From fde976604cf76a3a1059732c77e86ee386f67082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Wed, 19 Aug 2026 17:12:25 +0000 Subject: [PATCH] Raised minimum OpenGL version to 4.3. OpenGLES to 3.0. Removed glsl-optimizer. (#3905) --- 3rdparty/.editorconfig | 4 - 3rdparty/glsl-optimizer/generateParsers.sh | 5 - .../glsl-optimizer/include/c99/inttypes.h | 305 - 3rdparty/glsl-optimizer/include/c99/stdbool.h | 47 - 3rdparty/glsl-optimizer/include/c99/stdint.h | 247 - 3rdparty/glsl-optimizer/include/c99_compat.h | 180 - 3rdparty/glsl-optimizer/license.txt | 21 - 3rdparty/glsl-optimizer/src/getopt/getopt.h | 82 - .../glsl-optimizer/src/getopt/getopt_long.c | 511 -- 3rdparty/glsl-optimizer/src/glsl/Makefile | 131 - 3rdparty/glsl-optimizer/src/glsl/ast.h | 1129 --- .../src/glsl/ast_array_index.cpp | 268 - 3rdparty/glsl-optimizer/src/glsl/ast_expr.cpp | 95 - .../glsl-optimizer/src/glsl/ast_function.cpp | 1846 ----- .../glsl-optimizer/src/glsl/ast_to_hir.cpp | 6124 --------------- 3rdparty/glsl-optimizer/src/glsl/ast_type.cpp | 363 - .../src/glsl/builtin_functions.cpp | 4680 ----------- .../src/glsl/builtin_type_macros.h | 156 - .../glsl-optimizer/src/glsl/builtin_types.cpp | 369 - .../src/glsl/builtin_variables.cpp | 1111 --- .../glsl-optimizer/src/glsl/glcpp/glcpp-lex.c | 3139 -------- .../glsl-optimizer/src/glsl/glcpp/glcpp-lex.l | 578 -- .../src/glsl/glcpp/glcpp-parse.c | 4889 ------------ .../src/glsl/glcpp/glcpp-parse.h | 114 - .../src/glsl/glcpp/glcpp-parse.y | 2521 ------ .../glsl-optimizer/src/glsl/glcpp/glcpp.h | 253 - 3rdparty/glsl-optimizer/src/glsl/glcpp/pp.c | 242 - .../glsl-optimizer/src/glsl/glsl_lexer.cpp | 4358 ----------- .../glsl-optimizer/src/glsl/glsl_lexer.ll | 596 -- .../src/glsl/glsl_optimizer.cpp | 831 -- .../glsl-optimizer/src/glsl/glsl_optimizer.h | 92 - .../glsl-optimizer/src/glsl/glsl_parser.cpp | 6892 ----------------- .../glsl-optimizer/src/glsl/glsl_parser.h | 352 - .../glsl-optimizer/src/glsl/glsl_parser.yy | 2681 ------- .../src/glsl/glsl_parser_extras.cpp | 1680 ---- .../src/glsl/glsl_parser_extras.h | 601 -- .../src/glsl/glsl_symbol_table.cpp | 250 - .../src/glsl/glsl_symbol_table.h | 108 - .../glsl-optimizer/src/glsl/glsl_types.cpp | 1098 --- 3rdparty/glsl-optimizer/src/glsl/glsl_types.h | 752 -- .../src/glsl/hir_field_selection.cpp | 121 - 3rdparty/glsl-optimizer/src/glsl/ir.cpp | 2019 ----- 3rdparty/glsl-optimizer/src/glsl/ir.h | 2533 ------ .../src/glsl/ir_basic_block.cpp | 125 - .../glsl-optimizer/src/glsl/ir_basic_block.h | 28 - .../glsl-optimizer/src/glsl/ir_builder.cpp | 572 -- 3rdparty/glsl-optimizer/src/glsl/ir_builder.h | 222 - 3rdparty/glsl-optimizer/src/glsl/ir_clone.cpp | 446 -- .../src/glsl/ir_constant_expression.cpp | 1978 ----- .../glsl-optimizer/src/glsl/ir_equals.cpp | 202 - .../src/glsl/ir_expression_flattening.cpp | 86 - .../src/glsl/ir_expression_flattening.h | 38 - .../glsl-optimizer/src/glsl/ir_function.cpp | 401 - .../src/glsl/ir_function_can_inline.cpp | 76 - .../src/glsl/ir_function_detect_recursion.cpp | 358 - .../src/glsl/ir_function_inlining.h | 30 - .../src/glsl/ir_hierarchical_visitor.cpp | 392 - .../src/glsl/ir_hierarchical_visitor.h | 210 - .../glsl-optimizer/src/glsl/ir_hv_accept.cpp | 430 - .../src/glsl/ir_import_prototypes.cpp | 125 - .../glsl-optimizer/src/glsl/ir_optimization.h | 136 - .../src/glsl/ir_print_glsl_visitor.cpp | 1789 ----- .../src/glsl/ir_print_glsl_visitor.h | 105 - .../src/glsl/ir_print_metal_visitor.cpp | 2039 ----- .../src/glsl/ir_print_metal_visitor.h | 36 - .../src/glsl/ir_print_visitor.cpp | 561 -- .../src/glsl/ir_print_visitor.h | 97 - .../src/glsl/ir_rvalue_visitor.cpp | 293 - .../src/glsl/ir_rvalue_visitor.h | 80 - 3rdparty/glsl-optimizer/src/glsl/ir_stats.cpp | 64 - 3rdparty/glsl-optimizer/src/glsl/ir_stats.h | 3 - 3rdparty/glsl-optimizer/src/glsl/ir_uniform.h | 195 - .../src/glsl/ir_unused_structs.cpp | 139 - .../src/glsl/ir_unused_structs.h | 26 - .../glsl-optimizer/src/glsl/ir_validate.cpp | 859 -- .../src/glsl/ir_variable_refcount.cpp | 160 - .../src/glsl/ir_variable_refcount.h | 76 - 3rdparty/glsl-optimizer/src/glsl/ir_visitor.h | 93 - .../glsl-optimizer/src/glsl/link_atomics.cpp | 277 - .../src/glsl/link_functions.cpp | 348 - .../src/glsl/link_interface_blocks.cpp | 385 - .../link_uniform_block_active_visitor.cpp | 221 - .../glsl/link_uniform_block_active_visitor.h | 64 - .../src/glsl/link_uniform_blocks.cpp | 363 - .../src/glsl/link_uniform_initializers.cpp | 315 - .../glsl-optimizer/src/glsl/link_uniforms.cpp | 988 --- .../glsl-optimizer/src/glsl/link_varyings.cpp | 1582 ---- .../glsl-optimizer/src/glsl/link_varyings.h | 266 - 3rdparty/glsl-optimizer/src/glsl/linker.cpp | 2904 ------- 3rdparty/glsl-optimizer/src/glsl/linker.h | 199 - 3rdparty/glsl-optimizer/src/glsl/list.h | 658 -- .../glsl-optimizer/src/glsl/loop_analysis.cpp | 813 -- .../glsl-optimizer/src/glsl/loop_analysis.h | 280 - .../glsl-optimizer/src/glsl/loop_controls.cpp | 253 - .../glsl-optimizer/src/glsl/loop_unroll.cpp | 408 - .../src/glsl/lower_clip_distance.cpp | 549 -- .../glsl-optimizer/src/glsl/lower_discard.cpp | 201 - .../src/glsl/lower_discard_flow.cpp | 148 - .../src/glsl/lower_if_to_cond_assign.cpp | 252 - .../src/glsl/lower_instructions.cpp | 578 -- .../glsl-optimizer/src/glsl/lower_jumps.cpp | 1032 --- .../src/glsl/lower_mat_op_to_vec.cpp | 432 -- .../src/glsl/lower_named_interface_blocks.cpp | 251 - .../glsl-optimizer/src/glsl/lower_noise.cpp | 71 - .../src/glsl/lower_offset_array.cpp | 91 - .../src/glsl/lower_output_reads.cpp | 173 - .../src/glsl/lower_packed_varyings.cpp | 681 -- .../src/glsl/lower_packing_builtins.cpp | 1314 ---- .../src/glsl/lower_ubo_reference.cpp | 553 -- .../lower_variable_index_to_cond_assign.cpp | 550 -- .../glsl/lower_vec_index_to_cond_assign.cpp | 238 - .../src/glsl/lower_vec_index_to_swizzle.cpp | 171 - .../glsl-optimizer/src/glsl/lower_vector.cpp | 228 - .../src/glsl/lower_vector_insert.cpp | 142 - .../src/glsl/lower_vertex_id.cpp | 144 - 3rdparty/glsl-optimizer/src/glsl/main.cpp | 415 - .../glsl-optimizer/src/glsl/opt_algebraic.cpp | 842 -- .../src/glsl/opt_array_splitting.cpp | 415 - .../src/glsl/opt_constant_folding.cpp | 166 - .../src/glsl/opt_constant_propagation.cpp | 464 -- .../src/glsl/opt_constant_variable.cpp | 224 - .../src/glsl/opt_copy_propagation.cpp | 350 - .../glsl/opt_copy_propagation_elements.cpp | 505 -- 3rdparty/glsl-optimizer/src/glsl/opt_cse.cpp | 419 - .../src/glsl/opt_dead_builtin_variables.cpp | 81 - .../src/glsl/opt_dead_builtin_varyings.cpp | 586 -- .../glsl-optimizer/src/glsl/opt_dead_code.cpp | 169 - .../src/glsl/opt_dead_code_local.cpp | 331 - .../src/glsl/opt_dead_functions.cpp | 152 - .../src/glsl/opt_flatten_nested_if_blocks.cpp | 103 - .../src/glsl/opt_flip_matrices.cpp | 123 - .../src/glsl/opt_function_inlining.cpp | 380 - .../src/glsl/opt_if_simplification.cpp | 126 - .../glsl-optimizer/src/glsl/opt_minmax.cpp | 475 -- .../src/glsl/opt_noop_swizzle.cpp | 83 - .../src/glsl/opt_rebalance_tree.cpp | 321 - .../src/glsl/opt_redundant_jumps.cpp | 124 - .../src/glsl/opt_structure_splitting.cpp | 366 - .../src/glsl/opt_swizzle_swizzle.cpp | 97 - .../src/glsl/opt_tree_grafting.cpp | 421 - .../glsl-optimizer/src/glsl/opt_vectorize.cpp | 408 - 3rdparty/glsl-optimizer/src/glsl/program.h | 52 - .../glsl-optimizer/src/glsl/s_expression.cpp | 217 - .../glsl-optimizer/src/glsl/s_expression.h | 180 - .../src/glsl/standalone_scaffolding.cpp | 163 - .../src/glsl/standalone_scaffolding.h | 77 - 3rdparty/glsl-optimizer/src/glsl/strtod.c | 79 - 3rdparty/glsl-optimizer/src/glsl/strtod.h | 46 - .../glsl-optimizer/src/glsl_optimizer_lib.gyp | 190 - .../glsl-optimizer/src/mesa/main/compiler.h | 364 - .../glsl-optimizer/src/mesa/main/config.h | 322 - .../glsl-optimizer/src/mesa/main/context.h | 85 - 3rdparty/glsl-optimizer/src/mesa/main/core.h | 53 - 3rdparty/glsl-optimizer/src/mesa/main/dd.h | 54 - .../glsl-optimizer/src/mesa/main/errors.h | 53 - .../glsl-optimizer/src/mesa/main/glheader.h | 264 - .../glsl-optimizer/src/mesa/main/glminimal.h | 479 -- .../glsl-optimizer/src/mesa/main/imports.c | 554 -- .../glsl-optimizer/src/mesa/main/imports.h | 551 -- .../glsl-optimizer/src/mesa/main/macros.h | 824 -- .../glsl-optimizer/src/mesa/main/mtypes.h | 1693 ---- .../src/mesa/main/simple_list.h | 205 - .../src/mesa/program/hash_table.h | 288 - .../src/mesa/program/prog_hash_table.c | 245 - .../src/mesa/program/prog_instruction.h | 430 - .../src/mesa/program/prog_parameter.h | 58 - .../src/mesa/program/prog_statevars.h | 139 - .../src/mesa/program/symbol_table.c | 435 -- .../src/mesa/program/symbol_table.h | 49 - 3rdparty/glsl-optimizer/src/node/binding.cpp | 22 - 3rdparty/glsl-optimizer/src/node/compiler.cpp | 87 - 3rdparty/glsl-optimizer/src/node/compiler.h | 27 - 3rdparty/glsl-optimizer/src/node/shader.cpp | 182 - 3rdparty/glsl-optimizer/src/node/shader.h | 37 - .../glsl-optimizer/src/util/Makefile.sources | 9 - 3rdparty/glsl-optimizer/src/util/hash_table.c | 440 -- 3rdparty/glsl-optimizer/src/util/hash_table.h | 107 - 3rdparty/glsl-optimizer/src/util/macros.h | 129 - 3rdparty/glsl-optimizer/src/util/ralloc.c | 492 -- 3rdparty/glsl-optimizer/src/util/ralloc.h | 449 -- 3rdparty/khronos/GLES2/gl2.h | 656 -- 3rdparty/khronos/GLES2/gl2platform.h | 27 - README.md | 7 +- bindings/bf/bgfx.bf | 4 +- bindings/c3/bgfx.c3 | 4 +- bindings/cs/bgfx.cs | 4 +- bindings/d/package.d | 2 +- bindings/zig/bgfx.zig | 4 +- docs/build.rst | 4 +- docs/internals.rst | 8 +- docs/license.rst | 1 - docs/overview.rst | 7 +- docs/tools.rst | 2 +- examples/02-metaballs/fs_metaballs.bin.h | 104 +- examples/02-metaballs/vs_metaballs.bin.h | 115 +- examples/17-drawstress/fs_drawstress.bin.h | 37 +- .../17-drawstress/fs_drawstress_tex.bin.h | 60 +- examples/17-drawstress/vs_drawstress.bin.h | 72 +- .../17-drawstress/vs_drawstress_tex.bin.h | 94 +- .../gpudrivenrendering.cpp | 16 +- examples/39-assao/assao.cpp | 49 +- examples/39-assao/cs_assao_apply.sc | 2 +- .../cs_assao_generate_importance_map.sc | 2 +- examples/39-assao/cs_assao_generate_q.sh | 4 +- examples/39-assao/cs_assao_non_smart_apply.sc | 2 +- examples/39-assao/cs_assao_non_smart_blur.sc | 2 +- .../39-assao/cs_assao_non_smart_half_apply.sc | 2 +- .../cs_assao_postprocess_importance_map_a.sc | 2 +- .../cs_assao_postprocess_importance_map_b.sc | 2 +- .../39-assao/cs_assao_prepare_depth_mip.sc | 16 +- examples/39-assao/cs_assao_prepare_depths.sc | 8 +- .../cs_assao_prepare_depths_and_normals.sc | 8 +- ...s_assao_prepare_depths_and_normals_half.sc | 4 +- .../39-assao/cs_assao_prepare_depths_half.sc | 4 +- examples/39-assao/cs_assao_smart_blur.sc | 2 +- examples/39-assao/cs_assao_smart_blur_wide.sc | 2 +- examples/39-assao/uniforms.sh | 12 + examples/46-fsr/cs_fsr.h | 25 +- examples/common/bgfx_utils.cpp | 5 +- .../common/debugdraw/fs_debugdraw_fill.bin.h | 35 +- .../debugdraw/fs_debugdraw_fill_lit.bin.h | 106 +- .../debugdraw/fs_debugdraw_fill_texture.bin.h | 60 +- .../common/debugdraw/fs_debugdraw_lines.bin.h | 37 +- .../fs_debugdraw_lines_stipple.bin.h | 65 +- .../common/debugdraw/vs_debugdraw_fill.bin.h | 83 +- .../debugdraw/vs_debugdraw_fill_lit.bin.h | 126 +- .../vs_debugdraw_fill_lit_mesh.bin.h | 115 +- .../debugdraw/vs_debugdraw_fill_mesh.bin.h | 71 +- .../debugdraw/vs_debugdraw_fill_texture.bin.h | 94 +- .../common/debugdraw/vs_debugdraw_lines.bin.h | 72 +- .../vs_debugdraw_lines_stipple.bin.h | 96 +- examples/common/font/fs_font_basic.bin.h | 195 +- .../common/font/fs_font_distance_field.bin.h | 199 +- .../fs_font_distance_field_drop_shadow.bin.h | 431 +- ...ont_distance_field_drop_shadow_image.bin.h | 498 +- .../font/fs_font_distance_field_outline.bin.h | 281 +- ...ance_field_outline_drop_shadow_image.bin.h | 609 +- ...fs_font_distance_field_outline_image.bin.h | 362 +- .../fs_font_distance_field_subpixel.bin.h | 249 +- examples/common/font/vs_font_basic.bin.h | 95 +- .../common/font/vs_font_distance_field.bin.h | 95 +- .../vs_font_distance_field_drop_shadow.bin.h | 163 +- ...ont_distance_field_drop_shadow_image.bin.h | 163 +- .../font/vs_font_distance_field_outline.bin.h | 140 +- ...ance_field_outline_drop_shadow_image.bin.h | 163 +- ...vs_font_distance_field_outline_image.bin.h | 140 +- .../vs_font_distance_field_subpixel.bin.h | 95 +- examples/common/imgui/fs_imgui_image.bin.h | 86 +- examples/common/imgui/fs_ocornut_imgui.bin.h | 62 +- examples/common/imgui/vs_imgui_image.bin.h | 72 +- examples/common/imgui/vs_ocornut_imgui.bin.h | 103 +- examples/common/nanovg/fs_nanovg_fill.bin.h | 758 +- examples/common/nanovg/vs_nanovg_fill.bin.h | 131 +- examples/common/ps/fs_particle.bin.h | 95 +- examples/common/ps/vs_particle.bin.h | 94 +- examples/makefile | 6 + .../runtime/shaders/essl/cs_assao_apply.bin | Bin 6041 -> 2087 bytes .../essl/cs_assao_generate_importance_map.bin | Bin 5047 -> 1231 bytes .../shaders/essl/cs_assao_generate_q0.bin | Bin 17895 -> 7394 bytes .../shaders/essl/cs_assao_generate_q1.bin | Bin 17895 -> 9460 bytes .../shaders/essl/cs_assao_generate_q2.bin | Bin 17895 -> 10631 bytes .../shaders/essl/cs_assao_generate_q3.bin | Bin 17895 -> 11576 bytes .../shaders/essl/cs_assao_generate_q3base.bin | Bin 17893 -> 7530 bytes .../essl/cs_assao_load_counter_clear.bin | Bin 4133 -> 234 bytes .../shaders/essl/cs_assao_non_smart_apply.bin | Bin 4667 -> 872 bytes .../shaders/essl/cs_assao_non_smart_blur.bin | Bin 4989 -> 1165 bytes .../essl/cs_assao_non_smart_half_apply.bin | Bin 4522 -> 755 bytes .../cs_assao_postprocess_importance_map_a.bin | Bin 5106 -> 921 bytes .../cs_assao_postprocess_importance_map_b.bin | Bin 5295 -> 1286 bytes .../essl/cs_assao_prepare_depth_mip.bin | Bin 7573 -> 3195 bytes .../shaders/essl/cs_assao_prepare_depths.bin | Bin 5281 -> 1214 bytes .../cs_assao_prepare_depths_and_normals.bin | Bin 10346 -> 7147 bytes ..._assao_prepare_depths_and_normals_half.bin | Bin 9318 -> 4330 bytes .../essl/cs_assao_prepare_depths_half.bin | Bin 4853 -> 811 bytes .../shaders/essl/cs_assao_smart_blur.bin | Bin 5854 -> 1636 bytes .../shaders/essl/cs_assao_smart_blur_wide.bin | Bin 6031 -> 2274 bytes .../shaders/essl/cs_atmo_multiscatter.bin | Bin 10384 -> 6842 bytes .../runtime/shaders/essl/cs_atmo_skyview.bin | Bin 10215 -> 5799 bytes .../shaders/essl/cs_atmo_transmittance.bin | Bin 8038 -> 2209 bytes .../runtime/shaders/essl/cs_drawindirect.bin | Bin 5688 -> 2340 bytes .../shaders/essl/cs_drawindirect_count.bin | Bin 5843 -> 2526 bytes .../shaders/essl/cs_fsr_bilinear_16.bin | Bin 61053 -> 1778 bytes .../shaders/essl/cs_fsr_bilinear_32.bin | Bin 34902 -> 1778 bytes .../runtime/shaders/essl/cs_fsr_easu_16.bin | Bin 66530 -> 46875 bytes .../runtime/shaders/essl/cs_fsr_easu_32.bin | Bin 39714 -> 46875 bytes .../runtime/shaders/essl/cs_fsr_rcas_16.bin | Bin 63636 -> 7781 bytes .../runtime/shaders/essl/cs_fsr_rcas_32.bin | Bin 37144 -> 7781 bytes .../runtime/shaders/essl/cs_gdr_copy_z.bin | Bin 1913 -> 554 bytes .../shaders/essl/cs_gdr_downscale_hi_z.bin | Bin 2353 -> 846 bytes .../shaders/essl/cs_gdr_occlude_props.bin | Bin 6382 -> 3566 bytes .../shaders/essl/cs_gdr_stream_compaction.bin | Bin 4060 -> 3658 bytes examples/runtime/shaders/essl/cs_indirect.bin | Bin 4343 -> 552 bytes .../shaders/essl/cs_init_instances.bin | Bin 6447 -> 6246 bytes .../runtime/shaders/essl/cs_terrain_init.bin | Bin 5217 -> 1565 bytes .../runtime/shaders/essl/cs_terrain_lod.bin | Bin 10016 -> 10117 bytes .../shaders/essl/cs_terrain_update_draw.bin | Bin 4473 -> 641 bytes .../essl/cs_terrain_update_indirect.bin | Bin 4475 -> 579 bytes examples/runtime/shaders/essl/cs_update.bin | Bin 4416 -> 613 bytes .../shaders/essl/cs_update_instances.bin | Bin 5755 -> 1901 bytes .../runtime/shaders/essl/fs_albedo_output.bin | Bin 139 -> 249 bytes .../essl/fs_assao_deferred_combine.bin | Bin 997 -> 1155 bytes .../runtime/shaders/essl/fs_assao_gbuffer.bin | Bin 303 -> 439 bytes .../runtime/shaders/essl/fs_bloom_combine.bin | Bin 390 -> 440 bytes .../runtime/shaders/essl/fs_bokeh_copy.bin | Bin 210 -> 267 bytes .../essl/fs_bokeh_copy_linear_to_gamma.bin | Bin 340 -> 355 bytes .../shaders/essl/fs_bokeh_dof_combine.bin | Bin 558 -> 753 bytes .../shaders/essl/fs_bokeh_dof_debug.bin | Bin 885 -> 1369 bytes .../shaders/essl/fs_bokeh_dof_downsample.bin | Bin 457 -> 497 bytes .../shaders/essl/fs_bokeh_dof_second_pass.bin | Bin 2692 -> 2136 bytes .../shaders/essl/fs_bokeh_dof_single_pass.bin | Bin 3172 -> 2353 bytes .../runtime/shaders/essl/fs_bokeh_forward.bin | Bin 2050 -> 1735 bytes .../shaders/essl/fs_bokeh_forward_grid.bin | Bin 1107 -> 904 bytes .../shaders/essl/fs_bokeh_linear_depth.bin | Bin 420 -> 361 bytes examples/runtime/shaders/essl/fs_bump.bin | Bin 4767 -> 2215 bytes examples/runtime/shaders/essl/fs_bunnylod.bin | Bin 499 -> 404 bytes examples/runtime/shaders/essl/fs_callback.bin | Bin 499 -> 404 bytes examples/runtime/shaders/essl/fs_cubes.bin | Bin 93 -> 191 bytes .../shaders/essl/fs_deferred_clear_uav.bin | Bin 2718 -> 226 bytes .../shaders/essl/fs_deferred_combine.bin | Bin 783 -> 614 bytes .../shaders/essl/fs_deferred_combine_ta.bin | Bin 862 -> 633 bytes .../shaders/essl/fs_deferred_debug.bin | Bin 219 -> 276 bytes .../shaders/essl/fs_deferred_debug_line.bin | Bin 93 -> 191 bytes .../shaders/essl/fs_deferred_debug_ta.bin | Bin 350 -> 344 bytes .../runtime/shaders/essl/fs_deferred_geom.bin | Bin 1069 -> 876 bytes .../shaders/essl/fs_deferred_light.bin | Bin 2043 -> 1142 bytes .../shaders/essl/fs_deferred_light_ta.bin | Bin 2127 -> 1158 bytes .../shaders/essl/fs_deferred_light_uav.bin | Bin 12882 -> 1129 bytes .../essl/fs_denoise_apply_lighting.bin | Bin 417 -> 459 bytes .../runtime/shaders/essl/fs_denoise_copy.bin | Bin 210 -> 267 bytes .../essl/fs_denoise_deferred_combine.bin | Bin 1709 -> 1277 bytes .../shaders/essl/fs_denoise_gbuffer.bin | Bin 2492 -> 1878 bytes .../shaders/essl/fs_denoise_spatial_3x3.bin | Bin 2154 -> 2087 bytes .../shaders/essl/fs_denoise_spatial_5x5.bin | Bin 2222 -> 2155 bytes .../shaders/essl/fs_denoise_temporal.bin | Bin 3910 -> 2062 bytes .../runtime/shaders/essl/fs_denoise_txaa.bin | Bin 6834 -> 8183 bytes .../runtime/shaders/essl/fs_downsample.bin | Bin 2007 -> 1414 bytes .../essl/fs_fsr_copy_linear_to_gamma.bin | Bin 340 -> 355 bytes .../runtime/shaders/essl/fs_fsr_forward.bin | Bin 2050 -> 1735 bytes .../shaders/essl/fs_fsr_forward_grid.bin | Bin 1107 -> 904 bytes .../fs_gdr_instanced_indirect_rendering.bin | Bin 494 -> 457 bytes examples/runtime/shaders/essl/fs_hdr_blur.bin | Bin 1015 -> 1000 bytes .../runtime/shaders/essl/fs_hdr_bright.bin | Bin 2451 -> 1968 bytes examples/runtime/shaders/essl/fs_hdr_lum.bin | Bin 2371 -> 2472 bytes .../runtime/shaders/essl/fs_hdr_lumavg.bin | Bin 3294 -> 2379 bytes examples/runtime/shaders/essl/fs_hdr_mesh.bin | Bin 1809 -> 1496 bytes .../runtime/shaders/essl/fs_hdr_skybox.bin | Bin 712 -> 551 bytes .../runtime/shaders/essl/fs_hdr_tonemap.bin | Bin 2726 -> 2630 bytes examples/runtime/shaders/essl/fs_hextile.bin | Bin 8061 -> 7161 bytes examples/runtime/shaders/essl/fs_ibl_mesh.bin | Bin 3608 -> 3106 bytes .../runtime/shaders/essl/fs_ibl_skybox.bin | Bin 1871 -> 2043 bytes .../runtime/shaders/essl/fs_instancing.bin | Bin 93 -> 191 bytes examples/runtime/shaders/essl/fs_layered.bin | Bin 257 -> 385 bytes .../runtime/shaders/essl/fs_layered_blit.bin | Bin 362 -> 356 bytes examples/runtime/shaders/essl/fs_mesh.bin | Bin 1427 -> 1447 bytes examples/runtime/shaders/essl/fs_oit.bin | Bin 109 -> 213 bytes examples/runtime/shaders/essl/fs_oit_wb.bin | Bin 380 -> 619 bytes .../runtime/shaders/essl/fs_oit_wb_blit.bin | Bin 423 -> 480 bytes .../shaders/essl/fs_oit_wb_separate.bin | Bin 448 -> 502 bytes .../shaders/essl/fs_oit_wb_separate_blit.bin | Bin 423 -> 480 bytes examples/runtime/shaders/essl/fs_particle.bin | Bin 380 -> 519 bytes .../runtime/shaders/essl/fs_picking_id.bin | Bin 132 -> 298 bytes .../shaders/essl/fs_picking_shaded.bin | Bin 878 -> 832 bytes examples/runtime/shaders/essl/fs_pom.bin | Bin 2889 -> 3841 bytes .../runtime/shaders/essl/fs_raymarching.bin | Bin 12628 -> 6096 bytes .../runtime/shaders/essl/fs_rsm_combine.bin | Bin 8214 -> 5716 bytes .../runtime/shaders/essl/fs_rsm_gbuffer.bin | Bin 196 -> 379 bytes .../runtime/shaders/essl/fs_rsm_lbuffer.bin | Bin 1462 -> 1238 bytes .../runtime/shaders/essl/fs_rsm_shadow.bin | Bin 181 -> 350 bytes .../shaders/essl/fs_screen_space_shadows.bin | Bin 3365 -> 2813 bytes .../essl/fs_shadowmaps_color_black.bin | Bin 80 -> 168 bytes .../essl/fs_shadowmaps_color_lighting_esm.bin | Bin 4266 -> 3861 bytes .../fs_shadowmaps_color_lighting_esm_csm.bin | Bin 10281 -> 9884 bytes ...s_shadowmaps_color_lighting_esm_linear.bin | Bin 4310 -> 3872 bytes ...adowmaps_color_lighting_esm_linear_csm.bin | Bin 10501 -> 10111 bytes ...dowmaps_color_lighting_esm_linear_omni.bin | Bin 7656 -> 6757 bytes .../fs_shadowmaps_color_lighting_esm_omni.bin | Bin 7610 -> 6746 bytes .../fs_shadowmaps_color_lighting_hard.bin | Bin 4149 -> 3818 bytes .../fs_shadowmaps_color_lighting_hard_csm.bin | Bin 9781 -> 9712 bytes ..._shadowmaps_color_lighting_hard_linear.bin | Bin 4181 -> 3829 bytes ...dowmaps_color_lighting_hard_linear_csm.bin | Bin 9917 -> 9939 bytes ...owmaps_color_lighting_hard_linear_omni.bin | Bin 7528 -> 6714 bytes ...fs_shadowmaps_color_lighting_hard_omni.bin | Bin 7494 -> 6703 bytes .../essl/fs_shadowmaps_color_lighting_pcf.bin | Bin 5695 -> 4947 bytes .../fs_shadowmaps_color_lighting_pcf_csm.bin | Bin 16400 -> 14972 bytes ...s_shadowmaps_color_lighting_pcf_linear.bin | Bin 5802 -> 5027 bytes ...adowmaps_color_lighting_pcf_linear_csm.bin | Bin 16916 -> 15164 bytes ...dowmaps_color_lighting_pcf_linear_omni.bin | Bin 9200 -> 7947 bytes .../fs_shadowmaps_color_lighting_pcf_omni.bin | Bin 9091 -> 7879 bytes .../fs_shadowmaps_color_lighting_pcss.bin | Bin 8246 -> 6943 bytes .../fs_shadowmaps_color_lighting_pcss_csm.bin | Bin 28444 -> 24287 bytes ..._shadowmaps_color_lighting_pcss_linear.bin | Bin 8263 -> 6976 bytes ...dowmaps_color_lighting_pcss_linear_csm.bin | Bin 28570 -> 24635 bytes ...owmaps_color_lighting_pcss_linear_omni.bin | Bin 11630 -> 9876 bytes ...fs_shadowmaps_color_lighting_pcss_omni.bin | Bin 11565 -> 9835 bytes .../essl/fs_shadowmaps_color_lighting_vsm.bin | Bin 4692 -> 4187 bytes .../fs_shadowmaps_color_lighting_vsm_csm.bin | Bin 12227 -> 11605 bytes ...s_shadowmaps_color_lighting_vsm_linear.bin | Bin 4736 -> 4198 bytes ...adowmaps_color_lighting_vsm_linear_csm.bin | Bin 12447 -> 11839 bytes ...dowmaps_color_lighting_vsm_linear_omni.bin | Bin 8084 -> 7083 bytes .../fs_shadowmaps_color_lighting_vsm_omni.bin | Bin 8038 -> 7072 bytes .../essl/fs_shadowmaps_color_texture.bin | Bin 699 -> 651 bytes .../shaders/essl/fs_shadowmaps_hblur.bin | Bin 1738 -> 2373 bytes .../shaders/essl/fs_shadowmaps_hblur_vsm.bin | Bin 2772 -> 2606 bytes .../shaders/essl/fs_shadowmaps_packdepth.bin | Bin 308 -> 433 bytes .../essl/fs_shadowmaps_packdepth_linear.bin | Bin 260 -> 393 bytes .../essl/fs_shadowmaps_packdepth_vsm.bin | Bin 503 -> 497 bytes .../fs_shadowmaps_packdepth_vsm_linear.bin | Bin 414 -> 437 bytes .../shaders/essl/fs_shadowmaps_texture.bin | Bin 219 -> 276 bytes .../essl/fs_shadowmaps_unpackdepth.bin | Bin 431 -> 502 bytes .../essl/fs_shadowmaps_unpackdepth_vsm.bin | Bin 407 -> 427 bytes .../shaders/essl/fs_shadowmaps_vblur.bin | Bin 1738 -> 2373 bytes .../shaders/essl/fs_shadowmaps_vblur_vsm.bin | Bin 2772 -> 2606 bytes .../essl/fs_shadowvolume_color_lighting.bin | Bin 2379 -> 2036 bytes .../essl/fs_shadowvolume_color_texture.bin | Bin 699 -> 651 bytes .../essl/fs_shadowvolume_svbackblank.bin | Bin 169 -> 168 bytes .../essl/fs_shadowvolume_svbackcolor.bin | Bin 142 -> 333 bytes .../essl/fs_shadowvolume_svbacktex1.bin | Bin 445 -> 855 bytes .../essl/fs_shadowvolume_svbacktex2.bin | Bin 445 -> 855 bytes .../essl/fs_shadowvolume_svfrontblank.bin | Bin 177 -> 248 bytes .../essl/fs_shadowvolume_svfrontcolor.bin | Bin 142 -> 333 bytes .../essl/fs_shadowvolume_svfronttex1.bin | Bin 442 -> 867 bytes .../essl/fs_shadowvolume_svfronttex2.bin | Bin 442 -> 867 bytes .../shaders/essl/fs_shadowvolume_svside.bin | Bin 472 -> 701 bytes .../essl/fs_shadowvolume_svsideblank.bin | Bin 80 -> 168 bytes .../essl/fs_shadowvolume_svsidecolor.bin | Bin 142 -> 333 bytes .../essl/fs_shadowvolume_svsidetex.bin | Bin 578 -> 888 bytes .../shaders/essl/fs_shadowvolume_texture.bin | Bin 219 -> 276 bytes .../essl/fs_shadowvolume_texture_lighting.bin | Bin 2610 -> 2191 bytes examples/runtime/shaders/essl/fs_sky.bin | Bin 739 -> 653 bytes examples/runtime/shaders/essl/fs_sky2.bin | Bin 35386 -> 26809 bytes examples/runtime/shaders/essl/fs_sky2_bg.bin | Bin 5924 -> 3715 bytes .../runtime/shaders/essl/fs_sky2_shadow.bin | Bin 213 -> 242 bytes .../shaders/essl/fs_sky_color_banding_fix.bin | Bin 956 -> 873 bytes .../runtime/shaders/essl/fs_sky_landscape.bin | Bin 1101 -> 1365 bytes examples/runtime/shaders/essl/fs_slug.bin | Bin 15294 -> 7638 bytes examples/runtime/shaders/essl/fs_sms_mesh.bin | Bin 8411 -> 5558 bytes .../runtime/shaders/essl/fs_sms_mesh_pd.bin | Bin 8632 -> 6818 bytes .../runtime/shaders/essl/fs_sms_shadow.bin | Bin 169 -> 168 bytes .../runtime/shaders/essl/fs_sms_shadow_pd.bin | Bin 410 -> 536 bytes .../shaders/essl/fs_sss_deferred_combine.bin | Bin 2924 -> 2424 bytes .../runtime/shaders/essl/fs_sss_gbuffer.bin | Bin 3101 -> 2336 bytes .../shaders/essl/fs_sss_linear_depth.bin | Bin 420 -> 361 bytes .../runtime/shaders/essl/fs_sss_unlit.bin | Bin 1370 -> 1006 bytes .../shaders/essl/fs_stencil_color_black.bin | Bin 80 -> 168 bytes .../essl/fs_stencil_color_lighting.bin | Bin 2276 -> 1881 bytes .../shaders/essl/fs_stencil_color_texture.bin | Bin 699 -> 651 bytes .../shaders/essl/fs_stencil_texture.bin | Bin 219 -> 276 bytes .../essl/fs_stencil_texture_lighting.bin | Bin 2602 -> 2082 bytes examples/runtime/shaders/essl/fs_terrain.bin | Bin 239 -> 298 bytes .../shaders/essl/fs_terrain_render.bin | Bin 6684 -> 475 bytes .../shaders/essl/fs_terrain_render_normal.bin | Bin 6623 -> 396 bytes examples/runtime/shaders/essl/fs_tree.bin | Bin 1332 -> 1318 bytes examples/runtime/shaders/essl/fs_update.bin | Bin 225 -> 275 bytes .../runtime/shaders/essl/fs_update_3d.bin | Bin 531 -> 386 bytes .../runtime/shaders/essl/fs_update_cmp.bin | Bin 238 -> 299 bytes .../runtime/shaders/essl/fs_update_mip.bin | Bin 319 -> 377 bytes examples/runtime/shaders/essl/fs_upsample.bin | Bin 1609 -> 992 bytes .../shaders/essl/fs_vectordisplay_blit.bin | Bin 426 -> 392 bytes .../shaders/essl/fs_vectordisplay_blur.bin | Bin 2024 -> 1585 bytes .../shaders/essl/fs_vectordisplay_fb.bin | Bin 410 -> 395 bytes examples/runtime/shaders/essl/fs_vt_mip.bin | Bin 828 -> 708 bytes examples/runtime/shaders/essl/fs_vt_unlit.bin | Bin 1203 -> 1035 bytes examples/runtime/shaders/essl/fs_wf_mesh.bin | Bin 1529 -> 2350 bytes .../shaders/essl/fs_wf_vertex_pulling.bin | Bin 91 -> 189 bytes .../runtime/shaders/essl/fs_wf_wireframe.bin | Bin 767 -> 546 bytes .../runtime/shaders/essl/vs_albedo_output.bin | Bin 462 -> 443 bytes examples/runtime/shaders/essl/vs_assao.bin | Bin 349 -> 294 bytes .../runtime/shaders/essl/vs_assao_gbuffer.bin | Bin 625 -> 509 bytes .../runtime/shaders/essl/vs_bokeh_forward.bin | Bin 1136 -> 754 bytes .../shaders/essl/vs_bokeh_screenquad.bin | Bin 349 -> 294 bytes examples/runtime/shaders/essl/vs_bump.bin | Bin 1485 -> 981 bytes .../shaders/essl/vs_bump_instanced.bin | Bin 1662 -> 1111 bytes examples/runtime/shaders/essl/vs_bunnylod.bin | Bin 587 -> 408 bytes examples/runtime/shaders/essl/vs_callback.bin | Bin 517 -> 397 bytes examples/runtime/shaders/essl/vs_cubes.bin | Bin 333 -> 278 bytes .../shaders/essl/vs_deferred_combine.bin | Bin 345 -> 290 bytes .../shaders/essl/vs_deferred_debug.bin | Bin 345 -> 290 bytes .../shaders/essl/vs_deferred_debug_line.bin | Bin 333 -> 278 bytes .../runtime/shaders/essl/vs_deferred_geom.bin | Bin 1758 -> 1067 bytes .../shaders/essl/vs_deferred_light.bin | Bin 345 -> 290 bytes .../shaders/essl/vs_denoise_gbuffer.bin | Bin 1673 -> 965 bytes .../shaders/essl/vs_denoise_screenquad.bin | Bin 349 -> 294 bytes .../runtime/shaders/essl/vs_fsr_forward.bin | Bin 1123 -> 726 bytes .../shaders/essl/vs_fsr_screenquad.bin | Bin 349 -> 294 bytes .../runtime/shaders/essl/vs_fullscreen.bin | Bin 345 -> 290 bytes .../vs_gdr_instanced_indirect_rendering.bin | Bin 631 -> 451 bytes .../shaders/essl/vs_gdr_render_occlusion.bin | Bin 494 -> 377 bytes examples/runtime/shaders/essl/vs_hdr_blur.bin | Bin 1497 -> 944 bytes .../runtime/shaders/essl/vs_hdr_bright.bin | Bin 345 -> 290 bytes examples/runtime/shaders/essl/vs_hdr_lum.bin | Bin 345 -> 290 bytes .../runtime/shaders/essl/vs_hdr_lumavg.bin | Bin 345 -> 290 bytes examples/runtime/shaders/essl/vs_hdr_mesh.bin | Bin 686 -> 497 bytes .../runtime/shaders/essl/vs_hdr_skybox.bin | Bin 345 -> 290 bytes .../runtime/shaders/essl/vs_hdr_tonemap.bin | Bin 1415 -> 964 bytes examples/runtime/shaders/essl/vs_hextile.bin | Bin 663 -> 447 bytes examples/runtime/shaders/essl/vs_ibl_mesh.bin | Bin 686 -> 509 bytes .../runtime/shaders/essl/vs_ibl_skybox.bin | Bin 806 -> 570 bytes .../runtime/shaders/essl/vs_instancing.bin | Bin 616 -> 508 bytes examples/runtime/shaders/essl/vs_layered.bin | Bin 580 -> 436 bytes .../runtime/shaders/essl/vs_layered_blit.bin | Bin 263 -> 215 bytes .../runtime/shaders/essl/vs_layered_eye.bin | Bin 629 -> 469 bytes examples/runtime/shaders/essl/vs_mesh.bin | Bin 1505 -> 965 bytes examples/runtime/shaders/essl/vs_oit.bin | Bin 619 -> 384 bytes examples/runtime/shaders/essl/vs_oit_blit.bin | Bin 345 -> 290 bytes examples/runtime/shaders/essl/vs_particle.bin | Bin 901 -> 619 bytes .../shaders/essl/vs_picking_shaded.bin | Bin 809 -> 673 bytes examples/runtime/shaders/essl/vs_pom.bin | Bin 1509 -> 1000 bytes .../runtime/shaders/essl/vs_raymarching.bin | Bin 428 -> 373 bytes .../runtime/shaders/essl/vs_rsm_combine.bin | Bin 345 -> 290 bytes .../runtime/shaders/essl/vs_rsm_gbuffer.bin | Bin 517 -> 403 bytes .../runtime/shaders/essl/vs_rsm_lbuffer.bin | Bin 1348 -> 1132 bytes .../runtime/shaders/essl/vs_rsm_shadow.bin | Bin 528 -> 414 bytes .../shaders/essl/vs_shadowmaps_color.bin | Bin 250 -> 195 bytes .../essl/vs_shadowmaps_color_lighting.bin | Bin 978 -> 683 bytes .../essl/vs_shadowmaps_color_lighting_csm.bin | Bin 1613 -> 1221 bytes .../vs_shadowmaps_color_lighting_linear.bin | Bin 1023 -> 711 bytes ...s_shadowmaps_color_lighting_linear_csm.bin | Bin 1777 -> 1325 bytes ..._shadowmaps_color_lighting_linear_omni.bin | Bin 1704 -> 1285 bytes .../vs_shadowmaps_color_lighting_omni.bin | Bin 1540 -> 1181 bytes .../essl/vs_shadowmaps_color_texture.bin | Bin 345 -> 290 bytes .../shaders/essl/vs_shadowmaps_depth.bin | Bin 250 -> 195 bytes .../shaders/essl/vs_shadowmaps_hblur.bin | Bin 1500 -> 1010 bytes .../shaders/essl/vs_shadowmaps_packdepth.bin | Bin 309 -> 246 bytes .../essl/vs_shadowmaps_packdepth_linear.bin | Bin 322 -> 257 bytes .../shaders/essl/vs_shadowmaps_texture.bin | Bin 345 -> 290 bytes .../essl/vs_shadowmaps_texture_lighting.bin | Bin 732 -> 553 bytes .../essl/vs_shadowmaps_unpackdepth.bin | Bin 345 -> 290 bytes .../shaders/essl/vs_shadowmaps_vblur.bin | Bin 1500 -> 1010 bytes .../essl/vs_shadowvolume_color_lighting.bin | Bin 637 -> 458 bytes .../essl/vs_shadowvolume_color_texture.bin | Bin 345 -> 290 bytes .../shaders/essl/vs_shadowvolume_svback.bin | Bin 456 -> 383 bytes .../shaders/essl/vs_shadowvolume_svfront.bin | Bin 250 -> 195 bytes .../shaders/essl/vs_shadowvolume_svside.bin | Bin 640 -> 587 bytes .../shaders/essl/vs_shadowvolume_texture.bin | Bin 345 -> 290 bytes .../essl/vs_shadowvolume_texture_lighting.bin | Bin 732 -> 553 bytes examples/runtime/shaders/essl/vs_sky.bin | Bin 3428 -> 1983 bytes examples/runtime/shaders/essl/vs_sky2.bin | Bin 604 -> 425 bytes examples/runtime/shaders/essl/vs_sky2_bg.bin | Bin 245 -> 183 bytes .../runtime/shaders/essl/vs_sky2_shadow.bin | Bin 483 -> 379 bytes .../runtime/shaders/essl/vs_sky_landscape.bin | Bin 580 -> 470 bytes examples/runtime/shaders/essl/vs_slug.bin | Bin 2044 -> 1340 bytes examples/runtime/shaders/essl/vs_sms_mesh.bin | Bin 922 -> 663 bytes .../runtime/shaders/essl/vs_sms_shadow.bin | Bin 250 -> 195 bytes .../runtime/shaders/essl/vs_sms_shadow_pd.bin | Bin 309 -> 246 bytes .../runtime/shaders/essl/vs_sss_gbuffer.bin | Bin 854 -> 576 bytes .../shaders/essl/vs_sss_screenquad.bin | Bin 349 -> 294 bytes .../runtime/shaders/essl/vs_stencil_color.bin | Bin 250 -> 195 bytes .../essl/vs_stencil_color_lighting.bin | Bin 637 -> 458 bytes .../shaders/essl/vs_stencil_color_texture.bin | Bin 345 -> 290 bytes .../shaders/essl/vs_stencil_texture.bin | Bin 345 -> 290 bytes .../essl/vs_stencil_texture_lighting.bin | Bin 732 -> 553 bytes examples/runtime/shaders/essl/vs_terrain.bin | Bin 403 -> 340 bytes .../essl/vs_terrain_height_texture.bin | Bin 550 -> 483 bytes .../shaders/essl/vs_terrain_render.bin | Bin 7307 -> 1710 bytes examples/runtime/shaders/essl/vs_tree.bin | Bin 799 -> 614 bytes examples/runtime/shaders/essl/vs_update.bin | Bin 345 -> 290 bytes .../shaders/essl/vs_vectordisplay_fb.bin | Bin 428 -> 373 bytes .../runtime/shaders/essl/vs_vt_generic.bin | Bin 462 -> 348 bytes examples/runtime/shaders/essl/vs_wf_mesh.bin | Bin 760 -> 583 bytes .../shaders/essl/vs_wf_vertex_pulling.bin | Bin 13263 -> 3091 bytes .../runtime/shaders/essl/vs_wf_wireframe.bin | Bin 572 -> 450 bytes .../runtime/shaders/glsl/cs_assao_apply.bin | Bin 6312 -> 2072 bytes .../glsl/cs_assao_generate_importance_map.bin | Bin 5318 -> 1216 bytes .../shaders/glsl/cs_assao_generate_q0.bin | Bin 18154 -> 7340 bytes .../shaders/glsl/cs_assao_generate_q1.bin | Bin 18154 -> 9434 bytes .../shaders/glsl/cs_assao_generate_q2.bin | Bin 18154 -> 10605 bytes .../shaders/glsl/cs_assao_generate_q3.bin | Bin 18154 -> 11536 bytes .../shaders/glsl/cs_assao_generate_q3base.bin | Bin 18152 -> 7504 bytes .../glsl/cs_assao_load_counter_clear.bin | Bin 4410 -> 234 bytes .../shaders/glsl/cs_assao_non_smart_apply.bin | Bin 4938 -> 857 bytes .../shaders/glsl/cs_assao_non_smart_blur.bin | Bin 5260 -> 1151 bytes .../glsl/cs_assao_non_smart_half_apply.bin | Bin 4793 -> 740 bytes .../cs_assao_postprocess_importance_map_a.bin | Bin 5377 -> 906 bytes .../cs_assao_postprocess_importance_map_b.bin | Bin 5566 -> 1271 bytes .../glsl/cs_assao_prepare_depth_mip.bin | Bin 7802 -> 3147 bytes .../shaders/glsl/cs_assao_prepare_depths.bin | Bin 5534 -> 1184 bytes .../cs_assao_prepare_depths_and_normals.bin | Bin 10593 -> 7111 bytes ..._assao_prepare_depths_and_normals_half.bin | Bin 9577 -> 4306 bytes .../glsl/cs_assao_prepare_depths_half.bin | Bin 5118 -> 793 bytes .../shaders/glsl/cs_assao_smart_blur.bin | Bin 6125 -> 1622 bytes .../shaders/glsl/cs_assao_smart_blur_wide.bin | Bin 6302 -> 2260 bytes .../shaders/glsl/cs_atmo_multiscatter.bin | Bin 10655 -> 6830 bytes .../runtime/shaders/glsl/cs_atmo_skyview.bin | Bin 10486 -> 5781 bytes .../shaders/glsl/cs_atmo_transmittance.bin | Bin 8309 -> 2203 bytes .../runtime/shaders/glsl/cs_drawindirect.bin | Bin 5965 -> 2340 bytes .../shaders/glsl/cs_drawindirect_count.bin | Bin 6120 -> 2526 bytes .../shaders/glsl/cs_fsr_bilinear_16.bin | Bin 61324 -> 1766 bytes .../shaders/glsl/cs_fsr_bilinear_32.bin | Bin 35173 -> 1766 bytes .../runtime/shaders/glsl/cs_fsr_easu_16.bin | Bin 66801 -> 46863 bytes .../runtime/shaders/glsl/cs_fsr_easu_32.bin | Bin 39985 -> 46863 bytes .../runtime/shaders/glsl/cs_fsr_rcas_16.bin | Bin 63907 -> 7769 bytes .../runtime/shaders/glsl/cs_fsr_rcas_32.bin | Bin 37415 -> 7769 bytes .../runtime/shaders/glsl/cs_gdr_copy_z.bin | Bin 4624 -> 542 bytes .../shaders/glsl/cs_gdr_downscale_hi_z.bin | Bin 5058 -> 834 bytes .../shaders/glsl/cs_gdr_occlude_props.bin | Bin 6659 -> 3560 bytes .../shaders/glsl/cs_gdr_stream_compaction.bin | Bin 6825 -> 3658 bytes examples/runtime/shaders/glsl/cs_indirect.bin | Bin 4620 -> 552 bytes .../shaders/glsl/cs_init_instances.bin | Bin 6724 -> 6246 bytes .../runtime/shaders/glsl/cs_terrain_init.bin | Bin 5494 -> 1565 bytes .../runtime/shaders/glsl/cs_terrain_lod.bin | Bin 10293 -> 10231 bytes .../shaders/glsl/cs_terrain_update_draw.bin | Bin 4750 -> 641 bytes .../glsl/cs_terrain_update_indirect.bin | Bin 4752 -> 579 bytes examples/runtime/shaders/glsl/cs_update.bin | Bin 4687 -> 607 bytes .../shaders/glsl/cs_update_instances.bin | Bin 6032 -> 1901 bytes .../runtime/shaders/glsl/fs_albedo_output.bin | Bin 133 -> 191 bytes .../glsl/fs_assao_deferred_combine.bin | Bin 965 -> 1049 bytes .../runtime/shaders/glsl/fs_assao_gbuffer.bin | Bin 246 -> 369 bytes .../runtime/shaders/glsl/fs_bloom_combine.bin | Bin 379 -> 370 bytes .../runtime/shaders/glsl/fs_bokeh_copy.bin | Bin 159 -> 203 bytes .../glsl/fs_bokeh_copy_linear_to_gamma.bin | Bin 324 -> 285 bytes .../shaders/glsl/fs_bokeh_dof_combine.bin | Bin 537 -> 647 bytes .../shaders/glsl/fs_bokeh_dof_debug.bin | Bin 859 -> 1281 bytes .../shaders/glsl/fs_bokeh_dof_downsample.bin | Bin 446 -> 421 bytes .../shaders/glsl/fs_bokeh_dof_second_pass.bin | Bin 2546 -> 1946 bytes .../shaders/glsl/fs_bokeh_dof_single_pass.bin | Bin 2951 -> 2169 bytes .../runtime/shaders/glsl/fs_bokeh_forward.bin | Bin 1888 -> 1533 bytes .../shaders/glsl/fs_bokeh_forward_grid.bin | Bin 1039 -> 798 bytes .../shaders/glsl/fs_bokeh_linear_depth.bin | Bin 401 -> 291 bytes examples/runtime/shaders/glsl/fs_bump.bin | Bin 4449 -> 2043 bytes examples/runtime/shaders/glsl/fs_bunnylod.bin | Bin 469 -> 334 bytes examples/runtime/shaders/glsl/fs_callback.bin | Bin 469 -> 334 bytes examples/runtime/shaders/glsl/fs_cubes.bin | Bin 87 -> 133 bytes .../shaders/glsl/fs_deferred_clear_uav.bin | Bin 3336 -> 174 bytes .../shaders/glsl/fs_deferred_combine.bin | Bin 699 -> 526 bytes .../shaders/glsl/fs_deferred_combine_ta.bin | Bin 772 -> 545 bytes .../shaders/glsl/fs_deferred_debug.bin | Bin 168 -> 212 bytes .../shaders/glsl/fs_deferred_debug_line.bin | Bin 87 -> 133 bytes .../shaders/glsl/fs_deferred_debug_ta.bin | Bin 287 -> 274 bytes .../runtime/shaders/glsl/fs_deferred_geom.bin | Bin 920 -> 764 bytes .../shaders/glsl/fs_deferred_light.bin | Bin 1900 -> 1024 bytes .../shaders/glsl/fs_deferred_light_ta.bin | Bin 1978 -> 1040 bytes .../shaders/glsl/fs_deferred_light_uav.bin | Bin 13500 -> 1017 bytes .../glsl/fs_denoise_apply_lighting.bin | Bin 406 -> 389 bytes .../runtime/shaders/glsl/fs_denoise_copy.bin | Bin 159 -> 203 bytes .../glsl/fs_denoise_deferred_combine.bin | Bin 1552 -> 1183 bytes .../shaders/glsl/fs_denoise_gbuffer.bin | Bin 2197 -> 1676 bytes .../shaders/glsl/fs_denoise_spatial_3x3.bin | Bin 2076 -> 1903 bytes .../shaders/glsl/fs_denoise_spatial_5x5.bin | Bin 2144 -> 1971 bytes .../shaders/glsl/fs_denoise_temporal.bin | Bin 3737 -> 1866 bytes .../runtime/shaders/glsl/fs_denoise_txaa.bin | Bin 6607 -> 7519 bytes .../runtime/shaders/glsl/fs_downsample.bin | Bin 1918 -> 1272 bytes .../glsl/fs_fsr_copy_linear_to_gamma.bin | Bin 324 -> 285 bytes .../runtime/shaders/glsl/fs_fsr_forward.bin | Bin 1888 -> 1533 bytes .../shaders/glsl/fs_fsr_forward_grid.bin | Bin 1039 -> 798 bytes .../fs_gdr_instanced_indirect_rendering.bin | Bin 407 -> 393 bytes examples/runtime/shaders/glsl/fs_hdr_blur.bin | Bin 932 -> 912 bytes .../runtime/shaders/glsl/fs_hdr_bright.bin | Bin 2323 -> 1814 bytes examples/runtime/shaders/glsl/fs_hdr_lum.bin | Bin 2253 -> 2330 bytes .../runtime/shaders/glsl/fs_hdr_lumavg.bin | Bin 3136 -> 2195 bytes examples/runtime/shaders/glsl/fs_hdr_mesh.bin | Bin 1661 -> 1372 bytes .../runtime/shaders/glsl/fs_hdr_skybox.bin | Bin 620 -> 469 bytes .../runtime/shaders/glsl/fs_hdr_tonemap.bin | Bin 2574 -> 2452 bytes examples/runtime/shaders/glsl/fs_hextile.bin | Bin 7628 -> 6671 bytes examples/runtime/shaders/glsl/fs_ibl_mesh.bin | Bin 3356 -> 2844 bytes .../runtime/shaders/glsl/fs_ibl_skybox.bin | Bin 1724 -> 1853 bytes .../runtime/shaders/glsl/fs_instancing.bin | Bin 87 -> 133 bytes examples/runtime/shaders/glsl/fs_layered.bin | Bin 237 -> 321 bytes .../runtime/shaders/glsl/fs_layered_blit.bin | Bin 299 -> 286 bytes examples/runtime/shaders/glsl/fs_mesh.bin | Bin 1355 -> 1341 bytes examples/runtime/shaders/glsl/fs_oit.bin | Bin 103 -> 155 bytes examples/runtime/shaders/glsl/fs_oit_wb.bin | Bin 362 -> 537 bytes .../runtime/shaders/glsl/fs_oit_wb_blit.bin | Bin 407 -> 404 bytes .../shaders/glsl/fs_oit_wb_separate.bin | Bin 420 -> 432 bytes .../shaders/glsl/fs_oit_wb_separate_blit.bin | Bin 407 -> 404 bytes examples/runtime/shaders/glsl/fs_particle.bin | Bin 366 -> 455 bytes .../runtime/shaders/glsl/fs_picking_id.bin | Bin 126 -> 240 bytes .../shaders/glsl/fs_picking_shaded.bin | Bin 830 -> 744 bytes examples/runtime/shaders/glsl/fs_pom.bin | Bin 2748 -> 3597 bytes .../runtime/shaders/glsl/fs_raymarching.bin | Bin 11962 -> 5912 bytes .../runtime/shaders/glsl/fs_rsm_combine.bin | Bin 7798 -> 5298 bytes .../runtime/shaders/glsl/fs_rsm_gbuffer.bin | Bin 184 -> 315 bytes .../runtime/shaders/glsl/fs_rsm_lbuffer.bin | Bin 1239 -> 1090 bytes .../runtime/shaders/glsl/fs_rsm_shadow.bin | Bin 169 -> 286 bytes .../shaders/glsl/fs_screen_space_shadows.bin | Bin 3177 -> 2587 bytes .../glsl/fs_shadowmaps_color_black.bin | Bin 80 -> 116 bytes .../glsl/fs_shadowmaps_color_lighting_esm.bin | Bin 4029 -> 3623 bytes .../fs_shadowmaps_color_lighting_esm_csm.bin | Bin 9899 -> 9496 bytes ...s_shadowmaps_color_lighting_esm_linear.bin | Bin 4073 -> 3634 bytes ...adowmaps_color_lighting_esm_linear_csm.bin | Bin 10119 -> 9699 bytes ...dowmaps_color_lighting_esm_linear_omni.bin | Bin 7300 -> 6363 bytes .../fs_shadowmaps_color_lighting_esm_omni.bin | Bin 7254 -> 6352 bytes .../fs_shadowmaps_color_lighting_hard.bin | Bin 3915 -> 3580 bytes .../fs_shadowmaps_color_lighting_hard_csm.bin | Bin 9411 -> 9324 bytes ..._shadowmaps_color_lighting_hard_linear.bin | Bin 3947 -> 3591 bytes ...dowmaps_color_lighting_hard_linear_csm.bin | Bin 9547 -> 9527 bytes ...owmaps_color_lighting_hard_linear_omni.bin | Bin 7175 -> 6320 bytes ...fs_shadowmaps_color_lighting_hard_omni.bin | Bin 7141 -> 6309 bytes .../glsl/fs_shadowmaps_color_lighting_pcf.bin | Bin 5361 -> 4625 bytes .../fs_shadowmaps_color_lighting_pcf_csm.bin | Bin 15665 -> 14236 bytes ...s_shadowmaps_color_lighting_pcf_linear.bin | Bin 5462 -> 4699 bytes ...adowmaps_color_lighting_pcf_linear_csm.bin | Bin 16157 -> 14404 bytes ...dowmaps_color_lighting_pcf_linear_omni.bin | Bin 8735 -> 7463 bytes .../fs_shadowmaps_color_lighting_pcf_omni.bin | Bin 8632 -> 7401 bytes .../fs_shadowmaps_color_lighting_pcss.bin | Bin 7796 -> 6537 bytes .../fs_shadowmaps_color_lighting_pcss_csm.bin | Bin 27225 -> 23245 bytes ..._shadowmaps_color_lighting_pcss_linear.bin | Bin 7813 -> 6564 bytes ...dowmaps_color_lighting_pcss_linear_csm.bin | Bin 27351 -> 23545 bytes ...owmaps_color_lighting_pcss_linear_omni.bin | Bin 11061 -> 9308 bytes ...fs_shadowmaps_color_lighting_pcss_omni.bin | Bin 11002 -> 9273 bytes .../glsl/fs_shadowmaps_color_lighting_vsm.bin | Bin 4430 -> 3913 bytes .../fs_shadowmaps_color_lighting_vsm_csm.bin | Bin 11745 -> 11073 bytes ...s_shadowmaps_color_lighting_vsm_linear.bin | Bin 4474 -> 3924 bytes ...adowmaps_color_lighting_vsm_linear_csm.bin | Bin 11965 -> 11283 bytes ...dowmaps_color_lighting_vsm_linear_omni.bin | Bin 7703 -> 6653 bytes .../fs_shadowmaps_color_lighting_vsm_omni.bin | Bin 7657 -> 6642 bytes .../glsl/fs_shadowmaps_color_texture.bin | Bin 614 -> 557 bytes .../shaders/glsl/fs_shadowmaps_hblur.bin | Bin 1611 -> 2279 bytes .../shaders/glsl/fs_shadowmaps_hblur_vsm.bin | Bin 2585 -> 2446 bytes .../shaders/glsl/fs_shadowmaps_packdepth.bin | Bin 296 -> 369 bytes .../glsl/fs_shadowmaps_packdepth_linear.bin | Bin 248 -> 329 bytes .../glsl/fs_shadowmaps_packdepth_vsm.bin | Bin 471 -> 421 bytes .../fs_shadowmaps_packdepth_vsm_linear.bin | Bin 388 -> 367 bytes .../shaders/glsl/fs_shadowmaps_texture.bin | Bin 168 -> 212 bytes .../glsl/fs_shadowmaps_unpackdepth.bin | Bin 366 -> 432 bytes .../glsl/fs_shadowmaps_unpackdepth_vsm.bin | Bin 342 -> 357 bytes .../shaders/glsl/fs_shadowmaps_vblur.bin | Bin 1611 -> 2279 bytes .../shaders/glsl/fs_shadowmaps_vblur_vsm.bin | Bin 2585 -> 2446 bytes .../glsl/fs_shadowvolume_color_lighting.bin | Bin 2150 -> 1852 bytes .../glsl/fs_shadowvolume_color_texture.bin | Bin 614 -> 557 bytes .../glsl/fs_shadowvolume_svbackblank.bin | Bin 161 -> 116 bytes .../glsl/fs_shadowvolume_svbackcolor.bin | Bin 136 -> 275 bytes .../glsl/fs_shadowvolume_svbacktex1.bin | Bin 431 -> 755 bytes .../glsl/fs_shadowvolume_svbacktex2.bin | Bin 431 -> 755 bytes .../glsl/fs_shadowvolume_svfrontblank.bin | Bin 169 -> 196 bytes .../glsl/fs_shadowvolume_svfrontcolor.bin | Bin 136 -> 275 bytes .../glsl/fs_shadowvolume_svfronttex1.bin | Bin 428 -> 767 bytes .../glsl/fs_shadowvolume_svfronttex2.bin | Bin 428 -> 767 bytes .../shaders/glsl/fs_shadowvolume_svside.bin | Bin 452 -> 637 bytes .../glsl/fs_shadowvolume_svsideblank.bin | Bin 80 -> 116 bytes .../glsl/fs_shadowvolume_svsidecolor.bin | Bin 136 -> 275 bytes .../glsl/fs_shadowvolume_svsidetex.bin | Bin 552 -> 812 bytes .../shaders/glsl/fs_shadowvolume_texture.bin | Bin 168 -> 212 bytes .../glsl/fs_shadowvolume_texture_lighting.bin | Bin 2372 -> 1995 bytes examples/runtime/shaders/glsl/fs_sky.bin | Bin 689 -> 559 bytes examples/runtime/shaders/glsl/fs_sky2.bin | Bin 33639 -> 24915 bytes examples/runtime/shaders/glsl/fs_sky2_bg.bin | Bin 5608 -> 3441 bytes .../runtime/shaders/glsl/fs_sky2_shadow.bin | Bin 199 -> 184 bytes .../shaders/glsl/fs_sky_color_banding_fix.bin | Bin 863 -> 779 bytes .../runtime/shaders/glsl/fs_sky_landscape.bin | Bin 974 -> 1247 bytes examples/runtime/shaders/glsl/fs_slug.bin | Bin 15931 -> 7178 bytes examples/runtime/shaders/glsl/fs_sms_mesh.bin | Bin 7928 -> 5146 bytes .../runtime/shaders/glsl/fs_sms_mesh_pd.bin | Bin 8266 -> 6502 bytes .../runtime/shaders/glsl/fs_sms_shadow.bin | Bin 161 -> 116 bytes .../runtime/shaders/glsl/fs_sms_shadow_pd.bin | Bin 392 -> 466 bytes .../shaders/glsl/fs_sss_deferred_combine.bin | Bin 2799 -> 2210 bytes .../runtime/shaders/glsl/fs_sss_gbuffer.bin | Bin 2837 -> 2086 bytes .../shaders/glsl/fs_sss_linear_depth.bin | Bin 401 -> 291 bytes .../runtime/shaders/glsl/fs_sss_unlit.bin | Bin 1288 -> 872 bytes .../shaders/glsl/fs_stencil_color_black.bin | Bin 80 -> 116 bytes .../glsl/fs_stencil_color_lighting.bin | Bin 2156 -> 1715 bytes .../shaders/glsl/fs_stencil_color_texture.bin | Bin 614 -> 557 bytes .../shaders/glsl/fs_stencil_texture.bin | Bin 168 -> 212 bytes .../glsl/fs_stencil_texture_lighting.bin | Bin 2418 -> 1898 bytes examples/runtime/shaders/glsl/fs_terrain.bin | Bin 219 -> 234 bytes .../shaders/glsl/fs_terrain_render.bin | Bin 7056 -> 399 bytes .../shaders/glsl/fs_terrain_render_normal.bin | Bin 6995 -> 326 bytes examples/runtime/shaders/glsl/fs_tree.bin | Bin 1210 -> 1188 bytes examples/runtime/shaders/glsl/fs_update.bin | Bin 169 -> 211 bytes .../runtime/shaders/glsl/fs_update_3d.bin | Bin 450 -> 316 bytes .../runtime/shaders/glsl/fs_update_cmp.bin | Bin 187 -> 235 bytes .../runtime/shaders/glsl/fs_update_mip.bin | Bin 259 -> 307 bytes examples/runtime/shaders/glsl/fs_upsample.bin | Bin 1526 -> 904 bytes .../shaders/glsl/fs_vectordisplay_blit.bin | Bin 363 -> 322 bytes .../shaders/glsl/fs_vectordisplay_blur.bin | Bin 1929 -> 1473 bytes .../shaders/glsl/fs_vectordisplay_fb.bin | Bin 341 -> 319 bytes examples/runtime/shaders/glsl/fs_vt_mip.bin | Bin 772 -> 614 bytes examples/runtime/shaders/glsl/fs_vt_unlit.bin | Bin 1056 -> 923 bytes examples/runtime/shaders/glsl/fs_wf_mesh.bin | Bin 1487 -> 2238 bytes .../shaders/glsl/fs_wf_vertex_pulling.bin | Bin 85 -> 131 bytes .../runtime/shaders/glsl/fs_wf_wireframe.bin | Bin 715 -> 470 bytes .../runtime/shaders/glsl/vs_albedo_output.bin | Bin 426 -> 443 bytes examples/runtime/shaders/glsl/vs_assao.bin | Bin 319 -> 294 bytes .../runtime/shaders/glsl/vs_assao_gbuffer.bin | Bin 577 -> 509 bytes .../runtime/shaders/glsl/vs_bokeh_forward.bin | Bin 1040 -> 754 bytes .../shaders/glsl/vs_bokeh_screenquad.bin | Bin 319 -> 294 bytes examples/runtime/shaders/glsl/vs_bump.bin | Bin 1359 -> 981 bytes .../shaders/glsl/vs_bump_instanced.bin | Bin 1506 -> 1111 bytes examples/runtime/shaders/glsl/vs_bunnylod.bin | Bin 539 -> 408 bytes examples/runtime/shaders/glsl/vs_callback.bin | Bin 475 -> 397 bytes examples/runtime/shaders/glsl/vs_cubes.bin | Bin 303 -> 278 bytes .../shaders/glsl/vs_deferred_combine.bin | Bin 315 -> 290 bytes .../shaders/glsl/vs_deferred_debug.bin | Bin 315 -> 290 bytes .../shaders/glsl/vs_deferred_debug_line.bin | Bin 303 -> 278 bytes .../runtime/shaders/glsl/vs_deferred_geom.bin | Bin 1608 -> 1067 bytes .../shaders/glsl/vs_deferred_light.bin | Bin 315 -> 290 bytes .../shaders/glsl/vs_denoise_gbuffer.bin | Bin 1547 -> 965 bytes .../shaders/glsl/vs_denoise_screenquad.bin | Bin 319 -> 294 bytes .../runtime/shaders/glsl/vs_fsr_forward.bin | Bin 1033 -> 726 bytes .../shaders/glsl/vs_fsr_screenquad.bin | Bin 319 -> 294 bytes .../runtime/shaders/glsl/vs_fullscreen.bin | Bin 315 -> 290 bytes .../vs_gdr_instanced_indirect_rendering.bin | Bin 542 -> 451 bytes .../shaders/glsl/vs_gdr_render_occlusion.bin | Bin 417 -> 377 bytes examples/runtime/shaders/glsl/vs_hdr_blur.bin | Bin 1395 -> 944 bytes .../runtime/shaders/glsl/vs_hdr_bright.bin | Bin 315 -> 290 bytes examples/runtime/shaders/glsl/vs_hdr_lum.bin | Bin 315 -> 290 bytes .../runtime/shaders/glsl/vs_hdr_lumavg.bin | Bin 315 -> 290 bytes examples/runtime/shaders/glsl/vs_hdr_mesh.bin | Bin 626 -> 497 bytes .../runtime/shaders/glsl/vs_hdr_skybox.bin | Bin 315 -> 290 bytes .../runtime/shaders/glsl/vs_hdr_tonemap.bin | Bin 1325 -> 964 bytes examples/runtime/shaders/glsl/vs_hextile.bin | Bin 609 -> 447 bytes examples/runtime/shaders/glsl/vs_ibl_mesh.bin | Bin 638 -> 509 bytes .../runtime/shaders/glsl/vs_ibl_skybox.bin | Bin 752 -> 570 bytes .../runtime/shaders/glsl/vs_instancing.bin | Bin 550 -> 508 bytes examples/runtime/shaders/glsl/vs_layered.bin | Bin 646 -> 573 bytes .../runtime/shaders/glsl/vs_layered_blit.bin | Bin 239 -> 215 bytes .../runtime/shaders/glsl/vs_layered_eye.bin | Bin 575 -> 469 bytes examples/runtime/shaders/glsl/vs_mesh.bin | Bin 1385 -> 965 bytes examples/runtime/shaders/glsl/vs_oit.bin | Bin 571 -> 384 bytes examples/runtime/shaders/glsl/vs_oit_blit.bin | Bin 315 -> 290 bytes examples/runtime/shaders/glsl/vs_particle.bin | Bin 841 -> 619 bytes .../shaders/glsl/vs_picking_shaded.bin | Bin 737 -> 673 bytes examples/runtime/shaders/glsl/vs_pom.bin | Bin 1389 -> 1000 bytes .../runtime/shaders/glsl/vs_raymarching.bin | Bin 386 -> 373 bytes .../runtime/shaders/glsl/vs_rsm_combine.bin | Bin 315 -> 290 bytes .../runtime/shaders/glsl/vs_rsm_gbuffer.bin | Bin 481 -> 403 bytes .../runtime/shaders/glsl/vs_rsm_lbuffer.bin | Bin 1257 -> 1120 bytes .../runtime/shaders/glsl/vs_rsm_shadow.bin | Bin 486 -> 414 bytes .../shaders/glsl/vs_shadowmaps_color.bin | Bin 232 -> 195 bytes .../glsl/vs_shadowmaps_color_lighting.bin | Bin 894 -> 683 bytes .../glsl/vs_shadowmaps_color_lighting_csm.bin | Bin 1481 -> 1221 bytes .../vs_shadowmaps_color_lighting_linear.bin | Bin 939 -> 711 bytes ...s_shadowmaps_color_lighting_linear_csm.bin | Bin 1645 -> 1325 bytes ..._shadowmaps_color_lighting_linear_omni.bin | Bin 1572 -> 1285 bytes .../vs_shadowmaps_color_lighting_omni.bin | Bin 1408 -> 1181 bytes .../glsl/vs_shadowmaps_color_texture.bin | Bin 315 -> 290 bytes .../shaders/glsl/vs_shadowmaps_depth.bin | Bin 232 -> 195 bytes .../shaders/glsl/vs_shadowmaps_hblur.bin | Bin 1404 -> 1010 bytes .../shaders/glsl/vs_shadowmaps_packdepth.bin | Bin 285 -> 246 bytes .../glsl/vs_shadowmaps_packdepth_linear.bin | Bin 298 -> 257 bytes .../shaders/glsl/vs_shadowmaps_texture.bin | Bin 315 -> 290 bytes .../glsl/vs_shadowmaps_texture_lighting.bin | Bin 666 -> 553 bytes .../glsl/vs_shadowmaps_unpackdepth.bin | Bin 315 -> 290 bytes .../shaders/glsl/vs_shadowmaps_vblur.bin | Bin 1404 -> 1010 bytes .../glsl/vs_shadowvolume_color_lighting.bin | Bin 583 -> 458 bytes .../glsl/vs_shadowvolume_color_texture.bin | Bin 315 -> 290 bytes .../shaders/glsl/vs_shadowvolume_svback.bin | Bin 432 -> 383 bytes .../shaders/glsl/vs_shadowvolume_svfront.bin | Bin 232 -> 195 bytes .../shaders/glsl/vs_shadowvolume_svside.bin | Bin 598 -> 587 bytes .../shaders/glsl/vs_shadowvolume_texture.bin | Bin 315 -> 290 bytes .../glsl/vs_shadowvolume_texture_lighting.bin | Bin 666 -> 553 bytes examples/runtime/shaders/glsl/vs_sky.bin | Bin 3254 -> 1983 bytes examples/runtime/shaders/glsl/vs_sky2.bin | Bin 556 -> 425 bytes examples/runtime/shaders/glsl/vs_sky2_bg.bin | Bin 227 -> 183 bytes .../runtime/shaders/glsl/vs_sky2_shadow.bin | Bin 447 -> 379 bytes .../runtime/shaders/glsl/vs_sky_landscape.bin | Bin 532 -> 470 bytes examples/runtime/shaders/glsl/vs_slug.bin | Bin 1862 -> 1340 bytes examples/runtime/shaders/glsl/vs_sms_mesh.bin | Bin 844 -> 663 bytes .../runtime/shaders/glsl/vs_sms_shadow.bin | Bin 232 -> 195 bytes .../runtime/shaders/glsl/vs_sms_shadow_pd.bin | Bin 285 -> 246 bytes .../runtime/shaders/glsl/vs_sss_gbuffer.bin | Bin 782 -> 576 bytes .../shaders/glsl/vs_sss_screenquad.bin | Bin 319 -> 294 bytes .../runtime/shaders/glsl/vs_stencil_color.bin | Bin 232 -> 195 bytes .../glsl/vs_stencil_color_lighting.bin | Bin 583 -> 458 bytes .../shaders/glsl/vs_stencil_color_texture.bin | Bin 315 -> 290 bytes .../shaders/glsl/vs_stencil_texture.bin | Bin 315 -> 290 bytes .../glsl/vs_stencil_texture_lighting.bin | Bin 666 -> 553 bytes examples/runtime/shaders/glsl/vs_terrain.bin | Bin 367 -> 340 bytes .../glsl/vs_terrain_height_texture.bin | Bin 513 -> 477 bytes .../shaders/glsl/vs_terrain_render.bin | Bin 7618 -> 1704 bytes examples/runtime/shaders/glsl/vs_tree.bin | Bin 727 -> 614 bytes examples/runtime/shaders/glsl/vs_update.bin | Bin 315 -> 290 bytes .../shaders/glsl/vs_vectordisplay_fb.bin | Bin 386 -> 373 bytes .../runtime/shaders/glsl/vs_vt_generic.bin | Bin 426 -> 348 bytes examples/runtime/shaders/glsl/vs_wf_mesh.bin | Bin 700 -> 583 bytes .../shaders/glsl/vs_wf_vertex_pulling.bin | Bin 13887 -> 3091 bytes .../runtime/shaders/glsl/vs_wf_wireframe.bin | Bin 530 -> 450 bytes include/bgfx/bgfx.h | 4 +- include/bgfx/c99/bgfx.h | 4 +- include/bgfx/defines.h | 2 +- scripts/bgfx.idl | 6 +- scripts/genie.lua | 4 +- scripts/geometryv.lua | 4 +- scripts/shader-embeded.mk | 10 +- scripts/shader.mk | 10 +- scripts/shaderc.lua | 265 - scripts/texturev.lua | 4 +- src/bgfx_p.h | 36 +- src/bgfx_shader.sh | 55 +- src/config.h | 14 +- src/cs_mipgen_oddx.bin.h | 1354 ++-- src/cs_mipgen_oddxy.bin.h | 1411 ++-- src/cs_mipgen_oddy.bin.h | 1354 ++-- src/cs_mipgen_pow2.bin.h | 1320 ++-- src/cs_yuv_to_rgb.bin.h | 779 +- src/fs_clear0.bin.h | 40 +- src/fs_clear1.bin.h | 52 +- src/fs_clear2.bin.h | 62 +- src/fs_clear3.bin.h | 73 +- src/fs_clear4.bin.h | 78 +- src/fs_clear5.bin.h | 92 +- src/fs_clear6.bin.h | 102 +- src/fs_clear7.bin.h | 113 +- src/fs_debugfont.bin.h | 97 +- src/glcontext_egl.cpp | 2 +- src/glcontext_html5.cpp | 35 +- src/glcontext_html5.h | 2 +- src/glcontext_wgl.cpp | 7 - src/glimports.h | 112 +- src/makefile | 4 +- src/renderer_gl.cpp | 1204 +-- src/renderer_gl.h | 67 +- src/vs_clear.bin.h | 55 +- src/vs_debugfont.bin.h | 113 +- tools/geometryv/fs_mesh.bin.h | 374 +- tools/geometryv/vs_mesh.bin.h | 107 +- tools/shaderc/shaderc.cpp | 651 +- tools/shaderc/shaderc.h | 8 - tools/shaderc/shaderc_glsl.cpp | 730 +- tools/texturev/fs_texture.bin.h | 730 +- tools/texturev/fs_texture_3d.bin.h | 743 +- tools/texturev/fs_texture_array.bin.h | 142 +- tools/texturev/fs_texture_cube.bin.h | 774 +- tools/texturev/fs_texture_cube2.bin.h | 726 +- tools/texturev/fs_texture_msdf.bin.h | 130 +- tools/texturev/fs_texture_msdf.sc | 4 +- tools/texturev/fs_texture_sdf.bin.h | 131 +- tools/texturev/vs_texture.bin.h | 95 +- tools/texturev/vs_texture_cube.bin.h | 94 +- 918 files changed, 9177 insertions(+), 116077 deletions(-) delete mode 100755 3rdparty/glsl-optimizer/generateParsers.sh delete mode 100644 3rdparty/glsl-optimizer/include/c99/inttypes.h delete mode 100644 3rdparty/glsl-optimizer/include/c99/stdbool.h delete mode 100644 3rdparty/glsl-optimizer/include/c99/stdint.h delete mode 100644 3rdparty/glsl-optimizer/include/c99_compat.h delete mode 100644 3rdparty/glsl-optimizer/license.txt delete mode 100644 3rdparty/glsl-optimizer/src/getopt/getopt.h delete mode 100644 3rdparty/glsl-optimizer/src/getopt/getopt_long.c delete mode 100644 3rdparty/glsl-optimizer/src/glsl/Makefile delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ast.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ast_array_index.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ast_expr.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ast_function.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ast_to_hir.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ast_type.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/builtin_functions.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/builtin_type_macros.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/builtin_types.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/builtin_variables.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-lex.c delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-lex.l delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.c delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.y delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glcpp/pp.c delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glsl_lexer.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glsl_lexer.ll delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glsl_optimizer.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glsl_optimizer.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glsl_parser.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glsl_parser.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glsl_parser.yy delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glsl_parser_extras.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glsl_parser_extras.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glsl_symbol_table.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glsl_symbol_table.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glsl_types.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/glsl_types.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/hir_field_selection.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_basic_block.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_basic_block.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_builder.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_builder.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_clone.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_constant_expression.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_equals.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_expression_flattening.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_expression_flattening.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_function.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_function_can_inline.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_function_detect_recursion.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_function_inlining.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_hierarchical_visitor.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_hierarchical_visitor.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_hv_accept.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_import_prototypes.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_optimization.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_print_metal_visitor.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_print_metal_visitor.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_print_visitor.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_print_visitor.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_rvalue_visitor.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_rvalue_visitor.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_stats.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_stats.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_uniform.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_unused_structs.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_unused_structs.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_validate.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_variable_refcount.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_variable_refcount.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/ir_visitor.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/link_atomics.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/link_functions.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/link_interface_blocks.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/link_uniform_block_active_visitor.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/link_uniform_block_active_visitor.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/link_uniform_blocks.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/link_uniform_initializers.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/link_uniforms.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/link_varyings.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/link_varyings.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/linker.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/linker.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/list.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/loop_analysis.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/loop_analysis.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/loop_controls.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/loop_unroll.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_clip_distance.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_discard.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_discard_flow.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_if_to_cond_assign.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_instructions.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_jumps.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_mat_op_to_vec.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_named_interface_blocks.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_noise.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_offset_array.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_output_reads.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_packed_varyings.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_packing_builtins.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_ubo_reference.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_variable_index_to_cond_assign.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_vec_index_to_cond_assign.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_vec_index_to_swizzle.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_vector.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_vector_insert.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/lower_vertex_id.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/main.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_algebraic.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_array_splitting.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_constant_folding.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_constant_propagation.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_constant_variable.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_copy_propagation.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_copy_propagation_elements.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_cse.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_dead_builtin_variables.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_dead_builtin_varyings.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_dead_code.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_dead_code_local.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_dead_functions.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_flatten_nested_if_blocks.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_flip_matrices.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_function_inlining.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_if_simplification.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_minmax.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_noop_swizzle.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_rebalance_tree.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_redundant_jumps.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_structure_splitting.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_swizzle_swizzle.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_tree_grafting.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/opt_vectorize.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/program.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/s_expression.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/s_expression.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/standalone_scaffolding.cpp delete mode 100644 3rdparty/glsl-optimizer/src/glsl/standalone_scaffolding.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl/strtod.c delete mode 100644 3rdparty/glsl-optimizer/src/glsl/strtod.h delete mode 100644 3rdparty/glsl-optimizer/src/glsl_optimizer_lib.gyp delete mode 100644 3rdparty/glsl-optimizer/src/mesa/main/compiler.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/main/config.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/main/context.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/main/core.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/main/dd.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/main/errors.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/main/glheader.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/main/glminimal.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/main/imports.c delete mode 100644 3rdparty/glsl-optimizer/src/mesa/main/imports.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/main/macros.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/main/mtypes.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/main/simple_list.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/program/hash_table.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/program/prog_hash_table.c delete mode 100644 3rdparty/glsl-optimizer/src/mesa/program/prog_instruction.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/program/prog_parameter.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/program/prog_statevars.h delete mode 100644 3rdparty/glsl-optimizer/src/mesa/program/symbol_table.c delete mode 100644 3rdparty/glsl-optimizer/src/mesa/program/symbol_table.h delete mode 100644 3rdparty/glsl-optimizer/src/node/binding.cpp delete mode 100644 3rdparty/glsl-optimizer/src/node/compiler.cpp delete mode 100644 3rdparty/glsl-optimizer/src/node/compiler.h delete mode 100644 3rdparty/glsl-optimizer/src/node/shader.cpp delete mode 100644 3rdparty/glsl-optimizer/src/node/shader.h delete mode 100644 3rdparty/glsl-optimizer/src/util/Makefile.sources delete mode 100644 3rdparty/glsl-optimizer/src/util/hash_table.c delete mode 100644 3rdparty/glsl-optimizer/src/util/hash_table.h delete mode 100644 3rdparty/glsl-optimizer/src/util/macros.h delete mode 100644 3rdparty/glsl-optimizer/src/util/ralloc.c delete mode 100644 3rdparty/glsl-optimizer/src/util/ralloc.h delete mode 100644 3rdparty/khronos/GLES2/gl2.h delete mode 100644 3rdparty/khronos/GLES2/gl2platform.h diff --git a/3rdparty/.editorconfig b/3rdparty/.editorconfig index ca5c3574b..32ad3970d 100644 --- a/3rdparty/.editorconfig +++ b/3rdparty/.editorconfig @@ -31,7 +31,3 @@ indent_size = 4 [remotery/*] indent_style = space indent_size = 4 - -[glsl-optimizer/*] -indent_style = space -indent_size = 3 diff --git a/3rdparty/glsl-optimizer/generateParsers.sh b/3rdparty/glsl-optimizer/generateParsers.sh deleted file mode 100755 index 5b9cdfb90..000000000 --- a/3rdparty/glsl-optimizer/generateParsers.sh +++ /dev/null @@ -1,5 +0,0 @@ -#! /bin/sh -flex --nounistd -osrc/glsl/glcpp/glcpp-lex.c src/glsl/glcpp/glcpp-lex.l -flex --nounistd -osrc/glsl/glsl_lexer.cpp src/glsl/glsl_lexer.ll -bison -v -o "src/glsl/glcpp/glcpp-parse.c" -p "glcpp_parser_" --defines=src/glsl/glcpp/glcpp-parse.h src/glsl/glcpp/glcpp-parse.y -bison -v -o "src/glsl/glsl_parser.cpp" -p "_mesa_glsl_" --defines=src/glsl/glsl_parser.h src/glsl/glsl_parser.yy diff --git a/3rdparty/glsl-optimizer/include/c99/inttypes.h b/3rdparty/glsl-optimizer/include/c99/inttypes.h deleted file mode 100644 index 4b3828a21..000000000 --- a/3rdparty/glsl-optimizer/include/c99/inttypes.h +++ /dev/null @@ -1,305 +0,0 @@ -// ISO C9x compliant inttypes.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_INTTYPES_H_ // [ -#define _MSC_INTTYPES_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include "stdint.h" - -// 7.8 Format conversion of integer types - -typedef struct { - intmax_t quot; - intmax_t rem; -} imaxdiv_t; - -// 7.8.1 Macros for format specifiers - -#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 - -// The fprintf macros for signed integers are: -#define PRId8 "d" -#define PRIi8 "i" -#define PRIdLEAST8 "d" -#define PRIiLEAST8 "i" -#define PRIdFAST8 "d" -#define PRIiFAST8 "i" - -#define PRId16 "hd" -#define PRIi16 "hi" -#define PRIdLEAST16 "hd" -#define PRIiLEAST16 "hi" -#define PRIdFAST16 "hd" -#define PRIiFAST16 "hi" - -#define PRId32 "I32d" -#define PRIi32 "I32i" -#define PRIdLEAST32 "I32d" -#define PRIiLEAST32 "I32i" -#define PRIdFAST32 "I32d" -#define PRIiFAST32 "I32i" - -#define PRId64 "I64d" -#define PRIi64 "I64i" -#define PRIdLEAST64 "I64d" -#define PRIiLEAST64 "I64i" -#define PRIdFAST64 "I64d" -#define PRIiFAST64 "I64i" - -#define PRIdMAX "I64d" -#define PRIiMAX "I64i" - -#define PRIdPTR "Id" -#define PRIiPTR "Ii" - -// The fprintf macros for unsigned integers are: -#define PRIo8 "o" -#define PRIu8 "u" -#define PRIx8 "x" -#define PRIX8 "X" -#define PRIoLEAST8 "o" -#define PRIuLEAST8 "u" -#define PRIxLEAST8 "x" -#define PRIXLEAST8 "X" -#define PRIoFAST8 "o" -#define PRIuFAST8 "u" -#define PRIxFAST8 "x" -#define PRIXFAST8 "X" - -#define PRIo16 "ho" -#define PRIu16 "hu" -#define PRIx16 "hx" -#define PRIX16 "hX" -#define PRIoLEAST16 "ho" -#define PRIuLEAST16 "hu" -#define PRIxLEAST16 "hx" -#define PRIXLEAST16 "hX" -#define PRIoFAST16 "ho" -#define PRIuFAST16 "hu" -#define PRIxFAST16 "hx" -#define PRIXFAST16 "hX" - -#define PRIo32 "I32o" -#define PRIu32 "I32u" -#define PRIx32 "I32x" -#define PRIX32 "I32X" -#define PRIoLEAST32 "I32o" -#define PRIuLEAST32 "I32u" -#define PRIxLEAST32 "I32x" -#define PRIXLEAST32 "I32X" -#define PRIoFAST32 "I32o" -#define PRIuFAST32 "I32u" -#define PRIxFAST32 "I32x" -#define PRIXFAST32 "I32X" - -#define PRIo64 "I64o" -#define PRIu64 "I64u" -#define PRIx64 "I64x" -#define PRIX64 "I64X" -#define PRIoLEAST64 "I64o" -#define PRIuLEAST64 "I64u" -#define PRIxLEAST64 "I64x" -#define PRIXLEAST64 "I64X" -#define PRIoFAST64 "I64o" -#define PRIuFAST64 "I64u" -#define PRIxFAST64 "I64x" -#define PRIXFAST64 "I64X" - -#define PRIoMAX "I64o" -#define PRIuMAX "I64u" -#define PRIxMAX "I64x" -#define PRIXMAX "I64X" - -#define PRIoPTR "Io" -#define PRIuPTR "Iu" -#define PRIxPTR "Ix" -#define PRIXPTR "IX" - -// The fscanf macros for signed integers are: -#define SCNd8 "d" -#define SCNi8 "i" -#define SCNdLEAST8 "d" -#define SCNiLEAST8 "i" -#define SCNdFAST8 "d" -#define SCNiFAST8 "i" - -#define SCNd16 "hd" -#define SCNi16 "hi" -#define SCNdLEAST16 "hd" -#define SCNiLEAST16 "hi" -#define SCNdFAST16 "hd" -#define SCNiFAST16 "hi" - -#define SCNd32 "ld" -#define SCNi32 "li" -#define SCNdLEAST32 "ld" -#define SCNiLEAST32 "li" -#define SCNdFAST32 "ld" -#define SCNiFAST32 "li" - -#define SCNd64 "I64d" -#define SCNi64 "I64i" -#define SCNdLEAST64 "I64d" -#define SCNiLEAST64 "I64i" -#define SCNdFAST64 "I64d" -#define SCNiFAST64 "I64i" - -#define SCNdMAX "I64d" -#define SCNiMAX "I64i" - -#ifdef _WIN64 // [ -# define SCNdPTR "I64d" -# define SCNiPTR "I64i" -#else // _WIN64 ][ -# define SCNdPTR "ld" -# define SCNiPTR "li" -#endif // _WIN64 ] - -// The fscanf macros for unsigned integers are: -#define SCNo8 "o" -#define SCNu8 "u" -#define SCNx8 "x" -#define SCNX8 "X" -#define SCNoLEAST8 "o" -#define SCNuLEAST8 "u" -#define SCNxLEAST8 "x" -#define SCNXLEAST8 "X" -#define SCNoFAST8 "o" -#define SCNuFAST8 "u" -#define SCNxFAST8 "x" -#define SCNXFAST8 "X" - -#define SCNo16 "ho" -#define SCNu16 "hu" -#define SCNx16 "hx" -#define SCNX16 "hX" -#define SCNoLEAST16 "ho" -#define SCNuLEAST16 "hu" -#define SCNxLEAST16 "hx" -#define SCNXLEAST16 "hX" -#define SCNoFAST16 "ho" -#define SCNuFAST16 "hu" -#define SCNxFAST16 "hx" -#define SCNXFAST16 "hX" - -#define SCNo32 "lo" -#define SCNu32 "lu" -#define SCNx32 "lx" -#define SCNX32 "lX" -#define SCNoLEAST32 "lo" -#define SCNuLEAST32 "lu" -#define SCNxLEAST32 "lx" -#define SCNXLEAST32 "lX" -#define SCNoFAST32 "lo" -#define SCNuFAST32 "lu" -#define SCNxFAST32 "lx" -#define SCNXFAST32 "lX" - -#define SCNo64 "I64o" -#define SCNu64 "I64u" -#define SCNx64 "I64x" -#define SCNX64 "I64X" -#define SCNoLEAST64 "I64o" -#define SCNuLEAST64 "I64u" -#define SCNxLEAST64 "I64x" -#define SCNXLEAST64 "I64X" -#define SCNoFAST64 "I64o" -#define SCNuFAST64 "I64u" -#define SCNxFAST64 "I64x" -#define SCNXFAST64 "I64X" - -#define SCNoMAX "I64o" -#define SCNuMAX "I64u" -#define SCNxMAX "I64x" -#define SCNXMAX "I64X" - -#ifdef _WIN64 // [ -# define SCNoPTR "I64o" -# define SCNuPTR "I64u" -# define SCNxPTR "I64x" -# define SCNXPTR "I64X" -#else // _WIN64 ][ -# define SCNoPTR "lo" -# define SCNuPTR "lu" -# define SCNxPTR "lx" -# define SCNXPTR "lX" -#endif // _WIN64 ] - -#endif // __STDC_FORMAT_MACROS ] - -// 7.8.2 Functions for greatest-width integer types - -// 7.8.2.1 The imaxabs function -#define imaxabs _abs64 - -// 7.8.2.2 The imaxdiv function - -// This is modified version of div() function from Microsoft's div.c found -// in %MSVC.NET%\crt\src\div.c -#ifdef STATIC_IMAXDIV // [ -static -#else // STATIC_IMAXDIV ][ -_inline -#endif // STATIC_IMAXDIV ] -imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) -{ - imaxdiv_t result; - - result.quot = numer / denom; - result.rem = numer % denom; - - if (numer < 0 && result.rem > 0) { - // did division wrong; must fix up - ++result.quot; - result.rem -= denom; - } - - return result; -} - -// 7.8.2.3 The strtoimax and strtoumax functions -#define strtoimax _strtoi64 -#define strtoumax _strtoui64 - -// 7.8.2.4 The wcstoimax and wcstoumax functions -#define wcstoimax _wcstoi64 -#define wcstoumax _wcstoui64 - - -#endif // _MSC_INTTYPES_H_ ] diff --git a/3rdparty/glsl-optimizer/include/c99/stdbool.h b/3rdparty/glsl-optimizer/include/c99/stdbool.h deleted file mode 100644 index 53439550c..000000000 --- a/3rdparty/glsl-optimizer/include/c99/stdbool.h +++ /dev/null @@ -1,47 +0,0 @@ -/************************************************************************** - * - * Copyright 2007-2010 VMware, Inc. - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * THE 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. - * - **************************************************************************/ - -#ifndef _STDBOOL_H_ -#define _STDBOOL_H_ - -#ifndef __cplusplus - -#define false 0 -#define true 1 -#define bool _Bool - -/* For compilers that don't have the builtin _Bool type. */ -#if ((defined(_MSC_VER) && _MSC_VER < 1800) || \ - (defined __GNUC__&& __STDC_VERSION__ < 199901L && __GNUC__ < 3)) && !defined(_lint) -typedef unsigned char _Bool; -#endif - -#endif /* !__cplusplus */ - -#define __bool_true_false_are_defined 1 - -#endif /* !_STDBOOL_H_ */ diff --git a/3rdparty/glsl-optimizer/include/c99/stdint.h b/3rdparty/glsl-optimizer/include/c99/stdint.h deleted file mode 100644 index d02608a59..000000000 --- a/3rdparty/glsl-optimizer/include/c99/stdint.h +++ /dev/null @@ -1,247 +0,0 @@ -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2008 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_STDINT_H_ // [ -#define _MSC_STDINT_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include - -// For Visual Studio 6 in C++ mode and for many Visual Studio versions when -// compiling for ARM we should wrap include with 'extern "C++" {}' -// or compiler give many errors like this: -// error C2733: second C linkage of overloaded function 'wmemchr' not allowed -#ifdef __cplusplus -extern "C" { -#endif -# include -#ifdef __cplusplus -} -#endif - -// Define _W64 macros to mark types changing their size, like intptr_t. -#ifndef _W64 -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif - - -// 7.18.1 Integer types - -// 7.18.1.1 Exact-width integer types - -// Visual Studio 6 and Embedded Visual C++ 4 doesn't -// realize that, e.g. char has the same size as __int8 -// so we give up on __intX for them. -#if (_MSC_VER < 1300) - typedef signed char int8_t; - typedef signed short int16_t; - typedef signed int int32_t; - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned int uint32_t; -#else - typedef signed __int8 int8_t; - typedef signed __int16 int16_t; - typedef signed __int32 int32_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; -#endif -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; - - -// 7.18.1.2 Minimum-width integer types -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -typedef int64_t int_least64_t; -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -typedef uint64_t uint_least64_t; - -// 7.18.1.3 Fastest minimum-width integer types -typedef int8_t int_fast8_t; -typedef int16_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef int64_t int_fast64_t; -typedef uint8_t uint_fast8_t; -typedef uint16_t uint_fast16_t; -typedef uint32_t uint_fast32_t; -typedef uint64_t uint_fast64_t; - -// 7.18.1.4 Integer types capable of holding object pointers -#ifdef _WIN64 // [ - typedef signed __int64 intptr_t; - typedef unsigned __int64 uintptr_t; -#else // _WIN64 ][ - typedef _W64 signed int intptr_t; - typedef _W64 unsigned int uintptr_t; -#endif // _WIN64 ] - -// 7.18.1.5 Greatest-width integer types -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; - - -// 7.18.2 Limits of specified-width integer types - -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 - -// 7.18.2.1 Limits of exact-width integer types -#define INT8_MIN ((int8_t)_I8_MIN) -#define INT8_MAX _I8_MAX -#define INT16_MIN ((int16_t)_I16_MIN) -#define INT16_MAX _I16_MAX -#define INT32_MIN ((int32_t)_I32_MIN) -#define INT32_MAX _I32_MAX -#define INT64_MIN ((int64_t)_I64_MIN) -#define INT64_MAX _I64_MAX -#define UINT8_MAX _UI8_MAX -#define UINT16_MAX _UI16_MAX -#define UINT32_MAX _UI32_MAX -#define UINT64_MAX _UI64_MAX - -// 7.18.2.2 Limits of minimum-width integer types -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -// 7.18.2.3 Limits of fastest minimum-width integer types -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -// 7.18.2.4 Limits of integer types capable of holding object pointers -#ifdef _WIN64 // [ -# define INTPTR_MIN INT64_MIN -# define INTPTR_MAX INT64_MAX -# define UINTPTR_MAX UINT64_MAX -#else // _WIN64 ][ -# define INTPTR_MIN INT32_MIN -# define INTPTR_MAX INT32_MAX -# define UINTPTR_MAX UINT32_MAX -#endif // _WIN64 ] - -// 7.18.2.5 Limits of greatest-width integer types -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -// 7.18.3 Limits of other integer types - -#ifdef _WIN64 // [ -# define PTRDIFF_MIN _I64_MIN -# define PTRDIFF_MAX _I64_MAX -#else // _WIN64 ][ -# define PTRDIFF_MIN _I32_MIN -# define PTRDIFF_MAX _I32_MAX -#endif // _WIN64 ] - -#define SIG_ATOMIC_MIN INT_MIN -#define SIG_ATOMIC_MAX INT_MAX - -#ifndef SIZE_MAX // [ -# ifdef _WIN64 // [ -# define SIZE_MAX _UI64_MAX -# else // _WIN64 ][ -# define SIZE_MAX _UI32_MAX -# endif // _WIN64 ] -#endif // SIZE_MAX ] - -// WCHAR_MIN and WCHAR_MAX are also defined in -#ifndef WCHAR_MIN // [ -# define WCHAR_MIN 0 -#endif // WCHAR_MIN ] -#ifndef WCHAR_MAX // [ -# define WCHAR_MAX _UI16_MAX -#endif // WCHAR_MAX ] - -#define WINT_MIN 0 -#define WINT_MAX _UI16_MAX - -#endif // __STDC_LIMIT_MACROS ] - - -// 7.18.4 Limits of other integer types - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -#define INTMAX_C INT64_C -#define UINTMAX_C UINT64_C - -#endif // __STDC_CONSTANT_MACROS ] - - -#endif // _MSC_STDINT_H_ ] diff --git a/3rdparty/glsl-optimizer/include/c99_compat.h b/3rdparty/glsl-optimizer/include/c99_compat.h deleted file mode 100644 index 5caddffc9..000000000 --- a/3rdparty/glsl-optimizer/include/c99_compat.h +++ /dev/null @@ -1,180 +0,0 @@ -/************************************************************************** - * - * Copyright 2007-2013 VMware, Inc. - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - **************************************************************************/ - -#ifndef _C99_COMPAT_H_ -#define _C99_COMPAT_H_ - - -/* - * MSVC hacks. - */ -#if defined(_MSC_VER) - -// BK - STFU! -# pragma warning(disable:4244) // warning C4244: 'function' : conversion from 'intmax_t' to 'int', possible loss of data -# pragma warning(disable:4267) // warning C4267: '=' : conversion from 'size_t' to 'unsigned int', possible loss of data -# pragma warning(disable:4351) // warning C4351: new behavior: elements of array '`anonymous-namespace'::per_vertex_accumulator::fields' will be default initialized -# pragma warning(disable:4345) // warning C4345: behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized -# pragma warning(disable:4715) // warning C4715: 'write_mask_to_swizzle' : not all control paths return a value -# pragma warning(disable:4800) // warning C4800: 'unsigned int' : forcing value to bool 'true' or 'false' (performance warning) -# pragma warning(disable:4456) // warning C4456: declaration of 'deref_var' hides previous local declaration -# pragma warning(disable:4457) // warning C4457: declaration of 'idx' hides function parameter -# pragma warning(disable:4458) // warning C4458: declaration of 'type' hides class member -# pragma warning(disable:4018) // warning C4018: '<': signed / unsigned mismatch -# pragma warning(disable:4805) // warning C4805: '|=': unsafe mix of type 'GLboolean' and type 'bool' in operation - - /* - * Visual Studio 2012 will complain if we define the `inline` keyword, but - * actually it only supports the keyword on C++. - * - * To avoid this the _ALLOW_KEYWORD_MACROS must be set. - */ -# if (_MSC_VER >= 1700) && !defined(_ALLOW_KEYWORD_MACROS) -# define _ALLOW_KEYWORD_MACROS -# endif - - /* - * XXX: MSVC has a `__restrict` keyword, but it also has a - * `__declspec(restrict)` modifier, so it is impossible to define a - * `restrict` macro without interfering with the latter. Furthermore the - * MSVC standard library uses __declspec(restrict) under the _CRTRESTRICT - * macro. For now resolve this issue by redefining _CRTRESTRICT, but going - * forward we should probably should stop using restrict, especially - * considering that our code does not obbey strict aliasing rules any way. - */ -# include -# undef _CRTRESTRICT -# define _CRTRESTRICT -#else -// BK - STFU! -# pragma GCC diagnostic ignored "-Wunknown-pragmas" // for clang to disable GCC pragmas -# pragma GCC diagnostic ignored "-Wpragmas" // for GCC to disable clang pragmas -# pragma GCC diagnostic ignored "-Wformat-extra-args" -# pragma GCC diagnostic ignored "-Wignored-qualifiers" -# pragma GCC diagnostic ignored "-Wmissing-field-initializers" -# pragma GCC diagnostic ignored "-Wreorder" -# pragma GCC diagnostic ignored "-Woverloaded-virtual" -# pragma GCC diagnostic ignored "-Wsign-compare" -# pragma GCC diagnostic ignored "-Wunneeded-internal-declaration" -# pragma GCC diagnostic ignored "-Wunused-parameter" -# pragma GCC diagnostic ignored "-Wunused-private-field" -# pragma GCC diagnostic ignored "-Wunused-variable" -# pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor" - -# if !defined(__clang__) -# pragma GCC diagnostic ignored "-Wformat=" -# pragma GCC diagnostic ignored "-Wmaybe-uninitialized" -# endif - -#endif - - -/* - * C99 inline keyword - */ -#ifndef inline -# ifdef __cplusplus - /* C++ supports inline keyword */ -# elif defined(__GNUC__) -# define inline __inline__ -# elif defined(_MSC_VER) -# define inline __inline -# elif defined(__ICL) -# define inline __inline -# elif defined(__INTEL_COMPILER) - /* Intel compiler supports inline keyword */ -# elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100) -# define inline __inline -# elif defined(__SUNPRO_C) && defined(__C99FEATURES__) - /* C99 supports inline keyword */ -# elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - /* C99 supports inline keyword */ -# else -# define inline -# endif -#endif - - -/* - * C99 restrict keyword - * - * See also: - * - http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html - */ -#ifndef restrict -# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - /* C99 */ -# elif defined(__SUNPRO_C) && defined(__C99FEATURES__) - /* C99 */ -# elif defined(__GNUC__) -# define restrict __restrict__ -# elif defined(_MSC_VER) -# define restrict __restrict -# else -# define restrict /* */ -# endif -#endif - - -/* - * C99 __func__ macro - */ -#ifndef __func__ -# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(_MSC_VER) - /* C99 */ -# elif defined(__SUNPRO_C) && defined(__C99FEATURES__) - /* C99 */ -# elif defined(__GNUC__) -# if __GNUC__ >= 2 -# define __func__ __FUNCTION__ -# else -# define __func__ "" -# endif -# elif defined(_MSC_VER) -# if _MSC_VER >= 1300 -# define __func__ __FUNCTION__ -# else -# define __func__ "" -# endif -# else -# define __func__ "" -# endif -#endif - - -/* Simple test case for debugging */ -#if 0 -static inline const char * -test_c99_compat_h(const void * restrict a, - const void * restrict b) -{ - return __func__; -} -#endif - - -#endif /* _C99_COMPAT_H_ */ diff --git a/3rdparty/glsl-optimizer/license.txt b/3rdparty/glsl-optimizer/license.txt deleted file mode 100644 index 11a04bb6f..000000000 --- a/3rdparty/glsl-optimizer/license.txt +++ /dev/null @@ -1,21 +0,0 @@ -GLSL Optimizer is licensed according to the terms of the MIT license: - -Copyright (C) 1999-2007 Brian Paul All Rights Reserved. -Copyright (C) 2010-2013 Unity Technologies All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/3rdparty/glsl-optimizer/src/getopt/getopt.h b/3rdparty/glsl-optimizer/src/getopt/getopt.h deleted file mode 100644 index 117608f48..000000000 --- a/3rdparty/glsl-optimizer/src/getopt/getopt.h +++ /dev/null @@ -1,82 +0,0 @@ -/* $OpenBSD: getopt.h,v 1.2 2008/06/26 05:42:04 ray Exp $ */ -/* $NetBSD: getopt.h,v 1.4 2000/07/07 10:43:54 ad Exp $ */ - -/*- - * Copyright (c) 2000 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Dieter Baron and Thomas Klausner. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _GETOPT_H_ -#define _GETOPT_H_ - -/* - * GNU-like getopt_long() and 4.4BSD getsubopt()/optreset extensions - */ -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -#ifdef __cplusplus -extern "C" { -#endif - -struct option { - /* name of long option */ - const char *name; - /* - * one of no_argument, required_argument, and optional_argument: - * whether option takes an argument - */ - int has_arg; - /* if not NULL, set *flag to val when option found */ - int *flag; - /* if flag not NULL, value to set *flag to; else return value */ - int val; -}; - -int getopt_long(int, char * const *, const char *, - const struct option *, int *); -int getopt_long_only(int, char * const *, const char *, - const struct option *, int *); -#ifndef _GETOPT_DEFINED_ -#define _GETOPT_DEFINED_ -int getopt(int, char * const *, const char *); -int getsubopt(char **, char * const *, char **); - -extern char *optarg; /* getopt(3) external variables */ -extern int opterr; -extern int optind; -extern int optopt; -extern int optreset; -extern char *suboptarg; /* getsubopt(3) external variable */ -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* !_GETOPT_H_ */ diff --git a/3rdparty/glsl-optimizer/src/getopt/getopt_long.c b/3rdparty/glsl-optimizer/src/getopt/getopt_long.c deleted file mode 100644 index 81268b839..000000000 --- a/3rdparty/glsl-optimizer/src/getopt/getopt_long.c +++ /dev/null @@ -1,511 +0,0 @@ -/* $OpenBSD: getopt_long.c,v 1.24 2010/07/22 19:31:53 blambert Exp $ */ -/* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ - -/* - * Copyright (c) 2002 Todd C. Miller - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Sponsored in part by the Defense Advanced Research Projects - * Agency (DARPA) and Air Force Research Laboratory, Air Force - * Materiel Command, USAF, under agreement number F39502-99-1-0512. - */ -/*- - * Copyright (c) 2000 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Dieter Baron and Thomas Klausner. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -int opterr = 1; /* if error message should be printed */ -int optind = 1; /* index into parent argv vector */ -int optopt = '?'; /* character checked for validity */ -int optreset; /* reset getopt */ -char *optarg; /* argument associated with option */ - -#define PRINT_ERROR ((opterr) && (*options != ':')) - -#define FLAG_PERMUTE 0x01 /* permute non-options to the end of argv */ -#define FLAG_ALLARGS 0x02 /* treat non-options as args to option "-1" */ -#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */ - -/* return values */ -#define BADCH (int)'?' -#define BADARG ((*options == ':') ? (int)':' : (int)'?') -#define INORDER (int)1 - -#define EMSG "" - -static int getopt_internal(int, char * const *, const char *, - const struct option *, int *, int); -static int parse_long_options(char * const *, const char *, - const struct option *, int *, int); -static int gcd(int, int); -static void permute_args(int, int, int, char * const *); - -static char *place = EMSG; /* option letter processing */ - -/* XXX: set optreset to 1 rather than these two */ -static int nonopt_start = -1; /* first non option argument (for permute) */ -static int nonopt_end = -1; /* first option after non options (for permute) */ - -/* Error messages */ -static const char recargchar[] = "option requires an argument -- %c"; -static const char recargstring[] = "option requires an argument -- %s"; -static const char ambig[] = "ambiguous option -- %.*s"; -static const char noarg[] = "option doesn't take an argument -- %.*s"; -static const char illoptchar[] = "unknown option -- %c"; -static const char illoptstring[] = "unknown option -- %s"; - -/* - * Compute the greatest common divisor of a and b. - */ -static int -gcd(int a, int b) -{ - int c; - - c = a % b; - while (c != 0) { - a = b; - b = c; - c = a % b; - } - - return (b); -} - -/* - * Exchange the block from nonopt_start to nonopt_end with the block - * from nonopt_end to opt_end (keeping the same order of arguments - * in each block). - */ -static void -permute_args(int panonopt_start, int panonopt_end, int opt_end, - char * const *nargv) -{ - int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos; - char *swap; - - /* - * compute lengths of blocks and number and size of cycles - */ - nnonopts = panonopt_end - panonopt_start; - nopts = opt_end - panonopt_end; - ncycle = gcd(nnonopts, nopts); - cyclelen = (opt_end - panonopt_start) / ncycle; - - for (i = 0; i < ncycle; i++) { - cstart = panonopt_end+i; - pos = cstart; - for (j = 0; j < cyclelen; j++) { - if (pos >= panonopt_end) - pos -= nnonopts; - else - pos += nopts; - swap = nargv[pos]; - /* LINTED const cast */ - ((char **) nargv)[pos] = nargv[cstart]; - /* LINTED const cast */ - ((char **)nargv)[cstart] = swap; - } - } -} - -/* - * parse_long_options -- - * Parse long options in argc/argv argument vector. - * Returns -1 if short_too is set and the option does not match long_options. - */ -static int -parse_long_options(char * const *nargv, const char *options, - const struct option *long_options, int *idx, int short_too) -{ - char *current_argv, *has_equal; - size_t current_argv_len; - int i, match; - - current_argv = place; - match = -1; - - optind++; - - if ((has_equal = strchr(current_argv, '=')) != NULL) { - /* argument found (--option=arg) */ - current_argv_len = has_equal - current_argv; - has_equal++; - } else - current_argv_len = strlen(current_argv); - - for (i = 0; long_options[i].name; i++) { - /* find matching long option */ - if (strncmp(current_argv, long_options[i].name, - current_argv_len)) - continue; - - if (strlen(long_options[i].name) == current_argv_len) { - /* exact match */ - match = i; - break; - } - /* - * If this is a known short option, don't allow - * a partial match of a single character. - */ - if (short_too && current_argv_len == 1) - continue; - - if (match == -1) /* partial match */ - match = i; - else { - /* ambiguous abbreviation */ - if (PRINT_ERROR) - fprintf(stderr, ambig, (int)current_argv_len, - current_argv); - optopt = 0; - return (BADCH); - } - } - if (match != -1) { /* option found */ - if (long_options[match].has_arg == no_argument - && has_equal) { - if (PRINT_ERROR) - fprintf(stderr, noarg, (int)current_argv_len, - current_argv); - /* - * XXX: GNU sets optopt to val regardless of flag - */ - if (long_options[match].flag == NULL) - optopt = long_options[match].val; - else - optopt = 0; - return (BADARG); - } - if (long_options[match].has_arg == required_argument || - long_options[match].has_arg == optional_argument) { - if (has_equal) - optarg = has_equal; - else if (long_options[match].has_arg == - required_argument) { - /* - * optional argument doesn't use next nargv - */ - optarg = nargv[optind++]; - } - } - if ((long_options[match].has_arg == required_argument) - && (optarg == NULL)) { - /* - * Missing argument; leading ':' indicates no error - * should be generated. - */ - if (PRINT_ERROR) - fprintf(stderr, recargstring, - current_argv); - /* - * XXX: GNU sets optopt to val regardless of flag - */ - if (long_options[match].flag == NULL) - optopt = long_options[match].val; - else - optopt = 0; - --optind; - return (BADARG); - } - } else { /* unknown option */ - if (short_too) { - --optind; - return (-1); - } - if (PRINT_ERROR) - fprintf(stderr, illoptstring, current_argv); - optopt = 0; - return (BADCH); - } - if (idx) - *idx = match; - if (long_options[match].flag) { - *long_options[match].flag = long_options[match].val; - return (0); - } else - return (long_options[match].val); -} - -/* - * getopt_internal -- - * Parse argc/argv argument vector. Called by user level routines. - */ -static int -getopt_internal(int nargc, char * const *nargv, const char *options, - const struct option *long_options, int *idx, int flags) -{ - char *oli; /* option letter list index */ - int optchar, short_too; - static int posixly_correct = -1; - - if (options == NULL) - return (-1); - - /* - * Disable GNU extensions if POSIXLY_CORRECT is set or options - * string begins with a '+'. - */ - if (posixly_correct == -1) - posixly_correct = (getenv("POSIXLY_CORRECT") != NULL); - if (posixly_correct || *options == '+') - flags &= ~FLAG_PERMUTE; - else if (*options == '-') - flags |= FLAG_ALLARGS; - if (*options == '+' || *options == '-') - options++; - - /* - * XXX Some GNU programs (like cvs) set optind to 0 instead of - * XXX using optreset. Work around this braindamage. - */ - if (optind == 0) - optind = optreset = 1; - - optarg = NULL; - if (optreset) - nonopt_start = nonopt_end = -1; -start: - if (optreset || !*place) { /* update scanning pointer */ - optreset = 0; - if (optind >= nargc) { /* end of argument vector */ - place = EMSG; - if (nonopt_end != -1) { - /* do permutation, if we have to */ - permute_args(nonopt_start, nonopt_end, - optind, nargv); - optind -= nonopt_end - nonopt_start; - } - else if (nonopt_start != -1) { - /* - * If we skipped non-options, set optind - * to the first of them. - */ - optind = nonopt_start; - } - nonopt_start = nonopt_end = -1; - return (-1); - } - if (*(place = nargv[optind]) != '-' || - (place[1] == '\0' && strchr(options, '-') == NULL)) { - place = EMSG; /* found non-option */ - if (flags & FLAG_ALLARGS) { - /* - * GNU extension: - * return non-option as argument to option 1 - */ - optarg = nargv[optind++]; - return (INORDER); - } - if (!(flags & FLAG_PERMUTE)) { - /* - * If no permutation wanted, stop parsing - * at first non-option. - */ - return (-1); - } - /* do permutation */ - if (nonopt_start == -1) - nonopt_start = optind; - else if (nonopt_end != -1) { - permute_args(nonopt_start, nonopt_end, - optind, nargv); - nonopt_start = optind - - (nonopt_end - nonopt_start); - nonopt_end = -1; - } - optind++; - /* process next argument */ - goto start; - } - if (nonopt_start != -1 && nonopt_end == -1) - nonopt_end = optind; - - /* - * If we have "-" do nothing, if "--" we are done. - */ - if (place[1] != '\0' && *++place == '-' && place[1] == '\0') { - optind++; - place = EMSG; - /* - * We found an option (--), so if we skipped - * non-options, we have to permute. - */ - if (nonopt_end != -1) { - permute_args(nonopt_start, nonopt_end, - optind, nargv); - optind -= nonopt_end - nonopt_start; - } - nonopt_start = nonopt_end = -1; - return (-1); - } - } - - /* - * Check long options if: - * 1) we were passed some - * 2) the arg is not just "-" - * 3) either the arg starts with -- we are getopt_long_only() - */ - if (long_options != NULL && place != nargv[optind] && - (*place == '-' || (flags & FLAG_LONGONLY))) { - short_too = 0; - if (*place == '-') - place++; /* --foo long option */ - else if (*place != ':' && strchr(options, *place) != NULL) - short_too = 1; /* could be short option too */ - - optchar = parse_long_options(nargv, options, long_options, - idx, short_too); - if (optchar != -1) { - place = EMSG; - return (optchar); - } - } - - if ((optchar = (int)*place++) == (int)':' || - (optchar == (int)'-' && *place != '\0') || - (oli = strchr(options, optchar)) == NULL) { - /* - * If the user specified "-" and '-' isn't listed in - * options, return -1 (non-option) as per POSIX. - * Otherwise, it is an unknown option character (or ':'). - */ - if (optchar == (int)'-' && *place == '\0') - return (-1); - if (!*place) - ++optind; - if (PRINT_ERROR) - fprintf(stderr, illoptchar, optchar); - optopt = optchar; - return (BADCH); - } - if (long_options != NULL && optchar == 'W' && oli[1] == ';') { - /* -W long-option */ - if (*place) /* no space */ - /* NOTHING */; - else if (++optind >= nargc) { /* no arg */ - place = EMSG; - if (PRINT_ERROR) - fprintf(stderr, recargchar, optchar); - optopt = optchar; - return (BADARG); - } else /* white space */ - place = nargv[optind]; - optchar = parse_long_options(nargv, options, long_options, - idx, 0); - place = EMSG; - return (optchar); - } - if (*++oli != ':') { /* doesn't take argument */ - if (!*place) - ++optind; - } else { /* takes (optional) argument */ - optarg = NULL; - if (*place) /* no white space */ - optarg = place; - else if (oli[1] != ':') { /* arg not optional */ - if (++optind >= nargc) { /* no arg */ - place = EMSG; - if (PRINT_ERROR) - fprintf(stderr, recargchar, optchar); - optopt = optchar; - return (BADARG); - } else - optarg = nargv[optind]; - } - place = EMSG; - ++optind; - } - /* dump back option letter */ - return (optchar); -} - -/* - * getopt -- - * Parse argc/argv argument vector. - * - * [eventually this will replace the BSD getopt] - */ -int -getopt(int nargc, char * const *nargv, const char *options) -{ - - /* - * We don't pass FLAG_PERMUTE to getopt_internal() since - * the BSD getopt(3) (unlike GNU) has never done this. - * - * Furthermore, since many privileged programs call getopt() - * before dropping privileges it makes sense to keep things - * as simple (and bug-free) as possible. - */ - return (getopt_internal(nargc, nargv, options, NULL, NULL, 0)); -} - -/* - * getopt_long -- - * Parse argc/argv argument vector. - */ -int -getopt_long(int nargc, char * const *nargv, const char *options, - const struct option *long_options, int *idx) -{ - - return (getopt_internal(nargc, nargv, options, long_options, idx, - FLAG_PERMUTE)); -} - -/* - * getopt_long_only -- - * Parse argc/argv argument vector. - */ -int -getopt_long_only(int nargc, char * const *nargv, const char *options, - const struct option *long_options, int *idx) -{ - - return (getopt_internal(nargc, nargv, options, long_options, idx, - FLAG_PERMUTE|FLAG_LONGONLY)); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/Makefile b/3rdparty/glsl-optimizer/src/glsl/Makefile deleted file mode 100644 index 27d7ad363..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/Makefile +++ /dev/null @@ -1,131 +0,0 @@ -# A simple makefile to build glsl-optimizer on linux - -CPPFLAGS += -I../talloc \ - -I../mesa \ - -I../mapi \ - -I../../include \ - -I.. - -CXXFLAGS += -s -Wall -Os -fdata-sections -ffunction-sections -CFLAGS += -s -Wall -Os -fdata-sections -ffunction-sections - -# This list gleaned from the VC project file. Update when needed -SRC = ast_array_index.cpp \ - ast_expr.cpp \ - ast_function.cpp \ - ast_to_hir.cpp \ - ast_type.cpp \ - builtin_functions.cpp \ - builtin_types.cpp \ - builtin_variables.cpp \ - glsl_lexer.cpp \ - glsl_optimizer.cpp \ - glsl_parser.cpp \ - glsl_parser_extras.cpp \ - glsl_symbol_table.cpp \ - glsl_types.cpp \ - hir_field_selection.cpp \ - ir.cpp \ - ir_basic_block.cpp \ - ir_builder.cpp \ - ir_clone.cpp \ - ir_constant_expression.cpp \ - ir_equals.cpp \ - ir_expression_flattening.cpp \ - ir_function.cpp \ - ir_function_can_inline.cpp \ - ir_function_detect_recursion.cpp \ - ir_hierarchical_visitor.cpp \ - ir_hv_accept.cpp \ - ir_import_prototypes.cpp \ - ir_print_glsl_visitor.cpp \ - ir_print_metal_visitor.cpp \ - ir_print_visitor.cpp \ - ir_rvalue_visitor.cpp \ - ir_stats.cpp \ - ir_unused_structs.cpp \ - ir_validate.cpp \ - ir_variable_refcount.cpp \ - link_atomics.cpp \ - linker.cpp \ - link_functions.cpp \ - link_interface_blocks.cpp \ - link_uniform_block_active_visitor.cpp \ - link_uniform_blocks.cpp \ - link_uniform_initializers.cpp \ - link_uniforms.cpp \ - link_varyings.cpp \ - loop_analysis.cpp \ - loop_controls.cpp \ - loop_unroll.cpp \ - lower_clip_distance.cpp \ - lower_discard.cpp \ - lower_discard_flow.cpp \ - lower_if_to_cond_assign.cpp \ - lower_instructions.cpp \ - lower_jumps.cpp \ - lower_mat_op_to_vec.cpp \ - lower_named_interface_blocks.cpp \ - lower_noise.cpp \ - lower_offset_array.cpp \ - lower_output_reads.cpp \ - lower_packed_varyings.cpp \ - lower_packing_builtins.cpp \ - lower_ubo_reference.cpp \ - lower_variable_index_to_cond_assign.cpp \ - lower_vec_index_to_cond_assign.cpp \ - lower_vec_index_to_swizzle.cpp \ - lower_vector.cpp \ - lower_vector_insert.cpp \ - lower_vertex_id.cpp \ - opt_algebraic.cpp \ - opt_array_splitting.cpp \ - opt_constant_folding.cpp \ - opt_constant_propagation.cpp \ - opt_constant_variable.cpp \ - opt_copy_propagation.cpp \ - opt_copy_propagation_elements.cpp \ - opt_cse.cpp \ - opt_dead_builtin_variables.cpp \ - opt_dead_builtin_varyings.cpp \ - opt_dead_code.cpp \ - opt_dead_code_local.cpp \ - opt_dead_functions.cpp \ - opt_flatten_nested_if_blocks.cpp \ - opt_flip_matrices.cpp \ - opt_function_inlining.cpp \ - opt_if_simplification.cpp \ - opt_minmax.cpp \ - opt_noop_swizzle.cpp \ - opt_rebalance_tree.cpp \ - opt_redundant_jumps.cpp \ - opt_structure_splitting.cpp \ - opt_swizzle_swizzle.cpp \ - opt_tree_grafting.cpp \ - opt_vectorize.cpp \ - s_expression.cpp \ - standalone_scaffolding.cpp \ - strtod.c \ - glcpp/glcpp-lex.c \ - glcpp/glcpp-parse.c \ - glcpp/pp.c \ - ../mesa/main/imports.c \ - ../mesa/program/prog_hash_table.c \ - ../mesa/program/symbol_table.c \ - ../util/hash_table.c \ - ../util/ralloc.c - - -OBJS1 = $(SRC:.cpp=.o) -OBJS = $(OBJS1:.c=.o) - -LIBNAME = libglslopt.a - -.PHONY: clean all - -all: $(OBJS) - ar cr $(LIBNAME) $(OBJS) - ranlib $(LIBNAME) - -clean: - rm -f $(OBJS) $(LIBNAME) diff --git a/3rdparty/glsl-optimizer/src/glsl/ast.h b/3rdparty/glsl-optimizer/src/glsl/ast.h deleted file mode 100644 index d28915a03..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ast.h +++ /dev/null @@ -1,1129 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright © 2009 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef AST_H -#define AST_H - -#include "list.h" -#include "glsl_parser_extras.h" - -struct _mesa_glsl_parse_state; - -struct YYLTYPE; - -/** - * \defgroup AST Abstract syntax tree node definitions - * - * An abstract syntax tree is generated by the parser. This is a fairly - * direct representation of the gramma derivation for the source program. - * No symantic checking is done during the generation of the AST. Only - * syntactic checking is done. Symantic checking is performed by a later - * stage that converts the AST to a more generic intermediate representation. - * - *@{ - */ -/** - * Base class of all abstract syntax tree nodes - */ -class ast_node { -public: - DECLARE_RALLOC_CXX_OPERATORS(ast_node); - - /** - * Print an AST node in something approximating the original GLSL code - */ - virtual void print(void) const; - - /** - * Convert the AST node to the high-level intermediate representation - */ - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - /** - * Retrieve the source location of an AST node - * - * This function is primarily used to get the source position of an AST node - * into a form that can be passed to \c _mesa_glsl_error. - * - * \sa _mesa_glsl_error, ast_node::set_location - */ - struct YYLTYPE get_location(void) const - { - struct YYLTYPE locp; - - locp.source = this->location.source; - locp.first_line = this->location.first_line; - locp.first_column = this->location.first_column; - locp.last_line = this->location.last_line; - locp.last_column = this->location.last_column; - - return locp; - } - - /** - * Set the source location of an AST node from a parser location - * - * \sa ast_node::get_location - */ - void set_location(const struct YYLTYPE &locp) - { - this->location.source = locp.source; - this->location.first_line = locp.first_line; - this->location.first_column = locp.first_column; - this->location.last_line = locp.last_line; - this->location.last_column = locp.last_column; - } - - /** - * Set the source location range of an AST node using two location nodes - * - * \sa ast_node::set_location - */ - void set_location_range(const struct YYLTYPE &begin, const struct YYLTYPE &end) - { - this->location.source = begin.source; - this->location.first_line = begin.first_line; - this->location.last_line = end.last_line; - this->location.first_column = begin.first_column; - this->location.last_column = end.last_column; - } - - /** - * Source location of the AST node. - */ - struct { - unsigned source; /**< GLSL source number. */ - unsigned first_line; /**< First line number within the source string. */ - unsigned first_column; /**< First column in the first line. */ - unsigned last_line; /**< Last line number within the source string. */ - unsigned last_column; /**< Last column in the last line. */ - } location; - - exec_node link; - -protected: - /** - * The only constructor is protected so that only derived class objects can - * be created. - */ - ast_node(void); -}; - - -/** - * Operators for AST expression nodes. - */ -enum ast_operators { - ast_assign, - ast_plus, /**< Unary + operator. */ - ast_neg, - ast_add, - ast_sub, - ast_mul, - ast_div, - ast_mod, - ast_lshift, - ast_rshift, - ast_less, - ast_greater, - ast_lequal, - ast_gequal, - ast_equal, - ast_nequal, - ast_bit_and, - ast_bit_xor, - ast_bit_or, - ast_bit_not, - ast_logic_and, - ast_logic_xor, - ast_logic_or, - ast_logic_not, - - ast_mul_assign, - ast_div_assign, - ast_mod_assign, - ast_add_assign, - ast_sub_assign, - ast_ls_assign, - ast_rs_assign, - ast_and_assign, - ast_xor_assign, - ast_or_assign, - - ast_conditional, - - ast_pre_inc, - ast_pre_dec, - ast_post_inc, - ast_post_dec, - ast_field_selection, - ast_array_index, - - ast_function_call, - - ast_identifier, - ast_int_constant, - ast_uint_constant, - ast_float_constant, - ast_bool_constant, - - ast_sequence, - ast_aggregate -}; - -/** - * Representation of any sort of expression. - */ -class ast_expression : public ast_node { -public: - ast_expression(int oper, ast_expression *, - ast_expression *, ast_expression *); - - ast_expression(const char *identifier) : - oper(ast_identifier) - { - subexpressions[0] = NULL; - subexpressions[1] = NULL; - subexpressions[2] = NULL; - primary_expression.identifier = identifier; - this->non_lvalue_description = NULL; - } - - static const char *operator_string(enum ast_operators op); - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - virtual void hir_no_rvalue(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - ir_rvalue *do_hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state, - bool needs_rvalue); - - virtual void print(void) const; - - enum ast_operators oper; - - ast_expression *subexpressions[3]; - - union { - const char *identifier; - int int_constant; - float float_constant; - unsigned uint_constant; - int bool_constant; - } primary_expression; - - - /** - * List of expressions for an \c ast_sequence or parameters for an - * \c ast_function_call - */ - exec_list expressions; - - /** - * For things that can't be l-values, this describes what it is. - * - * This text is used by the code that generates IR for assignments to - * detect and emit useful messages for assignments to some things that - * can't be l-values. For example, pre- or post-incerement expressions. - * - * \note - * This pointer may be \c NULL. - */ - const char *non_lvalue_description; -}; - -class ast_expression_bin : public ast_expression { -public: - ast_expression_bin(int oper, ast_expression *, ast_expression *); - - virtual void print(void) const; -}; - -/** - * Subclass of expressions for function calls - */ -class ast_function_expression : public ast_expression { -public: - ast_function_expression(ast_expression *callee) - : ast_expression(ast_function_call, callee, - NULL, NULL), - cons(false) - { - /* empty */ - } - - ast_function_expression(class ast_type_specifier *type) - : ast_expression(ast_function_call, (ast_expression *) type, - NULL, NULL), - cons(true) - { - /* empty */ - } - - bool is_constructor() const - { - return cons; - } - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - virtual void hir_no_rvalue(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - -private: - /** - * Is this function call actually a constructor? - */ - bool cons; -}; - -class ast_array_specifier : public ast_node { -public: - /** Unsized array specifier ([]) */ - explicit ast_array_specifier(const struct YYLTYPE &locp) - : is_unsized_array(true) - { - set_location(locp); - } - - /** Sized array specifier ([dim]) */ - ast_array_specifier(const struct YYLTYPE &locp, ast_expression *dim) - : is_unsized_array(false) - { - set_location(locp); - array_dimensions.push_tail(&dim->link); - } - - void add_dimension(ast_expression *dim) - { - array_dimensions.push_tail(&dim->link); - } - - virtual void print(void) const; - - /* If true, this means that the array has an unsized outermost dimension. */ - bool is_unsized_array; - - /* This list contains objects of type ast_node containing the - * sized dimensions only, in outermost-to-innermost order. - */ - exec_list array_dimensions; -}; - -/** - * C-style aggregate initialization class - * - * Represents C-style initializers of vectors, matrices, arrays, and - * structures. E.g., vec3 pos = {1.0, 0.0, -1.0} is equivalent to - * vec3 pos = vec3(1.0, 0.0, -1.0). - * - * Specified in GLSL 4.20 and GL_ARB_shading_language_420pack. - * - * \sa _mesa_ast_set_aggregate_type - */ -class ast_aggregate_initializer : public ast_expression { -public: - ast_aggregate_initializer() - : ast_expression(ast_aggregate, NULL, NULL, NULL), - constructor_type(NULL) - { - /* empty */ - } - - /** - * glsl_type of the aggregate, which is inferred from the LHS of whatever - * the aggregate is being used to initialize. This can't be inferred at - * parse time (since the parser deals with ast_type_specifiers, not - * glsl_types), so the parser leaves it NULL. However, the ast-to-hir - * conversion code makes sure to fill it in with the appropriate type - * before hir() is called. - */ - const glsl_type *constructor_type; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - virtual void hir_no_rvalue(exec_list *instructions, - struct _mesa_glsl_parse_state *state); -}; - -/** - * Number of possible operators for an ast_expression - * - * This is done as a define instead of as an additional value in the enum so - * that the compiler won't generate spurious messages like "warning: - * enumeration value ‘ast_num_operators’ not handled in switch" - */ -#define AST_NUM_OPERATORS (ast_sequence + 1) - - -class ast_compound_statement : public ast_node { -public: - ast_compound_statement(int new_scope, ast_node *statements); - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - int new_scope; - exec_list statements; -}; - -class ast_declaration : public ast_node { -public: - ast_declaration(const char *identifier, - ast_array_specifier *array_specifier, - ast_expression *initializer); - virtual void print(void) const; - - const char *identifier; - - ast_array_specifier *array_specifier; - - ast_expression *initializer; -}; - - -enum { - ast_precision_high = 0, - ast_precision_medium, - ast_precision_low, - ast_precision_none, /**< Absence of precision qualifier. */ -}; - -struct ast_type_qualifier { - DECLARE_RALLOC_CXX_OPERATORS(ast_type_qualifier); - - union { - struct { - unsigned invariant:1; - unsigned precise:1; - unsigned constant:1; - unsigned attribute:1; - unsigned varying:1; - unsigned in:1; - unsigned out:1; - unsigned centroid:1; - unsigned sample:1; - unsigned uniform:1; - unsigned smooth:1; - unsigned flat:1; - unsigned noperspective:1; - - /** \name Layout qualifiers for GL_ARB_fragment_coord_conventions */ - /*@{*/ - unsigned origin_upper_left:1; - unsigned pixel_center_integer:1; - /*@}*/ - - /** - * Flag set if GL_ARB_explicit_attrib_location "location" layout - * qualifier is used. - */ - unsigned explicit_location:1; - /** - * Flag set if GL_ARB_explicit_attrib_location "index" layout - * qualifier is used. - */ - unsigned explicit_index:1; - - /** - * Flag set if GL_ARB_shading_language_420pack "binding" layout - * qualifier is used. - */ - unsigned explicit_binding:1; - - /** - * Flag set if GL_ARB_shader_atomic counter "offset" layout - * qualifier is used. - */ - unsigned explicit_offset:1; - - /** \name Layout qualifiers for GL_AMD_conservative_depth */ - /** \{ */ - unsigned depth_any:1; - unsigned depth_greater:1; - unsigned depth_less:1; - unsigned depth_unchanged:1; - /** \} */ - - /** \name Layout qualifiers for GL_ARB_uniform_buffer_object */ - /** \{ */ - unsigned std140:1; - unsigned shared:1; - unsigned packed:1; - unsigned column_major:1; - unsigned row_major:1; - /** \} */ - - /** \name Layout qualifiers for GLSL 1.50 geometry shaders */ - /** \{ */ - unsigned prim_type:1; - unsigned max_vertices:1; - /** \} */ - - /** - * local_size_{x,y,z} flags for compute shaders. Bit 0 represents - * local_size_x, and so on. - */ - unsigned local_size:3; - - /** \name Layout and memory qualifiers for ARB_shader_image_load_store. */ - /** \{ */ - unsigned early_fragment_tests:1; - unsigned explicit_image_format:1; - unsigned coherent:1; - unsigned _volatile:1; - unsigned restrict_flag:1; - unsigned read_only:1; /**< "readonly" qualifier. */ - unsigned write_only:1; /**< "writeonly" qualifier. */ - /** \} */ - - /** \name Layout qualifiers for GL_ARB_gpu_shader5 */ - /** \{ */ - unsigned invocations:1; - unsigned stream:1; /**< Has stream value assigned */ - unsigned explicit_stream:1; /**< stream value assigned explicitly by shader code */ - /** \} */ - } - /** \brief Set of flags, accessed by name. */ - q; - - /** \brief Set of flags, accessed as a bitmask. */ - uint64_t i; - } flags; - - /** Precision of the type (highp/medium/lowp). */ - unsigned precision:2; - - /** Geometry shader invocations for GL_ARB_gpu_shader5. */ - int invocations; - - /** - * Location specified via GL_ARB_explicit_attrib_location layout - * - * \note - * This field is only valid if \c explicit_location is set. - */ - int location; - /** - * Index specified via GL_ARB_explicit_attrib_location layout - * - * \note - * This field is only valid if \c explicit_index is set. - */ - int index; - - /** Maximum output vertices in GLSL 1.50 geometry shaders. */ - int max_vertices; - - /** Stream in GLSL 1.50 geometry shaders. */ - unsigned stream; - - /** Input or output primitive type in GLSL 1.50 geometry shaders */ - GLenum prim_type; - - /** - * Binding specified via GL_ARB_shading_language_420pack's "binding" keyword. - * - * \note - * This field is only valid if \c explicit_binding is set. - */ - int binding; - - /** - * Offset specified via GL_ARB_shader_atomic_counter's "offset" - * keyword. - * - * \note - * This field is only valid if \c explicit_offset is set. - */ - int offset; - - /** - * Local size specified via GL_ARB_compute_shader's "local_size_{x,y,z}" - * layout qualifier. Element i of this array is only valid if - * flags.q.local_size & (1 << i) is set. - */ - int local_size[3]; - - /** - * Image format specified with an ARB_shader_image_load_store - * layout qualifier. - * - * \note - * This field is only valid if \c explicit_image_format is set. - */ - GLenum image_format; - - /** - * Base type of the data read from or written to this image. Only - * the following enumerants are allowed: GLSL_TYPE_UINT, - * GLSL_TYPE_INT, GLSL_TYPE_FLOAT. - * - * \note - * This field is only valid if \c explicit_image_format is set. - */ - glsl_base_type image_base_type; - - /** - * Return true if and only if an interpolation qualifier is present. - */ - bool has_interpolation() const; - - /** - * Return whether a layout qualifier is present. - */ - bool has_layout() const; - - /** - * Return whether a storage qualifier is present. - */ - bool has_storage() const; - - /** - * Return whether an auxiliary storage qualifier is present. - */ - bool has_auxiliary_storage() const; - - /** - * \brief Return string representation of interpolation qualifier. - * - * If an interpolation qualifier is present, then return that qualifier's - * string representation. Otherwise, return null. For example, if the - * noperspective bit is set, then this returns "noperspective". - * - * If multiple interpolation qualifiers are somehow present, then the - * returned string is undefined but not null. - */ - const char *interpolation_string() const; - - bool merge_qualifier(YYLTYPE *loc, - _mesa_glsl_parse_state *state, - ast_type_qualifier q); - - bool merge_in_qualifier(YYLTYPE *loc, - _mesa_glsl_parse_state *state, - ast_type_qualifier q, - ast_node* &node); - -}; - -class ast_declarator_list; - -class ast_struct_specifier : public ast_node { -public: - /** - * \brief Make a shallow copy of an ast_struct_specifier. - * - * Use only if the objects are allocated from the same context and will not - * be modified. Zeros the inherited ast_node's fields. - */ - ast_struct_specifier(const ast_struct_specifier& that): - ast_node(), name(that.name), declarations(that.declarations), - is_declaration(that.is_declaration) - { - /* empty */ - } - - ast_struct_specifier(const char *identifier, - ast_declarator_list *declarator_list); - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - const char *name; - /* List of ast_declarator_list * */ - exec_list declarations; - bool is_declaration; -}; - - - -class ast_type_specifier : public ast_node { -public: - /** - * \brief Make a shallow copy of an ast_type_specifier, specifying array - * fields. - * - * Use only if the objects are allocated from the same context and will not - * be modified. Zeros the inherited ast_node's fields. - */ - ast_type_specifier(const ast_type_specifier *that, - ast_array_specifier *array_specifier) - : ast_node(), type_name(that->type_name), structure(that->structure), - array_specifier(array_specifier), - default_precision(that->default_precision) - { - /* empty */ - } - - /** Construct a type specifier from a type name */ - ast_type_specifier(const char *name) - : type_name(name), structure(NULL), array_specifier(NULL), - default_precision(ast_precision_none) - { - /* empty */ - } - - /** Construct a type specifier from a structure definition */ - ast_type_specifier(ast_struct_specifier *s) - : type_name(s->name), structure(s), array_specifier(NULL), - default_precision(ast_precision_none) - { - /* empty */ - } - - const struct glsl_type *glsl_type(const char **name, - struct _mesa_glsl_parse_state *state) - const; - - virtual void print(void) const; - - ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); - - const char *type_name; - ast_struct_specifier *structure; - - ast_array_specifier *array_specifier; - - /** For precision statements, this is the given precision; otherwise none. */ - unsigned default_precision:2; -}; - - -class ast_fully_specified_type : public ast_node { -public: - virtual void print(void) const; - bool has_qualifiers() const; - - ast_fully_specified_type() : qualifier(), specifier(NULL) - { - qualifier.precision = ast_precision_none; - } - - const struct glsl_type *glsl_type(const char **name, - struct _mesa_glsl_parse_state *state) - const; - - ast_type_qualifier qualifier; - ast_type_specifier *specifier; -}; - - -class ast_declarator_list : public ast_node { -public: - ast_declarator_list(ast_fully_specified_type *); - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - ast_fully_specified_type *type; - /** List of 'ast_declaration *' */ - exec_list declarations; - - /** - * Flags for redeclarations. In these cases, no type is specified, to - * `type` is allowed to be NULL. In all other cases, this would be an error. - */ - int invariant; /** < `invariant` redeclaration */ - int precise; /** < `precise` redeclaration */ -}; - - -class ast_parameter_declarator : public ast_node { -public: - ast_parameter_declarator() : - type(NULL), - identifier(NULL), - array_specifier(NULL), - formal_parameter(false), - is_void(false) - { - /* empty */ - } - - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - ast_fully_specified_type *type; - const char *identifier; - ast_array_specifier *array_specifier; - - static void parameters_to_hir(exec_list *ast_parameters, - bool formal, exec_list *ir_parameters, - struct _mesa_glsl_parse_state *state); - -private: - /** Is this parameter declaration part of a formal parameter list? */ - bool formal_parameter; - - /** - * Is this parameter 'void' type? - * - * This field is set by \c ::hir. - */ - bool is_void; -}; - - -class ast_function : public ast_node { -public: - ast_function(void); - - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - ast_fully_specified_type *return_type; - const char *identifier; - - exec_list parameters; - -private: - /** - * Is this prototype part of the function definition? - * - * Used by ast_function_definition::hir to process the parameters, etc. - * of the function. - * - * \sa ::hir - */ - bool is_definition; - - /** - * Function signature corresponding to this function prototype instance - * - * Used by ast_function_definition::hir to process the parameters, etc. - * of the function. - * - * \sa ::hir - */ - class ir_function_signature *signature; - - friend class ast_function_definition; -}; - - -class ast_expression_statement : public ast_node { -public: - ast_expression_statement(ast_expression *); - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - ast_expression *expression; -}; - - -class ast_case_label : public ast_node { -public: - ast_case_label(ast_expression *test_value); - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - /** - * An test value of NULL means 'default'. - */ - ast_expression *test_value; -}; - - -class ast_case_label_list : public ast_node { -public: - ast_case_label_list(void); - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - /** - * A list of case labels. - */ - exec_list labels; -}; - - -class ast_case_statement : public ast_node { -public: - ast_case_statement(ast_case_label_list *labels); - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - ast_case_label_list *labels; - - /** - * A list of statements. - */ - exec_list stmts; -}; - - -class ast_case_statement_list : public ast_node { -public: - ast_case_statement_list(void); - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - /** - * A list of cases. - */ - exec_list cases; -}; - - -class ast_switch_body : public ast_node { -public: - ast_switch_body(ast_case_statement_list *stmts); - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - ast_case_statement_list *stmts; -}; - - -class ast_selection_statement : public ast_node { -public: - ast_selection_statement(ast_expression *condition, - ast_node *then_statement, - ast_node *else_statement); - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - ast_expression *condition; - ast_node *then_statement; - ast_node *else_statement; -}; - - -class ast_switch_statement : public ast_node { -public: - ast_switch_statement(ast_expression *test_expression, - ast_node *body); - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - ast_expression *test_expression; - ast_node *body; - -protected: - void test_to_hir(exec_list *, struct _mesa_glsl_parse_state *); -}; - -class ast_iteration_statement : public ast_node { -public: - ast_iteration_statement(int mode, ast_node *init, ast_node *condition, - ast_expression *rest_expression, ast_node *body); - - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); - - enum ast_iteration_modes { - ast_for, - ast_while, - ast_do_while - } mode; - - - ast_node *init_statement; - ast_node *condition; - ast_expression *rest_expression; - - ast_node *body; - - /** - * Generate IR from the condition of a loop - * - * This is factored out of ::hir because some loops have the condition - * test at the top (for and while), and others have it at the end (do-while). - */ - void condition_to_hir(exec_list *, struct _mesa_glsl_parse_state *); -}; - - -class ast_jump_statement : public ast_node { -public: - ast_jump_statement(int mode, ast_expression *return_value); - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - enum ast_jump_modes { - ast_continue, - ast_break, - ast_return, - ast_discard - } mode; - - ast_expression *opt_return_value; -}; - - -class ast_function_definition : public ast_node { -public: - ast_function_definition() : prototype(NULL), body(NULL) - { - } - - virtual void print(void) const; - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - ast_function *prototype; - ast_compound_statement *body; -}; - -class ast_interface_block : public ast_node { -public: - ast_interface_block(ast_type_qualifier layout, - const char *instance_name, - ast_array_specifier *array_specifier) - : layout(layout), block_name(NULL), instance_name(instance_name), - array_specifier(array_specifier) - { - } - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - - ast_type_qualifier layout; - const char *block_name; - - /** - * Declared name of the block instance, if specified. - * - * If the block does not have an instance name, this field will be - * \c NULL. - */ - const char *instance_name; - - /** List of ast_declarator_list * */ - exec_list declarations; - - /** - * Declared array size of the block instance - * - * If the block is not declared as an array or if the block instance array - * is unsized, this field will be \c NULL. - */ - ast_array_specifier *array_specifier; -}; - - -/** - * AST node representing a declaration of the input layout for geometry - * shaders. - */ -class ast_gs_input_layout : public ast_node -{ -public: - ast_gs_input_layout(const struct YYLTYPE &locp, GLenum prim_type) - : prim_type(prim_type) - { - set_location(locp); - } - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - -private: - const GLenum prim_type; -}; - - -/** - * AST node representing a decalaration of the input layout for compute - * shaders. - */ -class ast_cs_input_layout : public ast_node -{ -public: - ast_cs_input_layout(const struct YYLTYPE &locp, const unsigned *local_size) - { - memcpy(this->local_size, local_size, sizeof(this->local_size)); - set_location(locp); - } - - virtual ir_rvalue *hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - -private: - unsigned local_size[3]; -}; - -/*@}*/ - -extern void -_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state); - -extern ir_rvalue * -_mesa_ast_field_selection_to_hir(const ast_expression *expr, - exec_list *instructions, - struct _mesa_glsl_parse_state *state); - -extern ir_rvalue * -_mesa_ast_array_index_to_hir(void *mem_ctx, - struct _mesa_glsl_parse_state *state, - ir_rvalue *array, ir_rvalue *idx, - YYLTYPE &loc, YYLTYPE &idx_loc); - -extern void -_mesa_ast_set_aggregate_type(const glsl_type *type, - ast_expression *expr); - -void -emit_function(_mesa_glsl_parse_state *state, ir_function *f); - -extern void -check_builtin_array_max_size(const char *name, unsigned size, - YYLTYPE loc, struct _mesa_glsl_parse_state *state); - -#endif /* AST_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/ast_array_index.cpp b/3rdparty/glsl-optimizer/src/glsl/ast_array_index.cpp deleted file mode 100644 index b64877b51..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ast_array_index.cpp +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "ast.h" -#include "glsl_types.h" -#include "ir.h" - -void -ast_array_specifier::print(void) const -{ - if (this->is_unsized_array) { - printf("[ ] "); - } - - foreach_list_typed (ast_node, array_dimension, link, &this->array_dimensions) { - printf("[ "); - array_dimension->print(); - printf("] "); - } -} - -/** - * If \c ir is a reference to an array for which we are tracking the max array - * element accessed, track that the given element has been accessed. - * Otherwise do nothing. - * - * This function also checks whether the array is a built-in array whose - * maximum size is too small to accommodate the given index, and if so uses - * loc and state to report the error. - */ -static void -update_max_array_access(ir_rvalue *ir, unsigned idx, YYLTYPE *loc, - struct _mesa_glsl_parse_state *state) -{ - if (ir_dereference_variable *deref_var = ir->as_dereference_variable()) { - ir_variable *var = deref_var->var; - if (idx > var->data.max_array_access) { - var->data.max_array_access = idx; - - /* Check whether this access will, as a side effect, implicitly cause - * the size of a built-in array to be too large. - */ - check_builtin_array_max_size(var->name, idx+1, *loc, state); - } - } else if (ir_dereference_record *deref_record = - ir->as_dereference_record()) { - /* There are two possibilities we need to consider: - * - * - Accessing an element of an array that is a member of a named - * interface block (e.g. ifc.foo[i]) - * - * - Accessing an element of an array that is a member of a named - * interface block array (e.g. ifc[j].foo[i]). - */ - ir_dereference_variable *deref_var = - deref_record->record->as_dereference_variable(); - if (deref_var == NULL) { - if (ir_dereference_array *deref_array = - deref_record->record->as_dereference_array()) { - deref_var = deref_array->array->as_dereference_variable(); - } - } - - if (deref_var != NULL) { - if (deref_var->var->is_interface_instance()) { - const glsl_type *interface_type = - deref_var->var->get_interface_type(); - unsigned field_index = - deref_record->record->type->field_index(deref_record->field); - assert(field_index < interface_type->length); - - unsigned *const max_ifc_array_access = - deref_var->var->get_max_ifc_array_access(); - - assert(max_ifc_array_access != NULL); - - if (idx > max_ifc_array_access[field_index]) { - max_ifc_array_access[field_index] = idx; - - /* Check whether this access will, as a side effect, implicitly - * cause the size of a built-in array to be too large. - */ - check_builtin_array_max_size(deref_record->field, idx+1, *loc, - state); - } - } - } - } -} - - -ir_rvalue * -_mesa_ast_array_index_to_hir(void *mem_ctx, - struct _mesa_glsl_parse_state *state, - ir_rvalue *array, ir_rvalue *idx, - YYLTYPE &loc, YYLTYPE &idx_loc) -{ - if (!array->type->is_error() - && !array->type->is_array() - && !array->type->is_matrix() - && !array->type->is_vector()) { - _mesa_glsl_error(& idx_loc, state, - "cannot dereference non-array / non-matrix / " - "non-vector"); - } - - if (!idx->type->is_error()) { - if (!idx->type->is_integer()) { - _mesa_glsl_error(& idx_loc, state, "array index must be integer type"); - } else if (!idx->type->is_scalar()) { - _mesa_glsl_error(& idx_loc, state, "array index must be scalar"); - } - } - - /* If the array index is a constant expression and the array has a - * declared size, ensure that the access is in-bounds. If the array - * index is not a constant expression, ensure that the array has a - * declared size. - */ - ir_constant *const const_index = idx->constant_expression_value(); - if (const_index != NULL && idx->type->is_integer()) { - const int idx = const_index->value.i[0]; - const char *type_name = "error"; - unsigned bound = 0; - - /* From page 24 (page 30 of the PDF) of the GLSL 1.50 spec: - * - * "It is illegal to declare an array with a size, and then - * later (in the same shader) index the same array with an - * integral constant expression greater than or equal to the - * declared size. It is also illegal to index an array with a - * negative constant expression." - */ - if (array->type->is_matrix()) { - if (array->type->row_type()->vector_elements <= (unsigned)idx) { - type_name = "matrix"; - bound = array->type->row_type()->vector_elements; - } - } else if (array->type->is_vector()) { - if (array->type->vector_elements <= (unsigned)idx) { - type_name = "vector"; - bound = array->type->vector_elements; - } - } else { - /* glsl_type::array_size() returns -1 for non-array types. This means - * that we don't need to verify that the type is an array before - * doing the bounds checking. - */ - if ((array->type->array_size() > 0) - && (array->type->array_size() <= idx)) { - type_name = "array"; - bound = array->type->array_size(); - } - } - - if (bound > 0) { - _mesa_glsl_error(& loc, state, "%s index must be < %u", - type_name, bound); - } else if (idx < 0) { - _mesa_glsl_error(& loc, state, "%s index must be >= 0", - type_name); - } - - if (array->type->is_array()) - update_max_array_access(array, idx, &loc, state); - } else if (const_index == NULL && array->type->is_array()) { - if (array->type->is_unsized_array()) { - _mesa_glsl_error(&loc, state, "unsized array index must be constant"); - } else if (array->type->fields.array->is_interface() - && array->variable_referenced()->data.mode == ir_var_uniform - && !state->is_version(400, 0) && !state->ARB_gpu_shader5_enable) { - /* Page 46 in section 4.3.7 of the OpenGL ES 3.00 spec says: - * - * "All indexes used to index a uniform block array must be - * constant integral expressions." - */ - _mesa_glsl_error(&loc, state, - "uniform block array index must be constant"); - } else { - /* whole_variable_referenced can return NULL if the array is a - * member of a structure. In this case it is safe to not update - * the max_array_access field because it is never used for fields - * of structures. - */ - ir_variable *v = array->whole_variable_referenced(); - if (v != NULL) - v->data.max_array_access = array->type->array_size() - 1; - } - - /* From page 23 (29 of the PDF) of the GLSL 1.30 spec: - * - * "Samplers aggregated into arrays within a shader (using square - * brackets [ ]) can only be indexed with integral constant - * expressions [...]." - * - * This restriction was added in GLSL 1.30. Shaders using earlier - * version of the language should not be rejected by the compiler - * front-end for using this construct. This allows useful things such - * as using a loop counter as the index to an array of samplers. If the - * loop in unrolled, the code should compile correctly. Instead, emit a - * warning. - * - * In GLSL 4.00 / ARB_gpu_shader5, this requirement is relaxed again to allow - * indexing with dynamically uniform expressions. Note that these are not - * required to be uniforms or expressions based on them, but merely that the - * values must not diverge between shader invocations run together. If the - * values *do* diverge, then the behavior of the operation requiring a - * dynamically uniform expression is undefined. - */ - if (array->type->element_type()->is_sampler()) { - if (!state->is_version(130, 100)) { - if (state->es_shader) { - _mesa_glsl_warning(&loc, state, - "sampler arrays indexed with non-constant " - "expressions is optional in %s", - state->get_version_string()); - } else { - _mesa_glsl_warning(&loc, state, - "sampler arrays indexed with non-constant " - "expressions will be forbidden in GLSL 1.30 " - "and later"); - } - } else if (!state->is_version(400, 0) && !state->ARB_gpu_shader5_enable) { - _mesa_glsl_error(&loc, state, - "sampler arrays indexed with non-constant " - "expressions is forbidden in GLSL 1.30 and " - "later"); - } - } - } - - /* After performing all of the error checking, generate the IR for the - * expression. - */ - if (array->type->is_array() - || array->type->is_matrix()) { - return new(mem_ctx) ir_dereference_array(array, idx); - } else if (array->type->is_vector()) { - return new(mem_ctx) ir_expression(ir_binop_vector_extract, array, idx); - } else if (array->type->is_error()) { - return array; - } else { - ir_rvalue *result = new(mem_ctx) ir_dereference_array(array, idx); - result->type = glsl_type::error_type; - - return result; - } -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ast_expr.cpp b/3rdparty/glsl-optimizer/src/glsl/ast_expr.cpp deleted file mode 100644 index e624d11cf..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ast_expr.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#include -#include "ast.h" - -const char * -ast_expression::operator_string(enum ast_operators op) -{ - static const char *const operators[] = { - "=", - "+", - "-", - "+", - "-", - "*", - "/", - "%", - "<<", - ">>", - "<", - ">", - "<=", - ">=", - "==", - "!=", - "&", - "^", - "|", - "~", - "&&", - "^^", - "||", - "!", - - "*=", - "/=", - "%=", - "+=", - "-=", - "<<=", - ">>=", - "&=", - "^=", - "|=", - - "?:", - - "++", - "--", - "++", - "--", - ".", - }; - - assert((unsigned int)op < sizeof(operators) / sizeof(operators[0])); - - return operators[op]; -} - - -ast_expression_bin::ast_expression_bin(int oper, ast_expression *ex0, - ast_expression *ex1) : - ast_expression(oper, ex0, ex1, NULL) -{ - assert((oper >= ast_plus) && (oper <= ast_logic_not)); -} - - -void -ast_expression_bin::print(void) const -{ - subexpressions[0]->print(); - printf("%s ", operator_string(oper)); - subexpressions[1]->print(); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ast_function.cpp b/3rdparty/glsl-optimizer/src/glsl/ast_function.cpp deleted file mode 100644 index 55d9e91a1..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ast_function.cpp +++ /dev/null @@ -1,1846 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "glsl_symbol_table.h" -#include "ast.h" -#include "glsl_types.h" -#include "ir.h" -#include "main/core.h" /* for MIN2 */ - -static ir_rvalue * -convert_component(ir_rvalue *src, const glsl_type *desired_type); - -bool -apply_implicit_conversion(const glsl_type *to, ir_rvalue * &from, - struct _mesa_glsl_parse_state *state); - -static unsigned -process_parameters(exec_list *instructions, exec_list *actual_parameters, - exec_list *parameters, - struct _mesa_glsl_parse_state *state) -{ - unsigned count = 0; - - foreach_list_typed(ast_node, ast, link, parameters) { - ir_rvalue *result = ast->hir(instructions, state); - - ir_constant *const constant = result->constant_expression_value(); - if (constant != NULL) - result = constant; - - actual_parameters->push_tail(result); - count++; - } - - return count; -} - - -/** - * Generate a source prototype for a function signature - * - * \param return_type Return type of the function. May be \c NULL. - * \param name Name of the function. - * \param parameters List of \c ir_instruction nodes representing the - * parameter list for the function. This may be either a - * formal (\c ir_variable) or actual (\c ir_rvalue) - * parameter list. Only the type is used. - * - * \return - * A ralloced string representing the prototype of the function. - */ -char * -prototype_string(const glsl_type *return_type, const char *name, - exec_list *parameters) -{ - char *str = NULL; - - if (return_type != NULL) - str = ralloc_asprintf(NULL, "%s ", return_type->name); - - ralloc_asprintf_append(&str, "%s(", name); - - const char *comma = ""; - foreach_in_list(const ir_variable, param, parameters) { - ralloc_asprintf_append(&str, "%s%s", comma, param->type->name); - comma = ", "; - } - - ralloc_strcat(&str, ")"); - return str; -} - -static glsl_precision precision_for_call (const ir_function_signature* sig, glsl_precision max_prec, glsl_precision first_prec) -{ - if (sig->precision != glsl_precision_undefined) - return sig->precision; - - // if return type is boolean, treat as lowp - if (sig->return_type->base_type == GLSL_TYPE_BOOL) - return glsl_precision_low; - - // if it's a built-in texture function, precision comes from sampler (1st param) precision - if (sig->is_builtin()) - { - if (strncmp (sig->function_name(), "texture", 7) == 0) - return first_prec; - if (strncmp (sig->function_name(), "shadow", 6) == 0) - return first_prec; - } - - // other built-in: max precision of parameters - if (sig->is_builtin()) - return max_prec; - - // otherwise: undefined - return glsl_precision_undefined; -} - - -static glsl_precision precision_for_call (const ir_function_signature* sig, exec_list *actual_parameters) -{ - glsl_precision prec_params_max = glsl_precision_undefined; - glsl_precision prec_params_first = glsl_precision_undefined; - int params_counter = 0; - - foreach_two_lists(formal_node, &sig->parameters, - actual_node, actual_parameters) { - ir_rvalue *actual = (ir_rvalue *) actual_node; - ir_variable *formal = (ir_variable *) formal_node; - assert(actual != NULL); - assert(formal != NULL); - glsl_precision param_prec = (glsl_precision)formal->data.precision; - if (param_prec == glsl_precision_undefined) - param_prec = actual->get_precision(); - prec_params_max = higher_precision (prec_params_max, param_prec); - if (params_counter == 0) - prec_params_first = param_prec; - - ++params_counter; - } - - return precision_for_call (sig, prec_params_max, prec_params_first); -} - -static bool -verify_image_parameter(YYLTYPE *loc, _mesa_glsl_parse_state *state, - const ir_variable *formal, const ir_variable *actual) -{ - /** - * From the ARB_shader_image_load_store specification: - * - * "The values of image variables qualified with coherent, - * volatile, restrict, readonly, or writeonly may not be passed - * to functions whose formal parameters lack such - * qualifiers. [...] It is legal to have additional qualifiers - * on a formal parameter, but not to have fewer." - */ - if (actual->data.image_coherent && !formal->data.image_coherent) { - _mesa_glsl_error(loc, state, - "function call parameter `%s' drops " - "`coherent' qualifier", formal->name); - return false; - } - - if (actual->data.image_volatile && !formal->data.image_volatile) { - _mesa_glsl_error(loc, state, - "function call parameter `%s' drops " - "`volatile' qualifier", formal->name); - return false; - } - - if (actual->data.image_restrict && !formal->data.image_restrict) { - _mesa_glsl_error(loc, state, - "function call parameter `%s' drops " - "`restrict' qualifier", formal->name); - return false; - } - - if (actual->data.image_read_only && !formal->data.image_read_only) { - _mesa_glsl_error(loc, state, - "function call parameter `%s' drops " - "`readonly' qualifier", formal->name); - return false; - } - - if (actual->data.image_write_only && !formal->data.image_write_only) { - _mesa_glsl_error(loc, state, - "function call parameter `%s' drops " - "`writeonly' qualifier", formal->name); - return false; - } - - return true; -} - - -/** - * Verify that 'out' and 'inout' actual parameters are lvalues. Also, verify - * that 'const_in' formal parameters (an extension in our IR) correspond to - * ir_constant actual parameters. - */ -static bool -verify_parameter_modes(_mesa_glsl_parse_state *state, - ir_function_signature *sig, - exec_list &actual_ir_parameters, - exec_list &actual_ast_parameters) -{ - exec_node *actual_ir_node = actual_ir_parameters.head; - exec_node *actual_ast_node = actual_ast_parameters.head; - - foreach_in_list(const ir_variable, formal, &sig->parameters) { - /* The lists must be the same length. */ - assert(!actual_ir_node->is_tail_sentinel()); - assert(!actual_ast_node->is_tail_sentinel()); - - const ir_rvalue *const actual = (ir_rvalue *) actual_ir_node; - const ast_expression *const actual_ast = - exec_node_data(ast_expression, actual_ast_node, link); - - /* FIXME: 'loc' is incorrect (as of 2011-01-21). It is always - * FIXME: 0:0(0). - */ - YYLTYPE loc = actual_ast->get_location(); - - /* Verify that 'const_in' parameters are ir_constants. */ - if (formal->data.mode == ir_var_const_in && - actual->ir_type != ir_type_constant) { - _mesa_glsl_error(&loc, state, - "parameter `in %s' must be a constant expression", - formal->name); - return false; - } - - /* Verify that shader_in parameters are shader inputs */ - if (formal->data.must_be_shader_input) { - ir_variable *var = actual->variable_referenced(); - if (var && var->data.mode != ir_var_shader_in) { - _mesa_glsl_error(&loc, state, - "parameter `%s` must be a shader input", - formal->name); - return false; - } - - if (actual->ir_type == ir_type_swizzle) { - _mesa_glsl_error(&loc, state, - "parameter `%s` must not be swizzled", - formal->name); - return false; - } - } - - /* Verify that 'out' and 'inout' actual parameters are lvalues. */ - if (formal->data.mode == ir_var_function_out - || formal->data.mode == ir_var_function_inout) { - const char *mode = NULL; - switch (formal->data.mode) { - case ir_var_function_out: mode = "out"; break; - case ir_var_function_inout: mode = "inout"; break; - default: assert(false); break; - } - - /* This AST-based check catches errors like f(i++). The IR-based - * is_lvalue() is insufficient because the actual parameter at the - * IR-level is just a temporary value, which is an l-value. - */ - if (actual_ast->non_lvalue_description != NULL) { - _mesa_glsl_error(&loc, state, - "function parameter '%s %s' references a %s", - mode, formal->name, - actual_ast->non_lvalue_description); - return false; - } - - ir_variable *var = actual->variable_referenced(); - if (var) - var->data.assigned = true; - - if (var && var->data.read_only) { - _mesa_glsl_error(&loc, state, - "function parameter '%s %s' references the " - "read-only variable '%s'", - mode, formal->name, - actual->variable_referenced()->name); - return false; - } else if (!actual->is_lvalue()) { - /* Even though ir_binop_vector_extract is not an l-value, let it - * slop through. generate_call will handle it correctly. - */ - ir_expression *const expr = ((ir_rvalue *) actual)->as_expression(); - if (expr == NULL - || expr->operation != ir_binop_vector_extract - || !expr->operands[0]->is_lvalue()) { - _mesa_glsl_error(&loc, state, - "function parameter '%s %s' is not an lvalue", - mode, formal->name); - return false; - } - } - } - - if (formal->type->is_image() && - actual->variable_referenced()) { - if (!verify_image_parameter(&loc, state, formal, - actual->variable_referenced())) - return false; - } - - actual_ir_node = actual_ir_node->next; - actual_ast_node = actual_ast_node->next; - } - return true; -} - -static void -fix_parameter(void *mem_ctx, ir_rvalue *actual, const glsl_type *formal_type, - exec_list *before_instructions, exec_list *after_instructions, - bool parameter_is_inout, glsl_precision prec) -{ - ir_expression *const expr = actual->as_expression(); - - /* If the types match exactly and the parameter is not a vector-extract, - * nothing needs to be done to fix the parameter. - */ - if (formal_type == actual->type - && (expr == NULL || expr->operation != ir_binop_vector_extract)) - return; - - /* To convert an out parameter, we need to create a temporary variable to - * hold the value before conversion, and then perform the conversion after - * the function call returns. - * - * This has the effect of transforming code like this: - * - * void f(out int x); - * float value; - * f(value); - * - * Into IR that's equivalent to this: - * - * void f(out int x); - * float value; - * int out_parameter_conversion; - * f(out_parameter_conversion); - * value = float(out_parameter_conversion); - * - * If the parameter is an ir_expression of ir_binop_vector_extract, - * additional conversion is needed in the post-call re-write. - */ - ir_variable *tmp = - new(mem_ctx) ir_variable(formal_type, "inout_tmp", ir_var_temporary, prec); - - before_instructions->push_tail(tmp); - - /* If the parameter is an inout parameter, copy the value of the actual - * parameter to the new temporary. Note that no type conversion is allowed - * here because inout parameters must match types exactly. - */ - if (parameter_is_inout) { - /* Inout parameters should never require conversion, since that would - * require an implicit conversion to exist both to and from the formal - * parameter type, and there are no bidirectional implicit conversions. - */ - assert (actual->type == formal_type); - - ir_dereference_variable *const deref_tmp_1 = - new(mem_ctx) ir_dereference_variable(tmp); - ir_assignment *const assignment = - new(mem_ctx) ir_assignment(deref_tmp_1, actual); - before_instructions->push_tail(assignment); - } - - /* Replace the parameter in the call with a dereference of the new - * temporary. - */ - ir_dereference_variable *const deref_tmp_2 = - new(mem_ctx) ir_dereference_variable(tmp); - actual->replace_with(deref_tmp_2); - - - /* Copy the temporary variable to the actual parameter with optional - * type conversion applied. - */ - ir_rvalue *rhs = new(mem_ctx) ir_dereference_variable(tmp); - if (actual->type != formal_type) - rhs = convert_component(rhs, actual->type); - - ir_rvalue *lhs = actual; - if (expr != NULL && expr->operation == ir_binop_vector_extract) { - rhs = new(mem_ctx) ir_expression(ir_triop_vector_insert, - expr->operands[0]->type, - expr->operands[0]->clone(mem_ctx, NULL), - rhs, - expr->operands[1]->clone(mem_ctx, NULL)); - lhs = expr->operands[0]->clone(mem_ctx, NULL); - } - - ir_assignment *const assignment_2 = new(mem_ctx) ir_assignment(lhs, rhs); - after_instructions->push_tail(assignment_2); -} - -/** - * Generate a function call. - * - * For non-void functions, this returns a dereference of the temporary variable - * which stores the return value for the call. For void functions, this returns - * NULL. - */ -static ir_rvalue * -generate_call(exec_list *instructions, ir_function_signature *sig, - exec_list *actual_parameters, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - exec_list post_call_conversions; - - /* Perform implicit conversion of arguments. For out parameters, we need - * to place them in a temporary variable and do the conversion after the - * call takes place. Since we haven't emitted the call yet, we'll place - * the post-call conversions in a temporary exec_list, and emit them later. - */ - foreach_two_lists(formal_node, &sig->parameters, - actual_node, actual_parameters) { - ir_rvalue *actual = (ir_rvalue *) actual_node; - ir_variable *formal = (ir_variable *) formal_node; - - if (formal->type->is_numeric() || formal->type->is_boolean()) { - switch (formal->data.mode) { - case ir_var_const_in: - case ir_var_function_in: { - ir_rvalue *converted - = convert_component(actual, formal->type); - actual->replace_with(converted); - break; - } - case ir_var_function_out: - case ir_var_function_inout: - fix_parameter(ctx, actual, formal->type, - instructions, &post_call_conversions, - formal->data.mode == ir_var_function_inout, - precision_for_call(sig,actual_parameters)); - break; - default: - assert (!"Illegal formal parameter mode"); - break; - } - } - } - - /* If the function call is a constant expression, don't generate any - * instructions; just generate an ir_constant. - * - * Function calls were first allowed to be constant expressions in GLSL - * 1.20 and GLSL ES 3.00. - */ - if (state->is_version(120, 300)) { - ir_constant *value = sig->constant_expression_value(actual_parameters, NULL); - if (value != NULL) { - return value; - } - } - - ir_dereference_variable *deref = NULL; - if (!sig->return_type->is_void()) { - /* Create a new temporary to hold the return value. */ - char *const name = ir_variable::temporaries_allocate_names - ? ralloc_asprintf(ctx, "%s_retval", sig->function_name()) - : NULL; - - ir_variable *var; - - var = new(ctx) ir_variable(sig->return_type, name, ir_var_temporary, precision_for_call(sig,actual_parameters)); - instructions->push_tail(var); - - ralloc_free(name); - - deref = new(ctx) ir_dereference_variable(var); - } - ir_call *call = new(ctx) ir_call(sig, deref, actual_parameters); - instructions->push_tail(call); - - /* Also emit any necessary out-parameter conversions. */ - instructions->append_list(&post_call_conversions); - - return deref ? deref->clone(ctx, NULL) : NULL; -} - -/** - * Given a function name and parameter list, find the matching signature. - */ -static ir_function_signature * -match_function_by_name(const char *name, - exec_list *actual_parameters, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - ir_function *f = state->symbols->get_function(name); - ir_function_signature *local_sig = NULL; - ir_function_signature *sig = NULL; - - /* Is the function hidden by a record type constructor? */ - if (state->symbols->get_type(name)) - goto done; /* no match */ - - /* Is the function hidden by a variable (impossible in 1.10)? */ - if (!state->symbols->separate_function_namespace - && state->symbols->get_variable(name)) - goto done; /* no match */ - - if (f != NULL) { - /* In desktop GL, the presence of a user-defined signature hides any - * built-in signatures, so we must ignore them. In contrast, in ES2 - * user-defined signatures add new overloads, so we must consider them. - */ - bool allow_builtins = state->es_shader || !f->has_user_signature(); - - /* Look for a match in the local shader. If exact, we're done. */ - bool is_exact = false; - sig = local_sig = f->matching_signature(state, actual_parameters, - allow_builtins, &is_exact); - if (is_exact) - goto done; - - if (!allow_builtins) - goto done; - } - - /* Local shader has no exact candidates; check the built-ins. */ - _mesa_glsl_initialize_builtin_functions(); - sig = _mesa_glsl_find_builtin_function(state, name, actual_parameters); - -done: - if (sig != NULL) { - /* If the match is from a linked built-in shader, import the prototype. */ - if (sig != local_sig) { - if (f == NULL) { - f = new(ctx) ir_function(name); - state->symbols->add_global_function(f); - emit_function(state, f); - } - f->add_signature(sig->clone_prototype(f, NULL)); - } - } - return sig; -} - -static void -print_function_prototypes(_mesa_glsl_parse_state *state, YYLTYPE *loc, - ir_function *f) -{ - if (f == NULL) - return; - - foreach_in_list(ir_function_signature, sig, &f->signatures) { - if (sig->is_builtin() && !sig->is_builtin_available(state)) - continue; - - char *str = prototype_string(sig->return_type, f->name, &sig->parameters); - _mesa_glsl_error(loc, state, " %s", str); - ralloc_free(str); - } -} - -/** - * Raise a "no matching function" error, listing all possible overloads the - * compiler considered so developers can figure out what went wrong. - */ -static void -no_matching_function_error(const char *name, - YYLTYPE *loc, - exec_list *actual_parameters, - _mesa_glsl_parse_state *state) -{ - gl_shader *sh = _mesa_glsl_get_builtin_function_shader(); - - if (state->symbols->get_function(name) == NULL - && (!state->uses_builtin_functions - || sh->symbols->get_function(name) == NULL)) { - _mesa_glsl_error(loc, state, "no function with name '%s'", name); - } else { - char *str = prototype_string(NULL, name, actual_parameters); - _mesa_glsl_error(loc, state, - "no matching function for call to `%s'; candidates are:", - str); - ralloc_free(str); - - print_function_prototypes(state, loc, state->symbols->get_function(name)); - - if (state->uses_builtin_functions) { - print_function_prototypes(state, loc, sh->symbols->get_function(name)); - } - } -} - -/** - * Perform automatic type conversion of constructor parameters - * - * This implements the rules in the "Conversion and Scalar Constructors" - * section (GLSL 1.10 section 5.4.1), not the "Implicit Conversions" rules. - */ -static ir_rvalue * -convert_component(ir_rvalue *src, const glsl_type *desired_type) -{ - void *ctx = ralloc_parent(src); - const unsigned a = desired_type->base_type; - const unsigned b = src->type->base_type; - ir_expression *result = NULL; - - if (src->type->is_error()) - return src; - - assert(a <= GLSL_TYPE_BOOL); - assert(b <= GLSL_TYPE_BOOL); - - if (a == b) - return src; - - switch (a) { - case GLSL_TYPE_UINT: - switch (b) { - case GLSL_TYPE_INT: - result = new(ctx) ir_expression(ir_unop_i2u, src); - break; - case GLSL_TYPE_FLOAT: - result = new(ctx) ir_expression(ir_unop_f2u, src); - break; - case GLSL_TYPE_BOOL: - result = new(ctx) ir_expression(ir_unop_i2u, - new(ctx) ir_expression(ir_unop_b2i, src)); - break; - } - break; - case GLSL_TYPE_INT: - switch (b) { - case GLSL_TYPE_UINT: - result = new(ctx) ir_expression(ir_unop_u2i, src); - break; - case GLSL_TYPE_FLOAT: - result = new(ctx) ir_expression(ir_unop_f2i, src); - break; - case GLSL_TYPE_BOOL: - result = new(ctx) ir_expression(ir_unop_b2i, src); - break; - } - break; - case GLSL_TYPE_FLOAT: - switch (b) { - case GLSL_TYPE_UINT: - result = new(ctx) ir_expression(ir_unop_u2f, desired_type, src, NULL); - break; - case GLSL_TYPE_INT: - result = new(ctx) ir_expression(ir_unop_i2f, desired_type, src, NULL); - break; - case GLSL_TYPE_BOOL: - result = new(ctx) ir_expression(ir_unop_b2f, desired_type, src, NULL); - break; - } - break; - case GLSL_TYPE_BOOL: - switch (b) { - case GLSL_TYPE_UINT: - result = new(ctx) ir_expression(ir_unop_i2b, - new(ctx) ir_expression(ir_unop_u2i, src)); - break; - case GLSL_TYPE_INT: - result = new(ctx) ir_expression(ir_unop_i2b, desired_type, src, NULL); - break; - case GLSL_TYPE_FLOAT: - result = new(ctx) ir_expression(ir_unop_f2b, desired_type, src, NULL); - break; - } - break; - } - - assert(result != NULL); - assert(result->type == desired_type); - - /* Try constant folding; it may fold in the conversion we just added. */ - ir_constant *const constant = result->constant_expression_value(); - return (constant != NULL) ? (ir_rvalue *) constant : (ir_rvalue *) result; -} - -/** - * Dereference a specific component from a scalar, vector, or matrix - */ -static ir_rvalue * -dereference_component(ir_rvalue *src, unsigned component) -{ - void *ctx = ralloc_parent(src); - assert(component < src->type->components()); - - /* If the source is a constant, just create a new constant instead of a - * dereference of the existing constant. - */ - ir_constant *constant = src->as_constant(); - if (constant) - return new(ctx) ir_constant(constant, component); - - if (src->type->is_scalar()) { - return src; - } else if (src->type->is_vector()) { - return new(ctx) ir_swizzle(src, component, 0, 0, 0, 1); - } else { - assert(src->type->is_matrix()); - - /* Dereference a row of the matrix, then call this function again to get - * a specific element from that row. - */ - const int c = component / src->type->column_type()->vector_elements; - const int r = component % src->type->column_type()->vector_elements; - ir_constant *const col_index = new(ctx) ir_constant(c); - ir_dereference *const col = new(ctx) ir_dereference_array(src, col_index); - - col->type = src->type->column_type(); - - return dereference_component(col, r); - } - - assert(!"Should not get here."); - return NULL; -} - - -static ir_rvalue * -process_vec_mat_constructor(exec_list *instructions, - const glsl_type *constructor_type, - YYLTYPE *loc, exec_list *parameters, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - - /* The ARB_shading_language_420pack spec says: - * - * "If an initializer is a list of initializers enclosed in curly braces, - * the variable being declared must be a vector, a matrix, an array, or a - * structure. - * - * int i = { 1 }; // illegal, i is not an aggregate" - */ - if (constructor_type->vector_elements <= 1) { - _mesa_glsl_error(loc, state, "aggregates can only initialize vectors, " - "matrices, arrays, and structs"); - return ir_rvalue::error_value(ctx); - } - - exec_list actual_parameters; - const unsigned parameter_count = - process_parameters(instructions, &actual_parameters, parameters, state); - - if (parameter_count == 0 - || (constructor_type->is_vector() && - constructor_type->vector_elements != parameter_count) - || (constructor_type->is_matrix() && - constructor_type->matrix_columns != parameter_count)) { - _mesa_glsl_error(loc, state, "%s constructor must have %u parameters", - constructor_type->is_vector() ? "vector" : "matrix", - constructor_type->vector_elements); - return ir_rvalue::error_value(ctx); - } - - bool all_parameters_are_constant = true; - - /* Type cast each parameter and, if possible, fold constants. */ - foreach_in_list_safe(ir_rvalue, ir, &actual_parameters) { - ir_rvalue *result = ir; - - /* Apply implicit conversions (not the scalar constructor rules!). See - * the spec quote above. */ - if (constructor_type->is_float()) { - const glsl_type *desired_type = - glsl_type::get_instance(GLSL_TYPE_FLOAT, - ir->type->vector_elements, - ir->type->matrix_columns); - if (result->type->can_implicitly_convert_to(desired_type, state)) { - /* Even though convert_component() implements the constructor - * conversion rules (not the implicit conversion rules), its safe - * to use it here because we already checked that the implicit - * conversion is legal. - */ - result = convert_component(ir, desired_type); - } - } - - if (constructor_type->is_matrix()) { - if (result->type != constructor_type->column_type()) { - _mesa_glsl_error(loc, state, "type error in matrix constructor: " - "expected: %s, found %s", - constructor_type->column_type()->name, - result->type->name); - return ir_rvalue::error_value(ctx); - } - } else if (result->type != constructor_type->get_scalar_type()) { - _mesa_glsl_error(loc, state, "type error in vector constructor: " - "expected: %s, found %s", - constructor_type->get_scalar_type()->name, - result->type->name); - return ir_rvalue::error_value(ctx); - } - - /* Attempt to convert the parameter to a constant valued expression. - * After doing so, track whether or not all the parameters to the - * constructor are trivially constant valued expressions. - */ - ir_rvalue *const constant = result->constant_expression_value(); - - if (constant != NULL) - result = constant; - else - all_parameters_are_constant = false; - - ir->replace_with(result); - } - - if (all_parameters_are_constant) - return new(ctx) ir_constant(constructor_type, &actual_parameters); - - ir_variable *var = new(ctx) ir_variable(constructor_type, "vec_mat_ctor", - ir_var_temporary, glsl_precision_undefined); - instructions->push_tail(var); - - int i = 0; - - foreach_in_list(ir_rvalue, rhs, &actual_parameters) { - ir_instruction *assignment = NULL; - - if (var->type->is_matrix()) { - ir_rvalue *lhs = new(ctx) ir_dereference_array(var, - new(ctx) ir_constant(i)); - assignment = new(ctx) ir_assignment(lhs, rhs, NULL); - } else { - /* use writemask rather than index for vector */ - assert(var->type->is_vector()); - assert(i < 4); - ir_dereference *lhs = new(ctx) ir_dereference_variable(var); - assignment = new(ctx) ir_assignment(lhs, rhs, NULL, (unsigned)(1 << i)); - } - - instructions->push_tail(assignment); - - i++; - } - - return new(ctx) ir_dereference_variable(var); -} - - -static ir_rvalue * -process_array_constructor(exec_list *instructions, - const glsl_type *constructor_type, - YYLTYPE *loc, exec_list *parameters, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - /* Array constructors come in two forms: sized and unsized. Sized array - * constructors look like 'vec4[2](a, b)', where 'a' and 'b' are vec4 - * variables. In this case the number of parameters must exactly match the - * specified size of the array. - * - * Unsized array constructors look like 'vec4[](a, b)', where 'a' and 'b' - * are vec4 variables. In this case the size of the array being constructed - * is determined by the number of parameters. - * - * From page 52 (page 58 of the PDF) of the GLSL 1.50 spec: - * - * "There must be exactly the same number of arguments as the size of - * the array being constructed. If no size is present in the - * constructor, then the array is explicitly sized to the number of - * arguments provided. The arguments are assigned in order, starting at - * element 0, to the elements of the constructed array. Each argument - * must be the same type as the element type of the array, or be a type - * that can be converted to the element type of the array according to - * Section 4.1.10 "Implicit Conversions."" - */ - exec_list actual_parameters; - const unsigned parameter_count = - process_parameters(instructions, &actual_parameters, parameters, state); - bool is_unsized_array = constructor_type->is_unsized_array(); - - if ((parameter_count == 0) || - (!is_unsized_array && (constructor_type->length != parameter_count))) { - const unsigned min_param = is_unsized_array - ? 1 : constructor_type->length; - - _mesa_glsl_error(loc, state, "array constructor must have %s %u " - "parameter%s", - is_unsized_array ? "at least" : "exactly", - min_param, (min_param <= 1) ? "" : "s"); - return ir_rvalue::error_value(ctx); - } - - if (is_unsized_array) { - constructor_type = - glsl_type::get_array_instance(constructor_type->element_type(), - parameter_count); - assert(constructor_type != NULL); - assert(constructor_type->length == parameter_count); - } - - bool all_parameters_are_constant = true; - - /* Type cast each parameter and, if possible, fold constants. */ - foreach_in_list_safe(ir_rvalue, ir, &actual_parameters) { - ir_rvalue *result = ir; - - /* Apply implicit conversions (not the scalar constructor rules!). See - * the spec quote above. */ - if (constructor_type->element_type()->is_float()) { - const glsl_type *desired_type = - glsl_type::get_instance(GLSL_TYPE_FLOAT, - ir->type->vector_elements, - ir->type->matrix_columns); - if (result->type->can_implicitly_convert_to(desired_type, state)) { - /* Even though convert_component() implements the constructor - * conversion rules (not the implicit conversion rules), its safe - * to use it here because we already checked that the implicit - * conversion is legal. - */ - result = convert_component(ir, desired_type); - } - } - - if (result->type != constructor_type->element_type()) { - _mesa_glsl_error(loc, state, "type error in array constructor: " - "expected: %s, found %s", - constructor_type->element_type()->name, - result->type->name); - return ir_rvalue::error_value(ctx); - } - - /* Attempt to convert the parameter to a constant valued expression. - * After doing so, track whether or not all the parameters to the - * constructor are trivially constant valued expressions. - */ - ir_rvalue *const constant = result->constant_expression_value(); - - if (constant != NULL) - result = constant; - else - all_parameters_are_constant = false; - - ir->replace_with(result); - } - - if (all_parameters_are_constant) - return new(ctx) ir_constant(constructor_type, &actual_parameters); - - ir_variable *var = new(ctx) ir_variable(constructor_type, "array_ctor", - ir_var_temporary, glsl_precision_undefined); - instructions->push_tail(var); - - int i = 0; - foreach_in_list(ir_rvalue, rhs, &actual_parameters) { - ir_rvalue *lhs = new(ctx) ir_dereference_array(var, - new(ctx) ir_constant(i)); - - ir_instruction *assignment = new(ctx) ir_assignment(lhs, rhs, NULL); - instructions->push_tail(assignment); - - i++; - } - - return new(ctx) ir_dereference_variable(var); -} - - -/** - * Try to convert a record constructor to a constant expression - */ -static ir_constant * -constant_record_constructor(const glsl_type *constructor_type, - exec_list *parameters, void *mem_ctx) -{ - foreach_in_list(ir_instruction, node, parameters) { - ir_constant *constant = node->as_constant(); - if (constant == NULL) - return NULL; - node->replace_with(constant); - } - - return new(mem_ctx) ir_constant(constructor_type, parameters); -} - - -/** - * Determine if a list consists of a single scalar r-value - */ -bool -single_scalar_parameter(exec_list *parameters) -{ - const ir_rvalue *const p = (ir_rvalue *) parameters->head; - assert(((ir_rvalue *)p)->as_rvalue() != NULL); - - return (p->type->is_scalar() && p->next->is_tail_sentinel()); -} - - -/** - * Generate inline code for a vector constructor - * - * The generated constructor code will consist of a temporary variable - * declaration of the same type as the constructor. A sequence of assignments - * from constructor parameters to the temporary will follow. - * - * \return - * An \c ir_dereference_variable of the temprorary generated in the constructor - * body. - */ -ir_rvalue * -emit_inline_vector_constructor(const glsl_type *type, unsigned ast_precision, - exec_list *instructions, - exec_list *parameters, - void *ctx) -{ - assert(!parameters->is_empty()); - - ir_variable *var = new(ctx) ir_variable(type, "vec_ctor", ir_var_temporary, (glsl_precision)ast_precision); - instructions->push_tail(var); - - /* There are two kinds of vector constructors. - * - * - Construct a vector from a single scalar by replicating that scalar to - * all components of the vector. - * - * - Construct a vector from an arbirary combination of vectors and - * scalars. The components of the constructor parameters are assigned - * to the vector in order until the vector is full. - */ - const unsigned lhs_components = type->components(); - if (single_scalar_parameter(parameters)) { - ir_rvalue *first_param = (ir_rvalue *)parameters->head; - ir_rvalue *rhs = new(ctx) ir_swizzle(first_param, 0, 0, 0, 0, - lhs_components); - var->data.precision = higher_precision ((glsl_precision)var->data.precision, rhs->get_precision()); - ir_dereference_variable *lhs = new(ctx) ir_dereference_variable(var); - const unsigned mask = (1U << lhs_components) - 1; - - assert(rhs->type == lhs->type); - - ir_instruction *inst = new(ctx) ir_assignment(lhs, rhs, NULL, mask); - instructions->push_tail(inst); - } else { - unsigned base_component = 0; - unsigned base_lhs_component = 0; - ir_constant_data data; - unsigned constant_mask = 0, constant_components = 0; - - memset(&data, 0, sizeof(data)); - - foreach_in_list(ir_rvalue, param, parameters) { - var->data.precision = higher_precision ((glsl_precision)var->data.precision, param->get_precision()); - unsigned rhs_components = param->type->components(); - - /* Do not try to assign more components to the vector than it has! - */ - if ((rhs_components + base_lhs_component) > lhs_components) { - rhs_components = lhs_components - base_lhs_component; - } - - const ir_constant *const c = param->as_constant(); - if (c != NULL) { - for (unsigned i = 0; i < rhs_components; i++) { - switch (c->type->base_type) { - case GLSL_TYPE_UINT: - data.u[i + base_component] = c->get_uint_component(i); - break; - case GLSL_TYPE_INT: - data.i[i + base_component] = c->get_int_component(i); - break; - case GLSL_TYPE_FLOAT: - data.f[i + base_component] = c->get_float_component(i); - break; - case GLSL_TYPE_BOOL: - data.b[i + base_component] = c->get_bool_component(i); - break; - default: - assert(!"Should not get here."); - break; - } - } - - /* Mask of fields to be written in the assignment. - */ - constant_mask |= ((1U << rhs_components) - 1) << base_lhs_component; - constant_components += rhs_components; - - base_component += rhs_components; - } - /* Advance the component index by the number of components - * that were just assigned. - */ - base_lhs_component += rhs_components; - } - - if (constant_mask != 0) { - ir_dereference *lhs = new(ctx) ir_dereference_variable(var); - const glsl_type *rhs_type = glsl_type::get_instance(var->type->base_type, - constant_components, - 1); - ir_rvalue *rhs = new(ctx) ir_constant(rhs_type, &data); - - ir_instruction *inst = - new(ctx) ir_assignment(lhs, rhs, NULL, constant_mask); - instructions->push_tail(inst); - } - - base_component = 0; - foreach_in_list(ir_rvalue, param, parameters) { - unsigned rhs_components = param->type->components(); - - /* Do not try to assign more components to the vector than it has! - */ - if ((rhs_components + base_component) > lhs_components) { - rhs_components = lhs_components - base_component; - } - - const ir_constant *const c = param->as_constant(); - if (c == NULL) { - /* Mask of fields to be written in the assignment. - */ - const unsigned write_mask = ((1U << rhs_components) - 1) - << base_component; - - ir_dereference *lhs = new(ctx) ir_dereference_variable(var); - - /* Generate a swizzle so that LHS and RHS sizes match. - */ - ir_rvalue *rhs = - new(ctx) ir_swizzle(param, 0, 1, 2, 3, rhs_components); - - ir_instruction *inst = - new(ctx) ir_assignment(lhs, rhs, NULL, write_mask); - instructions->push_tail(inst); - } - - /* Advance the component index by the number of components that were - * just assigned. - */ - base_component += rhs_components; - } - } - return new(ctx) ir_dereference_variable(var); -} - - -/** - * Generate assignment of a portion of a vector to a portion of a matrix column - * - * \param src_base First component of the source to be used in assignment - * \param column Column of destination to be assiged - * \param row_base First component of the destination column to be assigned - * \param count Number of components to be assigned - * - * \note - * \c src_base + \c count must be less than or equal to the number of components - * in the source vector. - */ -ir_instruction * -assign_to_matrix_column(ir_variable *var, unsigned column, unsigned row_base, - ir_rvalue *src, unsigned src_base, unsigned count, - void *mem_ctx) -{ - ir_constant *col_idx = new(mem_ctx) ir_constant(column); - ir_dereference *column_ref = new(mem_ctx) ir_dereference_array(var, col_idx); - - assert(column_ref->type->components() >= (row_base + count)); - assert(src->type->components() >= (src_base + count)); - - /* Generate a swizzle that extracts the number of components from the source - * that are to be assigned to the column of the matrix. - */ - if (count < src->type->vector_elements) { - src = new(mem_ctx) ir_swizzle(src, - src_base + 0, src_base + 1, - src_base + 2, src_base + 3, - count); - } - - /* Mask of fields to be written in the assignment. - */ - const unsigned write_mask = ((1U << count) - 1) << row_base; - - return new(mem_ctx) ir_assignment(column_ref, src, NULL, write_mask); -} - - -/** - * Generate inline code for a matrix constructor - * - * The generated constructor code will consist of a temporary variable - * declaration of the same type as the constructor. A sequence of assignments - * from constructor parameters to the temporary will follow. - * - * \return - * An \c ir_dereference_variable of the temprorary generated in the constructor - * body. - */ -ir_rvalue * -emit_inline_matrix_constructor(const glsl_type *type, int ast_precision, - exec_list *instructions, - exec_list *parameters, - void *ctx) -{ - assert(!parameters->is_empty()); - - ir_variable *var = new(ctx) ir_variable(type, "mat_ctor", ir_var_temporary, (glsl_precision)ast_precision); - instructions->push_tail(var); - - /* There are three kinds of matrix constructors. - * - * - Construct a matrix from a single scalar by replicating that scalar to - * along the diagonal of the matrix and setting all other components to - * zero. - * - * - Construct a matrix from an arbirary combination of vectors and - * scalars. The components of the constructor parameters are assigned - * to the matrix in column-major order until the matrix is full. - * - * - Construct a matrix from a single matrix. The source matrix is copied - * to the upper left portion of the constructed matrix, and the remaining - * elements take values from the identity matrix. - */ - ir_rvalue *const first_param = (ir_rvalue *) parameters->head; - if (single_scalar_parameter(parameters)) { - /* Assign the scalar to the X component of a vec4, and fill the remaining - * components with zero. - */ - ir_variable *rhs_var = - new(ctx) ir_variable(glsl_type::vec4_type, "mat_ctor_vec", - ir_var_temporary, (glsl_precision)ast_precision); - instructions->push_tail(rhs_var); - - ir_constant_data zero; - zero.f[0] = 0.0; - zero.f[1] = 0.0; - zero.f[2] = 0.0; - zero.f[3] = 0.0; - - ir_instruction *inst = - new(ctx) ir_assignment(new(ctx) ir_dereference_variable(rhs_var), - new(ctx) ir_constant(rhs_var->type, &zero), - NULL); - instructions->push_tail(inst); - - ir_dereference *const rhs_ref = new(ctx) ir_dereference_variable(rhs_var); - - inst = new(ctx) ir_assignment(rhs_ref, first_param, NULL, 0x01); - instructions->push_tail(inst); - - /* Assign the temporary vector to each column of the destination matrix - * with a swizzle that puts the X component on the diagonal of the - * matrix. In some cases this may mean that the X component does not - * get assigned into the column at all (i.e., when the matrix has more - * columns than rows). - */ - static const unsigned rhs_swiz[4][4] = { - { 0, 1, 1, 1 }, - { 1, 0, 1, 1 }, - { 1, 1, 0, 1 }, - { 1, 1, 1, 0 } - }; - - const unsigned cols_to_init = MIN2(type->matrix_columns, - type->vector_elements); - for (unsigned i = 0; i < cols_to_init; i++) { - ir_constant *const col_idx = new(ctx) ir_constant(i); - ir_rvalue *const col_ref = new(ctx) ir_dereference_array(var, col_idx); - - ir_rvalue *const rhs_ref = new(ctx) ir_dereference_variable(rhs_var); - ir_rvalue *const rhs = new(ctx) ir_swizzle(rhs_ref, rhs_swiz[i], - type->vector_elements); - - inst = new(ctx) ir_assignment(col_ref, rhs, NULL); - instructions->push_tail(inst); - } - - for (unsigned i = cols_to_init; i < type->matrix_columns; i++) { - ir_constant *const col_idx = new(ctx) ir_constant(i); - ir_rvalue *const col_ref = new(ctx) ir_dereference_array(var, col_idx); - - ir_rvalue *const rhs_ref = new(ctx) ir_dereference_variable(rhs_var); - ir_rvalue *const rhs = new(ctx) ir_swizzle(rhs_ref, 1, 1, 1, 1, - type->vector_elements); - - inst = new(ctx) ir_assignment(col_ref, rhs, NULL); - instructions->push_tail(inst); - } - } else if (first_param->type->is_matrix()) { - /* From page 50 (56 of the PDF) of the GLSL 1.50 spec: - * - * "If a matrix is constructed from a matrix, then each component - * (column i, row j) in the result that has a corresponding - * component (column i, row j) in the argument will be initialized - * from there. All other components will be initialized to the - * identity matrix. If a matrix argument is given to a matrix - * constructor, it is an error to have any other arguments." - */ - assert(first_param->next->is_tail_sentinel()); - ir_rvalue *const src_matrix = first_param; - - /* If the source matrix is smaller, pre-initialize the relavent parts of - * the destination matrix to the identity matrix. - */ - if ((src_matrix->type->matrix_columns < var->type->matrix_columns) - || (src_matrix->type->vector_elements < var->type->vector_elements)) { - - /* If the source matrix has fewer rows, every column of the destination - * must be initialized. Otherwise only the columns in the destination - * that do not exist in the source must be initialized. - */ - unsigned col = - (src_matrix->type->vector_elements < var->type->vector_elements) - ? 0 : src_matrix->type->matrix_columns; - - const glsl_type *const col_type = var->type->column_type(); - for (/* empty */; col < var->type->matrix_columns; col++) { - ir_constant_data ident; - - ident.f[0] = 0.0; - ident.f[1] = 0.0; - ident.f[2] = 0.0; - ident.f[3] = 0.0; - - ident.f[col] = 1.0; - - ir_rvalue *const rhs = new(ctx) ir_constant(col_type, &ident); - - ir_rvalue *const lhs = - new(ctx) ir_dereference_array(var, new(ctx) ir_constant(col)); - - ir_instruction *inst = new(ctx) ir_assignment(lhs, rhs, NULL); - instructions->push_tail(inst); - } - } - - /* Assign columns from the source matrix to the destination matrix. - * - * Since the parameter will be used in the RHS of multiple assignments, - * generate a temporary and copy the paramter there. - */ - ir_variable *const rhs_var = - new(ctx) ir_variable(first_param->type, "mat_ctor_mat", - ir_var_temporary, (glsl_precision)ast_precision); - instructions->push_tail(rhs_var); - - ir_dereference *const rhs_var_ref = - new(ctx) ir_dereference_variable(rhs_var); - ir_instruction *const inst = - new(ctx) ir_assignment(rhs_var_ref, first_param, NULL); - instructions->push_tail(inst); - - const unsigned last_row = MIN2(src_matrix->type->vector_elements, - var->type->vector_elements); - const unsigned last_col = MIN2(src_matrix->type->matrix_columns, - var->type->matrix_columns); - - unsigned swiz[4] = { 0, 0, 0, 0 }; - for (unsigned i = 1; i < last_row; i++) - swiz[i] = i; - - const unsigned write_mask = (1U << last_row) - 1; - - for (unsigned i = 0; i < last_col; i++) { - ir_dereference *const lhs = - new(ctx) ir_dereference_array(var, new(ctx) ir_constant(i)); - ir_rvalue *const rhs_col = - new(ctx) ir_dereference_array(rhs_var, new(ctx) ir_constant(i)); - - /* If one matrix has columns that are smaller than the columns of the - * other matrix, wrap the column access of the larger with a swizzle - * so that the LHS and RHS of the assignment have the same size (and - * therefore have the same type). - * - * It would be perfectly valid to unconditionally generate the - * swizzles, this this will typically result in a more compact IR tree. - */ - ir_rvalue *rhs; - if (lhs->type->vector_elements != rhs_col->type->vector_elements) { - rhs = new(ctx) ir_swizzle(rhs_col, swiz, last_row); - } else { - rhs = rhs_col; - } - - ir_instruction *inst = - new(ctx) ir_assignment(lhs, rhs, NULL, write_mask); - instructions->push_tail(inst); - } - } else { - const unsigned cols = type->matrix_columns; - const unsigned rows = type->vector_elements; - unsigned col_idx = 0; - unsigned row_idx = 0; - - foreach_in_list(ir_rvalue, rhs, parameters) { - const unsigned components_remaining_this_column = rows - row_idx; - unsigned rhs_components = rhs->type->components(); - unsigned rhs_base = 0; - - /* Since the parameter might be used in the RHS of two assignments, - * generate a temporary and copy the paramter there. - */ - ir_variable *rhs_var = - new(ctx) ir_variable(rhs->type, "mat_ctor_vec", ir_var_temporary, (glsl_precision)ast_precision); - instructions->push_tail(rhs_var); - - ir_dereference *rhs_var_ref = - new(ctx) ir_dereference_variable(rhs_var); - ir_instruction *inst = new(ctx) ir_assignment(rhs_var_ref, rhs, NULL); - instructions->push_tail(inst); - - /* Assign the current parameter to as many components of the matrix - * as it will fill. - * - * NOTE: A single vector parameter can span two matrix columns. A - * single vec4, for example, can completely fill a mat2. - */ - if (rhs_components >= components_remaining_this_column) { - const unsigned count = MIN2(rhs_components, - components_remaining_this_column); - - rhs_var_ref = new(ctx) ir_dereference_variable(rhs_var); - - ir_instruction *inst = assign_to_matrix_column(var, col_idx, - row_idx, - rhs_var_ref, 0, - count, ctx); - instructions->push_tail(inst); - - rhs_base = count; - - col_idx++; - row_idx = 0; - } - - /* If there is data left in the parameter and components left to be - * set in the destination, emit another assignment. It is possible - * that the assignment could be of a vec4 to the last element of the - * matrix. In this case col_idx==cols, but there is still data - * left in the source parameter. Obviously, don't emit an assignment - * to data outside the destination matrix. - */ - if ((col_idx < cols) && (rhs_base < rhs_components)) { - const unsigned count = rhs_components - rhs_base; - - rhs_var_ref = new(ctx) ir_dereference_variable(rhs_var); - - ir_instruction *inst = assign_to_matrix_column(var, col_idx, - row_idx, - rhs_var_ref, - rhs_base, - count, ctx); - instructions->push_tail(inst); - - row_idx += count; - } - } - } - - return new(ctx) ir_dereference_variable(var); -} - - -ir_rvalue * -emit_inline_record_constructor(const glsl_type *type, - exec_list *instructions, - exec_list *parameters, - void *mem_ctx) -{ - ir_variable *const var = - new(mem_ctx) ir_variable(type, "record_ctor", ir_var_temporary, glsl_precision_undefined); - ir_dereference_variable *const d = new(mem_ctx) ir_dereference_variable(var); - - instructions->push_tail(var); - - exec_node *node = parameters->head; - for (unsigned i = 0; i < type->length; i++) { - assert(!node->is_tail_sentinel()); - - ir_dereference *const lhs = - new(mem_ctx) ir_dereference_record(d->clone(mem_ctx, NULL), - type->fields.structure[i].name); - - ir_rvalue *const rhs = ((ir_instruction *) node)->as_rvalue(); - assert(rhs != NULL); - - ir_instruction *const assign = new(mem_ctx) ir_assignment(lhs, rhs, NULL); - - instructions->push_tail(assign); - node = node->next; - } - - return d; -} - - -static ir_rvalue * -process_record_constructor(exec_list *instructions, - const glsl_type *constructor_type, - YYLTYPE *loc, exec_list *parameters, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - exec_list actual_parameters; - - process_parameters(instructions, &actual_parameters, - parameters, state); - - exec_node *node = actual_parameters.head; - for (unsigned i = 0; i < constructor_type->length; i++) { - ir_rvalue *ir = (ir_rvalue *) node; - - if (node->is_tail_sentinel()) { - _mesa_glsl_error(loc, state, - "insufficient parameters to constructor for `%s'", - constructor_type->name); - return ir_rvalue::error_value(ctx); - } - - if (apply_implicit_conversion(constructor_type->fields.structure[i].type, - ir, state)) { - node->replace_with(ir); - } else { - _mesa_glsl_error(loc, state, - "parameter type mismatch in constructor for `%s.%s' " - "(%s vs %s)", - constructor_type->name, - constructor_type->fields.structure[i].name, - ir->type->name, - constructor_type->fields.structure[i].type->name); - return ir_rvalue::error_value(ctx);; - } - - node = node->next; - } - - if (!node->is_tail_sentinel()) { - _mesa_glsl_error(loc, state, "too many parameters in constructor " - "for `%s'", constructor_type->name); - return ir_rvalue::error_value(ctx); - } - - ir_rvalue *const constant = - constant_record_constructor(constructor_type, &actual_parameters, - state); - - return (constant != NULL) - ? constant - : emit_inline_record_constructor(constructor_type, instructions, - &actual_parameters, state); -} - - -ir_rvalue * -ast_function_expression::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - /* There are three sorts of function calls. - * - * 1. constructors - The first subexpression is an ast_type_specifier. - * 2. methods - Only the .length() method of array types. - * 3. functions - Calls to regular old functions. - * - * Method calls are actually detected when the ast_field_selection - * expression is handled. - */ - if (is_constructor()) { - const ast_type_specifier *type = (ast_type_specifier *) subexpressions[0]; - YYLTYPE loc = type->get_location(); - const char *name; - - const glsl_type *const constructor_type = type->glsl_type(& name, state); - - /* constructor_type can be NULL if a variable with the same name as the - * structure has come into scope. - */ - if (constructor_type == NULL) { - _mesa_glsl_error(& loc, state, "unknown type `%s' (structure name " - "may be shadowed by a variable with the same name)", - type->type_name); - return ir_rvalue::error_value(ctx); - } - - - /* Constructors for samplers are illegal. - */ - if (constructor_type->is_sampler()) { - _mesa_glsl_error(& loc, state, "cannot construct sampler type `%s'", - constructor_type->name); - return ir_rvalue::error_value(ctx); - } - - if (constructor_type->is_array()) { - if (!state->check_version(120, 300, &loc, - "array constructors forbidden")) { - return ir_rvalue::error_value(ctx); - } - - return process_array_constructor(instructions, constructor_type, - & loc, &this->expressions, state); - } - - - /* There are two kinds of constructor calls. Constructors for arrays and - * structures must have the exact number of arguments with matching types - * in the correct order. These constructors follow essentially the same - * type matching rules as functions. - * - * Constructors for built-in language types, such as mat4 and vec2, are - * free form. The only requirements are that the parameters must provide - * enough values of the correct scalar type and that no arguments are - * given past the last used argument. - * - * When using the C-style initializer syntax from GLSL 4.20, constructors - * must have the exact number of arguments with matching types in the - * correct order. - */ - if (constructor_type->is_record()) { - return process_record_constructor(instructions, constructor_type, - &loc, &this->expressions, - state); - } - - if (!constructor_type->is_numeric() && !constructor_type->is_boolean()) - return ir_rvalue::error_value(ctx); - - /* Total number of components of the type being constructed. */ - const unsigned type_components = constructor_type->components(); - - /* Number of components from parameters that have actually been - * consumed. This is used to perform several kinds of error checking. - */ - unsigned components_used = 0; - - unsigned matrix_parameters = 0; - unsigned nonmatrix_parameters = 0; - exec_list actual_parameters; - glsl_precision params_precision = glsl_precision_undefined; - - foreach_list_typed(ast_node, ast, link, &this->expressions) { - ir_rvalue *result = ast->hir(instructions, state); - - /* From page 50 (page 56 of the PDF) of the GLSL 1.50 spec: - * - * "It is an error to provide extra arguments beyond this - * last used argument." - */ - if (components_used >= type_components) { - _mesa_glsl_error(& loc, state, "too many parameters to `%s' " - "constructor", - constructor_type->name); - return ir_rvalue::error_value(ctx); - } - - if (!result->type->is_numeric() && !result->type->is_boolean()) { - _mesa_glsl_error(& loc, state, "cannot construct `%s' from a " - "non-numeric data type", - constructor_type->name); - return ir_rvalue::error_value(ctx); - } - - /* Count the number of matrix and nonmatrix parameters. This - * is used below to enforce some of the constructor rules. - */ - if (result->type->is_matrix()) - matrix_parameters++; - else - nonmatrix_parameters++; - - actual_parameters.push_tail(result); - params_precision = higher_precision(params_precision, result->get_precision()); - components_used += result->type->components(); - } - - /* From page 28 (page 34 of the PDF) of the GLSL 1.10 spec: - * - * "It is an error to construct matrices from other matrices. This - * is reserved for future use." - */ - if (matrix_parameters > 0 - && constructor_type->is_matrix() - && !state->check_version(120, 100, &loc, - "cannot construct `%s' from a matrix", - constructor_type->name)) { - return ir_rvalue::error_value(ctx); - } - - /* From page 50 (page 56 of the PDF) of the GLSL 1.50 spec: - * - * "If a matrix argument is given to a matrix constructor, it is - * an error to have any other arguments." - */ - if ((matrix_parameters > 0) - && ((matrix_parameters + nonmatrix_parameters) > 1) - && constructor_type->is_matrix()) { - _mesa_glsl_error(& loc, state, "for matrix `%s' constructor, " - "matrix must be only parameter", - constructor_type->name); - return ir_rvalue::error_value(ctx); - } - - /* From page 28 (page 34 of the PDF) of the GLSL 1.10 spec: - * - * "In these cases, there must be enough components provided in the - * arguments to provide an initializer for every component in the - * constructed value." - */ - if (components_used < type_components && components_used != 1 - && matrix_parameters == 0) { - _mesa_glsl_error(& loc, state, "too few components to construct " - "`%s'", - constructor_type->name); - return ir_rvalue::error_value(ctx); - } - - /* Later, we cast each parameter to the same base type as the - * constructor. Since there are no non-floating point matrices, we - * need to break them up into a series of column vectors. - */ - if (constructor_type->base_type != GLSL_TYPE_FLOAT) { - foreach_in_list_safe(ir_rvalue, matrix, &actual_parameters) { - if (!matrix->type->is_matrix()) - continue; - - /* Create a temporary containing the matrix. */ - ir_variable *var = new(ctx) ir_variable(matrix->type, "matrix_tmp", - ir_var_temporary, matrix->get_precision()); - instructions->push_tail(var); - instructions->push_tail(new(ctx) ir_assignment(new(ctx) - ir_dereference_variable(var), matrix, NULL)); - var->constant_value = matrix->constant_expression_value(); - - /* Replace the matrix with dereferences of its columns. */ - for (int i = 0; i < (int)matrix->type->matrix_columns; i++) { - matrix->insert_before(new (ctx) ir_dereference_array(var, - new(ctx) ir_constant(i))); - } - matrix->remove(); - } - } - - bool all_parameters_are_constant = true; - - /* Type cast each parameter and, if possible, fold constants.*/ - foreach_in_list_safe(ir_rvalue, ir, &actual_parameters) { - const glsl_type *desired_type = - glsl_type::get_instance(constructor_type->base_type, - ir->type->vector_elements, - ir->type->matrix_columns); - ir_rvalue *result = convert_component(ir, desired_type); - - /* Attempt to convert the parameter to a constant valued expression. - * After doing so, track whether or not all the parameters to the - * constructor are trivially constant valued expressions. - */ - ir_rvalue *const constant = result->constant_expression_value(); - - if (constant != NULL) - result = constant; - else - all_parameters_are_constant = false; - - if (result != ir) { - ir->replace_with(result); - } - } - - /* If all of the parameters are trivially constant, create a - * constant representing the complete collection of parameters. - */ - if (all_parameters_are_constant) { - return new(ctx) ir_constant(constructor_type, &actual_parameters); - } else if (constructor_type->is_scalar()) { - return dereference_component((ir_rvalue *) actual_parameters.head, - 0); - } else if (constructor_type->is_vector()) { - return emit_inline_vector_constructor(constructor_type, params_precision, - instructions, - &actual_parameters, - ctx); - } else { - assert(constructor_type->is_matrix()); - return emit_inline_matrix_constructor(constructor_type, params_precision, - instructions, - &actual_parameters, - ctx); - } - } else { - const ast_expression *id = subexpressions[0]; - const char *func_name = id->primary_expression.identifier; - YYLTYPE loc = get_location(); - exec_list actual_parameters; - - process_parameters(instructions, &actual_parameters, &this->expressions, - state); - - ir_function_signature *sig = - match_function_by_name(func_name, &actual_parameters, state); - - ir_rvalue *value = NULL; - if (sig == NULL) { - no_matching_function_error(func_name, &loc, &actual_parameters, state); - value = ir_rvalue::error_value(ctx); - } else if (!verify_parameter_modes(state, sig, actual_parameters, this->expressions)) { - /* an error has already been emitted */ - value = ir_rvalue::error_value(ctx); - } else { - value = generate_call(instructions, sig, &actual_parameters, state); - } - - return value; - } - - return ir_rvalue::error_value(ctx); -} - -ir_rvalue * -ast_aggregate_initializer::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - YYLTYPE loc = this->get_location(); - - if (!this->constructor_type) { - _mesa_glsl_error(&loc, state, "type of C-style initializer unknown"); - return ir_rvalue::error_value(ctx); - } - const glsl_type *const constructor_type = this->constructor_type; - - if (!state->ARB_shading_language_420pack_enable) { - _mesa_glsl_error(&loc, state, "C-style initialization requires the " - "GL_ARB_shading_language_420pack extension"); - return ir_rvalue::error_value(ctx); - } - - if (constructor_type->is_array()) { - return process_array_constructor(instructions, constructor_type, &loc, - &this->expressions, state); - } - - if (constructor_type->is_record()) { - return process_record_constructor(instructions, constructor_type, &loc, - &this->expressions, state); - } - - return process_vec_mat_constructor(instructions, constructor_type, &loc, - &this->expressions, state); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ast_to_hir.cpp b/3rdparty/glsl-optimizer/src/glsl/ast_to_hir.cpp deleted file mode 100644 index 09b688578..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ast_to_hir.cpp +++ /dev/null @@ -1,6124 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file ast_to_hir.c - * Convert abstract syntax to to high-level intermediate reprensentation (HIR). - * - * During the conversion to HIR, the majority of the symantic checking is - * preformed on the program. This includes: - * - * * Symbol table management - * * Type checking - * * Function binding - * - * The majority of this work could be done during parsing, and the parser could - * probably generate HIR directly. However, this results in frequent changes - * to the parser code. Since we do not assume that every system this complier - * is built on will have Flex and Bison installed, we have to store the code - * generated by these tools in our version control system. In other parts of - * the system we've seen problems where a parser was changed but the generated - * code was not committed, merge conflicts where created because two developers - * had slightly different versions of Bison installed, etc. - * - * I have also noticed that running Bison generated parsers in GDB is very - * irritating. When you get a segfault on '$$ = $1->foo', you can't very - * well 'print $1' in GDB. - * - * As a result, my preference is to put as little C code as possible in the - * parser (and lexer) sources. - */ - -#include "glsl_symbol_table.h" -#include "glsl_parser_extras.h" -#include "ast.h" -#include "glsl_types.h" -#include "program/hash_table.h" -#include "ir.h" -#include "ir_builder.h" - -using namespace ir_builder; - -static void -detect_conflicting_assignments(struct _mesa_glsl_parse_state *state, - exec_list *instructions); -static void -remove_per_vertex_blocks(exec_list *instructions, - _mesa_glsl_parse_state *state, ir_variable_mode mode); - - -void -_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state) -{ - _mesa_glsl_initialize_variables(instructions, state); - - state->symbols->separate_function_namespace = state->language_version == 110; - - state->current_function = NULL; - - state->toplevel_ir = instructions; - - state->gs_input_prim_type_specified = false; - state->cs_input_local_size_specified = false; - - /* Section 4.2 of the GLSL 1.20 specification states: - * "The built-in functions are scoped in a scope outside the global scope - * users declare global variables in. That is, a shader's global scope, - * available for user-defined functions and global variables, is nested - * inside the scope containing the built-in functions." - * - * Since built-in functions like ftransform() access built-in variables, - * it follows that those must be in the outer scope as well. - * - * We push scope here to create this nesting effect...but don't pop. - * This way, a shader's globals are still in the symbol table for use - * by the linker. - */ - state->symbols->push_scope(); - - foreach_list_typed (ast_node, ast, link, & state->translation_unit) - ast->hir(instructions, state); - - detect_recursion_unlinked(state, instructions); - detect_conflicting_assignments(state, instructions); - - state->toplevel_ir = NULL; - - /* Move all of the variable declarations to the front of the IR list, and - * reverse the order. This has the (intended!) side effect that vertex - * shader inputs and fragment shader outputs will appear in the IR in the - * same order that they appeared in the shader code. This results in the - * locations being assigned in the declared order. Many (arguably buggy) - * applications depend on this behavior, and it matches what nearly all - * other drivers do. - * - * However, do not push the declarations before struct decls or precision - * statements. - */ - ir_instruction* before_node = (ir_instruction*)instructions->head; - ir_instruction* after_node = NULL; - while (before_node && (before_node->ir_type == ir_type_precision || before_node->ir_type == ir_type_typedecl)) - { - after_node = before_node; - before_node = (ir_instruction*)before_node->next; - } - - foreach_in_list_safe(ir_instruction, node, instructions) { - ir_variable *const var = node->as_variable(); - - if (var == NULL) - continue; - - var->remove(); - if (after_node) - after_node->insert_after(var); - else - instructions->push_head(var); - } - - /* Figure out if gl_FragCoord is actually used in fragment shader */ - ir_variable *const var = state->symbols->get_variable("gl_FragCoord"); - if (var != NULL) - state->fs_uses_gl_fragcoord = var->data.used; - - /* From section 7.1 (Built-In Language Variables) of the GLSL 4.10 spec: - * - * If multiple shaders using members of a built-in block belonging to - * the same interface are linked together in the same program, they - * must all redeclare the built-in block in the same way, as described - * in section 4.3.7 "Interface Blocks" for interface block matching, or - * a link error will result. - * - * The phrase "using members of a built-in block" implies that if two - * shaders are linked together and one of them *does not use* any members - * of the built-in block, then that shader does not need to have a matching - * redeclaration of the built-in block. - * - * This appears to be a clarification to the behaviour established for - * gl_PerVertex by GLSL 1.50, therefore implement it regardless of GLSL - * version. - * - * The definition of "interface" in section 4.3.7 that applies here is as - * follows: - * - * The boundary between adjacent programmable pipeline stages: This - * spans all the outputs in all compilation units of the first stage - * and all the inputs in all compilation units of the second stage. - * - * Therefore this rule applies to both inter- and intra-stage linking. - * - * The easiest way to implement this is to check whether the shader uses - * gl_PerVertex right after ast-to-ir conversion, and if it doesn't, simply - * remove all the relevant variable declaration from the IR, so that the - * linker won't see them and complain about mismatches. - */ - remove_per_vertex_blocks(instructions, state, ir_var_shader_in); - remove_per_vertex_blocks(instructions, state, ir_var_shader_out); -} - - -static ir_expression_operation -get_conversion_operation(const glsl_type *to, const glsl_type *from, - struct _mesa_glsl_parse_state *state) -{ - switch (to->base_type) { - case GLSL_TYPE_FLOAT: - switch (from->base_type) { - case GLSL_TYPE_INT: return ir_unop_i2f; - case GLSL_TYPE_UINT: return ir_unop_u2f; - default: return (ir_expression_operation)0; - } - - case GLSL_TYPE_UINT: - if (!state->is_version(400, 0) && !state->ARB_gpu_shader5_enable) - return (ir_expression_operation)0; - switch (from->base_type) { - case GLSL_TYPE_INT: return ir_unop_i2u; - default: return (ir_expression_operation)0; - } - - default: return (ir_expression_operation)0; - } -} - - -/** - * If a conversion is available, convert one operand to a different type - * - * The \c from \c ir_rvalue is converted "in place". - * - * \param to Type that the operand it to be converted to - * \param from Operand that is being converted - * \param state GLSL compiler state - * - * \return - * If a conversion is possible (or unnecessary), \c true is returned. - * Otherwise \c false is returned. - */ -bool -apply_implicit_conversion(const glsl_type *to, ir_rvalue * &from, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - if (to->base_type == from->type->base_type) - return true; - - /* Prior to GLSL 1.20, there are no implicit conversions */ - if (!state->is_version(120, 0)) - return false; - - /* From page 27 (page 33 of the PDF) of the GLSL 1.50 spec: - * - * "There are no implicit array or structure conversions. For - * example, an array of int cannot be implicitly converted to an - * array of float. - */ - if (!to->is_numeric() || !from->type->is_numeric()) - return false; - - /* We don't actually want the specific type `to`, we want a type - * with the same base type as `to`, but the same vector width as - * `from`. - */ - to = glsl_type::get_instance(to->base_type, from->type->vector_elements, - from->type->matrix_columns); - - ir_expression_operation op = get_conversion_operation(to, from->type, state); - if (op) { - from = new(ctx) ir_expression(op, to, from, NULL); - return true; - } else { - return false; - } -} - - -static const struct glsl_type * -arithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, - bool multiply, - struct _mesa_glsl_parse_state *state, YYLTYPE *loc) -{ - const glsl_type *type_a = value_a->type; - const glsl_type *type_b = value_b->type; - - /* From GLSL 1.50 spec, page 56: - * - * "The arithmetic binary operators add (+), subtract (-), - * multiply (*), and divide (/) operate on integer and - * floating-point scalars, vectors, and matrices." - */ - if (!type_a->is_numeric() || !type_b->is_numeric()) { - _mesa_glsl_error(loc, state, - "operands to arithmetic operators must be numeric"); - return glsl_type::error_type; - } - - - /* "If one operand is floating-point based and the other is - * not, then the conversions from Section 4.1.10 "Implicit - * Conversions" are applied to the non-floating-point-based operand." - */ - if (!apply_implicit_conversion(type_a, value_b, state) - && !apply_implicit_conversion(type_b, value_a, state)) { - _mesa_glsl_error(loc, state, - "could not implicitly convert operands to " - "arithmetic operator"); - return glsl_type::error_type; - } - type_a = value_a->type; - type_b = value_b->type; - - /* "If the operands are integer types, they must both be signed or - * both be unsigned." - * - * From this rule and the preceeding conversion it can be inferred that - * both types must be GLSL_TYPE_FLOAT, or GLSL_TYPE_UINT, or GLSL_TYPE_INT. - * The is_numeric check above already filtered out the case where either - * type is not one of these, so now the base types need only be tested for - * equality. - */ - if (type_a->base_type != type_b->base_type) { - _mesa_glsl_error(loc, state, - "base type mismatch for arithmetic operator"); - return glsl_type::error_type; - } - - /* "All arithmetic binary operators result in the same fundamental type - * (signed integer, unsigned integer, or floating-point) as the - * operands they operate on, after operand type conversion. After - * conversion, the following cases are valid - * - * * The two operands are scalars. In this case the operation is - * applied, resulting in a scalar." - */ - if (type_a->is_scalar() && type_b->is_scalar()) - return type_a; - - /* "* One operand is a scalar, and the other is a vector or matrix. - * In this case, the scalar operation is applied independently to each - * component of the vector or matrix, resulting in the same size - * vector or matrix." - */ - if (type_a->is_scalar()) { - if (!type_b->is_scalar()) - return type_b; - } else if (type_b->is_scalar()) { - return type_a; - } - - /* All of the combinations of , , - * , , and have been - * handled. - */ - assert(!type_a->is_scalar()); - assert(!type_b->is_scalar()); - - /* "* The two operands are vectors of the same size. In this case, the - * operation is done component-wise resulting in the same size - * vector." - */ - if (type_a->is_vector() && type_b->is_vector()) { - if (type_a == type_b) { - return type_a; - } else { - _mesa_glsl_error(loc, state, - "vector size mismatch for arithmetic operator"); - return glsl_type::error_type; - } - } - - /* All of the combinations of , , - * , , , and - * have been handled. At least one of the operands must - * be matrix. Further, since there are no integer matrix types, the base - * type of both operands must be float. - */ - assert(type_a->is_matrix() || type_b->is_matrix()); - assert(type_a->base_type == GLSL_TYPE_FLOAT); - assert(type_b->base_type == GLSL_TYPE_FLOAT); - - /* "* The operator is add (+), subtract (-), or divide (/), and the - * operands are matrices with the same number of rows and the same - * number of columns. In this case, the operation is done component- - * wise resulting in the same size matrix." - * * The operator is multiply (*), where both operands are matrices or - * one operand is a vector and the other a matrix. A right vector - * operand is treated as a column vector and a left vector operand as a - * row vector. In all these cases, it is required that the number of - * columns of the left operand is equal to the number of rows of the - * right operand. Then, the multiply (*) operation does a linear - * algebraic multiply, yielding an object that has the same number of - * rows as the left operand and the same number of columns as the right - * operand. Section 5.10 "Vector and Matrix Operations" explains in - * more detail how vectors and matrices are operated on." - */ - if (! multiply) { - if (type_a == type_b) - return type_a; - } else { - if (type_a->is_matrix() && type_b->is_matrix()) { - /* Matrix multiply. The columns of A must match the rows of B. Given - * the other previously tested constraints, this means the vector type - * of a row from A must be the same as the vector type of a column from - * B. - */ - if (type_a->row_type() == type_b->column_type()) { - /* The resulting matrix has the number of columns of matrix B and - * the number of rows of matrix A. We get the row count of A by - * looking at the size of a vector that makes up a column. The - * transpose (size of a row) is done for B. - */ - const glsl_type *const type = - glsl_type::get_instance(type_a->base_type, - type_a->column_type()->vector_elements, - type_b->row_type()->vector_elements); - assert(type != glsl_type::error_type); - - return type; - } - } else if (type_a->is_matrix()) { - /* A is a matrix and B is a column vector. Columns of A must match - * rows of B. Given the other previously tested constraints, this - * means the vector type of a row from A must be the same as the - * vector the type of B. - */ - if (type_a->row_type() == type_b) { - /* The resulting vector has a number of elements equal to - * the number of rows of matrix A. */ - const glsl_type *const type = - glsl_type::get_instance(type_a->base_type, - type_a->column_type()->vector_elements, - 1); - assert(type != glsl_type::error_type); - - return type; - } - } else { - assert(type_b->is_matrix()); - - /* A is a row vector and B is a matrix. Columns of A must match rows - * of B. Given the other previously tested constraints, this means - * the type of A must be the same as the vector type of a column from - * B. - */ - if (type_a == type_b->column_type()) { - /* The resulting vector has a number of elements equal to - * the number of columns of matrix B. */ - const glsl_type *const type = - glsl_type::get_instance(type_a->base_type, - type_b->row_type()->vector_elements, - 1); - assert(type != glsl_type::error_type); - - return type; - } - } - - _mesa_glsl_error(loc, state, "size mismatch for matrix multiplication"); - return glsl_type::error_type; - } - - - /* "All other cases are illegal." - */ - _mesa_glsl_error(loc, state, "type mismatch"); - return glsl_type::error_type; -} - - -static const struct glsl_type * -unary_arithmetic_result_type(const struct glsl_type *type, - struct _mesa_glsl_parse_state *state, YYLTYPE *loc) -{ - /* From GLSL 1.50 spec, page 57: - * - * "The arithmetic unary operators negate (-), post- and pre-increment - * and decrement (-- and ++) operate on integer or floating-point - * values (including vectors and matrices). All unary operators work - * component-wise on their operands. These result with the same type - * they operated on." - */ - if (!type->is_numeric()) { - _mesa_glsl_error(loc, state, - "operands to arithmetic operators must be numeric"); - return glsl_type::error_type; - } - - return type; -} - -/** - * \brief Return the result type of a bit-logic operation. - * - * If the given types to the bit-logic operator are invalid, return - * glsl_type::error_type. - * - * \param type_a Type of LHS of bit-logic op - * \param type_b Type of RHS of bit-logic op - */ -static const struct glsl_type * -bit_logic_result_type(const struct glsl_type *type_a, - const struct glsl_type *type_b, - ast_operators op, - struct _mesa_glsl_parse_state *state, YYLTYPE *loc) -{ - if (!state->check_bitwise_operations_allowed(loc)) { - return glsl_type::error_type; - } - - /* From page 50 (page 56 of PDF) of GLSL 1.30 spec: - * - * "The bitwise operators and (&), exclusive-or (^), and inclusive-or - * (|). The operands must be of type signed or unsigned integers or - * integer vectors." - */ - if (!type_a->is_integer()) { - _mesa_glsl_error(loc, state, "LHS of `%s' must be an integer", - ast_expression::operator_string(op)); - return glsl_type::error_type; - } - if (!type_b->is_integer()) { - _mesa_glsl_error(loc, state, "RHS of `%s' must be an integer", - ast_expression::operator_string(op)); - return glsl_type::error_type; - } - - /* "The fundamental types of the operands (signed or unsigned) must - * match," - */ - if (type_a->base_type != type_b->base_type) { - _mesa_glsl_error(loc, state, "operands of `%s' must have the same " - "base type", ast_expression::operator_string(op)); - return glsl_type::error_type; - } - - /* "The operands cannot be vectors of differing size." */ - if (type_a->is_vector() && - type_b->is_vector() && - type_a->vector_elements != type_b->vector_elements) { - _mesa_glsl_error(loc, state, "operands of `%s' cannot be vectors of " - "different sizes", ast_expression::operator_string(op)); - return glsl_type::error_type; - } - - /* "If one operand is a scalar and the other a vector, the scalar is - * applied component-wise to the vector, resulting in the same type as - * the vector. The fundamental types of the operands [...] will be the - * resulting fundamental type." - */ - if (type_a->is_scalar()) - return type_b; - else - return type_a; -} - -static const struct glsl_type * -modulus_result_type(const struct glsl_type *type_a, - const struct glsl_type *type_b, - struct _mesa_glsl_parse_state *state, YYLTYPE *loc) -{ - if (!state->check_version(130, 300, loc, "operator '%%' is reserved")) { - return glsl_type::error_type; - } - - /* From GLSL 1.50 spec, page 56: - * "The operator modulus (%) operates on signed or unsigned integers or - * integer vectors. The operand types must both be signed or both be - * unsigned." - */ - if (!type_a->is_integer()) { - _mesa_glsl_error(loc, state, "LHS of operator %% must be an integer"); - return glsl_type::error_type; - } - if (!type_b->is_integer()) { - _mesa_glsl_error(loc, state, "RHS of operator %% must be an integer"); - return glsl_type::error_type; - } - if (type_a->base_type != type_b->base_type) { - _mesa_glsl_error(loc, state, - "operands of %% must have the same base type"); - return glsl_type::error_type; - } - - /* "The operands cannot be vectors of differing size. If one operand is - * a scalar and the other vector, then the scalar is applied component- - * wise to the vector, resulting in the same type as the vector. If both - * are vectors of the same size, the result is computed component-wise." - */ - if (type_a->is_vector()) { - if (!type_b->is_vector() - || (type_a->vector_elements == type_b->vector_elements)) - return type_a; - } else - return type_b; - - /* "The operator modulus (%) is not defined for any other data types - * (non-integer types)." - */ - _mesa_glsl_error(loc, state, "type mismatch"); - return glsl_type::error_type; -} - - -static const struct glsl_type * -relational_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, - struct _mesa_glsl_parse_state *state, YYLTYPE *loc) -{ - const glsl_type *type_a = value_a->type; - const glsl_type *type_b = value_b->type; - - /* From GLSL 1.50 spec, page 56: - * "The relational operators greater than (>), less than (<), greater - * than or equal (>=), and less than or equal (<=) operate only on - * scalar integer and scalar floating-point expressions." - */ - if (!type_a->is_numeric() - || !type_b->is_numeric() - || !type_a->is_scalar() - || !type_b->is_scalar()) { - _mesa_glsl_error(loc, state, - "operands to relational operators must be scalar and " - "numeric"); - return glsl_type::error_type; - } - - /* "Either the operands' types must match, or the conversions from - * Section 4.1.10 "Implicit Conversions" will be applied to the integer - * operand, after which the types must match." - */ - if (!apply_implicit_conversion(type_a, value_b, state) - && !apply_implicit_conversion(type_b, value_a, state)) { - _mesa_glsl_error(loc, state, - "could not implicitly convert operands to " - "relational operator"); - return glsl_type::error_type; - } - type_a = value_a->type; - type_b = value_b->type; - - if (type_a->base_type != type_b->base_type) { - _mesa_glsl_error(loc, state, "base type mismatch"); - return glsl_type::error_type; - } - - /* "The result is scalar Boolean." - */ - return glsl_type::bool_type; -} - -/** - * \brief Return the result type of a bit-shift operation. - * - * If the given types to the bit-shift operator are invalid, return - * glsl_type::error_type. - * - * \param type_a Type of LHS of bit-shift op - * \param type_b Type of RHS of bit-shift op - */ -static const struct glsl_type * -shift_result_type(const struct glsl_type *type_a, - const struct glsl_type *type_b, - ast_operators op, - struct _mesa_glsl_parse_state *state, YYLTYPE *loc) -{ - if (!state->check_bitwise_operations_allowed(loc)) { - return glsl_type::error_type; - } - - /* From page 50 (page 56 of the PDF) of the GLSL 1.30 spec: - * - * "The shift operators (<<) and (>>). For both operators, the operands - * must be signed or unsigned integers or integer vectors. One operand - * can be signed while the other is unsigned." - */ - if (!type_a->is_integer()) { - _mesa_glsl_error(loc, state, "LHS of operator %s must be an integer or " - "integer vector", ast_expression::operator_string(op)); - return glsl_type::error_type; - - } - if (!type_b->is_integer()) { - _mesa_glsl_error(loc, state, "RHS of operator %s must be an integer or " - "integer vector", ast_expression::operator_string(op)); - return glsl_type::error_type; - } - - /* "If the first operand is a scalar, the second operand has to be - * a scalar as well." - */ - if (type_a->is_scalar() && !type_b->is_scalar()) { - _mesa_glsl_error(loc, state, "if the first operand of %s is scalar, the " - "second must be scalar as well", - ast_expression::operator_string(op)); - return glsl_type::error_type; - } - - /* If both operands are vectors, check that they have same number of - * elements. - */ - if (type_a->is_vector() && - type_b->is_vector() && - type_a->vector_elements != type_b->vector_elements) { - _mesa_glsl_error(loc, state, "vector operands to operator %s must " - "have same number of elements", - ast_expression::operator_string(op)); - return glsl_type::error_type; - } - - /* "In all cases, the resulting type will be the same type as the left - * operand." - */ - return type_a; -} - -/** - * Validates that a value can be assigned to a location with a specified type - * - * Validates that \c rhs can be assigned to some location. If the types are - * not an exact match but an automatic conversion is possible, \c rhs will be - * converted. - * - * \return - * \c NULL if \c rhs cannot be assigned to a location with type \c lhs_type. - * Otherwise the actual RHS to be assigned will be returned. This may be - * \c rhs, or it may be \c rhs after some type conversion. - * - * \note - * In addition to being used for assignments, this function is used to - * type-check return values. - */ -ir_rvalue * -validate_assignment(struct _mesa_glsl_parse_state *state, - YYLTYPE loc, const glsl_type *lhs_type, - ir_rvalue *rhs, bool is_initializer) -{ - /* If there is already some error in the RHS, just return it. Anything - * else will lead to an avalanche of error message back to the user. - */ - if (rhs->type->is_error()) - return rhs; - - /* If the types are identical, the assignment can trivially proceed. - */ - if (rhs->type == lhs_type) - return rhs; - - /* If the array element types are the same and the LHS is unsized, - * the assignment is okay for initializers embedded in variable - * declarations. - * - * Note: Whole-array assignments are not permitted in GLSL 1.10, but this - * is handled by ir_dereference::is_lvalue. - */ - if (lhs_type->is_unsized_array() && rhs->type->is_array() - && (lhs_type->element_type() == rhs->type->element_type())) { - if (is_initializer) { - return rhs; - } else { - _mesa_glsl_error(&loc, state, - "implicitly sized arrays cannot be assigned"); - return NULL; - } - } - - /* Check for implicit conversion in GLSL 1.20 */ - if (apply_implicit_conversion(lhs_type, rhs, state)) { - if (rhs->type == lhs_type) - return rhs; - } - - _mesa_glsl_error(&loc, state, - "%s of type %s cannot be assigned to " - "variable of type %s", - is_initializer ? "initializer" : "value", - rhs->type->name, lhs_type->name); - - return NULL; -} - -static void -mark_whole_array_access(ir_rvalue *access) -{ - ir_dereference_variable *deref = access->as_dereference_variable(); - - if (deref && deref->var) { - deref->var->data.max_array_access = deref->type->length - 1; - } -} - -static bool -do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state, - const char *non_lvalue_description, - ir_rvalue *lhs, ir_rvalue *rhs, - ir_rvalue **out_rvalue, bool needs_rvalue, - bool is_initializer, - YYLTYPE lhs_loc) -{ - void *ctx = state; - bool error_emitted = (lhs->type->is_error() || rhs->type->is_error()); - ir_rvalue *extract_channel = NULL; - - /* If the assignment LHS comes back as an ir_binop_vector_extract - * expression, move it to the RHS as an ir_triop_vector_insert. - */ - if (lhs->ir_type == ir_type_expression) { - ir_expression *const lhs_expr = lhs->as_expression(); - - if (unlikely(lhs_expr->operation == ir_binop_vector_extract)) { - ir_rvalue *new_rhs = - validate_assignment(state, lhs_loc, lhs->type, - rhs, is_initializer); - - if (new_rhs == NULL) { - return lhs; - } else { - /* This converts: - * - LHS: (expression float vector_extract ) - * - RHS: - * into: - * - LHS: - * - RHS: (expression vec2 vector_insert ) - * - * The LHS type is now a vector instead of a scalar. Since GLSL - * allows assignments to be used as rvalues, we need to re-extract - * the channel from assignment_temp when returning the rvalue. - */ - extract_channel = lhs_expr->operands[1]; - rhs = new(ctx) ir_expression(ir_triop_vector_insert, - lhs_expr->operands[0]->type, - lhs_expr->operands[0], - new_rhs, - extract_channel); - lhs = lhs_expr->operands[0]->clone(ctx, NULL); - } - } - } - - ir_variable *lhs_var = lhs->variable_referenced(); - if (lhs_var) - lhs_var->data.assigned = true; - - if (!error_emitted) { - if (non_lvalue_description != NULL) { - _mesa_glsl_error(&lhs_loc, state, - "assignment to %s", - non_lvalue_description); - error_emitted = true; - } else if (lhs_var != NULL && lhs_var->data.read_only) { - _mesa_glsl_error(&lhs_loc, state, - "assignment to read-only variable '%s'", - lhs_var->name); - error_emitted = true; - } else if (lhs->type->is_array() && - !state->check_version(120, 300, &lhs_loc, - "whole array assignment forbidden")) { - /* From page 32 (page 38 of the PDF) of the GLSL 1.10 spec: - * - * "Other binary or unary expressions, non-dereferenced - * arrays, function names, swizzles with repeated fields, - * and constants cannot be l-values." - * - * The restriction on arrays is lifted in GLSL 1.20 and GLSL ES 3.00. - */ - error_emitted = true; - } else if (!lhs->is_lvalue()) { - _mesa_glsl_error(& lhs_loc, state, "non-lvalue in assignment"); - error_emitted = true; - } - } - - ir_rvalue *new_rhs = - validate_assignment(state, lhs_loc, lhs->type, rhs, is_initializer); - if (new_rhs != NULL) { - rhs = new_rhs; - - /* If the LHS array was not declared with a size, it takes it size from - * the RHS. If the LHS is an l-value and a whole array, it must be a - * dereference of a variable. Any other case would require that the LHS - * is either not an l-value or not a whole array. - */ - if (lhs->type->is_unsized_array()) { - ir_dereference *const d = lhs->as_dereference(); - - assert(d != NULL); - - ir_variable *const var = d->variable_referenced(); - - assert(var != NULL); - - if (var->data.max_array_access >= unsigned(rhs->type->array_size())) { - /* FINISHME: This should actually log the location of the RHS. */ - _mesa_glsl_error(& lhs_loc, state, "array size must be > %u due to " - "previous access", - var->data.max_array_access); - } - - var->type = glsl_type::get_array_instance(lhs->type->element_type(), - rhs->type->array_size()); - d->type = var->type; - } - if (lhs->type->is_array()) { - mark_whole_array_access(rhs); - mark_whole_array_access(lhs); - } - } - - if (lhs->get_precision() == glsl_precision_undefined) - { - glsl_precision prec = precision_from_ir (rhs); - ir_dereference *const d = lhs->as_dereference(); - if (d) - { - ir_variable *const var = d->variable_referenced(); - if (var) - var->data.precision = prec; - } - } - - /* Most callers of do_assignment (assign, add_assign, pre_inc/dec, - * but not post_inc) need the converted assigned value as an rvalue - * to handle things like: - * - * i = j += 1; - */ - if (needs_rvalue) { - ir_variable *var = new(ctx) ir_variable(rhs->type, "assignment_tmp", - ir_var_temporary, precision_from_ir(rhs)); - instructions->push_tail(var); - instructions->push_tail(assign(var, rhs)); - - if (!error_emitted) { - ir_dereference_variable *deref_var = new(ctx) ir_dereference_variable(var); - instructions->push_tail(new(ctx) ir_assignment(lhs, deref_var)); - } - ir_rvalue *rvalue = new(ctx) ir_dereference_variable(var); - - if (extract_channel) { - rvalue = new(ctx) ir_expression(ir_binop_vector_extract, - rvalue, - extract_channel->clone(ctx, NULL)); - } - - *out_rvalue = rvalue; - } else { - if (!error_emitted) - instructions->push_tail(new(ctx) ir_assignment(lhs, rhs)); - *out_rvalue = NULL; - } - - return error_emitted; -} - -static ir_rvalue * -get_lvalue_copy(exec_list *instructions, ir_rvalue *lvalue) -{ - void *ctx = ralloc_parent(lvalue); - ir_variable *var; - - var = new(ctx) ir_variable(lvalue->type, "_post_incdec_tmp", - ir_var_temporary, precision_from_ir(lvalue)); - instructions->push_tail(var); - - instructions->push_tail(new(ctx) ir_assignment(new(ctx) ir_dereference_variable(var), - lvalue)); - - return new(ctx) ir_dereference_variable(var); -} - - -ir_rvalue * -ast_node::hir(exec_list *instructions, struct _mesa_glsl_parse_state *state) -{ - (void) instructions; - (void) state; - - return NULL; -} - -void -ast_function_expression::hir_no_rvalue(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - (void)hir(instructions, state); -} - -void -ast_aggregate_initializer::hir_no_rvalue(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - (void)hir(instructions, state); -} - -static ir_rvalue * -do_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1) -{ - int join_op; - ir_rvalue *cmp = NULL; - - if (operation == ir_binop_all_equal) - join_op = ir_binop_logic_and; - else - join_op = ir_binop_logic_or; - - switch (op0->type->base_type) { - case GLSL_TYPE_FLOAT: - case GLSL_TYPE_UINT: - case GLSL_TYPE_INT: - case GLSL_TYPE_BOOL: - return new(mem_ctx) ir_expression(operation, op0, op1); - - case GLSL_TYPE_ARRAY: { - for (unsigned int i = 0; i < op0->type->length; i++) { - ir_rvalue *e0, *e1, *result; - - e0 = new(mem_ctx) ir_dereference_array(op0->clone(mem_ctx, NULL), - new(mem_ctx) ir_constant(i)); - e1 = new(mem_ctx) ir_dereference_array(op1->clone(mem_ctx, NULL), - new(mem_ctx) ir_constant(i)); - result = do_comparison(mem_ctx, operation, e0, e1); - - if (cmp) { - cmp = new(mem_ctx) ir_expression(join_op, cmp, result); - } else { - cmp = result; - } - } - - mark_whole_array_access(op0); - mark_whole_array_access(op1); - break; - } - - case GLSL_TYPE_STRUCT: { - for (unsigned int i = 0; i < op0->type->length; i++) { - ir_rvalue *e0, *e1, *result; - const char *field_name = op0->type->fields.structure[i].name; - - e0 = new(mem_ctx) ir_dereference_record(op0->clone(mem_ctx, NULL), - field_name); - e1 = new(mem_ctx) ir_dereference_record(op1->clone(mem_ctx, NULL), - field_name); - result = do_comparison(mem_ctx, operation, e0, e1); - - if (cmp) { - cmp = new(mem_ctx) ir_expression(join_op, cmp, result); - } else { - cmp = result; - } - } - break; - } - - case GLSL_TYPE_ERROR: - case GLSL_TYPE_VOID: - case GLSL_TYPE_SAMPLER: - case GLSL_TYPE_IMAGE: - case GLSL_TYPE_INTERFACE: - case GLSL_TYPE_ATOMIC_UINT: - /* I assume a comparison of a struct containing a sampler just - * ignores the sampler present in the type. - */ - break; - } - - if (cmp == NULL) - cmp = new(mem_ctx) ir_constant(true); - - return cmp; -} - -/* For logical operations, we want to ensure that the operands are - * scalar booleans. If it isn't, emit an error and return a constant - * boolean to avoid triggering cascading error messages. - */ -ir_rvalue * -get_scalar_boolean_operand(exec_list *instructions, - struct _mesa_glsl_parse_state *state, - ast_expression *parent_expr, - int operand, - const char *operand_name, - bool *error_emitted) -{ - ast_expression *expr = parent_expr->subexpressions[operand]; - void *ctx = state; - ir_rvalue *val = expr->hir(instructions, state); - - if (val->type->is_boolean() && val->type->is_scalar()) - return val; - - if (!*error_emitted) { - YYLTYPE loc = expr->get_location(); - _mesa_glsl_error(&loc, state, "%s of `%s' must be scalar boolean", - operand_name, - parent_expr->operator_string(parent_expr->oper)); - *error_emitted = true; - } - - return new(ctx) ir_constant(true); -} - -/** - * If name refers to a builtin array whose maximum allowed size is less than - * size, report an error and return true. Otherwise return false. - */ -void -check_builtin_array_max_size(const char *name, unsigned size, - YYLTYPE loc, struct _mesa_glsl_parse_state *state) -{ - if ((strcmp("gl_TexCoord", name) == 0) - && (size > state->Const.MaxTextureCoords)) { - /* From page 54 (page 60 of the PDF) of the GLSL 1.20 spec: - * - * "The size [of gl_TexCoord] can be at most - * gl_MaxTextureCoords." - */ - _mesa_glsl_error(&loc, state, "`gl_TexCoord' array size cannot " - "be larger than gl_MaxTextureCoords (%u)", - state->Const.MaxTextureCoords); - } else if (strcmp("gl_ClipDistance", name) == 0 - && size > state->Const.MaxClipPlanes) { - /* From section 7.1 (Vertex Shader Special Variables) of the - * GLSL 1.30 spec: - * - * "The gl_ClipDistance array is predeclared as unsized and - * must be sized by the shader either redeclaring it with a - * size or indexing it only with integral constant - * expressions. ... The size can be at most - * gl_MaxClipDistances." - */ - _mesa_glsl_error(&loc, state, "`gl_ClipDistance' array size cannot " - "be larger than gl_MaxClipDistances (%u)", - state->Const.MaxClipPlanes); - } -} - -/** - * Create the constant 1, of a which is appropriate for incrementing and - * decrementing values of the given GLSL type. For example, if type is vec4, - * this creates a constant value of 1.0 having type float. - * - * If the given type is invalid for increment and decrement operators, return - * a floating point 1--the error will be detected later. - */ -static ir_rvalue * -constant_one_for_inc_dec(void *ctx, const glsl_type *type) -{ - switch (type->base_type) { - case GLSL_TYPE_UINT: - return new(ctx) ir_constant((unsigned) 1); - case GLSL_TYPE_INT: - return new(ctx) ir_constant(1); - default: - case GLSL_TYPE_FLOAT: - return new(ctx) ir_constant(1.0f); - } -} - -ir_rvalue * -ast_expression::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - return do_hir(instructions, state, true); -} - -void -ast_expression::hir_no_rvalue(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - do_hir(instructions, state, false); -} - -ir_rvalue * -ast_expression::do_hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state, - bool needs_rvalue) -{ - void *ctx = state; - static const int operations[AST_NUM_OPERATORS] = { - -1, /* ast_assign doesn't convert to ir_expression. */ - -1, /* ast_plus doesn't convert to ir_expression. */ - ir_unop_neg, - ir_binop_add, - ir_binop_sub, - ir_binop_mul, - ir_binop_div, - ir_binop_mod, - ir_binop_lshift, - ir_binop_rshift, - ir_binop_less, - ir_binop_greater, - ir_binop_lequal, - ir_binop_gequal, - ir_binop_all_equal, - ir_binop_any_nequal, - ir_binop_bit_and, - ir_binop_bit_xor, - ir_binop_bit_or, - ir_unop_bit_not, - ir_binop_logic_and, - ir_binop_logic_xor, - ir_binop_logic_or, - ir_unop_logic_not, - - /* Note: The following block of expression types actually convert - * to multiple IR instructions. - */ - ir_binop_mul, /* ast_mul_assign */ - ir_binop_div, /* ast_div_assign */ - ir_binop_mod, /* ast_mod_assign */ - ir_binop_add, /* ast_add_assign */ - ir_binop_sub, /* ast_sub_assign */ - ir_binop_lshift, /* ast_ls_assign */ - ir_binop_rshift, /* ast_rs_assign */ - ir_binop_bit_and, /* ast_and_assign */ - ir_binop_bit_xor, /* ast_xor_assign */ - ir_binop_bit_or, /* ast_or_assign */ - - -1, /* ast_conditional doesn't convert to ir_expression. */ - ir_binop_add, /* ast_pre_inc. */ - ir_binop_sub, /* ast_pre_dec. */ - ir_binop_add, /* ast_post_inc. */ - ir_binop_sub, /* ast_post_dec. */ - -1, /* ast_field_selection doesn't conv to ir_expression. */ - -1, /* ast_array_index doesn't convert to ir_expression. */ - -1, /* ast_function_call doesn't conv to ir_expression. */ - -1, /* ast_identifier doesn't convert to ir_expression. */ - -1, /* ast_int_constant doesn't convert to ir_expression. */ - -1, /* ast_uint_constant doesn't conv to ir_expression. */ - -1, /* ast_float_constant doesn't conv to ir_expression. */ - -1, /* ast_bool_constant doesn't conv to ir_expression. */ - -1, /* ast_sequence doesn't convert to ir_expression. */ - }; - ir_rvalue *result = NULL; - ir_rvalue *op[3]; - const struct glsl_type *type; /* a temporary variable for switch cases */ - bool error_emitted = false; - YYLTYPE loc; - - loc = this->get_location(); - - switch (this->oper) { - case ast_aggregate: - assert(!"ast_aggregate: Should never get here."); - break; - - case ast_assign: { - op[0] = this->subexpressions[0]->hir(instructions, state); - op[1] = this->subexpressions[1]->hir(instructions, state); - - error_emitted = - do_assignment(instructions, state, - this->subexpressions[0]->non_lvalue_description, - op[0], op[1], &result, needs_rvalue, false, - this->subexpressions[0]->get_location()); - break; - } - - case ast_plus: - op[0] = this->subexpressions[0]->hir(instructions, state); - - type = unary_arithmetic_result_type(op[0]->type, state, & loc); - - error_emitted = type->is_error(); - - result = op[0]; - break; - - case ast_neg: - op[0] = this->subexpressions[0]->hir(instructions, state); - - type = unary_arithmetic_result_type(op[0]->type, state, & loc); - - error_emitted = type->is_error(); - - result = new(ctx) ir_expression(operations[this->oper], type, - op[0], NULL); - break; - - case ast_add: - case ast_sub: - case ast_mul: - case ast_div: - op[0] = this->subexpressions[0]->hir(instructions, state); - op[1] = this->subexpressions[1]->hir(instructions, state); - - type = arithmetic_result_type(op[0], op[1], - (this->oper == ast_mul), - state, & loc); - error_emitted = type->is_error(); - - result = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); - break; - - case ast_mod: - op[0] = this->subexpressions[0]->hir(instructions, state); - op[1] = this->subexpressions[1]->hir(instructions, state); - - type = modulus_result_type(op[0]->type, op[1]->type, state, & loc); - - assert(operations[this->oper] == ir_binop_mod); - - result = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); - error_emitted = type->is_error(); - break; - - case ast_lshift: - case ast_rshift: - if (!state->check_bitwise_operations_allowed(&loc)) { - error_emitted = true; - } - - op[0] = this->subexpressions[0]->hir(instructions, state); - op[1] = this->subexpressions[1]->hir(instructions, state); - type = shift_result_type(op[0]->type, op[1]->type, this->oper, state, - &loc); - result = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); - error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); - break; - - case ast_less: - case ast_greater: - case ast_lequal: - case ast_gequal: - op[0] = this->subexpressions[0]->hir(instructions, state); - op[1] = this->subexpressions[1]->hir(instructions, state); - - type = relational_result_type(op[0], op[1], state, & loc); - - /* The relational operators must either generate an error or result - * in a scalar boolean. See page 57 of the GLSL 1.50 spec. - */ - assert(type->is_error() - || ((type->base_type == GLSL_TYPE_BOOL) - && type->is_scalar())); - - result = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); - error_emitted = type->is_error(); - break; - - case ast_nequal: - case ast_equal: - op[0] = this->subexpressions[0]->hir(instructions, state); - op[1] = this->subexpressions[1]->hir(instructions, state); - - /* From page 58 (page 64 of the PDF) of the GLSL 1.50 spec: - * - * "The equality operators equal (==), and not equal (!=) - * operate on all types. They result in a scalar Boolean. If - * the operand types do not match, then there must be a - * conversion from Section 4.1.10 "Implicit Conversions" - * applied to one operand that can make them match, in which - * case this conversion is done." - */ - if ((!apply_implicit_conversion(op[0]->type, op[1], state) - && !apply_implicit_conversion(op[1]->type, op[0], state)) - || (op[0]->type != op[1]->type)) { - _mesa_glsl_error(& loc, state, "operands of `%s' must have the same " - "type", (this->oper == ast_equal) ? "==" : "!="); - error_emitted = true; - } else if ((op[0]->type->is_array() || op[1]->type->is_array()) && - !state->check_version(120, 300, &loc, - "array comparisons forbidden")) { - error_emitted = true; - } else if ((op[0]->type->contains_opaque() || - op[1]->type->contains_opaque())) { - _mesa_glsl_error(&loc, state, "opaque type comparisons forbidden"); - error_emitted = true; - } - - if (error_emitted) { - result = new(ctx) ir_constant(false); - } else { - result = do_comparison(ctx, operations[this->oper], op[0], op[1]); - assert(result->type == glsl_type::bool_type); - } - break; - - case ast_bit_and: - case ast_bit_xor: - case ast_bit_or: - op[0] = this->subexpressions[0]->hir(instructions, state); - op[1] = this->subexpressions[1]->hir(instructions, state); - - type = bit_logic_result_type(op[0]->type, op[1]->type, this->oper, - state, &loc); - result = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); - error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); - break; - - case ast_bit_not: - op[0] = this->subexpressions[0]->hir(instructions, state); - - if (!state->check_bitwise_operations_allowed(&loc)) { - error_emitted = true; - } - - if (!op[0]->type->is_integer()) { - _mesa_glsl_error(&loc, state, "operand of `~' must be an integer"); - error_emitted = true; - } - - type = error_emitted ? glsl_type::error_type : op[0]->type; - result = new(ctx) ir_expression(ir_unop_bit_not, type, op[0], NULL); - break; - - case ast_logic_and: { - exec_list rhs_instructions; - op[0] = get_scalar_boolean_operand(instructions, state, this, 0, - "LHS", &error_emitted); - op[1] = get_scalar_boolean_operand(&rhs_instructions, state, this, 1, - "RHS", &error_emitted); - - if (rhs_instructions.is_empty()) { - result = new(ctx) ir_expression(ir_binop_logic_and, op[0], op[1]); - type = result->type; - } else { - ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type, - "and_tmp", - ir_var_temporary, glsl_precision_low); - instructions->push_tail(tmp); - - ir_if *const stmt = new(ctx) ir_if(op[0]); - instructions->push_tail(stmt); - - stmt->then_instructions.append_list(&rhs_instructions); - ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp); - ir_assignment *const then_assign = - new(ctx) ir_assignment(then_deref, op[1]); - stmt->then_instructions.push_tail(then_assign); - - ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp); - ir_assignment *const else_assign = - new(ctx) ir_assignment(else_deref, new(ctx) ir_constant(false)); - stmt->else_instructions.push_tail(else_assign); - - result = new(ctx) ir_dereference_variable(tmp); - type = tmp->type; - } - break; - } - - case ast_logic_or: { - exec_list rhs_instructions; - op[0] = get_scalar_boolean_operand(instructions, state, this, 0, - "LHS", &error_emitted); - op[1] = get_scalar_boolean_operand(&rhs_instructions, state, this, 1, - "RHS", &error_emitted); - - if (rhs_instructions.is_empty()) { - result = new(ctx) ir_expression(ir_binop_logic_or, op[0], op[1]); - type = result->type; - } else { - ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type, - "or_tmp", - ir_var_temporary, glsl_precision_low); - instructions->push_tail(tmp); - - ir_if *const stmt = new(ctx) ir_if(op[0]); - instructions->push_tail(stmt); - - ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp); - ir_assignment *const then_assign = - new(ctx) ir_assignment(then_deref, new(ctx) ir_constant(true)); - stmt->then_instructions.push_tail(then_assign); - - stmt->else_instructions.append_list(&rhs_instructions); - ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp); - ir_assignment *const else_assign = - new(ctx) ir_assignment(else_deref, op[1]); - stmt->else_instructions.push_tail(else_assign); - - result = new(ctx) ir_dereference_variable(tmp); - type = tmp->type; - } - break; - } - - case ast_logic_xor: - /* From page 33 (page 39 of the PDF) of the GLSL 1.10 spec: - * - * "The logical binary operators and (&&), or ( | | ), and - * exclusive or (^^). They operate only on two Boolean - * expressions and result in a Boolean expression." - */ - op[0] = get_scalar_boolean_operand(instructions, state, this, 0, "LHS", - &error_emitted); - op[1] = get_scalar_boolean_operand(instructions, state, this, 1, "RHS", - &error_emitted); - - result = new(ctx) ir_expression(operations[this->oper], glsl_type::bool_type, - op[0], op[1]); - break; - - case ast_logic_not: - op[0] = get_scalar_boolean_operand(instructions, state, this, 0, - "operand", &error_emitted); - - result = new(ctx) ir_expression(operations[this->oper], glsl_type::bool_type, - op[0], NULL); - break; - - case ast_mul_assign: - case ast_div_assign: - case ast_add_assign: - case ast_sub_assign: { - op[0] = this->subexpressions[0]->hir(instructions, state); - op[1] = this->subexpressions[1]->hir(instructions, state); - - type = arithmetic_result_type(op[0], op[1], - (this->oper == ast_mul_assign), - state, & loc); - - ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); - - error_emitted = - do_assignment(instructions, state, - this->subexpressions[0]->non_lvalue_description, - op[0]->clone(ctx, NULL), temp_rhs, - &result, needs_rvalue, false, - this->subexpressions[0]->get_location()); - - /* GLSL 1.10 does not allow array assignment. However, we don't have to - * explicitly test for this because none of the binary expression - * operators allow array operands either. - */ - - break; - } - - case ast_mod_assign: { - op[0] = this->subexpressions[0]->hir(instructions, state); - op[1] = this->subexpressions[1]->hir(instructions, state); - - type = modulus_result_type(op[0]->type, op[1]->type, state, & loc); - - assert(operations[this->oper] == ir_binop_mod); - - ir_rvalue *temp_rhs; - temp_rhs = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); - - error_emitted = - do_assignment(instructions, state, - this->subexpressions[0]->non_lvalue_description, - op[0]->clone(ctx, NULL), temp_rhs, - &result, needs_rvalue, false, - this->subexpressions[0]->get_location()); - break; - } - - case ast_ls_assign: - case ast_rs_assign: { - op[0] = this->subexpressions[0]->hir(instructions, state); - op[1] = this->subexpressions[1]->hir(instructions, state); - type = shift_result_type(op[0]->type, op[1]->type, this->oper, state, - &loc); - ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper], - type, op[0], op[1]); - error_emitted = - do_assignment(instructions, state, - this->subexpressions[0]->non_lvalue_description, - op[0]->clone(ctx, NULL), temp_rhs, - &result, needs_rvalue, false, - this->subexpressions[0]->get_location()); - break; - } - - case ast_and_assign: - case ast_xor_assign: - case ast_or_assign: { - op[0] = this->subexpressions[0]->hir(instructions, state); - op[1] = this->subexpressions[1]->hir(instructions, state); - type = bit_logic_result_type(op[0]->type, op[1]->type, this->oper, - state, &loc); - ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper], - type, op[0], op[1]); - error_emitted = - do_assignment(instructions, state, - this->subexpressions[0]->non_lvalue_description, - op[0]->clone(ctx, NULL), temp_rhs, - &result, needs_rvalue, false, - this->subexpressions[0]->get_location()); - break; - } - - case ast_conditional: { - /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec: - * - * "The ternary selection operator (?:). It operates on three - * expressions (exp1 ? exp2 : exp3). This operator evaluates the - * first expression, which must result in a scalar Boolean." - */ - op[0] = get_scalar_boolean_operand(instructions, state, this, 0, - "condition", &error_emitted); - - /* The :? operator is implemented by generating an anonymous temporary - * followed by an if-statement. The last instruction in each branch of - * the if-statement assigns a value to the anonymous temporary. This - * temporary is the r-value of the expression. - */ - exec_list then_instructions; - exec_list else_instructions; - - op[1] = this->subexpressions[1]->hir(&then_instructions, state); - op[2] = this->subexpressions[2]->hir(&else_instructions, state); - - /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec: - * - * "The second and third expressions can be any type, as - * long their types match, or there is a conversion in - * Section 4.1.10 "Implicit Conversions" that can be applied - * to one of the expressions to make their types match. This - * resulting matching type is the type of the entire - * expression." - */ - if ((!apply_implicit_conversion(op[1]->type, op[2], state) - && !apply_implicit_conversion(op[2]->type, op[1], state)) - || (op[1]->type != op[2]->type)) { - YYLTYPE loc = this->subexpressions[1]->get_location(); - - _mesa_glsl_error(& loc, state, "second and third operands of ?: " - "operator must have matching types"); - error_emitted = true; - type = glsl_type::error_type; - } else { - type = op[1]->type; - } - - /* From page 33 (page 39 of the PDF) of the GLSL 1.10 spec: - * - * "The second and third expressions must be the same type, but can - * be of any type other than an array." - */ - if (type->is_array() && - !state->check_version(120, 300, &loc, - "second and third operands of ?: operator " - "cannot be arrays")) { - error_emitted = true; - } - - ir_constant *cond_val = op[0]->constant_expression_value(); - ir_constant *then_val = op[1]->constant_expression_value(); - ir_constant *else_val = op[2]->constant_expression_value(); - - if (then_instructions.is_empty() - && else_instructions.is_empty() - && (cond_val != NULL) && (then_val != NULL) && (else_val != NULL)) { - result = (cond_val->value.b[0]) ? then_val : else_val; - } else { - ir_variable *const tmp = - new(ctx) ir_variable(type, "conditional_tmp", ir_var_temporary, higher_precision(op[1], op[2])); - instructions->push_tail(tmp); - - ir_if *const stmt = new(ctx) ir_if(op[0]); - instructions->push_tail(stmt); - - then_instructions.move_nodes_to(& stmt->then_instructions); - ir_dereference *const then_deref = - new(ctx) ir_dereference_variable(tmp); - ir_assignment *const then_assign = - new(ctx) ir_assignment(then_deref, op[1]); - stmt->then_instructions.push_tail(then_assign); - - else_instructions.move_nodes_to(& stmt->else_instructions); - ir_dereference *const else_deref = - new(ctx) ir_dereference_variable(tmp); - ir_assignment *const else_assign = - new(ctx) ir_assignment(else_deref, op[2]); - stmt->else_instructions.push_tail(else_assign); - - result = new(ctx) ir_dereference_variable(tmp); - } - break; - } - - case ast_pre_inc: - case ast_pre_dec: { - this->non_lvalue_description = (this->oper == ast_pre_inc) - ? "pre-increment operation" : "pre-decrement operation"; - - op[0] = this->subexpressions[0]->hir(instructions, state); - op[1] = constant_one_for_inc_dec(ctx, op[0]->type); - - type = arithmetic_result_type(op[0], op[1], false, state, & loc); - - ir_rvalue *temp_rhs; - temp_rhs = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); - - error_emitted = - do_assignment(instructions, state, - this->subexpressions[0]->non_lvalue_description, - op[0]->clone(ctx, NULL), temp_rhs, - &result, needs_rvalue, false, - this->subexpressions[0]->get_location()); - break; - } - - case ast_post_inc: - case ast_post_dec: { - this->non_lvalue_description = (this->oper == ast_post_inc) - ? "post-increment operation" : "post-decrement operation"; - op[0] = this->subexpressions[0]->hir(instructions, state); - op[1] = constant_one_for_inc_dec(ctx, op[0]->type); - - error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); - - type = arithmetic_result_type(op[0], op[1], false, state, & loc); - - ir_rvalue *temp_rhs; - temp_rhs = new(ctx) ir_expression(operations[this->oper], type, - op[0], op[1]); - - /* Get a temporary of a copy of the lvalue before it's modified. - * This may get thrown away later. - */ - result = get_lvalue_copy(instructions, op[0]->clone(ctx, NULL)); - - ir_rvalue *junk_rvalue; - error_emitted = - do_assignment(instructions, state, - this->subexpressions[0]->non_lvalue_description, - op[0]->clone(ctx, NULL), temp_rhs, - &junk_rvalue, false, false, - this->subexpressions[0]->get_location()); - - break; - } - - case ast_field_selection: - result = _mesa_ast_field_selection_to_hir(this, instructions, state); - break; - - case ast_array_index: { - YYLTYPE index_loc = subexpressions[1]->get_location(); - - op[0] = subexpressions[0]->hir(instructions, state); - op[1] = subexpressions[1]->hir(instructions, state); - - result = _mesa_ast_array_index_to_hir(ctx, state, op[0], op[1], - loc, index_loc); - - if (result->type->is_error()) - error_emitted = true; - - break; - } - - case ast_function_call: - /* Should *NEVER* get here. ast_function_call should always be handled - * by ast_function_expression::hir. - */ - assert(0); - break; - - case ast_identifier: { - /* ast_identifier can appear several places in a full abstract syntax - * tree. This particular use must be at location specified in the grammar - * as 'variable_identifier'. - */ - ir_variable *var = - state->symbols->get_variable(this->primary_expression.identifier); - - if (var != NULL) { - var->data.used = true; - result = new(ctx) ir_dereference_variable(var); - } else { - _mesa_glsl_error(& loc, state, "`%s' undeclared", - this->primary_expression.identifier); - - result = ir_rvalue::error_value(ctx); - error_emitted = true; - } - break; - } - - case ast_int_constant: - result = new(ctx) ir_constant(this->primary_expression.int_constant); - break; - - case ast_uint_constant: - result = new(ctx) ir_constant(this->primary_expression.uint_constant); - break; - - case ast_float_constant: - result = new(ctx) ir_constant(this->primary_expression.float_constant); - break; - - case ast_bool_constant: - result = new(ctx) ir_constant(bool(!!this->primary_expression.bool_constant)); - break; - - case ast_sequence: { - /* It should not be possible to generate a sequence in the AST without - * any expressions in it. - */ - assert(!this->expressions.is_empty()); - - /* The r-value of a sequence is the last expression in the sequence. If - * the other expressions in the sequence do not have side-effects (and - * therefore add instructions to the instruction list), they get dropped - * on the floor. - */ - exec_node *previous_tail_pred = NULL; - YYLTYPE previous_operand_loc = loc; - - foreach_list_typed (ast_node, ast, link, &this->expressions) { - /* If one of the operands of comma operator does not generate any - * code, we want to emit a warning. At each pass through the loop - * previous_tail_pred will point to the last instruction in the - * stream *before* processing the previous operand. Naturally, - * instructions->tail_pred will point to the last instruction in the - * stream *after* processing the previous operand. If the two - * pointers match, then the previous operand had no effect. - * - * The warning behavior here differs slightly from GCC. GCC will - * only emit a warning if none of the left-hand operands have an - * effect. However, it will emit a warning for each. I believe that - * there are some cases in C (especially with GCC extensions) where - * it is useful to have an intermediate step in a sequence have no - * effect, but I don't think these cases exist in GLSL. Either way, - * it would be a giant hassle to replicate that behavior. - */ - if (previous_tail_pred == instructions->tail_pred) { - _mesa_glsl_warning(&previous_operand_loc, state, - "left-hand operand of comma expression has " - "no effect"); - } - - /* tail_pred is directly accessed instead of using the get_tail() - * method for performance reasons. get_tail() has extra code to - * return NULL when the list is empty. We don't care about that - * here, so using tail_pred directly is fine. - */ - previous_tail_pred = instructions->tail_pred; - previous_operand_loc = ast->get_location(); - - result = ast->hir(instructions, state); - } - - /* Any errors should have already been emitted in the loop above. - */ - error_emitted = true; - break; - } - } - type = NULL; /* use result->type, not type. */ - assert(result != NULL || !needs_rvalue); - - if (result && result->type->is_error() && !error_emitted) - _mesa_glsl_error(& loc, state, "type mismatch"); - - return result; -} - - -ir_rvalue * -ast_expression_statement::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - /* It is possible to have expression statements that don't have an - * expression. This is the solitary semicolon: - * - * for (i = 0; i < 5; i++) - * ; - * - * In this case the expression will be NULL. Test for NULL and don't do - * anything in that case. - */ - if (expression != NULL) - expression->hir_no_rvalue(instructions, state); - - /* Statements do not have r-values. - */ - return NULL; -} - - -ir_rvalue * -ast_compound_statement::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - if (new_scope) - state->symbols->push_scope(); - - foreach_list_typed (ast_node, ast, link, &this->statements) - ast->hir(instructions, state); - - if (new_scope) - state->symbols->pop_scope(); - - /* Compound statements do not have r-values. - */ - return NULL; -} - -/** - * Evaluate the given exec_node (which should be an ast_node representing - * a single array dimension) and return its integer value. - */ -static unsigned -process_array_size(exec_node *node, - struct _mesa_glsl_parse_state *state) -{ - exec_list dummy_instructions; - - ast_node *array_size = exec_node_data(ast_node, node, link); - ir_rvalue *const ir = array_size->hir(& dummy_instructions, state); - YYLTYPE loc = array_size->get_location(); - - if (ir == NULL) { - _mesa_glsl_error(& loc, state, - "array size could not be resolved"); - return 0; - } - - if (!ir->type->is_integer()) { - _mesa_glsl_error(& loc, state, - "array size must be integer type"); - return 0; - } - - if (!ir->type->is_scalar()) { - _mesa_glsl_error(& loc, state, - "array size must be scalar type"); - return 0; - } - - ir_constant *const size = ir->constant_expression_value(); - if (size == NULL) { - _mesa_glsl_error(& loc, state, "array size must be a " - "constant valued expression"); - return 0; - } - - if (size->value.i[0] <= 0) { - _mesa_glsl_error(& loc, state, "array size must be > 0"); - return 0; - } - - assert(size->type == ir->type); - - /* If the array size is const (and we've verified that - * it is) then no instructions should have been emitted - * when we converted it to HIR. If they were emitted, - * then either the array size isn't const after all, or - * we are emitting unnecessary instructions. - */ - assert(dummy_instructions.is_empty()); - - return size->value.u[0]; -} - -static const glsl_type * -process_array_type(YYLTYPE *loc, const glsl_type *base, - ast_array_specifier *array_specifier, - struct _mesa_glsl_parse_state *state) -{ - const glsl_type *array_type = base; - - if (array_specifier != NULL) { - if (base->is_array()) { - - /* From page 19 (page 25) of the GLSL 1.20 spec: - * - * "Only one-dimensional arrays may be declared." - */ - if (!state->ARB_arrays_of_arrays_enable) { - _mesa_glsl_error(loc, state, - "invalid array of `%s'" - "GL_ARB_arrays_of_arrays " - "required for defining arrays of arrays", - base->name); - return glsl_type::error_type; - } - - if (base->length == 0) { - _mesa_glsl_error(loc, state, - "only the outermost array dimension can " - "be unsized", - base->name); - return glsl_type::error_type; - } - } - - for (exec_node *node = array_specifier->array_dimensions.tail_pred; - !node->is_head_sentinel(); node = node->prev) { - unsigned array_size = process_array_size(node, state); - array_type = glsl_type::get_array_instance(array_type, array_size); - } - - if (array_specifier->is_unsized_array) - array_type = glsl_type::get_array_instance(array_type, 0); - } - - return array_type; -} - - -const glsl_type * -ast_type_specifier::glsl_type(const char **name, - struct _mesa_glsl_parse_state *state) const -{ - const struct glsl_type *type; - - type = state->symbols->get_type(this->type_name); - *name = this->type_name; - - YYLTYPE loc = this->get_location(); - type = process_array_type(&loc, type, this->array_specifier, state); - - return type; -} - -const glsl_type * -ast_fully_specified_type::glsl_type(const char **name, - struct _mesa_glsl_parse_state *state) const -{ - const struct glsl_type *type = this->specifier->glsl_type(name, state); - - if (type == NULL) - return NULL; - - /* GLSL Optimizer change: do allow unspecified precision; hlsl2glsl - produces a bunch of wrapper functions without precision specified. - - if (type->base_type == GLSL_TYPE_FLOAT - && state->es_shader - && state->stage == MESA_SHADER_FRAGMENT - && this->qualifier.precision == ast_precision_none - && state->symbols->get_variable("#default precision") == NULL) { - YYLTYPE loc = this->get_location(); - _mesa_glsl_error(&loc, state, - "no precision specified this scope for type `%s'", - type->name); - } - */ - - return type; -} - -/** - * Determine whether a toplevel variable declaration declares a varying. This - * function operates by examining the variable's mode and the shader target, - * so it correctly identifies linkage variables regardless of whether they are - * declared using the deprecated "varying" syntax or the new "in/out" syntax. - * - * Passing a non-toplevel variable declaration (e.g. a function parameter) to - * this function will produce undefined results. - */ -static bool -is_varying_var(ir_variable *var, gl_shader_stage target) -{ - switch (target) { - case MESA_SHADER_VERTEX: - return var->data.mode == ir_var_shader_out; - case MESA_SHADER_FRAGMENT: - return var->data.mode == ir_var_shader_in || var->data.mode == ir_var_shader_inout; - default: - return var->data.mode == ir_var_shader_out || var->data.mode == ir_var_shader_in; - } -} - - -/** - * Matrix layout qualifiers are only allowed on certain types - */ -static void -validate_matrix_layout_for_type(struct _mesa_glsl_parse_state *state, - YYLTYPE *loc, - const glsl_type *type, - ir_variable *var) -{ - if (var && !var->is_in_uniform_block()) { - /* Layout qualifiers may only apply to interface blocks and fields in - * them. - */ - _mesa_glsl_error(loc, state, - "uniform block layout qualifiers row_major and " - "column_major may not be applied to variables " - "outside of uniform blocks"); - } else if (!type->is_matrix()) { - /* The OpenGL ES 3.0 conformance tests did not originally allow - * matrix layout qualifiers on non-matrices. However, the OpenGL - * 4.4 and OpenGL ES 3.0 (revision TBD) specifications were - * amended to specifically allow these layouts on all types. Emit - * a warning so that people know their code may not be portable. - */ - _mesa_glsl_warning(loc, state, - "uniform block layout qualifiers row_major and " - "column_major applied to non-matrix types may " - "be rejected by older compilers"); - } else if (type->is_record()) { - /* We allow 'layout(row_major)' on structure types because it's the only - * way to get row-major layouts on matrices contained in structures. - */ - _mesa_glsl_warning(loc, state, - "uniform block layout qualifiers row_major and " - "column_major applied to structure types is not " - "strictly conformant and may be rejected by other " - "compilers"); - } -} - -static bool -validate_binding_qualifier(struct _mesa_glsl_parse_state *state, - YYLTYPE *loc, - ir_variable *var, - const ast_type_qualifier *qual) -{ - if (var->data.mode != ir_var_uniform) { - _mesa_glsl_error(loc, state, - "the \"binding\" qualifier only applies to uniforms"); - return false; - } - - if (qual->binding < 0) { - _mesa_glsl_error(loc, state, "binding values must be >= 0"); - return false; - } - - const struct gl_context *const ctx = state->ctx; - unsigned elements = var->type->is_array() ? var->type->length : 1; - unsigned max_index = qual->binding + elements - 1; - - if (var->type->is_interface()) { - /* UBOs. From page 60 of the GLSL 4.20 specification: - * "If the binding point for any uniform block instance is less than zero, - * or greater than or equal to the implementation-dependent maximum - * number of uniform buffer bindings, a compilation error will occur. - * When the binding identifier is used with a uniform block instanced as - * an array of size N, all elements of the array from binding through - * binding + N – 1 must be within this range." - * - * The implementation-dependent maximum is GL_MAX_UNIFORM_BUFFER_BINDINGS. - */ - if (max_index >= ctx->Const.MaxUniformBufferBindings) { - _mesa_glsl_error(loc, state, "layout(binding = %d) for %d UBOs exceeds " - "the maximum number of UBO binding points (%d)", - qual->binding, elements, - ctx->Const.MaxUniformBufferBindings); - return false; - } - } else if (var->type->is_sampler() || - (var->type->is_array() && var->type->fields.array->is_sampler())) { - /* Samplers. From page 63 of the GLSL 4.20 specification: - * "If the binding is less than zero, or greater than or equal to the - * implementation-dependent maximum supported number of units, a - * compilation error will occur. When the binding identifier is used - * with an array of size N, all elements of the array from binding - * through binding + N - 1 must be within this range." - */ - unsigned limit = ctx->Const.Program[state->stage].MaxTextureImageUnits; - - if (max_index >= limit) { - _mesa_glsl_error(loc, state, "layout(binding = %d) for %d samplers " - "exceeds the maximum number of texture image units " - "(%d)", qual->binding, elements, limit); - - return false; - } - } else if (var->type->contains_atomic()) { - assert(ctx->Const.MaxAtomicBufferBindings <= MAX_COMBINED_ATOMIC_BUFFERS); - if (unsigned(qual->binding) >= ctx->Const.MaxAtomicBufferBindings) { - _mesa_glsl_error(loc, state, "layout(binding = %d) exceeds the " - " maximum number of atomic counter buffer bindings" - "(%d)", qual->binding, - ctx->Const.MaxAtomicBufferBindings); - - return false; - } - } else { - _mesa_glsl_error(loc, state, - "the \"binding\" qualifier only applies to uniform " - "blocks, samplers, atomic counters, or arrays thereof"); - return false; - } - - return true; -} - - -static glsl_interp_qualifier -interpret_interpolation_qualifier(const struct ast_type_qualifier *qual, - ir_variable_mode mode, - struct _mesa_glsl_parse_state *state, - YYLTYPE *loc) -{ - glsl_interp_qualifier interpolation; - if (qual->flags.q.flat) - interpolation = INTERP_QUALIFIER_FLAT; - else if (qual->flags.q.noperspective) - interpolation = INTERP_QUALIFIER_NOPERSPECTIVE; - else if (qual->flags.q.smooth) - interpolation = INTERP_QUALIFIER_SMOOTH; - else - interpolation = INTERP_QUALIFIER_NONE; - - if (interpolation != INTERP_QUALIFIER_NONE) { - if (mode != ir_var_shader_in && mode != ir_var_shader_out) { - _mesa_glsl_error(loc, state, - "interpolation qualifier `%s' can only be applied to " - "shader inputs or outputs.", - interpolation_string(interpolation)); - - } - - if ((state->stage == MESA_SHADER_VERTEX && mode == ir_var_shader_in) || - (state->stage == MESA_SHADER_FRAGMENT && mode == ir_var_shader_out)) { - _mesa_glsl_error(loc, state, - "interpolation qualifier `%s' cannot be applied to " - "vertex shader inputs or fragment shader outputs", - interpolation_string(interpolation)); - } - } - - return interpolation; -} - - -static void -validate_explicit_location(const struct ast_type_qualifier *qual, - ir_variable *var, - struct _mesa_glsl_parse_state *state, - YYLTYPE *loc) -{ - bool fail = false; - - /* Checks for GL_ARB_explicit_uniform_location. */ - if (qual->flags.q.uniform) { - if (!state->check_explicit_uniform_location_allowed(loc, var)) - return; - - const struct gl_context *const ctx = state->ctx; - unsigned max_loc = qual->location + var->type->uniform_locations() - 1; - - /* ARB_explicit_uniform_location specification states: - * - * "The explicitly defined locations and the generated locations - * must be in the range of 0 to MAX_UNIFORM_LOCATIONS minus one." - * - * "Valid locations for default-block uniform variable locations - * are in the range of 0 to the implementation-defined maximum - * number of uniform locations." - */ - if (qual->location < 0) { - _mesa_glsl_error(loc, state, - "explicit location < 0 for uniform %s", var->name); - return; - } - - if (max_loc >= ctx->Const.MaxUserAssignableUniformLocations) { - _mesa_glsl_error(loc, state, "location(s) consumed by uniform %s " - ">= MAX_UNIFORM_LOCATIONS (%u)", var->name, - ctx->Const.MaxUserAssignableUniformLocations); - return; - } - - var->data.explicit_location = true; - var->data.location = qual->location; - return; - } - - /* Between GL_ARB_explicit_attrib_location an - * GL_ARB_separate_shader_objects, the inputs and outputs of any shader - * stage can be assigned explicit locations. The checking here associates - * the correct extension with the correct stage's input / output: - * - * input output - * ----- ------ - * vertex explicit_loc sso - * geometry sso sso - * fragment sso explicit_loc - */ - switch (state->stage) { - case MESA_SHADER_VERTEX: - if (var->data.mode == ir_var_shader_in) { - if (!state->check_explicit_attrib_location_allowed(loc, var)) - return; - - break; - } - - if (var->data.mode == ir_var_shader_out) { - if (!state->check_separate_shader_objects_allowed(loc, var)) - return; - - break; - } - - fail = true; - break; - - case MESA_SHADER_GEOMETRY: - if (var->data.mode == ir_var_shader_in || var->data.mode == ir_var_shader_out) { - if (!state->check_separate_shader_objects_allowed(loc, var)) - return; - - break; - } - - fail = true; - break; - - case MESA_SHADER_FRAGMENT: - if (var->data.mode == ir_var_shader_in) { - if (!state->check_separate_shader_objects_allowed(loc, var)) - return; - - break; - } - - if (var->data.mode == ir_var_shader_out) { - if (!state->check_explicit_attrib_location_allowed(loc, var)) - return; - - break; - } - // EXT_shader_framebuffer_fetch: - // ability to use the inout qualifier at global scope - // in a fragment shader, is optional and must be enabled by - // #extension GL_EXT_shader_framebuffer_fetch - if (var->data.mode == ir_var_shader_inout && state->EXT_shader_framebuffer_fetch_enable) { - break; - } - - fail = true; - break; - - case MESA_SHADER_COMPUTE: - _mesa_glsl_error(loc, state, - "compute shader variables cannot be given " - "explicit locations"); - return; - }; - - if (fail) { - _mesa_glsl_error(loc, state, - "%s cannot be given an explicit location in %s shader", - mode_string(var), - _mesa_shader_stage_to_string(state->stage)); - } else { - var->data.explicit_location = true; - - /* This bit of silliness is needed because invalid explicit locations - * are supposed to be flagged during linking. Small negative values - * biased by VERT_ATTRIB_GENERIC0 or FRAG_RESULT_DATA0 could alias - * built-in values (e.g., -16+VERT_ATTRIB_GENERIC0 = VERT_ATTRIB_POS). - * The linker needs to be able to differentiate these cases. This - * ensures that negative values stay negative. - */ - if (qual->location >= 0) { - switch (state->stage) { - case MESA_SHADER_VERTEX: - var->data.location = (var->data.mode == ir_var_shader_in) - ? (qual->location + VERT_ATTRIB_GENERIC0) - : (qual->location + VARYING_SLOT_VAR0); - break; - - case MESA_SHADER_GEOMETRY: - var->data.location = qual->location + VARYING_SLOT_VAR0; - break; - - case MESA_SHADER_FRAGMENT: - var->data.location = (var->data.mode == ir_var_shader_out || var->data.mode == ir_var_shader_inout) - ? (qual->location + FRAG_RESULT_DATA0) - : (qual->location + VARYING_SLOT_VAR0); - break; - case MESA_SHADER_COMPUTE: - assert(!"Unexpected shader type"); - break; - } - } else { - var->data.location = qual->location; - } - - if (qual->flags.q.explicit_index) { - /* From the GLSL 4.30 specification, section 4.4.2 (Output - * Layout Qualifiers): - * - * "It is also a compile-time error if a fragment shader - * sets a layout index to less than 0 or greater than 1." - * - * Older specifications don't mandate a behavior; we take - * this as a clarification and always generate the error. - */ - if (qual->index < 0 || qual->index > 1) { - _mesa_glsl_error(loc, state, - "explicit index may only be 0 or 1"); - } else { - var->data.explicit_index = true; - var->data.index = qual->index; - } - } - } -} - -static void -apply_image_qualifier_to_variable(const struct ast_type_qualifier *qual, - ir_variable *var, - struct _mesa_glsl_parse_state *state, - YYLTYPE *loc) -{ - const glsl_type *base_type = - (var->type->is_array() ? var->type->element_type() : var->type); - - if (base_type->is_image()) { - if (var->data.mode != ir_var_uniform && - var->data.mode != ir_var_function_in) { - _mesa_glsl_error(loc, state, "image variables may only be declared as " - "function parameters or uniform-qualified " - "global variables"); - } - - var->data.image_read_only |= qual->flags.q.read_only; - var->data.image_write_only |= qual->flags.q.write_only; - var->data.image_coherent |= qual->flags.q.coherent; - var->data.image_volatile |= qual->flags.q._volatile; - var->data.image_restrict |= qual->flags.q.restrict_flag; - var->data.read_only = true; - - if (qual->flags.q.explicit_image_format) { - if (var->data.mode == ir_var_function_in) { - _mesa_glsl_error(loc, state, "format qualifiers cannot be " - "used on image function parameters"); - } - - if (qual->image_base_type != base_type->sampler_type) { - _mesa_glsl_error(loc, state, "format qualifier doesn't match the " - "base data type of the image"); - } - - var->data.image_format = qual->image_format; - } else { - if (var->data.mode == ir_var_uniform && !qual->flags.q.write_only) { - _mesa_glsl_error(loc, state, "uniforms not qualified with " - "`writeonly' must have a format layout " - "qualifier"); - } - - var->data.image_format = GL_NONE; - } - } -} - -static inline const char* -get_layout_qualifier_string(bool origin_upper_left, bool pixel_center_integer) -{ - if (origin_upper_left && pixel_center_integer) - return "origin_upper_left, pixel_center_integer"; - else if (origin_upper_left) - return "origin_upper_left"; - else if (pixel_center_integer) - return "pixel_center_integer"; - else - return " "; -} - -static inline bool -is_conflicting_fragcoord_redeclaration(struct _mesa_glsl_parse_state *state, - const struct ast_type_qualifier *qual) -{ - /* If gl_FragCoord was previously declared, and the qualifiers were - * different in any way, return true. - */ - if (state->fs_redeclares_gl_fragcoord) { - return (state->fs_pixel_center_integer != qual->flags.q.pixel_center_integer - || state->fs_origin_upper_left != qual->flags.q.origin_upper_left); - } - - return false; -} - -static void -apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, - ir_variable *var, - struct _mesa_glsl_parse_state *state, - YYLTYPE *loc, - bool is_parameter) -{ - STATIC_ASSERT(sizeof(qual->flags.q) <= sizeof(qual->flags.i)); - - if (qual->flags.q.invariant) { - if (var->data.used) { - _mesa_glsl_error(loc, state, - "variable `%s' may not be redeclared " - "`invariant' after being used", - var->name); - } else { - var->data.invariant = 1; - } - } - - if (qual->flags.q.precise) { - if (var->data.used) { - _mesa_glsl_error(loc, state, - "variable `%s' may not be redeclared " - "`precise' after being used", - var->name); - } else { - var->data.precise = 1; - } - } - - if (qual->flags.q.constant || qual->flags.q.attribute - || qual->flags.q.uniform - || (qual->flags.q.varying && (state->stage == MESA_SHADER_FRAGMENT))) - var->data.read_only = 1; - - if (qual->flags.q.centroid) - var->data.centroid = 1; - - if (qual->flags.q.sample) - var->data.sample = 1; - - if (state->stage == MESA_SHADER_GEOMETRY && - qual->flags.q.out && qual->flags.q.stream) { - var->data.stream = qual->stream; - } - - if (qual->flags.q.attribute && state->stage != MESA_SHADER_VERTEX) { - var->type = glsl_type::error_type; - _mesa_glsl_error(loc, state, - "`attribute' variables may not be declared in the " - "%s shader", - _mesa_shader_stage_to_string(state->stage)); - } - - /* Disallow layout qualifiers which may only appear on layout declarations. */ - if (qual->flags.q.prim_type) { - _mesa_glsl_error(loc, state, - "Primitive type may only be specified on GS input or output " - "layout declaration, not on variables."); - } - - /* Section 6.1.1 (Function Calling Conventions) of the GLSL 1.10 spec says: - * - * "However, the const qualifier cannot be used with out or inout." - * - * The same section of the GLSL 4.40 spec further clarifies this saying: - * - * "The const qualifier cannot be used with out or inout, or a - * compile-time error results." - */ - if (is_parameter && qual->flags.q.constant && qual->flags.q.out) { - _mesa_glsl_error(loc, state, - "`const' may not be applied to `out' or `inout' " - "function parameters"); - } - - /* If there is no qualifier that changes the mode of the variable, leave - * the setting alone. - */ - assert(var->data.mode != ir_var_temporary); - if (qual->flags.q.in && qual->flags.q.out) - { - if (!is_parameter && (state->stage == MESA_SHADER_FRAGMENT)) - var->data.mode = ir_var_shader_inout; - else - var->data.mode = ir_var_function_inout; - } - else if (qual->flags.q.in) - var->data.mode = is_parameter ? ir_var_function_in : ir_var_shader_in; - else if (qual->flags.q.attribute - || (qual->flags.q.varying && (state->stage == MESA_SHADER_FRAGMENT))) - var->data.mode = ir_var_shader_in; - else if (qual->flags.q.out) - var->data.mode = is_parameter ? ir_var_function_out : ir_var_shader_out; - else if (qual->flags.q.varying && (state->stage == MESA_SHADER_VERTEX)) - var->data.mode = ir_var_shader_out; - else if (qual->flags.q.uniform) - var->data.mode = ir_var_uniform; - - if (!is_parameter && is_varying_var(var, state->stage)) { - /* User-defined ins/outs are not permitted in compute shaders. */ - if (state->stage == MESA_SHADER_COMPUTE) { - _mesa_glsl_error(loc, state, - "user-defined input and output variables are not " - "permitted in compute shaders"); - } - - /* This variable is being used to link data between shader stages (in - * pre-glsl-1.30 parlance, it's a "varying"). Check that it has a type - * that is allowed for such purposes. - * - * From page 25 (page 31 of the PDF) of the GLSL 1.10 spec: - * - * "The varying qualifier can be used only with the data types - * float, vec2, vec3, vec4, mat2, mat3, and mat4, or arrays of - * these." - * - * This was relaxed in GLSL version 1.30 and GLSL ES version 3.00. From - * page 31 (page 37 of the PDF) of the GLSL 1.30 spec: - * - * "Fragment inputs can only be signed and unsigned integers and - * integer vectors, float, floating-point vectors, matrices, or - * arrays of these. Structures cannot be input. - * - * Similar text exists in the section on vertex shader outputs. - * - * Similar text exists in the GLSL ES 3.00 spec, except that the GLSL ES - * 3.00 spec allows structs as well. Varying structs are also allowed - * in GLSL 1.50. - */ - switch (var->type->get_scalar_type()->base_type) { - case GLSL_TYPE_FLOAT: - /* Ok in all GLSL versions */ - break; - case GLSL_TYPE_UINT: - case GLSL_TYPE_INT: - if (state->is_version(130, 300)) - break; - _mesa_glsl_error(loc, state, - "varying variables must be of base type float in %s", - state->get_version_string()); - break; - case GLSL_TYPE_STRUCT: - if (state->is_version(150, 300)) - break; - _mesa_glsl_error(loc, state, - "varying variables may not be of type struct"); - break; - default: - _mesa_glsl_error(loc, state, "illegal type for a varying variable"); - break; - } - } - - if (state->all_invariant && (state->current_function == NULL)) { - switch (state->stage) { - case MESA_SHADER_VERTEX: - if (var->data.mode == ir_var_shader_out) - var->data.invariant = true; - break; - case MESA_SHADER_GEOMETRY: - if ((var->data.mode == ir_var_shader_in) - || (var->data.mode == ir_var_shader_out)) - var->data.invariant = true; - break; - case MESA_SHADER_FRAGMENT: - if (var->data.mode == ir_var_shader_in) - var->data.invariant = true; - break; - case MESA_SHADER_COMPUTE: - /* Invariance isn't meaningful in compute shaders. */ - break; - } - } - - var->data.interpolation = - interpret_interpolation_qualifier(qual, (ir_variable_mode) var->data.mode, - state, loc); - - var->data.pixel_center_integer = qual->flags.q.pixel_center_integer; - var->data.origin_upper_left = qual->flags.q.origin_upper_left; - if ((qual->flags.q.origin_upper_left || qual->flags.q.pixel_center_integer) - && (strcmp(var->name, "gl_FragCoord") != 0)) { - const char *const qual_string = (qual->flags.q.origin_upper_left) - ? "origin_upper_left" : "pixel_center_integer"; - - _mesa_glsl_error(loc, state, - "layout qualifier `%s' can only be applied to " - "fragment shader input `gl_FragCoord'", - qual_string); - } - - if (var->name != NULL && strcmp(var->name, "gl_FragCoord") == 0) { - - /* Section 4.3.8.1, page 39 of GLSL 1.50 spec says: - * - * "Within any shader, the first redeclarations of gl_FragCoord - * must appear before any use of gl_FragCoord." - * - * Generate a compiler error if above condition is not met by the - * fragment shader. - */ - ir_variable *earlier = state->symbols->get_variable("gl_FragCoord"); - if (earlier != NULL && - earlier->data.used && - !state->fs_redeclares_gl_fragcoord) { - _mesa_glsl_error(loc, state, - "gl_FragCoord used before its first redeclaration " - "in fragment shader"); - } - - /* Make sure all gl_FragCoord redeclarations specify the same layout - * qualifiers. - */ - if (is_conflicting_fragcoord_redeclaration(state, qual)) { - const char *const qual_string = - get_layout_qualifier_string(qual->flags.q.origin_upper_left, - qual->flags.q.pixel_center_integer); - - const char *const state_string = - get_layout_qualifier_string(state->fs_origin_upper_left, - state->fs_pixel_center_integer); - - _mesa_glsl_error(loc, state, - "gl_FragCoord redeclared with different layout " - "qualifiers (%s) and (%s) ", - state_string, - qual_string); - } - state->fs_origin_upper_left = qual->flags.q.origin_upper_left; - state->fs_pixel_center_integer = qual->flags.q.pixel_center_integer; - state->fs_redeclares_gl_fragcoord_with_no_layout_qualifiers = - !qual->flags.q.origin_upper_left && !qual->flags.q.pixel_center_integer; - state->fs_redeclares_gl_fragcoord = - state->fs_origin_upper_left || - state->fs_pixel_center_integer || - state->fs_redeclares_gl_fragcoord_with_no_layout_qualifiers; - } - - if (qual->flags.q.explicit_location) { - validate_explicit_location(qual, var, state, loc); - } else if (qual->flags.q.explicit_index) { - _mesa_glsl_error(loc, state, "explicit index requires explicit location"); - } - - if (qual->flags.q.explicit_binding && - validate_binding_qualifier(state, loc, var, qual)) { - var->data.explicit_binding = true; - var->data.binding = qual->binding; - } - - if (var->type->contains_atomic()) { - if (var->data.mode == ir_var_uniform) { - if (var->data.explicit_binding) { - unsigned *offset = - &state->atomic_counter_offsets[var->data.binding]; - - if (*offset % ATOMIC_COUNTER_SIZE) - _mesa_glsl_error(loc, state, - "misaligned atomic counter offset"); - - var->data.atomic.offset = *offset; - *offset += var->type->atomic_size(); - - } else { - _mesa_glsl_error(loc, state, - "atomic counters require explicit binding point"); - } - } else if (var->data.mode != ir_var_function_in) { - _mesa_glsl_error(loc, state, "atomic counters may only be declared as " - "function parameters or uniform-qualified " - "global variables"); - } - } - - /* Does the declaration use the deprecated 'attribute' or 'varying' - * keywords? - */ - const bool uses_deprecated_qualifier = qual->flags.q.attribute - || qual->flags.q.varying; - - - /* Validate auxiliary storage qualifiers */ - - /* From section 4.3.4 of the GLSL 1.30 spec: - * "It is an error to use centroid in in a vertex shader." - * - * From section 4.3.4 of the GLSL ES 3.00 spec: - * "It is an error to use centroid in or interpolation qualifiers in - * a vertex shader input." - */ - - /* Section 4.3.6 of the GLSL 1.30 specification states: - * "It is an error to use centroid out in a fragment shader." - * - * The GL_ARB_shading_language_420pack extension specification states: - * "It is an error to use auxiliary storage qualifiers or interpolation - * qualifiers on an output in a fragment shader." - */ - if (qual->flags.q.sample && (!is_varying_var(var, state->stage) || uses_deprecated_qualifier)) { - _mesa_glsl_error(loc, state, - "sample qualifier may only be used on `in` or `out` " - "variables between shader stages"); - } - if (qual->flags.q.centroid && !is_varying_var(var, state->stage)) { - _mesa_glsl_error(loc, state, - "centroid qualifier may only be used with `in', " - "`out' or `varying' variables between shader stages"); - } - - - /* Is the 'layout' keyword used with parameters that allow relaxed checking. - * Many implementations of GL_ARB_fragment_coord_conventions_enable and some - * implementations (only Mesa?) GL_ARB_explicit_attrib_location_enable - * allowed the layout qualifier to be used with 'varying' and 'attribute'. - * These extensions and all following extensions that add the 'layout' - * keyword have been modified to require the use of 'in' or 'out'. - * - * The following extension do not allow the deprecated keywords: - * - * GL_AMD_conservative_depth - * GL_ARB_conservative_depth - * GL_ARB_gpu_shader5 - * GL_ARB_separate_shader_objects - * GL_ARB_tesselation_shader - * GL_ARB_transform_feedback3 - * GL_ARB_uniform_buffer_object - * - * It is unknown whether GL_EXT_shader_image_load_store or GL_NV_gpu_shader5 - * allow layout with the deprecated keywords. - */ - const bool relaxed_layout_qualifier_checking = - state->ARB_fragment_coord_conventions_enable; - - if (qual->has_layout() && uses_deprecated_qualifier) { - if (relaxed_layout_qualifier_checking) { - _mesa_glsl_warning(loc, state, - "`layout' qualifier may not be used with " - "`attribute' or `varying'"); - } else { - _mesa_glsl_error(loc, state, - "`layout' qualifier may not be used with " - "`attribute' or `varying'"); - } - } - - /* Layout qualifiers for gl_FragDepth, which are enabled by extension - * AMD_conservative_depth. - */ - int depth_layout_count = qual->flags.q.depth_any - + qual->flags.q.depth_greater - + qual->flags.q.depth_less - + qual->flags.q.depth_unchanged; - if (depth_layout_count > 0 - && !state->AMD_conservative_depth_enable - && !state->ARB_conservative_depth_enable) { - _mesa_glsl_error(loc, state, - "extension GL_AMD_conservative_depth or " - "GL_ARB_conservative_depth must be enabled " - "to use depth layout qualifiers"); - } else if (depth_layout_count > 0 - && strcmp(var->name, "gl_FragDepth") != 0) { - _mesa_glsl_error(loc, state, - "depth layout qualifiers can be applied only to " - "gl_FragDepth"); - } else if (depth_layout_count > 1 - && strcmp(var->name, "gl_FragDepth") == 0) { - _mesa_glsl_error(loc, state, - "at most one depth layout qualifier can be applied to " - "gl_FragDepth"); - } - if (qual->flags.q.depth_any) - var->data.depth_layout = ir_depth_layout_any; - else if (qual->flags.q.depth_greater) - var->data.depth_layout = ir_depth_layout_greater; - else if (qual->flags.q.depth_less) - var->data.depth_layout = ir_depth_layout_less; - else if (qual->flags.q.depth_unchanged) - var->data.depth_layout = ir_depth_layout_unchanged; - else - var->data.depth_layout = ir_depth_layout_none; - - if (qual->flags.q.std140 || - qual->flags.q.packed || - qual->flags.q.shared) { - _mesa_glsl_error(loc, state, - "uniform block layout qualifiers std140, packed, and " - "shared can only be applied to uniform blocks, not " - "members"); - } - - if (qual->flags.q.row_major || qual->flags.q.column_major) { - validate_matrix_layout_for_type(state, loc, var->type, var); - } - - if (var->type->contains_image()) - apply_image_qualifier_to_variable(qual, var, state, loc); -} - -/** - * Get the variable that is being redeclared by this declaration - * - * Semantic checks to verify the validity of the redeclaration are also - * performed. If semantic checks fail, compilation error will be emitted via - * \c _mesa_glsl_error, but a non-\c NULL pointer will still be returned. - * - * \returns - * A pointer to an existing variable in the current scope if the declaration - * is a redeclaration, \c NULL otherwise. - */ -static ir_variable * -get_variable_being_redeclared(ir_variable *var, YYLTYPE loc, - struct _mesa_glsl_parse_state *state, - bool allow_all_redeclarations) -{ - /* Check if this declaration is actually a re-declaration, either to - * resize an array or add qualifiers to an existing variable. - * - * This is allowed for variables in the current scope, or when at - * global scope (for built-ins in the implicit outer scope). - */ - ir_variable *earlier = state->symbols->get_variable(var->name); - if (earlier == NULL || - (state->current_function != NULL && - !state->symbols->name_declared_this_scope(var->name))) { - return NULL; - } - - - /* From page 24 (page 30 of the PDF) of the GLSL 1.50 spec, - * - * "It is legal to declare an array without a size and then - * later re-declare the same name as an array of the same - * type and specify a size." - */ - if (earlier->type->is_unsized_array() && var->type->is_array() - && (var->type->element_type() == earlier->type->element_type())) { - /* FINISHME: This doesn't match the qualifiers on the two - * FINISHME: declarations. It's not 100% clear whether this is - * FINISHME: required or not. - */ - - const unsigned size = unsigned(var->type->array_size()); - check_builtin_array_max_size(var->name, size, loc, state); - if ((size > 0) && (size <= earlier->data.max_array_access)) { - _mesa_glsl_error(& loc, state, "array size must be > %u due to " - "previous access", - earlier->data.max_array_access); - } - - earlier->type = var->type; - delete var; - var = NULL; - } else if ((state->ARB_fragment_coord_conventions_enable || - state->is_version(150, 0)) - && strcmp(var->name, "gl_FragCoord") == 0 - && earlier->type == var->type - && earlier->data.mode == var->data.mode) { - /* Allow redeclaration of gl_FragCoord for ARB_fcc layout - * qualifiers. - */ - earlier->data.origin_upper_left = var->data.origin_upper_left; - earlier->data.pixel_center_integer = var->data.pixel_center_integer; - - /* According to section 4.3.7 of the GLSL 1.30 spec, - * the following built-in varaibles can be redeclared with an - * interpolation qualifier: - * * gl_FrontColor - * * gl_BackColor - * * gl_FrontSecondaryColor - * * gl_BackSecondaryColor - * * gl_Color - * * gl_SecondaryColor - */ - } else if (state->is_version(130, 0) - && (strcmp(var->name, "gl_FrontColor") == 0 - || strcmp(var->name, "gl_BackColor") == 0 - || strcmp(var->name, "gl_FrontSecondaryColor") == 0 - || strcmp(var->name, "gl_BackSecondaryColor") == 0 - || strcmp(var->name, "gl_Color") == 0 - || strcmp(var->name, "gl_SecondaryColor") == 0) - && earlier->type == var->type - && earlier->data.mode == var->data.mode) { - earlier->data.interpolation = var->data.interpolation; - - /* Layout qualifiers for gl_FragDepth. */ - } else if ((state->AMD_conservative_depth_enable || - state->ARB_conservative_depth_enable) - && strcmp(var->name, "gl_FragDepth") == 0 - && earlier->type == var->type - && earlier->data.mode == var->data.mode) { - - /** From the AMD_conservative_depth spec: - * Within any shader, the first redeclarations of gl_FragDepth - * must appear before any use of gl_FragDepth. - */ - if (earlier->data.used) { - _mesa_glsl_error(&loc, state, - "the first redeclaration of gl_FragDepth " - "must appear before any use of gl_FragDepth"); - } - - /* Prevent inconsistent redeclaration of depth layout qualifier. */ - if (earlier->data.depth_layout != ir_depth_layout_none - && earlier->data.depth_layout != var->data.depth_layout) { - _mesa_glsl_error(&loc, state, - "gl_FragDepth: depth layout is declared here " - "as '%s, but it was previously declared as " - "'%s'", - depth_layout_string(var->data.depth_layout), - depth_layout_string(earlier->data.depth_layout)); - } - - earlier->data.depth_layout = var->data.depth_layout; - - } else if (allow_all_redeclarations) { - if (earlier->data.mode != var->data.mode) { - _mesa_glsl_error(&loc, state, - "redeclaration of `%s' with incorrect qualifiers", - var->name); - } else if (earlier->type != var->type) { - _mesa_glsl_error(&loc, state, - "redeclaration of `%s' has incorrect type", - var->name); - } - } else { - _mesa_glsl_error(&loc, state, "`%s' redeclared", var->name); - } - - return earlier; -} - -/** - * Generate the IR for an initializer in a variable declaration - */ -ir_rvalue * -process_initializer(ir_variable *var, ast_declaration *decl, - ast_fully_specified_type *type, - exec_list *initializer_instructions, - struct _mesa_glsl_parse_state *state) -{ - ir_rvalue *result = NULL; - - YYLTYPE initializer_loc = decl->initializer->get_location(); - - /* From page 24 (page 30 of the PDF) of the GLSL 1.10 spec: - * - * "All uniform variables are read-only and are initialized either - * directly by an application via API commands, or indirectly by - * OpenGL." - */ - if (var->data.mode == ir_var_uniform) { - state->check_version(120, 0, &initializer_loc, - "cannot initialize uniforms"); - } - - /* From section 4.1.7 of the GLSL 4.40 spec: - * - * "Opaque variables [...] are initialized only through the - * OpenGL API; they cannot be declared with an initializer in a - * shader." - */ - if (var->type->contains_opaque()) { - _mesa_glsl_error(& initializer_loc, state, - "cannot initialize opaque variable"); - } - - if ((var->data.mode == ir_var_shader_in) && (state->current_function == NULL)) { - _mesa_glsl_error(& initializer_loc, state, - "cannot initialize %s shader input / %s", - _mesa_shader_stage_to_string(state->stage), - (state->stage == MESA_SHADER_VERTEX) - ? "attribute" : "varying"); - } - - /* If the initializer is an ast_aggregate_initializer, recursively store - * type information from the LHS into it, so that its hir() function can do - * type checking. - */ - if (decl->initializer->oper == ast_aggregate) - _mesa_ast_set_aggregate_type(var->type, decl->initializer); - - ir_dereference *const lhs = new(state) ir_dereference_variable(var); - ir_rvalue *rhs = decl->initializer->hir(initializer_instructions, state); - - /* Propagate precision qualifier for constant value */ - if (type->qualifier.flags.q.constant) { - ir_constant *constant_value = rhs->constant_expression_value(); - if (NULL != constant_value) { - constant_value->set_precision((glsl_precision)type->qualifier.precision); - if (constant_value->type->is_array()) { - for (unsigned i = 0; i < constant_value->type->length; i++) { - constant_value->get_array_element(i)->set_precision((glsl_precision)type->qualifier.precision); - } - } - } - } - - /* Calculate the constant value if this is a const or uniform - * declaration. - */ - if (type->qualifier.flags.q.constant - || type->qualifier.flags.q.uniform) { - ir_rvalue *new_rhs = validate_assignment(state, initializer_loc, - var->type, rhs, true); - if (new_rhs != NULL) { - rhs = new_rhs; - - ir_constant *constant_value = rhs->constant_expression_value(); - if (!constant_value) { - /* If ARB_shading_language_420pack is enabled, initializers of - * const-qualified local variables do not have to be constant - * expressions. Const-qualified global variables must still be - * initialized with constant expressions. - */ - if (!state->ARB_shading_language_420pack_enable - || state->current_function == NULL) { - _mesa_glsl_error(& initializer_loc, state, - "initializer of %s variable `%s' must be a " - "constant expression", - (type->qualifier.flags.q.constant) - ? "const" : "uniform", - decl->identifier); - if (var->type->is_numeric()) { - /* Reduce cascading errors. */ - var->constant_value = ir_constant::zero(state, var->type); - } - } - } else { - rhs = constant_value; - var->constant_value = constant_value; - } - } else { - if (var->type->is_numeric()) { - /* Reduce cascading errors. */ - var->constant_value = ir_constant::zero(state, var->type); - } - } - } - - if (rhs && !rhs->type->is_error()) { - bool temp = var->data.read_only; - if (type->qualifier.flags.q.constant) - var->data.read_only = false; - - /* Never emit code to initialize a uniform. - */ - const glsl_type *initializer_type; - if (!type->qualifier.flags.q.uniform) { - do_assignment(initializer_instructions, state, - NULL, - lhs, rhs, - &result, true, - true, - type->get_location()); - initializer_type = result->type; - } else - initializer_type = rhs->type; - - var->constant_initializer = rhs->constant_expression_value(); - var->data.has_initializer = true; - - /* If the declared variable is an unsized array, it must inherrit - * its full type from the initializer. A declaration such as - * - * uniform float a[] = float[](1.0, 2.0, 3.0, 3.0); - * - * becomes - * - * uniform float a[4] = float[](1.0, 2.0, 3.0, 3.0); - * - * The assignment generated in the if-statement (below) will also - * automatically handle this case for non-uniforms. - * - * If the declared variable is not an array, the types must - * already match exactly. As a result, the type assignment - * here can be done unconditionally. For non-uniforms the call - * to do_assignment can change the type of the initializer (via - * the implicit conversion rules). For uniforms the initializer - * must be a constant expression, and the type of that expression - * was validated above. - */ - var->type = initializer_type; - - var->data.read_only = temp; - } - - return result; -} - -static void -apply_precision_to_variable(const struct ast_type_qualifier& qual, - ir_variable *var, bool function_param, - struct _mesa_glsl_parse_state *state) -{ - if (!state->es_shader) - return; - if (var->type->is_sampler() && qual.precision == ast_precision_none && !function_param) - var->data.precision = ast_precision_low; // samplers default to low precision (outside of function arguments) - else - var->data.precision = qual.precision; -} - - -/** - * Do additional processing necessary for geometry shader input declarations - * (this covers both interface blocks arrays and bare input variables). - */ -static void -handle_geometry_shader_input_decl(struct _mesa_glsl_parse_state *state, - YYLTYPE loc, ir_variable *var) -{ - unsigned num_vertices = 0; - if (state->gs_input_prim_type_specified) { - num_vertices = vertices_per_prim(state->in_qualifier->prim_type); - } - - /* Geometry shader input variables must be arrays. Caller should have - * reported an error for this. - */ - if (!var->type->is_array()) { - assert(state->error); - - /* To avoid cascading failures, short circuit the checks below. */ - return; - } - - if (var->type->is_unsized_array()) { - /* Section 4.3.8.1 (Input Layout Qualifiers) of the GLSL 1.50 spec says: - * - * All geometry shader input unsized array declarations will be - * sized by an earlier input layout qualifier, when present, as per - * the following table. - * - * Followed by a table mapping each allowed input layout qualifier to - * the corresponding input length. - */ - if (num_vertices != 0) - var->type = glsl_type::get_array_instance(var->type->fields.array, - num_vertices); - } else { - /* Section 4.3.8.1 (Input Layout Qualifiers) of the GLSL 1.50 spec - * includes the following examples of compile-time errors: - * - * // code sequence within one shader... - * in vec4 Color1[]; // size unknown - * ...Color1.length()...// illegal, length() unknown - * in vec4 Color2[2]; // size is 2 - * ...Color1.length()...// illegal, Color1 still has no size - * in vec4 Color3[3]; // illegal, input sizes are inconsistent - * layout(lines) in; // legal, input size is 2, matching - * in vec4 Color4[3]; // illegal, contradicts layout - * ... - * - * To detect the case illustrated by Color3, we verify that the size of - * an explicitly-sized array matches the size of any previously declared - * explicitly-sized array. To detect the case illustrated by Color4, we - * verify that the size of an explicitly-sized array is consistent with - * any previously declared input layout. - */ - if (num_vertices != 0 && var->type->length != num_vertices) { - _mesa_glsl_error(&loc, state, - "geometry shader input size contradicts previously" - " declared layout (size is %u, but layout requires a" - " size of %u)", var->type->length, num_vertices); - } else if (state->gs_input_size != 0 && - var->type->length != state->gs_input_size) { - _mesa_glsl_error(&loc, state, - "geometry shader input sizes are " - "inconsistent (size is %u, but a previous " - "declaration has size %u)", - var->type->length, state->gs_input_size); - } else { - state->gs_input_size = var->type->length; - } - } -} - - -void -validate_identifier(const char *identifier, YYLTYPE loc, - struct _mesa_glsl_parse_state *state) -{ - /* From page 15 (page 21 of the PDF) of the GLSL 1.10 spec, - * - * "Identifiers starting with "gl_" are reserved for use by - * OpenGL, and may not be declared in a shader as either a - * variable or a function." - */ - if (is_gl_identifier(identifier)) { - _mesa_glsl_error(&loc, state, - "identifier `%s' uses reserved `gl_' prefix", - identifier); - } else if (strstr(identifier, "__")) { - /* From page 14 (page 20 of the PDF) of the GLSL 1.10 - * spec: - * - * "In addition, all identifiers containing two - * consecutive underscores (__) are reserved as - * possible future keywords." - * - * The intention is that names containing __ are reserved for internal - * use by the implementation, and names prefixed with GL_ are reserved - * for use by Khronos. Names simply containing __ are dangerous to use, - * but should be allowed. - * - * A future version of the GLSL specification will clarify this. - */ - _mesa_glsl_warning(&loc, state, - "identifier `%s' uses reserved `__' string", - identifier); - } -} - -static bool -precision_qualifier_allowed(const glsl_type *type) -{ - /* Precision qualifiers apply to floating point, integer and sampler - * types. - * - * Section 4.5.2 (Precision Qualifiers) of the GLSL 1.30 spec says: - * "Any floating point or any integer declaration can have the type - * preceded by one of these precision qualifiers [...] Literal - * constants do not have precision qualifiers. Neither do Boolean - * variables. - * - * Section 4.5 (Precision and Precision Qualifiers) of the GLSL 1.30 - * spec also says: - * - * "Precision qualifiers are added for code portability with OpenGL - * ES, not for functionality. They have the same syntax as in OpenGL - * ES." - * - * Section 8 (Built-In Functions) of the GLSL ES 1.00 spec says: - * - * "uniform lowp sampler2D sampler; - * highp vec2 coord; - * ... - * lowp vec4 col = texture2D (sampler, coord); - * // texture2D returns lowp" - * - * From this, we infer that GLSL 1.30 (and later) should allow precision - * qualifiers on sampler types just like float and integer types. - */ - return type->is_float() - || type->is_integer() - || type->is_record() - || type->is_sampler(); -} - -ir_rvalue * -ast_declarator_list::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - const struct glsl_type *decl_type; - const char *type_name = NULL; - ir_rvalue *result = NULL; - YYLTYPE loc = this->get_location(); - - /* From page 46 (page 52 of the PDF) of the GLSL 1.50 spec: - * - * "To ensure that a particular output variable is invariant, it is - * necessary to use the invariant qualifier. It can either be used to - * qualify a previously declared variable as being invariant - * - * invariant gl_Position; // make existing gl_Position be invariant" - * - * In these cases the parser will set the 'invariant' flag in the declarator - * list, and the type will be NULL. - */ - if (this->invariant) { - assert(this->type == NULL); - - if (state->current_function != NULL) { - _mesa_glsl_error(& loc, state, - "all uses of `invariant' keyword must be at global " - "scope"); - } - - foreach_list_typed (ast_declaration, decl, link, &this->declarations) { - assert(decl->array_specifier == NULL); - assert(decl->initializer == NULL); - - ir_variable *const earlier = - state->symbols->get_variable(decl->identifier); - if (earlier == NULL) { - _mesa_glsl_error(& loc, state, - "undeclared variable `%s' cannot be marked " - "invariant", decl->identifier); - } else if (!is_varying_var(earlier, state->stage)) { - _mesa_glsl_error(&loc, state, - "`%s' cannot be marked invariant; interfaces between " - "shader stages only.", decl->identifier); - } else if (earlier->data.used) { - _mesa_glsl_error(& loc, state, - "variable `%s' may not be redeclared " - "`invariant' after being used", - earlier->name); - } else { - earlier->data.invariant = true; - } - } - - /* Invariant redeclarations do not have r-values. - */ - return NULL; - } - - if (this->precise) { - assert(this->type == NULL); - - foreach_list_typed (ast_declaration, decl, link, &this->declarations) { - assert(decl->array_specifier == NULL); - assert(decl->initializer == NULL); - - ir_variable *const earlier = - state->symbols->get_variable(decl->identifier); - if (earlier == NULL) { - _mesa_glsl_error(& loc, state, - "undeclared variable `%s' cannot be marked " - "precise", decl->identifier); - } else if (state->current_function != NULL && - !state->symbols->name_declared_this_scope(decl->identifier)) { - /* Note: we have to check if we're in a function, since - * builtins are treated as having come from another scope. - */ - _mesa_glsl_error(& loc, state, - "variable `%s' from an outer scope may not be " - "redeclared `precise' in this scope", - earlier->name); - } else if (earlier->data.used) { - _mesa_glsl_error(& loc, state, - "variable `%s' may not be redeclared " - "`precise' after being used", - earlier->name); - } else { - earlier->data.precise = true; - } - } - - /* Precise redeclarations do not have r-values either. */ - return NULL; - } - - assert(this->type != NULL); - assert(!this->invariant); - assert(!this->precise); - - /* The type specifier may contain a structure definition. Process that - * before any of the variable declarations. - */ - (void) this->type->specifier->hir(instructions, state); - - decl_type = this->type->glsl_type(& type_name, state); - - /* An offset-qualified atomic counter declaration sets the default - * offset for the next declaration within the same atomic counter - * buffer. - */ - if (decl_type && decl_type->contains_atomic()) { - if (type->qualifier.flags.q.explicit_binding && - type->qualifier.flags.q.explicit_offset) - state->atomic_counter_offsets[type->qualifier.binding] = - type->qualifier.offset; - } - - if (this->declarations.is_empty()) { - /* If there is no structure involved in the program text, there are two - * possible scenarios: - * - * - The program text contained something like 'vec4;'. This is an - * empty declaration. It is valid but weird. Emit a warning. - * - * - The program text contained something like 'S;' and 'S' is not the - * name of a known structure type. This is both invalid and weird. - * Emit an error. - * - * - The program text contained something like 'mediump float;' - * when the programmer probably meant 'precision mediump - * float;' Emit a warning with a description of what they - * probably meant to do. - * - * Note that if decl_type is NULL and there is a structure involved, - * there must have been some sort of error with the structure. In this - * case we assume that an error was already generated on this line of - * code for the structure. There is no need to generate an additional, - * confusing error. - */ - assert(this->type->specifier->structure == NULL || decl_type != NULL - || state->error); - - if (decl_type == NULL) { - _mesa_glsl_error(&loc, state, - "invalid type `%s' in empty declaration", - type_name); - } else if (decl_type->base_type == GLSL_TYPE_ATOMIC_UINT) { - /* Empty atomic counter declarations are allowed and useful - * to set the default offset qualifier. - */ - return NULL; - } else if (this->type->qualifier.precision != ast_precision_none) { - if (this->type->specifier->structure != NULL) { - _mesa_glsl_error(&loc, state, - "precision qualifiers can't be applied " - "to structures"); - } else { - static const char *const precision_names[] = { - "highp", - "highp", - "mediump", - "lowp" - }; - - _mesa_glsl_warning(&loc, state, - "empty declaration with precision qualifier, " - "to set the default precision, use " - "`precision %s %s;'", - precision_names[this->type->qualifier.precision], - type_name); - } - } else if (this->type->specifier->structure == NULL) { - _mesa_glsl_warning(&loc, state, "empty declaration"); - } - } - - foreach_list_typed (ast_declaration, decl, link, &this->declarations) { - const struct glsl_type *var_type; - ir_variable *var; - - /* FINISHME: Emit a warning if a variable declaration shadows a - * FINISHME: declaration at a higher scope. - */ - - if ((decl_type == NULL) || decl_type->is_void()) { - if (type_name != NULL) { - _mesa_glsl_error(& loc, state, - "invalid type `%s' in declaration of `%s'", - type_name, decl->identifier); - } else { - _mesa_glsl_error(& loc, state, - "invalid type in declaration of `%s'", - decl->identifier); - } - continue; - } - - var_type = process_array_type(&loc, decl_type, decl->array_specifier, - state); - - var = new(ctx) ir_variable(var_type, decl->identifier, ir_var_auto, (glsl_precision)this->type->qualifier.precision); - - /* The 'varying in' and 'varying out' qualifiers can only be used with - * ARB_geometry_shader4 and EXT_geometry_shader4, which we don't support - * yet. - */ - if (this->type->qualifier.flags.q.varying) { - if (this->type->qualifier.flags.q.in) { - _mesa_glsl_error(& loc, state, - "`varying in' qualifier in declaration of " - "`%s' only valid for geometry shaders using " - "ARB_geometry_shader4 or EXT_geometry_shader4", - decl->identifier); - } else if (this->type->qualifier.flags.q.out) { - _mesa_glsl_error(& loc, state, - "`varying out' qualifier in declaration of " - "`%s' only valid for geometry shaders using " - "ARB_geometry_shader4 or EXT_geometry_shader4", - decl->identifier); - } - } - - /* From page 22 (page 28 of the PDF) of the GLSL 1.10 specification; - * - * "Global variables can only use the qualifiers const, - * attribute, uniform, or varying. Only one may be - * specified. - * - * Local variables can only use the qualifier const." - * - * This is relaxed in GLSL 1.30 and GLSL ES 3.00. It is also relaxed by - * any extension that adds the 'layout' keyword. - */ - if (!state->is_version(130, 300) - && !state->has_explicit_attrib_location() - && !state->has_separate_shader_objects() - && !state->ARB_fragment_coord_conventions_enable) { - if (this->type->qualifier.flags.q.out) { - _mesa_glsl_error(& loc, state, - "`out' qualifier in declaration of `%s' " - "only valid for function parameters in %s", - decl->identifier, state->get_version_string()); - } - if (this->type->qualifier.flags.q.in) { - _mesa_glsl_error(& loc, state, - "`in' qualifier in declaration of `%s' " - "only valid for function parameters in %s", - decl->identifier, state->get_version_string()); - } - /* FINISHME: Test for other invalid qualifiers. */ - } - - apply_type_qualifier_to_variable(& this->type->qualifier, var, state, - & loc, false); - apply_precision_to_variable(this->type->qualifier, var, false, state); - - if (this->type->qualifier.flags.q.invariant) { - if (!is_varying_var(var, state->stage)) { - _mesa_glsl_error(&loc, state, - "`%s' cannot be marked invariant; interfaces between " - "shader stages only", var->name); - } - } - - if (state->current_function != NULL) { - const char *mode = NULL; - const char *extra = ""; - - /* There is no need to check for 'inout' here because the parser will - * only allow that in function parameter lists. - */ - if (this->type->qualifier.flags.q.attribute) { - mode = "attribute"; - } else if (this->type->qualifier.flags.q.uniform) { - mode = "uniform"; - } else if (this->type->qualifier.flags.q.varying) { - mode = "varying"; - } else if (this->type->qualifier.flags.q.in) { - mode = "in"; - extra = " or in function parameter list"; - } else if (this->type->qualifier.flags.q.out) { - mode = "out"; - extra = " or in function parameter list"; - } - - if (mode) { - _mesa_glsl_error(& loc, state, - "%s variable `%s' must be declared at " - "global scope%s", - mode, var->name, extra); - } - } else if (var->data.mode == ir_var_shader_in) { - var->data.read_only = true; - - if (state->stage == MESA_SHADER_VERTEX) { - bool error_emitted = false; - - /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec: - * - * "Vertex shader inputs can only be float, floating-point - * vectors, matrices, signed and unsigned integers and integer - * vectors. Vertex shader inputs can also form arrays of these - * types, but not structures." - * - * From page 31 (page 27 of the PDF) of the GLSL 1.30 spec: - * - * "Vertex shader inputs can only be float, floating-point - * vectors, matrices, signed and unsigned integers and integer - * vectors. They cannot be arrays or structures." - * - * From page 23 (page 29 of the PDF) of the GLSL 1.20 spec: - * - * "The attribute qualifier can be used only with float, - * floating-point vectors, and matrices. Attribute variables - * cannot be declared as arrays or structures." - * - * From page 33 (page 39 of the PDF) of the GLSL ES 3.00 spec: - * - * "Vertex shader inputs can only be float, floating-point - * vectors, matrices, signed and unsigned integers and integer - * vectors. Vertex shader inputs cannot be arrays or - * structures." - */ - const glsl_type *check_type = var->type; - while (check_type->is_array()) - check_type = check_type->element_type(); - - switch (check_type->base_type) { - case GLSL_TYPE_FLOAT: - break; - case GLSL_TYPE_UINT: - case GLSL_TYPE_INT: - if (state->is_version(120, 300)) - break; - /* FALLTHROUGH */ - default: - _mesa_glsl_error(& loc, state, - "vertex shader input / attribute cannot have " - "type %s`%s'", - var->type->is_array() ? "array of " : "", - check_type->name); - error_emitted = true; - } - - if (!error_emitted && var->type->is_array() && - !state->check_version(150, 0, &loc, - "vertex shader input / attribute " - "cannot have array type")) { - error_emitted = true; - } - } else if (state->stage == MESA_SHADER_GEOMETRY) { - /* From section 4.3.4 (Inputs) of the GLSL 1.50 spec: - * - * Geometry shader input variables get the per-vertex values - * written out by vertex shader output variables of the same - * names. Since a geometry shader operates on a set of - * vertices, each input varying variable (or input block, see - * interface blocks below) needs to be declared as an array. - */ - if (!var->type->is_array()) { - _mesa_glsl_error(&loc, state, - "geometry shader inputs must be arrays"); - } - - handle_geometry_shader_input_decl(state, loc, var); - } - } - - /* Integer fragment inputs must be qualified with 'flat'. In GLSL ES, - * so must integer vertex outputs. - * - * From section 4.3.4 ("Inputs") of the GLSL 1.50 spec: - * "Fragment shader inputs that are signed or unsigned integers or - * integer vectors must be qualified with the interpolation qualifier - * flat." - * - * From section 4.3.4 ("Input Variables") of the GLSL 3.00 ES spec: - * "Fragment shader inputs that are, or contain, signed or unsigned - * integers or integer vectors must be qualified with the - * interpolation qualifier flat." - * - * From section 4.3.6 ("Output Variables") of the GLSL 3.00 ES spec: - * "Vertex shader outputs that are, or contain, signed or unsigned - * integers or integer vectors must be qualified with the - * interpolation qualifier flat." - * - * Note that prior to GLSL 1.50, this requirement applied to vertex - * outputs rather than fragment inputs. That creates problems in the - * presence of geometry shaders, so we adopt the GLSL 1.50 rule for all - * desktop GL shaders. For GLSL ES shaders, we follow the spec and - * apply the restriction to both vertex outputs and fragment inputs. - * - * Note also that the desktop GLSL specs are missing the text "or - * contain"; this is presumably an oversight, since there is no - * reasonable way to interpolate a fragment shader input that contains - * an integer. - */ - if (state->is_version(130, 300) && - var->type->contains_integer() && - var->data.interpolation != INTERP_QUALIFIER_FLAT && - ((state->stage == MESA_SHADER_FRAGMENT && var->data.mode == ir_var_shader_in) - || (state->stage == MESA_SHADER_VERTEX && var->data.mode == ir_var_shader_out - && state->es_shader))) { - const char *var_type = (state->stage == MESA_SHADER_VERTEX) ? - "vertex output" : "fragment input"; - _mesa_glsl_error(&loc, state, "if a %s is (or contains) " - "an integer, then it must be qualified with 'flat'", - var_type); - } - - - /* Interpolation qualifiers cannot be applied to 'centroid' and - * 'centroid varying'. - * - * From page 29 (page 35 of the PDF) of the GLSL 1.30 spec: - * "interpolation qualifiers may only precede the qualifiers in, - * centroid in, out, or centroid out in a declaration. They do not apply - * to the deprecated storage qualifiers varying or centroid varying." - * - * These deprecated storage qualifiers do not exist in GLSL ES 3.00. - */ - if (state->is_version(130, 0) - && this->type->qualifier.has_interpolation() - && this->type->qualifier.flags.q.varying) { - - const char *i = this->type->qualifier.interpolation_string(); - assert(i != NULL); - const char *s; - if (this->type->qualifier.flags.q.centroid) - s = "centroid varying"; - else - s = "varying"; - - _mesa_glsl_error(&loc, state, - "qualifier '%s' cannot be applied to the " - "deprecated storage qualifier '%s'", i, s); - } - - - /* Interpolation qualifiers can only apply to vertex shader outputs and - * fragment shader inputs. - * - * From page 29 (page 35 of the PDF) of the GLSL 1.30 spec: - * "Outputs from a vertex shader (out) and inputs to a fragment - * shader (in) can be further qualified with one or more of these - * interpolation qualifiers" - * - * From page 31 (page 37 of the PDF) of the GLSL ES 3.00 spec: - * "These interpolation qualifiers may only precede the qualifiers - * in, centroid in, out, or centroid out in a declaration. They do - * not apply to inputs into a vertex shader or outputs from a - * fragment shader." - */ - if (state->is_version(130, 300) - && this->type->qualifier.has_interpolation()) { - - const char *i = this->type->qualifier.interpolation_string(); - assert(i != NULL); - - switch (state->stage) { - case MESA_SHADER_VERTEX: - if (this->type->qualifier.flags.q.in) { - _mesa_glsl_error(&loc, state, - "qualifier '%s' cannot be applied to vertex " - "shader inputs", i); - } - break; - case MESA_SHADER_FRAGMENT: - if (this->type->qualifier.flags.q.out) { - _mesa_glsl_error(&loc, state, - "qualifier '%s' cannot be applied to fragment " - "shader outputs", i); - } - break; - default: - break; - } - } - - - /* Precision qualifiers exists only in GLSL versions 1.00 and >= 1.30. - */ - if (this->type->qualifier.precision != ast_precision_none) { - state->check_precision_qualifiers_allowed(&loc); - } - - - /* If a precision qualifier is allowed on a type, it is allowed on - * an array of that type. - */ - if (!(this->type->qualifier.precision == ast_precision_none - || precision_qualifier_allowed(var->type) - || (var->type->is_array() - && precision_qualifier_allowed(var->type->fields.array)))) { - - _mesa_glsl_error(&loc, state, - "precision qualifiers apply only to floating point" - ", integer and sampler types"); - } - - /* From section 4.1.7 of the GLSL 4.40 spec: - * - * "[Opaque types] can only be declared as function - * parameters or uniform-qualified variables." - */ - if (var_type->contains_opaque() && - !this->type->qualifier.flags.q.uniform) { - _mesa_glsl_error(&loc, state, - "opaque variables must be declared uniform"); - } - - /* Process the initializer and add its instructions to a temporary - * list. This list will be added to the instruction stream (below) after - * the declaration is added. This is done because in some cases (such as - * redeclarations) the declaration may not actually be added to the - * instruction stream. - */ - exec_list initializer_instructions; - - /* Examine var name here since var may get deleted in the next call */ - bool var_is_gl_id = is_gl_identifier(var->name); - - ir_variable *earlier = - get_variable_being_redeclared(var, decl->get_location(), state, - false /* allow_all_redeclarations */); - if (earlier != NULL) { - if (var_is_gl_id && - earlier->data.how_declared == ir_var_declared_in_block) { - _mesa_glsl_error(&loc, state, - "`%s' has already been redeclared using " - "gl_PerVertex", var->name); - } - earlier->data.how_declared = ir_var_declared_normally; - } - - if (decl->initializer != NULL) { - result = process_initializer((earlier == NULL) ? var : earlier, - decl, this->type, - &initializer_instructions, state); - } - - /* From page 23 (page 29 of the PDF) of the GLSL 1.10 spec: - * - * "It is an error to write to a const variable outside of - * its declaration, so they must be initialized when - * declared." - */ - if (this->type->qualifier.flags.q.constant && decl->initializer == NULL) { - _mesa_glsl_error(& loc, state, - "const declaration of `%s' must be initialized", - decl->identifier); - } - - if (state->es_shader) { - const glsl_type *const t = (earlier == NULL) - ? var->type : earlier->type; - - if (t->is_unsized_array()) - /* Section 10.17 of the GLSL ES 1.00 specification states that - * unsized array declarations have been removed from the language. - * Arrays that are sized using an initializer are still explicitly - * sized. However, GLSL ES 1.00 does not allow array - * initializers. That is only allowed in GLSL ES 3.00. - * - * Section 4.1.9 (Arrays) of the GLSL ES 3.00 spec says: - * - * "An array type can also be formed without specifying a size - * if the definition includes an initializer: - * - * float x[] = float[2] (1.0, 2.0); // declares an array of size 2 - * float y[] = float[] (1.0, 2.0, 3.0); // declares an array of size 3 - * - * float a[5]; - * float b[] = a;" - */ - _mesa_glsl_error(& loc, state, - "unsized array declarations are not allowed in " - "GLSL ES"); - } - - /* If the declaration is not a redeclaration, there are a few additional - * semantic checks that must be applied. In addition, variable that was - * created for the declaration should be added to the IR stream. - */ - if (earlier == NULL) { - validate_identifier(decl->identifier, loc, state); - - /* Add the variable to the symbol table. Note that the initializer's - * IR was already processed earlier (though it hasn't been emitted - * yet), without the variable in scope. - * - * This differs from most C-like languages, but it follows the GLSL - * specification. From page 28 (page 34 of the PDF) of the GLSL 1.50 - * spec: - * - * "Within a declaration, the scope of a name starts immediately - * after the initializer if present or immediately after the name - * being declared if not." - */ - if (!state->symbols->add_variable(var)) { - YYLTYPE loc = this->get_location(); - _mesa_glsl_error(&loc, state, "name `%s' already taken in the " - "current scope", decl->identifier); - continue; - } - - /* Push the variable declaration to the top. It means that all the - * variable declarations will appear in a funny last-to-first order, - * but otherwise we run into trouble if a function is prototyped, a - * global var is decled, then the function is defined with usage of - * the global var. See glslparsertest's CorrectModule.frag. - * However, do not insert declarations before default precision statements - * or type declarations. - */ - ir_instruction* before_node = (ir_instruction*)instructions->head; - while (before_node && (before_node->ir_type == ir_type_precision || before_node->ir_type == ir_type_typedecl)) - before_node = (ir_instruction*)before_node->next; - if (before_node) - before_node->insert_before(var); - else - instructions->push_head(var); - } - - instructions->append_list(&initializer_instructions); - } - - - /* Generally, variable declarations do not have r-values. However, - * one is used for the declaration in - * - * while (bool b = some_condition()) { - * ... - * } - * - * so we return the rvalue from the last seen declaration here. - */ - return result; -} - - -ir_rvalue * -ast_parameter_declarator::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - const struct glsl_type *type; - const char *name = NULL; - YYLTYPE loc = this->get_location(); - - type = this->type->glsl_type(& name, state); - - if (type == NULL) { - if (name != NULL) { - _mesa_glsl_error(& loc, state, - "invalid type `%s' in declaration of `%s'", - name, this->identifier); - } else { - _mesa_glsl_error(& loc, state, - "invalid type in declaration of `%s'", - this->identifier); - } - - type = glsl_type::error_type; - } - - /* From page 62 (page 68 of the PDF) of the GLSL 1.50 spec: - * - * "Functions that accept no input arguments need not use void in the - * argument list because prototypes (or definitions) are required and - * therefore there is no ambiguity when an empty argument list "( )" is - * declared. The idiom "(void)" as a parameter list is provided for - * convenience." - * - * Placing this check here prevents a void parameter being set up - * for a function, which avoids tripping up checks for main taking - * parameters and lookups of an unnamed symbol. - */ - if (type->is_void()) { - if (this->identifier != NULL) - _mesa_glsl_error(& loc, state, - "named parameter cannot have type `void'"); - - is_void = true; - return NULL; - } - - if (formal_parameter && (this->identifier == NULL)) { - _mesa_glsl_error(& loc, state, "formal parameter lacks a name"); - return NULL; - } - - /* This only handles "vec4 foo[..]". The earlier specifier->glsl_type(...) - * call already handled the "vec4[..] foo" case. - */ - type = process_array_type(&loc, type, this->array_specifier, state); - - if (!type->is_error() && type->is_unsized_array()) { - _mesa_glsl_error(&loc, state, "arrays passed as parameters must have " - "a declared size"); - type = glsl_type::error_type; - } - - is_void = false; - ir_variable *var = new(ctx) - ir_variable(type, this->identifier, ir_var_function_in, (glsl_precision)this->type->qualifier.precision); - - /* Apply any specified qualifiers to the parameter declaration. Note that - * for function parameters the default mode is 'in'. - */ - apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & loc, - true); - apply_precision_to_variable(this->type->qualifier, var, true, state); - - /* From section 4.1.7 of the GLSL 4.40 spec: - * - * "Opaque variables cannot be treated as l-values; hence cannot - * be used as out or inout function parameters, nor can they be - * assigned into." - */ - if ((var->data.mode == ir_var_function_inout || var->data.mode == ir_var_function_out) - && type->contains_opaque()) { - _mesa_glsl_error(&loc, state, "out and inout parameters cannot " - "contain opaque variables"); - type = glsl_type::error_type; - } - - /* From page 39 (page 45 of the PDF) of the GLSL 1.10 spec: - * - * "When calling a function, expressions that do not evaluate to - * l-values cannot be passed to parameters declared as out or inout." - * - * From page 32 (page 38 of the PDF) of the GLSL 1.10 spec: - * - * "Other binary or unary expressions, non-dereferenced arrays, - * function names, swizzles with repeated fields, and constants - * cannot be l-values." - * - * So for GLSL 1.10, passing an array as an out or inout parameter is not - * allowed. This restriction is removed in GLSL 1.20, and in GLSL ES. - */ - if ((var->data.mode == ir_var_function_inout || var->data.mode == ir_var_function_out) - && type->is_array() - && !state->check_version(120, 100, &loc, - "arrays cannot be out or inout parameters")) { - type = glsl_type::error_type; - } - - instructions->push_tail(var); - - /* Parameter declarations do not have r-values. - */ - return NULL; -} - - -void -ast_parameter_declarator::parameters_to_hir(exec_list *ast_parameters, - bool formal, - exec_list *ir_parameters, - _mesa_glsl_parse_state *state) -{ - ast_parameter_declarator *void_param = NULL; - unsigned count = 0; - - foreach_list_typed (ast_parameter_declarator, param, link, ast_parameters) { - param->formal_parameter = formal; - param->hir(ir_parameters, state); - - if (param->is_void) - void_param = param; - - count++; - } - - if ((void_param != NULL) && (count > 1)) { - YYLTYPE loc = void_param->get_location(); - - _mesa_glsl_error(& loc, state, - "`void' parameter must be only parameter"); - } -} - - -void -emit_function(_mesa_glsl_parse_state *state, ir_function *f) -{ - /* IR invariants disallow function declarations or definitions - * nested within other function definitions. But there is no - * requirement about the relative order of function declarations - * and definitions with respect to one another. So simply insert - * the new ir_function block at the end of the toplevel instruction - * list. - */ - state->toplevel_ir->push_tail(f); -} - - -ir_rvalue * -ast_function::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - ir_function *f = NULL; - ir_function_signature *sig = NULL; - exec_list hir_parameters; - - const char *const name = identifier; - - /* New functions are always added to the top-level IR instruction stream, - * so this instruction list pointer is ignored. See also emit_function - * (called below). - */ - (void) instructions; - - /* From page 21 (page 27 of the PDF) of the GLSL 1.20 spec, - * - * "Function declarations (prototypes) cannot occur inside of functions; - * they must be at global scope, or for the built-in functions, outside - * the global scope." - * - * From page 27 (page 33 of the PDF) of the GLSL ES 1.00.16 spec, - * - * "User defined functions may only be defined within the global scope." - * - * Note that this language does not appear in GLSL 1.10. - */ - if ((state->current_function != NULL) && - state->is_version(120, 100)) { - YYLTYPE loc = this->get_location(); - _mesa_glsl_error(&loc, state, - "declaration of function `%s' not allowed within " - "function body", name); - } - - validate_identifier(name, this->get_location(), state); - - /* Convert the list of function parameters to HIR now so that they can be - * used below to compare this function's signature with previously seen - * signatures for functions with the same name. - */ - ast_parameter_declarator::parameters_to_hir(& this->parameters, - is_definition, - & hir_parameters, state); - - const char *return_type_name; - const glsl_type *return_type = - this->return_type->glsl_type(& return_type_name, state); - - if (!return_type) { - YYLTYPE loc = this->get_location(); - _mesa_glsl_error(&loc, state, - "function `%s' has undeclared return type `%s'", - name, return_type_name); - return_type = glsl_type::error_type; - } - - /* From page 56 (page 62 of the PDF) of the GLSL 1.30 spec: - * "No qualifier is allowed on the return type of a function." - */ - if (this->return_type->has_qualifiers()) { - YYLTYPE loc = this->get_location(); - _mesa_glsl_error(& loc, state, - "function `%s' return type has qualifiers", name); - } - - /* Section 6.1 (Function Definitions) of the GLSL 1.20 spec says: - * - * "Arrays are allowed as arguments and as the return type. In both - * cases, the array must be explicitly sized." - */ - if (return_type->is_unsized_array()) { - YYLTYPE loc = this->get_location(); - _mesa_glsl_error(& loc, state, - "function `%s' return type array must be explicitly " - "sized", name); - } - - /* From section 4.1.7 of the GLSL 4.40 spec: - * - * "[Opaque types] can only be declared as function parameters - * or uniform-qualified variables." - */ - if (return_type->contains_opaque()) { - YYLTYPE loc = this->get_location(); - _mesa_glsl_error(&loc, state, - "function `%s' return type can't contain an opaque type", - name); - } - - /* Create an ir_function if one doesn't already exist. */ - f = state->symbols->get_function(name); - if (f == NULL) { - f = new(ctx) ir_function(name); - if (!state->symbols->add_function(f)) { - /* This function name shadows a non-function use of the same name. */ - YYLTYPE loc = this->get_location(); - - _mesa_glsl_error(&loc, state, "function name `%s' conflicts with " - "non-function", name); - return NULL; - } - - emit_function(state, f); - } - - /* Verify that this function's signature either doesn't match a previously - * seen signature for a function with the same name, or, if a match is found, - * that the previously seen signature does not have an associated definition. - */ - if (state->es_shader || f->has_user_signature()) { - sig = f->exact_matching_signature(state, &hir_parameters); - if (sig != NULL) { - const char *badvar = sig->qualifiers_match(&hir_parameters); - if (badvar != NULL) { - YYLTYPE loc = this->get_location(); - - _mesa_glsl_error(&loc, state, "function `%s' parameter `%s' " - "qualifiers don't match prototype", name, badvar); - } - - if (sig->return_type != return_type) { - YYLTYPE loc = this->get_location(); - - _mesa_glsl_error(&loc, state, "function `%s' return type doesn't " - "match prototype", name); - } - - if (sig->is_defined) { - if (is_definition) { - YYLTYPE loc = this->get_location(); - _mesa_glsl_error(& loc, state, "function `%s' redefined", name); - } else { - /* We just encountered a prototype that exactly matches a - * function that's already been defined. This is redundant, - * and we should ignore it. - */ - return NULL; - } - } - } - } - - /* Verify the return type of main() */ - if (strcmp(name, "main") == 0) { - if (! return_type->is_void()) { - YYLTYPE loc = this->get_location(); - - _mesa_glsl_error(& loc, state, "main() must return void"); - } - - if (!hir_parameters.is_empty()) { - YYLTYPE loc = this->get_location(); - - _mesa_glsl_error(& loc, state, "main() must not take any parameters"); - } - } - - /* Finish storing the information about this new function in its signature. - */ - if (sig == NULL) { - sig = new(ctx) ir_function_signature(return_type, (glsl_precision)this->return_type->qualifier.precision); - f->add_signature(sig); - } - - sig->replace_parameters(&hir_parameters); - signature = sig; - - /* Function declarations (prototypes) do not have r-values. - */ - return NULL; -} - - -ir_rvalue * -ast_function_definition::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - prototype->is_definition = true; - prototype->hir(instructions, state); - - ir_function_signature *signature = prototype->signature; - if (signature == NULL) - return NULL; - - assert(state->current_function == NULL); - state->current_function = signature; - state->found_return = false; - - /* Duplicate parameters declared in the prototype as concrete variables. - * Add these to the symbol table. - */ - state->symbols->push_scope(); - foreach_in_list(ir_variable, var, &signature->parameters) { - assert(var->as_variable() != NULL); - - /* The only way a parameter would "exist" is if two parameters have - * the same name. - */ - if (state->symbols->name_declared_this_scope(var->name)) { - YYLTYPE loc = this->get_location(); - - _mesa_glsl_error(& loc, state, "parameter `%s' redeclared", var->name); - } else { - state->symbols->add_variable(var); - } - } - - /* Convert the body of the function to HIR. */ - this->body->hir(&signature->body, state); - signature->is_defined = true; - - state->symbols->pop_scope(); - - assert(state->current_function == signature); - state->current_function = NULL; - - if (!signature->return_type->is_void() && !state->found_return) { - YYLTYPE loc = this->get_location(); - _mesa_glsl_error(& loc, state, "function `%s' has non-void return type " - "%s, but no return statement", - signature->function_name(), - signature->return_type->name); - } - - /* Function definitions do not have r-values. - */ - return NULL; -} - - -ir_rvalue * -ast_jump_statement::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - - switch (mode) { - case ast_return: { - ir_return *inst; - assert(state->current_function); - - if (opt_return_value) { - ir_rvalue *ret = opt_return_value->hir(instructions, state); - - /* The value of the return type can be NULL if the shader says - * 'return foo();' and foo() is a function that returns void. - * - * NOTE: The GLSL spec doesn't say that this is an error. The type - * of the return value is void. If the return type of the function is - * also void, then this should compile without error. Seriously. - */ - const glsl_type *const ret_type = - (ret == NULL) ? glsl_type::void_type : ret->type; - - /* Implicit conversions are not allowed for return values prior to - * ARB_shading_language_420pack. - */ - if (state->current_function->return_type != ret_type) { - YYLTYPE loc = this->get_location(); - - if (state->ARB_shading_language_420pack_enable) { - if (!apply_implicit_conversion(state->current_function->return_type, - ret, state)) { - _mesa_glsl_error(& loc, state, - "could not implicitly convert return value " - "to %s, in function `%s'", - state->current_function->return_type->name, - state->current_function->function_name()); - } - } else { - _mesa_glsl_error(& loc, state, - "`return' with wrong type %s, in function `%s' " - "returning %s", - ret_type->name, - state->current_function->function_name(), - state->current_function->return_type->name); - } - } else if (state->current_function->return_type->base_type == - GLSL_TYPE_VOID) { - YYLTYPE loc = this->get_location(); - - /* The ARB_shading_language_420pack, GLSL ES 3.0, and GLSL 4.20 - * specs add a clarification: - * - * "A void function can only use return without a return argument, even if - * the return argument has void type. Return statements only accept values: - * - * void func1() { } - * void func2() { return func1(); } // illegal return statement" - */ - _mesa_glsl_error(& loc, state, - "void functions can only use `return' without a " - "return argument"); - } - - inst = new(ctx) ir_return(ret); - } else { - if (state->current_function->return_type->base_type != - GLSL_TYPE_VOID) { - YYLTYPE loc = this->get_location(); - - _mesa_glsl_error(& loc, state, - "`return' with no value, in function %s returning " - "non-void", - state->current_function->function_name()); - } - inst = new(ctx) ir_return; - } - - state->found_return = true; - instructions->push_tail(inst); - break; - } - - case ast_discard: - if (state->stage != MESA_SHADER_FRAGMENT) { - YYLTYPE loc = this->get_location(); - - _mesa_glsl_error(& loc, state, - "`discard' may only appear in a fragment shader"); - } - instructions->push_tail(new(ctx) ir_discard); - break; - - case ast_break: - case ast_continue: - if (mode == ast_continue && - state->loop_nesting_ast == NULL) { - YYLTYPE loc = this->get_location(); - - _mesa_glsl_error(& loc, state, "continue may only appear in a loop"); - } else if (mode == ast_break && - state->loop_nesting_ast == NULL && - state->switch_state.switch_nesting_ast == NULL) { - YYLTYPE loc = this->get_location(); - - _mesa_glsl_error(& loc, state, - "break may only appear in a loop or a switch"); - } else { - /* For a loop, inline the for loop expression again, since we don't - * know where near the end of the loop body the normal copy of it is - * going to be placed. Same goes for the condition for a do-while - * loop. - */ - if (state->loop_nesting_ast != NULL && - mode == ast_continue) { - if (state->loop_nesting_ast->rest_expression) { - state->loop_nesting_ast->rest_expression->hir(instructions, - state); - } - if (state->loop_nesting_ast->mode == - ast_iteration_statement::ast_do_while) { - state->loop_nesting_ast->condition_to_hir(instructions, state); - } - } - - if (state->switch_state.is_switch_innermost && - mode == ast_break) { - /* Force break out of switch by setting is_break switch state. - */ - ir_variable *const is_break_var = state->switch_state.is_break_var; - ir_dereference_variable *const deref_is_break_var = - new(ctx) ir_dereference_variable(is_break_var); - ir_constant *const true_val = new(ctx) ir_constant(true); - ir_assignment *const set_break_var = - new(ctx) ir_assignment(deref_is_break_var, true_val); - - instructions->push_tail(set_break_var); - } - else { - ir_loop_jump *const jump = - new(ctx) ir_loop_jump((mode == ast_break) - ? ir_loop_jump::jump_break - : ir_loop_jump::jump_continue); - instructions->push_tail(jump); - } - } - - break; - } - - /* Jump instructions do not have r-values. - */ - return NULL; -} - - -ir_rvalue * -ast_selection_statement::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - - ir_rvalue *const condition = this->condition->hir(instructions, state); - - /* From page 66 (page 72 of the PDF) of the GLSL 1.50 spec: - * - * "Any expression whose type evaluates to a Boolean can be used as the - * conditional expression bool-expression. Vector types are not accepted - * as the expression to if." - * - * The checks are separated so that higher quality diagnostics can be - * generated for cases where both rules are violated. - */ - if (!condition->type->is_boolean() || !condition->type->is_scalar()) { - YYLTYPE loc = this->condition->get_location(); - - _mesa_glsl_error(& loc, state, "if-statement condition must be scalar " - "boolean"); - } - - ir_if *const stmt = new(ctx) ir_if(condition); - - if (then_statement != NULL) { - state->symbols->push_scope(); - then_statement->hir(& stmt->then_instructions, state); - state->symbols->pop_scope(); - } - - if (else_statement != NULL) { - state->symbols->push_scope(); - else_statement->hir(& stmt->else_instructions, state); - state->symbols->pop_scope(); - } - - instructions->push_tail(stmt); - - /* if-statements do not have r-values. - */ - return NULL; -} - - -ir_rvalue * -ast_switch_statement::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - - ir_rvalue *const test_expression = - this->test_expression->hir(instructions, state); - - /* From page 66 (page 55 of the PDF) of the GLSL 1.50 spec: - * - * "The type of init-expression in a switch statement must be a - * scalar integer." - */ - if (!test_expression->type->is_scalar() || - !test_expression->type->is_integer()) { - YYLTYPE loc = this->test_expression->get_location(); - - _mesa_glsl_error(& loc, - state, - "switch-statement expression must be scalar " - "integer"); - } - - /* Track the switch-statement nesting in a stack-like manner. - */ - struct glsl_switch_state saved = state->switch_state; - - state->switch_state.is_switch_innermost = true; - state->switch_state.switch_nesting_ast = this; - state->switch_state.labels_ht = hash_table_ctor(0, hash_table_pointer_hash, - hash_table_pointer_compare); - state->switch_state.previous_default = NULL; - - /* Initalize is_fallthru state to false. - */ - ir_rvalue *const is_fallthru_val = new (ctx) ir_constant(false); - state->switch_state.is_fallthru_var = - new(ctx) ir_variable(glsl_type::bool_type, - "switch_is_fallthru_tmp", - ir_var_temporary, glsl_precision_low); - instructions->push_tail(state->switch_state.is_fallthru_var); - - ir_dereference_variable *deref_is_fallthru_var = - new(ctx) ir_dereference_variable(state->switch_state.is_fallthru_var); - instructions->push_tail(new(ctx) ir_assignment(deref_is_fallthru_var, - is_fallthru_val)); - - /* Initalize is_break state to false. - */ - ir_rvalue *const is_break_val = new (ctx) ir_constant(false); - state->switch_state.is_break_var = - new(ctx) ir_variable(glsl_type::bool_type, - "switch_is_break_tmp", - ir_var_temporary, glsl_precision_low); - instructions->push_tail(state->switch_state.is_break_var); - - ir_dereference_variable *deref_is_break_var = - new(ctx) ir_dereference_variable(state->switch_state.is_break_var); - instructions->push_tail(new(ctx) ir_assignment(deref_is_break_var, - is_break_val)); - - state->switch_state.run_default = - new(ctx) ir_variable(glsl_type::bool_type, - "run_default_tmp", - ir_var_temporary, glsl_precision_low); - instructions->push_tail(state->switch_state.run_default); - - /* Cache test expression. - */ - test_to_hir(instructions, state); - - /* Emit code for body of switch stmt. - */ - body->hir(instructions, state); - - hash_table_dtor(state->switch_state.labels_ht); - - state->switch_state = saved; - - /* Switch statements do not have r-values. */ - return NULL; -} - - -void -ast_switch_statement::test_to_hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - - /* Cache value of test expression. */ - ir_rvalue *const test_val = - test_expression->hir(instructions, - state); - - state->switch_state.test_var = new(ctx) ir_variable(test_val->type, - "switch_test_tmp", - ir_var_temporary, test_val->get_precision()); - ir_dereference_variable *deref_test_var = - new(ctx) ir_dereference_variable(state->switch_state.test_var); - - instructions->push_tail(state->switch_state.test_var); - instructions->push_tail(new(ctx) ir_assignment(deref_test_var, test_val)); -} - - -ir_rvalue * -ast_switch_body::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - if (stmts != NULL) - stmts->hir(instructions, state); - - /* Switch bodies do not have r-values. */ - return NULL; -} - -ir_rvalue * -ast_case_statement_list::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - exec_list default_case, after_default, tmp; - - foreach_list_typed (ast_case_statement, case_stmt, link, & this->cases) { - case_stmt->hir(&tmp, state); - - /* Default case. */ - if (state->switch_state.previous_default && default_case.is_empty()) { - default_case.append_list(&tmp); - continue; - } - - /* If default case found, append 'after_default' list. */ - if (!default_case.is_empty()) - after_default.append_list(&tmp); - else - instructions->append_list(&tmp); - } - - /* Handle the default case. This is done here because default might not be - * the last case. We need to add checks against following cases first to see - * if default should be chosen or not. - */ - if (!default_case.is_empty()) { - - ir_rvalue *const true_val = new (state) ir_constant(true); - ir_dereference_variable *deref_run_default_var = - new(state) ir_dereference_variable(state->switch_state.run_default); - - /* Choose to run default case initially, following conditional - * assignments might change this. - */ - ir_assignment *const init_var = - new(state) ir_assignment(deref_run_default_var, true_val); - instructions->push_tail(init_var); - - /* Default case was the last one, no checks required. */ - if (after_default.is_empty()) { - instructions->append_list(&default_case); - return NULL; - } - - foreach_in_list(ir_instruction, ir, &after_default) { - ir_assignment *assign = ir->as_assignment(); - - if (!assign) - continue; - - /* Clone the check between case label and init expression. */ - ir_expression *exp = (ir_expression*) assign->condition; - ir_expression *clone = exp->clone(state, NULL); - - ir_dereference_variable *deref_var = - new(state) ir_dereference_variable(state->switch_state.run_default); - ir_rvalue *const false_val = new (state) ir_constant(false); - - ir_assignment *const set_false = - new(state) ir_assignment(deref_var, false_val, clone); - - instructions->push_tail(set_false); - } - - /* Append default case and all cases after it. */ - instructions->append_list(&default_case); - instructions->append_list(&after_default); - } - - /* Case statements do not have r-values. */ - return NULL; -} - -ir_rvalue * -ast_case_statement::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - labels->hir(instructions, state); - - /* Conditionally set fallthru state based on break state. */ - ir_constant *const false_val = new(state) ir_constant(false); - ir_dereference_variable *const deref_is_fallthru_var = - new(state) ir_dereference_variable(state->switch_state.is_fallthru_var); - ir_dereference_variable *const deref_is_break_var = - new(state) ir_dereference_variable(state->switch_state.is_break_var); - ir_assignment *const reset_fallthru_on_break = - new(state) ir_assignment(deref_is_fallthru_var, - false_val, - deref_is_break_var); - instructions->push_tail(reset_fallthru_on_break); - - /* Guard case statements depending on fallthru state. */ - ir_dereference_variable *const deref_fallthru_guard = - new(state) ir_dereference_variable(state->switch_state.is_fallthru_var); - ir_if *const test_fallthru = new(state) ir_if(deref_fallthru_guard); - - foreach_list_typed (ast_node, stmt, link, & this->stmts) - stmt->hir(& test_fallthru->then_instructions, state); - - instructions->push_tail(test_fallthru); - - /* Case statements do not have r-values. */ - return NULL; -} - - -ir_rvalue * -ast_case_label_list::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - foreach_list_typed (ast_case_label, label, link, & this->labels) - label->hir(instructions, state); - - /* Case labels do not have r-values. */ - return NULL; -} - -ir_rvalue * -ast_case_label::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - - ir_dereference_variable *deref_fallthru_var = - new(ctx) ir_dereference_variable(state->switch_state.is_fallthru_var); - - ir_rvalue *const true_val = new(ctx) ir_constant(true); - - /* If not default case, ... */ - if (this->test_value != NULL) { - /* Conditionally set fallthru state based on - * comparison of cached test expression value to case label. - */ - ir_rvalue *const label_rval = this->test_value->hir(instructions, state); - ir_constant *label_const = label_rval->constant_expression_value(); - - if (!label_const) { - YYLTYPE loc = this->test_value->get_location(); - - _mesa_glsl_error(& loc, state, - "switch statement case label must be a " - "constant expression"); - - /* Stuff a dummy value in to allow processing to continue. */ - label_const = new(ctx) ir_constant(0); - } else { - ast_expression *previous_label = (ast_expression *) - hash_table_find(state->switch_state.labels_ht, - (void *)(uintptr_t)label_const->value.u[0]); - - if (previous_label) { - YYLTYPE loc = this->test_value->get_location(); - _mesa_glsl_error(& loc, state, "duplicate case value"); - - loc = previous_label->get_location(); - _mesa_glsl_error(& loc, state, "this is the previous case label"); - } else { - hash_table_insert(state->switch_state.labels_ht, - this->test_value, - (void *)(uintptr_t)label_const->value.u[0]); - } - } - - ir_dereference_variable *deref_test_var = - new(ctx) ir_dereference_variable(state->switch_state.test_var); - - ir_expression *test_cond = new(ctx) ir_expression(ir_binop_all_equal, - label_const, - deref_test_var); - - /* - * From GLSL 4.40 specification section 6.2 ("Selection"): - * - * "The type of the init-expression value in a switch statement must - * be a scalar int or uint. The type of the constant-expression value - * in a case label also must be a scalar int or uint. When any pair - * of these values is tested for "equal value" and the types do not - * match, an implicit conversion will be done to convert the int to a - * uint (see section 4.1.10 “Implicit Conversions”) before the compare - * is done." - */ - if (label_const->type != state->switch_state.test_var->type) { - YYLTYPE loc = this->test_value->get_location(); - - const glsl_type *type_a = label_const->type; - const glsl_type *type_b = state->switch_state.test_var->type; - - /* Check if int->uint implicit conversion is supported. */ - bool integer_conversion_supported = - glsl_type::int_type->can_implicitly_convert_to(glsl_type::uint_type, - state); - - if ((!type_a->is_integer() || !type_b->is_integer()) || - !integer_conversion_supported) { - _mesa_glsl_error(&loc, state, "type mismatch with switch " - "init-expression and case label (%s != %s)", - type_a->name, type_b->name); - } else { - /* Conversion of the case label. */ - if (type_a->base_type == GLSL_TYPE_INT) { - if (!apply_implicit_conversion(glsl_type::uint_type, - test_cond->operands[0], state)) - _mesa_glsl_error(&loc, state, "implicit type conversion error"); - } else { - /* Conversion of the init-expression value. */ - if (!apply_implicit_conversion(glsl_type::uint_type, - test_cond->operands[1], state)) - _mesa_glsl_error(&loc, state, "implicit type conversion error"); - } - } - } - - ir_assignment *set_fallthru_on_test = - new(ctx) ir_assignment(deref_fallthru_var, true_val, test_cond); - - instructions->push_tail(set_fallthru_on_test); - } else { /* default case */ - if (state->switch_state.previous_default) { - YYLTYPE loc = this->get_location(); - _mesa_glsl_error(& loc, state, - "multiple default labels in one switch"); - - loc = state->switch_state.previous_default->get_location(); - _mesa_glsl_error(& loc, state, "this is the first default label"); - } - state->switch_state.previous_default = this; - - /* Set fallthru condition on 'run_default' bool. */ - ir_dereference_variable *deref_run_default = - new(ctx) ir_dereference_variable(state->switch_state.run_default); - ir_rvalue *const cond_true = new(ctx) ir_constant(true); - ir_expression *test_cond = new(ctx) ir_expression(ir_binop_all_equal, - cond_true, - deref_run_default); - - /* Set falltrhu state. */ - ir_assignment *set_fallthru = - new(ctx) ir_assignment(deref_fallthru_var, true_val, test_cond); - - instructions->push_tail(set_fallthru); - } - - /* Case statements do not have r-values. */ - return NULL; -} - -void -ast_iteration_statement::condition_to_hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - - if (condition != NULL) { - ir_rvalue *const cond = - condition->hir(instructions, state); - - if ((cond == NULL) - || !cond->type->is_boolean() || !cond->type->is_scalar()) { - YYLTYPE loc = condition->get_location(); - - _mesa_glsl_error(& loc, state, - "loop condition must be scalar boolean"); - } else { - /* As the first code in the loop body, generate a block that looks - * like 'if (!condition) break;' as the loop termination condition. - */ - ir_rvalue *const not_cond = - new(ctx) ir_expression(ir_unop_logic_not, cond); - - ir_if *const if_stmt = new(ctx) ir_if(not_cond); - - ir_jump *const break_stmt = - new(ctx) ir_loop_jump(ir_loop_jump::jump_break); - - if_stmt->then_instructions.push_tail(break_stmt); - instructions->push_tail(if_stmt); - } - } -} - - -ir_rvalue * -ast_iteration_statement::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - - /* For-loops and while-loops start a new scope, but do-while loops do not. - */ - if (mode != ast_do_while) - state->symbols->push_scope(); - - if (init_statement != NULL) - init_statement->hir(instructions, state); - - ir_loop *const stmt = new(ctx) ir_loop(); - instructions->push_tail(stmt); - - /* Track the current loop nesting. */ - ast_iteration_statement *nesting_ast = state->loop_nesting_ast; - - state->loop_nesting_ast = this; - - /* Likewise, indicate that following code is closest to a loop, - * NOT closest to a switch. - */ - bool saved_is_switch_innermost = state->switch_state.is_switch_innermost; - state->switch_state.is_switch_innermost = false; - - if (mode != ast_do_while) - condition_to_hir(&stmt->body_instructions, state); - - if (body != NULL) - body->hir(& stmt->body_instructions, state); - - if (rest_expression != NULL) - rest_expression->hir(& stmt->body_instructions, state); - - if (mode == ast_do_while) - condition_to_hir(&stmt->body_instructions, state); - - if (mode != ast_do_while) - state->symbols->pop_scope(); - - /* Restore previous nesting before returning. */ - state->loop_nesting_ast = nesting_ast; - state->switch_state.is_switch_innermost = saved_is_switch_innermost; - - /* Loops do not have r-values. - */ - return NULL; -} - - -/** - * Determine if the given type is valid for establishing a default precision - * qualifier. - * - * From GLSL ES 3.00 section 4.5.4 ("Default Precision Qualifiers"): - * - * "The precision statement - * - * precision precision-qualifier type; - * - * can be used to establish a default precision qualifier. The type field - * can be either int or float or any of the sampler types, and the - * precision-qualifier can be lowp, mediump, or highp." - * - * GLSL ES 1.00 has similar language. GLSL 1.30 doesn't allow precision - * qualifiers on sampler types, but this seems like an oversight (since the - * intention of including these in GLSL 1.30 is to allow compatibility with ES - * shaders). So we allow int, float, and all sampler types regardless of GLSL - * version. - */ -static bool -is_valid_default_precision_type(const struct glsl_type *const type) -{ - if (type == NULL) - return false; - - switch (type->base_type) { - case GLSL_TYPE_INT: - case GLSL_TYPE_FLOAT: - /* "int" and "float" are valid, but vectors and matrices are not. */ - return type->vector_elements == 1 && type->matrix_columns == 1; - case GLSL_TYPE_SAMPLER: - return true; - default: - return false; - } -} - - -ir_rvalue * -ast_type_specifier::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - if (this->default_precision == ast_precision_none && this->structure == NULL) - return NULL; - - YYLTYPE loc = this->get_location(); - - /* If this is a precision statement, check that the type to which it is - * applied is either float or int. - * - * From section 4.5.3 of the GLSL 1.30 spec: - * "The precision statement - * precision precision-qualifier type; - * can be used to establish a default precision qualifier. The type - * field can be either int or float [...]. Any other types or - * qualifiers will result in an error. - */ - if (this->default_precision != ast_precision_none) { - if (!state->check_precision_qualifiers_allowed(&loc)) - return NULL; - - if (this->structure != NULL) { - _mesa_glsl_error(&loc, state, - "precision qualifiers do not apply to structures"); - return NULL; - } - - if (this->array_specifier != NULL) { - _mesa_glsl_error(&loc, state, - "default precision statements do not apply to " - "arrays"); - return NULL; - } - - const struct glsl_type *const type = - state->symbols->get_type(this->type_name); - if (!is_valid_default_precision_type(type)) { - _mesa_glsl_error(&loc, state, - "default precision statements apply only to " - "float, int, and sampler types"); - return NULL; - } - - { - void *ctx = state; - - const char* precision_type = NULL; - switch (this->default_precision) { - case glsl_precision_high: precision_type = "highp"; break; - case glsl_precision_medium: precision_type = "mediump"; break; - case glsl_precision_low: precision_type = "lowp"; break; - case glsl_precision_undefined: precision_type = ""; break; - } - char* precision_statement = ralloc_asprintf(ctx, "precision %s %s", precision_type, this->type_name); - - ir_precision_statement *const stmt = new(ctx) ir_precision_statement(precision_statement); - - instructions->push_head(stmt); - } - - if (type->base_type == GLSL_TYPE_FLOAT - && state->es_shader - && state->stage == MESA_SHADER_FRAGMENT) { - /* Section 4.5.3 (Default Precision Qualifiers) of the GLSL ES 1.00 - * spec says: - * - * "The fragment language has no default precision qualifier for - * floating point types." - * - * As a result, we have to track whether or not default precision has - * been specified for float in GLSL ES fragment shaders. - * - * Earlier in that same section, the spec says: - * - * "Non-precision qualified declarations will use the precision - * qualifier specified in the most recent precision statement - * that is still in scope. The precision statement has the same - * scoping rules as variable declarations. If it is declared - * inside a compound statement, its effect stops at the end of - * the innermost statement it was declared in. Precision - * statements in nested scopes override precision statements in - * outer scopes. Multiple precision statements for the same basic - * type can appear inside the same scope, with later statements - * overriding earlier statements within that scope." - * - * Default precision specifications follow the same scope rules as - * variables. So, we can track the state of the default float - * precision in the symbol table, and the rules will just work. This - * is a slight abuse of the symbol table, but it has the semantics - * that we want. - */ - ir_variable *const junk = - new(state) ir_variable(type, "#default precision", - ir_var_auto, (glsl_precision)this->default_precision); - - state->symbols->add_variable(junk); - state->had_float_precision = true; - } - - /* FINISHME: Translate precision statements into IR. */ - return NULL; - } - - /* _mesa_ast_set_aggregate_type() sets the field so that - * process_record_constructor() can do type-checking on C-style initializer - * expressions of structs, but ast_struct_specifier should only be translated - * to HIR if it is declaring the type of a structure. - * - * The ->is_declaration field is false for initializers of variables - * declared separately from the struct's type definition. - * - * struct S { ... }; (is_declaration = true) - * struct T { ... } t = { ... }; (is_declaration = true) - * S s = { ... }; (is_declaration = false) - */ - if (this->structure != NULL && this->structure->is_declaration) - return this->structure->hir(instructions, state); - - return NULL; -} - - -/** - * Process a structure or interface block tree into an array of structure fields - * - * After parsing, where there are some syntax differnces, structures and - * interface blocks are almost identical. They are similar enough that the - * AST for each can be processed the same way into a set of - * \c glsl_struct_field to describe the members. - * - * If we're processing an interface block, var_mode should be the type of the - * interface block (ir_var_shader_in, ir_var_shader_out, or ir_var_uniform). - * If we're processing a structure, var_mode should be ir_var_auto. - * - * \return - * The number of fields processed. A pointer to the array structure fields is - * stored in \c *fields_ret. - */ -unsigned -ast_process_structure_or_interface_block(exec_list *instructions, - struct _mesa_glsl_parse_state *state, - exec_list *declarations, - YYLTYPE &loc, - glsl_struct_field **fields_ret, - bool is_interface, - enum glsl_matrix_layout matrix_layout, - bool allow_reserved_names, - ir_variable_mode var_mode) -{ - unsigned decl_count = 0; - - /* Make an initial pass over the list of fields to determine how - * many there are. Each element in this list is an ast_declarator_list. - * This means that we actually need to count the number of elements in the - * 'declarations' list in each of the elements. - */ - foreach_list_typed (ast_declarator_list, decl_list, link, declarations) { - decl_count += decl_list->declarations.length(); - } - - /* Allocate storage for the fields and process the field - * declarations. As the declarations are processed, try to also convert - * the types to HIR. This ensures that structure definitions embedded in - * other structure definitions or in interface blocks are processed. - */ - glsl_struct_field *const fields = ralloc_array(state, glsl_struct_field, - decl_count); - - unsigned i = 0; - foreach_list_typed (ast_declarator_list, decl_list, link, declarations) { - const char *type_name; - - decl_list->type->specifier->hir(instructions, state); - - /* Section 10.9 of the GLSL ES 1.00 specification states that - * embedded structure definitions have been removed from the language. - */ - if (state->es_shader && decl_list->type->specifier->structure != NULL) { - _mesa_glsl_error(&loc, state, "embedded structure definitions are " - "not allowed in GLSL ES 1.00"); - } - - const glsl_type *decl_type = - decl_list->type->glsl_type(& type_name, state); - - foreach_list_typed (ast_declaration, decl, link, - &decl_list->declarations) { - if (!allow_reserved_names) - validate_identifier(decl->identifier, loc, state); - - /* From section 4.3.9 of the GLSL 4.40 spec: - * - * "[In interface blocks] opaque types are not allowed." - * - * It should be impossible for decl_type to be NULL here. Cases that - * might naturally lead to decl_type being NULL, especially for the - * is_interface case, will have resulted in compilation having - * already halted due to a syntax error. - */ - const struct glsl_type *field_type = - decl_type != NULL ? decl_type : glsl_type::error_type; - - if (is_interface && field_type->contains_opaque()) { - YYLTYPE loc = decl_list->get_location(); - _mesa_glsl_error(&loc, state, - "uniform in non-default uniform block contains " - "opaque variable"); - } - - if (field_type->contains_atomic()) { - /* FINISHME: Add a spec quotation here once updated spec - * FINISHME: language is available. See Khronos bug #10903 - * FINISHME: on whether atomic counters are allowed in - * FINISHME: structures. - */ - YYLTYPE loc = decl_list->get_location(); - _mesa_glsl_error(&loc, state, "atomic counter in structure or " - "uniform block"); - } - - if (field_type->contains_image()) { - /* FINISHME: Same problem as with atomic counters. - * FINISHME: Request clarification from Khronos and add - * FINISHME: spec quotation here. - */ - YYLTYPE loc = decl_list->get_location(); - _mesa_glsl_error(&loc, state, - "image in structure or uniform block"); - } - - const struct ast_type_qualifier *const qual = - & decl_list->type->qualifier; - if (qual->flags.q.std140 || - qual->flags.q.packed || - qual->flags.q.shared) { - _mesa_glsl_error(&loc, state, - "uniform block layout qualifiers std140, packed, and " - "shared can only be applied to uniform blocks, not " - "members"); - } - - field_type = process_array_type(&loc, decl_type, - decl->array_specifier, state); - fields[i].type = field_type; - fields[i].name = decl->identifier; - fields[i].precision = (glsl_precision)decl_list->type->qualifier.precision; - fields[i].location = -1; - fields[i].interpolation = - interpret_interpolation_qualifier(qual, var_mode, state, &loc); - fields[i].centroid = qual->flags.q.centroid ? 1 : 0; - fields[i].sample = qual->flags.q.sample ? 1 : 0; - - /* Only save explicitly defined streams in block's field */ - fields[i].stream = qual->flags.q.explicit_stream ? qual->stream : -1; - - if (qual->flags.q.row_major || qual->flags.q.column_major) { - if (!qual->flags.q.uniform) { - _mesa_glsl_error(&loc, state, - "row_major and column_major can only be " - "applied to uniform interface blocks"); - } else - validate_matrix_layout_for_type(state, &loc, field_type, NULL); - } - - if (qual->flags.q.uniform && qual->has_interpolation()) { - _mesa_glsl_error(&loc, state, - "interpolation qualifiers cannot be used " - "with uniform interface blocks"); - } - - if ((qual->flags.q.uniform || !is_interface) && - qual->has_auxiliary_storage()) { - _mesa_glsl_error(&loc, state, - "auxiliary storage qualifiers cannot be used " - "in uniform blocks or structures."); - } - - /* Propogate row- / column-major information down the fields of the - * structure or interface block. Structures need this data because - * the structure may contain a structure that contains ... a matrix - * that need the proper layout. - */ - if (field_type->without_array()->is_matrix() - || field_type->without_array()->is_record()) { - /* If no layout is specified for the field, inherit the layout - * from the block. - */ - fields[i].matrix_layout = matrix_layout; - - if (qual->flags.q.row_major) - fields[i].matrix_layout = GLSL_MATRIX_LAYOUT_ROW_MAJOR; - else if (qual->flags.q.column_major) - fields[i].matrix_layout = GLSL_MATRIX_LAYOUT_COLUMN_MAJOR; - - /* If we're processing an interface block, the matrix layout must - * be decided by this point. - */ - assert(!is_interface - || fields[i].matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR - || fields[i].matrix_layout == GLSL_MATRIX_LAYOUT_COLUMN_MAJOR); - } - - i++; - } - } - - assert(i == decl_count); - - *fields_ret = fields; - return decl_count; -} - - -ir_rvalue * -ast_struct_specifier::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - YYLTYPE loc = this->get_location(); - - /* Section 4.1.8 (Structures) of the GLSL 1.10 spec says: - * - * "Anonymous structures are not supported; so embedded structures must - * have a declarator. A name given to an embedded struct is scoped at - * the same level as the struct it is embedded in." - * - * The same section of the GLSL 1.20 spec says: - * - * "Anonymous structures are not supported. Embedded structures are not - * supported. - * - * struct S { float f; }; - * struct T { - * S; // Error: anonymous structures disallowed - * struct { ... }; // Error: embedded structures disallowed - * S s; // Okay: nested structures with name are allowed - * };" - * - * The GLSL ES 1.00 and 3.00 specs have similar langauge and examples. So, - * we allow embedded structures in 1.10 only. - */ - if (state->language_version != 110 && state->struct_specifier_depth != 0) - _mesa_glsl_error(&loc, state, - "embedded structure declarations are not allowed"); - - state->struct_specifier_depth++; - - glsl_struct_field *fields; - unsigned decl_count = - ast_process_structure_or_interface_block(instructions, - state, - &this->declarations, - loc, - &fields, - false, - GLSL_MATRIX_LAYOUT_INHERITED, - false /* allow_reserved_names */, - ir_var_auto); - - validate_identifier(this->name, loc, state); - - const glsl_type *t = - glsl_type::get_record_instance(fields, decl_count, this->name); - - if (!state->symbols->add_type(name, t)) { - _mesa_glsl_error(& loc, state, "struct `%s' previously defined", name); - } else { - const glsl_type **s = reralloc(state, state->user_structures, - const glsl_type *, - state->num_user_structures + 1); - if (s != NULL) { - s[state->num_user_structures] = t; - state->user_structures = s; - state->num_user_structures++; - ir_typedecl_statement* stmt = new(state) ir_typedecl_statement(t); - - /* Push the struct declarations to the top. - * However, do not insert declarations before default precision - * statements or other declarations - */ - ir_instruction* before_node = (ir_instruction*)instructions->head; - while (before_node && - (before_node->ir_type == ir_type_precision || - before_node->ir_type == ir_type_typedecl)) - before_node = (ir_instruction*)before_node->next; - if (before_node) - before_node->insert_before(stmt); - else - instructions->push_head(stmt); - } - } - - state->struct_specifier_depth--; - - /* Structure type definitions do not have r-values. - */ - return NULL; -} - - -/** - * Visitor class which detects whether a given interface block has been used. - */ -class interface_block_usage_visitor : public ir_hierarchical_visitor -{ -public: - interface_block_usage_visitor(ir_variable_mode mode, const glsl_type *block) - : mode(mode), block(block), found(false) - { - } - - virtual ir_visitor_status visit(ir_dereference_variable *ir) - { - if (ir->var->data.mode == mode && ir->var->get_interface_type() == block) { - found = true; - return visit_stop; - } - return visit_continue; - } - - bool usage_found() const - { - return this->found; - } - -private: - ir_variable_mode mode; - const glsl_type *block; - bool found; -}; - - -ir_rvalue * -ast_interface_block::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - YYLTYPE loc = this->get_location(); - - /* The ast_interface_block has a list of ast_declarator_lists. We - * need to turn those into ir_variables with an association - * with this uniform block. - */ - enum glsl_interface_packing packing; - if (this->layout.flags.q.shared) { - packing = GLSL_INTERFACE_PACKING_SHARED; - } else if (this->layout.flags.q.packed) { - packing = GLSL_INTERFACE_PACKING_PACKED; - } else { - /* The default layout is std140. - */ - packing = GLSL_INTERFACE_PACKING_STD140; - } - - ir_variable_mode var_mode; - const char *iface_type_name; - if (this->layout.flags.q.in) { - var_mode = ir_var_shader_in; - iface_type_name = "in"; - } else if (this->layout.flags.q.out) { - var_mode = ir_var_shader_out; - iface_type_name = "out"; - } else if (this->layout.flags.q.uniform) { - var_mode = ir_var_uniform; - iface_type_name = "uniform"; - } else { - var_mode = ir_var_auto; - iface_type_name = "UNKNOWN"; - assert(!"interface block layout qualifier not found!"); - } - - enum glsl_matrix_layout matrix_layout = GLSL_MATRIX_LAYOUT_INHERITED; - if (this->layout.flags.q.row_major) - matrix_layout = GLSL_MATRIX_LAYOUT_ROW_MAJOR; - else if (this->layout.flags.q.column_major) - matrix_layout = GLSL_MATRIX_LAYOUT_COLUMN_MAJOR; - - bool redeclaring_per_vertex = strcmp(this->block_name, "gl_PerVertex") == 0; - exec_list declared_variables; - glsl_struct_field *fields; - - /* Treat an interface block as one level of nesting, so that embedded struct - * specifiers will be disallowed. - */ - state->struct_specifier_depth++; - - unsigned int num_variables = - ast_process_structure_or_interface_block(&declared_variables, - state, - &this->declarations, - loc, - &fields, - true, - matrix_layout, - redeclaring_per_vertex, - var_mode); - - state->struct_specifier_depth--; - - if (!redeclaring_per_vertex) - validate_identifier(this->block_name, loc, state); - - const glsl_type *earlier_per_vertex = NULL; - if (redeclaring_per_vertex) { - /* Find the previous declaration of gl_PerVertex. If we're redeclaring - * the named interface block gl_in, we can find it by looking at the - * previous declaration of gl_in. Otherwise we can find it by looking - * at the previous decalartion of any of the built-in outputs, - * e.g. gl_Position. - * - * Also check that the instance name and array-ness of the redeclaration - * are correct. - */ - switch (var_mode) { - case ir_var_shader_in: - if (ir_variable *earlier_gl_in = - state->symbols->get_variable("gl_in")) { - earlier_per_vertex = earlier_gl_in->get_interface_type(); - } else { - _mesa_glsl_error(&loc, state, - "redeclaration of gl_PerVertex input not allowed " - "in the %s shader", - _mesa_shader_stage_to_string(state->stage)); - } - if (this->instance_name == NULL || - strcmp(this->instance_name, "gl_in") != 0 || this->array_specifier == NULL) { - _mesa_glsl_error(&loc, state, - "gl_PerVertex input must be redeclared as " - "gl_in[]"); - } - break; - case ir_var_shader_out: - if (ir_variable *earlier_gl_Position = - state->symbols->get_variable("gl_Position")) { - earlier_per_vertex = earlier_gl_Position->get_interface_type(); - } else { - _mesa_glsl_error(&loc, state, - "redeclaration of gl_PerVertex output not " - "allowed in the %s shader", - _mesa_shader_stage_to_string(state->stage)); - } - if (this->instance_name != NULL) { - _mesa_glsl_error(&loc, state, - "gl_PerVertex output may not be redeclared with " - "an instance name"); - } - break; - default: - _mesa_glsl_error(&loc, state, - "gl_PerVertex must be declared as an input or an " - "output"); - break; - } - - if (earlier_per_vertex == NULL) { - /* An error has already been reported. Bail out to avoid null - * dereferences later in this function. - */ - return NULL; - } - - /* Copy locations from the old gl_PerVertex interface block. */ - for (unsigned i = 0; i < num_variables; i++) { - int j = earlier_per_vertex->field_index(fields[i].name); - if (j == -1) { - _mesa_glsl_error(&loc, state, - "redeclaration of gl_PerVertex must be a subset " - "of the built-in members of gl_PerVertex"); - } else { - fields[i].location = - earlier_per_vertex->fields.structure[j].location; - fields[i].interpolation = - earlier_per_vertex->fields.structure[j].interpolation; - fields[i].centroid = - earlier_per_vertex->fields.structure[j].centroid; - fields[i].sample = - earlier_per_vertex->fields.structure[j].sample; - } - } - - /* From section 7.1 ("Built-in Language Variables") of the GLSL 4.10 - * spec: - * - * If a built-in interface block is redeclared, it must appear in - * the shader before any use of any member included in the built-in - * declaration, or a compilation error will result. - * - * This appears to be a clarification to the behaviour established for - * gl_PerVertex by GLSL 1.50, therefore we implement this behaviour - * regardless of GLSL version. - */ - interface_block_usage_visitor v(var_mode, earlier_per_vertex); - v.run(instructions); - if (v.usage_found()) { - _mesa_glsl_error(&loc, state, - "redeclaration of a built-in interface block must " - "appear before any use of any member of the " - "interface block"); - } - } - - const glsl_type *block_type = - glsl_type::get_interface_instance(fields, - num_variables, - packing, - this->block_name); - - if (!state->symbols->add_interface(block_type->name, block_type, var_mode)) { - YYLTYPE loc = this->get_location(); - _mesa_glsl_error(&loc, state, "interface block `%s' with type `%s' " - "already taken in the current scope", - this->block_name, iface_type_name); - } - - /* Since interface blocks cannot contain statements, it should be - * impossible for the block to generate any instructions. - */ - assert(declared_variables.is_empty()); - - /* From section 4.3.4 (Inputs) of the GLSL 1.50 spec: - * - * Geometry shader input variables get the per-vertex values written - * out by vertex shader output variables of the same names. Since a - * geometry shader operates on a set of vertices, each input varying - * variable (or input block, see interface blocks below) needs to be - * declared as an array. - */ - if (state->stage == MESA_SHADER_GEOMETRY && this->array_specifier == NULL && - var_mode == ir_var_shader_in) { - _mesa_glsl_error(&loc, state, "geometry shader inputs must be arrays"); - } - - /* Page 39 (page 45 of the PDF) of section 4.3.7 in the GLSL ES 3.00 spec - * says: - * - * "If an instance name (instance-name) is used, then it puts all the - * members inside a scope within its own name space, accessed with the - * field selector ( . ) operator (analogously to structures)." - */ - if (this->instance_name) { - if (redeclaring_per_vertex) { - /* When a built-in in an unnamed interface block is redeclared, - * get_variable_being_redeclared() calls - * check_builtin_array_max_size() to make sure that built-in array - * variables aren't redeclared to illegal sizes. But we're looking - * at a redeclaration of a named built-in interface block. So we - * have to manually call check_builtin_array_max_size() for all parts - * of the interface that are arrays. - */ - for (unsigned i = 0; i < num_variables; i++) { - if (fields[i].type->is_array()) { - const unsigned size = fields[i].type->array_size(); - check_builtin_array_max_size(fields[i].name, size, loc, state); - } - } - } else { - validate_identifier(this->instance_name, loc, state); - } - - ir_variable *var; - - if (this->array_specifier != NULL) { - /* Section 4.3.7 (Interface Blocks) of the GLSL 1.50 spec says: - * - * For uniform blocks declared an array, each individual array - * element corresponds to a separate buffer object backing one - * instance of the block. As the array size indicates the number - * of buffer objects needed, uniform block array declarations - * must specify an array size. - * - * And a few paragraphs later: - * - * Geometry shader input blocks must be declared as arrays and - * follow the array declaration and linking rules for all - * geometry shader inputs. All other input and output block - * arrays must specify an array size. - * - * The upshot of this is that the only circumstance where an - * interface array size *doesn't* need to be specified is on a - * geometry shader input. - */ - if (this->array_specifier->is_unsized_array && - (state->stage != MESA_SHADER_GEOMETRY || !this->layout.flags.q.in)) { - _mesa_glsl_error(&loc, state, - "only geometry shader inputs may be unsized " - "instance block arrays"); - - } - - const glsl_type *block_array_type = - process_array_type(&loc, block_type, this->array_specifier, state); - - var = new(state) ir_variable(block_array_type, - this->instance_name, - var_mode, glsl_precision_undefined); - } else { - var = new(state) ir_variable(block_type, - this->instance_name, - var_mode, glsl_precision_undefined); - } - - var->data.matrix_layout = matrix_layout == GLSL_MATRIX_LAYOUT_INHERITED - ? GLSL_MATRIX_LAYOUT_COLUMN_MAJOR : matrix_layout; - - if (state->stage == MESA_SHADER_GEOMETRY && var_mode == ir_var_shader_in) - handle_geometry_shader_input_decl(state, loc, var); - - if (ir_variable *earlier = - state->symbols->get_variable(this->instance_name)) { - if (!redeclaring_per_vertex) { - _mesa_glsl_error(&loc, state, "`%s' redeclared", - this->instance_name); - } - earlier->data.how_declared = ir_var_declared_normally; - earlier->type = var->type; - earlier->reinit_interface_type(block_type); - delete var; - } else { - /* Propagate the "binding" keyword into this UBO's fields; - * the UBO declaration itself doesn't get an ir_variable unless it - * has an instance name. This is ugly. - */ - var->data.explicit_binding = this->layout.flags.q.explicit_binding; - var->data.binding = this->layout.binding; - - state->symbols->add_variable(var); - instructions->push_tail(var); - } - } else { - /* In order to have an array size, the block must also be declared with - * an instance name. - */ - assert(this->array_specifier == NULL); - - for (unsigned i = 0; i < num_variables; i++) { - ir_variable *var = - new(state) ir_variable(fields[i].type, - ralloc_strdup(state, fields[i].name), - var_mode, fields[i].precision); - var->data.interpolation = fields[i].interpolation; - var->data.centroid = fields[i].centroid; - var->data.sample = fields[i].sample; - var->init_interface_type(block_type); - - if (fields[i].matrix_layout == GLSL_MATRIX_LAYOUT_INHERITED) { - var->data.matrix_layout = matrix_layout == GLSL_MATRIX_LAYOUT_INHERITED - ? GLSL_MATRIX_LAYOUT_COLUMN_MAJOR : matrix_layout; - } else { - var->data.matrix_layout = fields[i].matrix_layout; - } - - if (fields[i].stream != -1 && - ((unsigned)fields[i].stream) != this->layout.stream) { - _mesa_glsl_error(&loc, state, - "stream layout qualifier on " - "interface block member `%s' does not match " - "the interface block (%d vs %d)", - var->name, fields[i].stream, this->layout.stream); - } - - var->data.stream = this->layout.stream; - - if (redeclaring_per_vertex) { - ir_variable *earlier = - get_variable_being_redeclared(var, loc, state, - true /* allow_all_redeclarations */); - if (!is_gl_identifier(var->name) || earlier == NULL) { - _mesa_glsl_error(&loc, state, - "redeclaration of gl_PerVertex can only " - "include built-in variables"); - } else if (earlier->data.how_declared == ir_var_declared_normally) { - _mesa_glsl_error(&loc, state, - "`%s' has already been redeclared", var->name); - } else { - earlier->data.how_declared = ir_var_declared_in_block; - earlier->reinit_interface_type(block_type); - } - continue; - } - - if (state->symbols->get_variable(var->name) != NULL) - _mesa_glsl_error(&loc, state, "`%s' redeclared", var->name); - - /* Propagate the "binding" keyword into this UBO's fields; - * the UBO declaration itself doesn't get an ir_variable unless it - * has an instance name. This is ugly. - */ - var->data.explicit_binding = this->layout.flags.q.explicit_binding; - var->data.binding = this->layout.binding; - - state->symbols->add_variable(var); - instructions->push_tail(var); - } - - if (redeclaring_per_vertex && block_type != earlier_per_vertex) { - /* From section 7.1 ("Built-in Language Variables") of the GLSL 4.10 spec: - * - * It is also a compilation error ... to redeclare a built-in - * block and then use a member from that built-in block that was - * not included in the redeclaration. - * - * This appears to be a clarification to the behaviour established - * for gl_PerVertex by GLSL 1.50, therefore we implement this - * behaviour regardless of GLSL version. - * - * To prevent the shader from using a member that was not included in - * the redeclaration, we disable any ir_variables that are still - * associated with the old declaration of gl_PerVertex (since we've - * already updated all of the variables contained in the new - * gl_PerVertex to point to it). - * - * As a side effect this will prevent - * validate_intrastage_interface_blocks() from getting confused and - * thinking there are conflicting definitions of gl_PerVertex in the - * shader. - */ - foreach_in_list_safe(ir_instruction, node, instructions) { - ir_variable *const var = node->as_variable(); - if (var != NULL && - var->get_interface_type() == earlier_per_vertex && - var->data.mode == var_mode) { - if (var->data.how_declared == ir_var_declared_normally) { - _mesa_glsl_error(&loc, state, - "redeclaration of gl_PerVertex cannot " - "follow a redeclaration of `%s'", - var->name); - } - state->symbols->disable_variable(var->name); - var->remove(); - } - } - } - } - - return NULL; -} - - -ir_rvalue * -ast_gs_input_layout::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - YYLTYPE loc = this->get_location(); - - /* If any geometry input layout declaration preceded this one, make sure it - * was consistent with this one. - */ - if (state->gs_input_prim_type_specified && - state->in_qualifier->prim_type != this->prim_type) { - _mesa_glsl_error(&loc, state, - "geometry shader input layout does not match" - " previous declaration"); - return NULL; - } - - /* If any shader inputs occurred before this declaration and specified an - * array size, make sure the size they specified is consistent with the - * primitive type. - */ - unsigned num_vertices = vertices_per_prim(this->prim_type); - if (state->gs_input_size != 0 && state->gs_input_size != num_vertices) { - _mesa_glsl_error(&loc, state, - "this geometry shader input layout implies %u vertices" - " per primitive, but a previous input is declared" - " with size %u", num_vertices, state->gs_input_size); - return NULL; - } - - state->gs_input_prim_type_specified = true; - - /* If any shader inputs occurred before this declaration and did not - * specify an array size, their size is determined now. - */ - foreach_in_list(ir_instruction, node, instructions) { - ir_variable *var = node->as_variable(); - if (var == NULL || var->data.mode != ir_var_shader_in) - continue; - - /* Note: gl_PrimitiveIDIn has mode ir_var_shader_in, but it's not an - * array; skip it. - */ - - if (var->type->is_unsized_array()) { - if (var->data.max_array_access >= num_vertices) { - _mesa_glsl_error(&loc, state, - "this geometry shader input layout implies %u" - " vertices, but an access to element %u of input" - " `%s' already exists", num_vertices, - var->data.max_array_access, var->name); - } else { - var->type = glsl_type::get_array_instance(var->type->fields.array, - num_vertices); - } - } - } - - return NULL; -} - - -ir_rvalue * -ast_cs_input_layout::hir(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - YYLTYPE loc = this->get_location(); - - /* If any compute input layout declaration preceded this one, make sure it - * was consistent with this one. - */ - if (state->cs_input_local_size_specified) { - for (int i = 0; i < 3; i++) { - if (state->cs_input_local_size[i] != this->local_size[i]) { - _mesa_glsl_error(&loc, state, - "compute shader input layout does not match" - " previous declaration"); - return NULL; - } - } - } - - /* From the ARB_compute_shader specification: - * - * If the local size of the shader in any dimension is greater - * than the maximum size supported by the implementation for that - * dimension, a compile-time error results. - * - * It is not clear from the spec how the error should be reported if - * the total size of the work group exceeds - * MAX_COMPUTE_WORK_GROUP_INVOCATIONS, but it seems reasonable to - * report it at compile time as well. - */ - GLuint64 total_invocations = 1; - for (int i = 0; i < 3; i++) { - if (this->local_size[i] > state->ctx->Const.MaxComputeWorkGroupSize[i]) { - _mesa_glsl_error(&loc, state, - "local_size_%c exceeds MAX_COMPUTE_WORK_GROUP_SIZE" - " (%d)", 'x' + i, - state->ctx->Const.MaxComputeWorkGroupSize[i]); - break; - } - total_invocations *= this->local_size[i]; - if (total_invocations > - state->ctx->Const.MaxComputeWorkGroupInvocations) { - _mesa_glsl_error(&loc, state, - "product of local_sizes exceeds " - "MAX_COMPUTE_WORK_GROUP_INVOCATIONS (%d)", - state->ctx->Const.MaxComputeWorkGroupInvocations); - break; - } - } - - state->cs_input_local_size_specified = true; - for (int i = 0; i < 3; i++) - state->cs_input_local_size[i] = this->local_size[i]; - - /* We may now declare the built-in constant gl_WorkGroupSize (see - * builtin_variable_generator::generate_constants() for why we didn't - * declare it earlier). - */ - ir_variable *var = new(state->symbols) - ir_variable(glsl_type::ivec3_type, "gl_WorkGroupSize", ir_var_auto, glsl_precision_undefined); - var->data.how_declared = ir_var_declared_implicitly; - var->data.read_only = true; - instructions->push_tail(var); - state->symbols->add_variable(var); - ir_constant_data data; - memset(&data, 0, sizeof(data)); - for (int i = 0; i < 3; i++) - data.i[i] = this->local_size[i]; - var->constant_value = new(var) ir_constant(glsl_type::ivec3_type, &data); - var->constant_initializer = - new(var) ir_constant(glsl_type::ivec3_type, &data); - var->data.has_initializer = true; - - return NULL; -} - - -static void -detect_conflicting_assignments(struct _mesa_glsl_parse_state *state, - exec_list *instructions) -{ - bool gl_FragColor_assigned = false; - bool gl_FragData_assigned = false; - bool user_defined_fs_output_assigned = false; - ir_variable *user_defined_fs_output = NULL; - - /* It would be nice to have proper location information. */ - YYLTYPE loc; - memset(&loc, 0, sizeof(loc)); - - foreach_in_list(ir_instruction, node, instructions) { - ir_variable *var = node->as_variable(); - - if (!var || !var->data.assigned) - continue; - - if (strcmp(var->name, "gl_FragColor") == 0) - gl_FragColor_assigned = true; - else if (strcmp(var->name, "gl_FragData") == 0) - gl_FragData_assigned = true; - else if (!is_gl_identifier(var->name)) { - if (state->stage == MESA_SHADER_FRAGMENT && - var->data.mode == ir_var_shader_out) { - user_defined_fs_output_assigned = true; - user_defined_fs_output = var; - } - } - } - - /* From the GLSL 1.30 spec: - * - * "If a shader statically assigns a value to gl_FragColor, it - * may not assign a value to any element of gl_FragData. If a - * shader statically writes a value to any element of - * gl_FragData, it may not assign a value to - * gl_FragColor. That is, a shader may assign values to either - * gl_FragColor or gl_FragData, but not both. Multiple shaders - * linked together must also consistently write just one of - * these variables. Similarly, if user declared output - * variables are in use (statically assigned to), then the - * built-in variables gl_FragColor and gl_FragData may not be - * assigned to. These incorrect usages all generate compile - * time errors." - */ - if (gl_FragColor_assigned && gl_FragData_assigned) { - _mesa_glsl_error(&loc, state, "fragment shader writes to both " - "`gl_FragColor' and `gl_FragData'"); - } else if (gl_FragColor_assigned && user_defined_fs_output_assigned) { - _mesa_glsl_error(&loc, state, "fragment shader writes to both " - "`gl_FragColor' and `%s'", - user_defined_fs_output->name); - } else if (gl_FragData_assigned && user_defined_fs_output_assigned) { - _mesa_glsl_error(&loc, state, "fragment shader writes to both " - "`gl_FragData' and `%s'", - user_defined_fs_output->name); - } -} - - -static void -remove_per_vertex_blocks(exec_list *instructions, - _mesa_glsl_parse_state *state, ir_variable_mode mode) -{ - /* Find the gl_PerVertex interface block of the appropriate (in/out) mode, - * if it exists in this shader type. - */ - const glsl_type *per_vertex = NULL; - switch (mode) { - case ir_var_shader_in: - if (ir_variable *gl_in = state->symbols->get_variable("gl_in")) - per_vertex = gl_in->get_interface_type(); - break; - case ir_var_shader_out: - if (ir_variable *gl_Position = - state->symbols->get_variable("gl_Position")) { - per_vertex = gl_Position->get_interface_type(); - } - break; - default: - assert(!"Unexpected mode"); - break; - } - - /* If we didn't find a built-in gl_PerVertex interface block, then we don't - * need to do anything. - */ - if (per_vertex == NULL) - return; - - /* If the interface block is used by the shader, then we don't need to do - * anything. - */ - interface_block_usage_visitor v(mode, per_vertex); - v.run(instructions); - if (v.usage_found()) - return; - - /* Remove any ir_variable declarations that refer to the interface block - * we're removing. - */ - foreach_in_list_safe(ir_instruction, node, instructions) { - ir_variable *const var = node->as_variable(); - if (var != NULL && var->get_interface_type() == per_vertex && - var->data.mode == mode) { - state->symbols->disable_variable(var->name); - var->remove(); - } - } -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ast_type.cpp b/3rdparty/glsl-optimizer/src/glsl/ast_type.cpp deleted file mode 100644 index b596cd59e..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ast_type.cpp +++ /dev/null @@ -1,363 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "ast.h" - -void -ast_type_specifier::print(void) const -{ - if (structure) { - structure->print(); - } else { - printf("%s ", type_name); - } - - if (array_specifier) { - array_specifier->print(); - } -} - -bool -ast_fully_specified_type::has_qualifiers() const -{ - return this->qualifier.flags.i != 0; -} - -bool ast_type_qualifier::has_interpolation() const -{ - return this->flags.q.smooth - || this->flags.q.flat - || this->flags.q.noperspective; -} - -bool -ast_type_qualifier::has_layout() const -{ - return this->flags.q.origin_upper_left - || this->flags.q.pixel_center_integer - || this->flags.q.depth_any - || this->flags.q.depth_greater - || this->flags.q.depth_less - || this->flags.q.depth_unchanged - || this->flags.q.std140 - || this->flags.q.shared - || this->flags.q.column_major - || this->flags.q.row_major - || this->flags.q.packed - || this->flags.q.explicit_location - || this->flags.q.explicit_index - || this->flags.q.explicit_binding - || this->flags.q.explicit_offset; -} - -bool -ast_type_qualifier::has_storage() const -{ - return this->flags.q.constant - || this->flags.q.attribute - || this->flags.q.varying - || this->flags.q.in - || this->flags.q.out - || this->flags.q.uniform; -} - -bool -ast_type_qualifier::has_auxiliary_storage() const -{ - return this->flags.q.centroid - || this->flags.q.sample; -} - -const char* -ast_type_qualifier::interpolation_string() const -{ - if (this->flags.q.smooth) - return "smooth"; - else if (this->flags.q.flat) - return "flat"; - else if (this->flags.q.noperspective) - return "noperspective"; - else - return NULL; -} - -bool -ast_type_qualifier::merge_qualifier(YYLTYPE *loc, - _mesa_glsl_parse_state *state, - ast_type_qualifier q) -{ - ast_type_qualifier ubo_mat_mask; - ubo_mat_mask.flags.i = 0; - ubo_mat_mask.flags.q.row_major = 1; - ubo_mat_mask.flags.q.column_major = 1; - - ast_type_qualifier ubo_layout_mask; - ubo_layout_mask.flags.i = 0; - ubo_layout_mask.flags.q.std140 = 1; - ubo_layout_mask.flags.q.packed = 1; - ubo_layout_mask.flags.q.shared = 1; - - ast_type_qualifier ubo_binding_mask; - ubo_binding_mask.flags.i = 0; - ubo_binding_mask.flags.q.explicit_binding = 1; - ubo_binding_mask.flags.q.explicit_offset = 1; - - ast_type_qualifier stream_layout_mask; - stream_layout_mask.flags.i = 0; - stream_layout_mask.flags.q.stream = 1; - - /* Uniform block layout qualifiers get to overwrite each - * other (rightmost having priority), while all other - * qualifiers currently don't allow duplicates. - */ - ast_type_qualifier allowed_duplicates_mask; - allowed_duplicates_mask.flags.i = - ubo_mat_mask.flags.i | - ubo_layout_mask.flags.i | - ubo_binding_mask.flags.i; - - /* Geometry shaders can have several layout qualifiers - * assigning different stream values. - */ - if (state->stage == MESA_SHADER_GEOMETRY) - allowed_duplicates_mask.flags.i |= - stream_layout_mask.flags.i; - - if ((this->flags.i & q.flags.i & ~allowed_duplicates_mask.flags.i) != 0) { - _mesa_glsl_error(loc, state, - "duplicate layout qualifiers used"); - return false; - } - - if (q.flags.q.prim_type) { - if (this->flags.q.prim_type && this->prim_type != q.prim_type) { - _mesa_glsl_error(loc, state, - "conflicting primitive type qualifiers used"); - return false; - } - this->prim_type = q.prim_type; - } - - if (q.flags.q.max_vertices) { - if (this->flags.q.max_vertices && this->max_vertices != q.max_vertices) { - _mesa_glsl_error(loc, state, - "geometry shader set conflicting max_vertices " - "(%d and %d)", this->max_vertices, q.max_vertices); - return false; - } - this->max_vertices = q.max_vertices; - } - - if (q.flags.q.invocations) { - if (this->flags.q.invocations && this->invocations != q.invocations) { - _mesa_glsl_error(loc, state, - "geometry shader set conflicting invocations " - "(%d and %d)", this->invocations, q.invocations); - return false; - } - this->invocations = q.invocations; - } - - if (state->stage == MESA_SHADER_GEOMETRY && - state->has_explicit_attrib_stream()) { - if (q.flags.q.stream && q.stream >= state->ctx->Const.MaxVertexStreams) { - _mesa_glsl_error(loc, state, - "`stream' value is larger than MAX_VERTEX_STREAMS - 1 " - "(%d > %d)", - q.stream, state->ctx->Const.MaxVertexStreams - 1); - } - if (this->flags.q.explicit_stream && - this->stream >= state->ctx->Const.MaxVertexStreams) { - _mesa_glsl_error(loc, state, - "`stream' value is larger than MAX_VERTEX_STREAMS - 1 " - "(%d > %d)", - this->stream, state->ctx->Const.MaxVertexStreams - 1); - } - - if (!this->flags.q.explicit_stream) { - if (q.flags.q.stream) { - this->flags.q.stream = 1; - this->stream = q.stream; - } else if (!this->flags.q.stream && this->flags.q.out) { - /* Assign default global stream value */ - this->flags.q.stream = 1; - this->stream = state->out_qualifier->stream; - } - } else { - if (q.flags.q.explicit_stream) { - _mesa_glsl_error(loc, state, - "duplicate layout `stream' qualifier"); - } - } - } - - if ((q.flags.i & ubo_mat_mask.flags.i) != 0) - this->flags.i &= ~ubo_mat_mask.flags.i; - if ((q.flags.i & ubo_layout_mask.flags.i) != 0) - this->flags.i &= ~ubo_layout_mask.flags.i; - - for (int i = 0; i < 3; i++) { - if (q.flags.q.local_size & (1 << i)) { - if ((this->flags.q.local_size & (1 << i)) && - this->local_size[i] != q.local_size[i]) { - _mesa_glsl_error(loc, state, - "compute shader set conflicting values for " - "local_size_%c (%d and %d)", 'x' + i, - this->local_size[i], q.local_size[i]); - return false; - } - this->local_size[i] = q.local_size[i]; - } - } - - this->flags.i |= q.flags.i; - - if (q.flags.q.explicit_location) - this->location = q.location; - - if (q.flags.q.explicit_index) - this->index = q.index; - - if (q.flags.q.explicit_binding) - this->binding = q.binding; - - if (q.flags.q.explicit_offset) - this->offset = q.offset; - - if (q.precision != ast_precision_none) - this->precision = q.precision; - - if (q.flags.q.explicit_image_format) { - this->image_format = q.image_format; - this->image_base_type = q.image_base_type; - } - - return true; -} - -bool -ast_type_qualifier::merge_in_qualifier(YYLTYPE *loc, - _mesa_glsl_parse_state *state, - ast_type_qualifier q, - ast_node* &node) -{ - void *mem_ctx = state; - bool create_gs_ast = false; - bool create_cs_ast = false; - ast_type_qualifier valid_in_mask; - valid_in_mask.flags.i = 0; - - switch (state->stage) { - case MESA_SHADER_GEOMETRY: - if (q.flags.q.prim_type) { - /* Make sure this is a valid input primitive type. */ - switch (q.prim_type) { - case GL_POINTS: - case GL_LINES: - case GL_LINES_ADJACENCY: - case GL_TRIANGLES: - case GL_TRIANGLES_ADJACENCY: - break; - default: - _mesa_glsl_error(loc, state, - "invalid geometry shader input primitive type"); - break; - } - } - - create_gs_ast |= - q.flags.q.prim_type && - !state->in_qualifier->flags.q.prim_type; - - valid_in_mask.flags.q.prim_type = 1; - valid_in_mask.flags.q.invocations = 1; - break; - case MESA_SHADER_FRAGMENT: - if (q.flags.q.early_fragment_tests) { - state->early_fragment_tests = true; - } else { - _mesa_glsl_error(loc, state, "invalid input layout qualifier"); - } - break; - case MESA_SHADER_COMPUTE: - create_cs_ast |= - q.flags.q.local_size != 0 && - state->in_qualifier->flags.q.local_size == 0; - - valid_in_mask.flags.q.local_size = 7; - break; - default: - _mesa_glsl_error(loc, state, - "input layout qualifiers only valid in " - "geometry, fragment and compute shaders"); - break; - } - - /* Generate an error when invalid input layout qualifiers are used. */ - if ((q.flags.i & ~valid_in_mask.flags.i) != 0) { - _mesa_glsl_error(loc, state, - "invalid input layout qualifiers used"); - return false; - } - - /* Input layout qualifiers can be specified multiple - * times in separate declarations, as long as they match. - */ - if (this->flags.q.prim_type) { - if (q.flags.q.prim_type && - this->prim_type != q.prim_type) { - _mesa_glsl_error(loc, state, - "conflicting input primitive types specified"); - } - } else if (q.flags.q.prim_type) { - state->in_qualifier->flags.q.prim_type = 1; - state->in_qualifier->prim_type = q.prim_type; - } - - if (this->flags.q.invocations && - q.flags.q.invocations && - this->invocations != q.invocations) { - _mesa_glsl_error(loc, state, - "conflicting invocations counts specified"); - return false; - } else if (q.flags.q.invocations) { - this->flags.q.invocations = 1; - this->invocations = q.invocations; - } - - if (create_gs_ast) { - node = new(mem_ctx) ast_gs_input_layout(*loc, q.prim_type); - } else if (create_cs_ast) { - /* Infer a local_size of 1 for every unspecified dimension */ - unsigned local_size[3]; - for (int i = 0; i < 3; i++) { - if (q.flags.q.local_size & (1 << i)) - local_size[i] = q.local_size[i]; - else - local_size[i] = 1; - } - node = new(mem_ctx) ast_cs_input_layout(*loc, local_size); - } - - return true; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/builtin_functions.cpp b/3rdparty/glsl-optimizer/src/glsl/builtin_functions.cpp deleted file mode 100644 index 371eadfd5..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/builtin_functions.cpp +++ /dev/null @@ -1,4680 +0,0 @@ -/* - * Copyright © 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file builtin_functions.cpp - * - * Support for GLSL built-in functions. - * - * This file is split into several main components: - * - * 1. Availability predicates - * - * A series of small functions that check whether the current shader - * supports the version/extensions required to expose a built-in. - * - * 2. Core builtin_builder class functionality - * - * 3. Lists of built-in functions - * - * The builtin_builder::create_builtins() function contains lists of all - * built-in function signatures, where they're available, what types they - * take, and so on. - * - * 4. Implementations of built-in function signatures - * - * A series of functions which create ir_function_signatures and emit IR - * via ir_builder to implement them. - * - * 5. External API - * - * A few functions the rest of the compiler can use to interact with the - * built-in function module. For example, searching for a built-in by - * name and parameters. - */ - -#include -#include -#include "main/core.h" /* for struct gl_shader */ -#include "standalone_scaffolding.h" -#include "ir_builder.h" -#include "glsl_parser_extras.h" -#include "program/prog_instruction.h" -#include - -#define M_PIf ((float) M_PI) -#define M_PI_2f ((float) M_PI_2) -#define M_PI_4f ((float) M_PI_4) - -using namespace ir_builder; - -/** - * Availability predicates: - * @{ - */ -static bool -always_available(const _mesa_glsl_parse_state *) -{ - return true; -} - -static bool -compatibility_vs_only(const _mesa_glsl_parse_state *state) -{ - return state->stage == MESA_SHADER_VERTEX && - state->language_version <= 130 && - !state->es_shader; -} - -static bool -fs_only(const _mesa_glsl_parse_state *state) -{ - return state->stage == MESA_SHADER_FRAGMENT; -} - -static bool -gs_only(const _mesa_glsl_parse_state *state) -{ - return state->stage == MESA_SHADER_GEOMETRY; -} - -static bool -v110(const _mesa_glsl_parse_state *state) -{ - return !state->es_shader; -} - -static bool -v110_fs_only(const _mesa_glsl_parse_state *state) -{ - return !state->es_shader && state->stage == MESA_SHADER_FRAGMENT; -} - -static bool -v120(const _mesa_glsl_parse_state *state) -{ - return state->is_version(120, 300); -} - -static bool -v130(const _mesa_glsl_parse_state *state) -{ - return state->is_version(130, 300); -} - -static bool -v130_fs_only(const _mesa_glsl_parse_state *state) -{ - return state->is_version(130, 300) && - state->stage == MESA_SHADER_FRAGMENT; -} - -static bool -v140(const _mesa_glsl_parse_state *state) -{ - return state->is_version(140, 0); -} - -static bool -texture_rectangle(const _mesa_glsl_parse_state *state) -{ - return state->ARB_texture_rectangle_enable; -} - -static bool -texture_external(const _mesa_glsl_parse_state *state) -{ - return state->OES_EGL_image_external_enable; -} - -/** True if texturing functions with explicit LOD are allowed. */ -static bool -lod_exists_in_stage(const _mesa_glsl_parse_state *state) -{ - /* Texturing functions with "Lod" in their name exist: - * - In the vertex shader stage (for all languages) - * - In any stage for GLSL 1.30+ or GLSL ES 3.00 - * - In any stage for desktop GLSL with ARB_shader_texture_lod enabled. - * - * Since ARB_shader_texture_lod can only be enabled on desktop GLSL, we - * don't need to explicitly check state->es_shader. - */ - return state->stage == MESA_SHADER_VERTEX || - state->is_version(130, 300) || - state->EXT_texture_array_enable || /* BK - don't complain about texture array in fragment shaders. */ - state->OES_texture_3D_enable || /* BK - shut up */ - state->EXT_shader_texture_lod_enable || /* BK - pretend it's ok too */ - state->ARB_shader_texture_lod_enable; -} - -static bool -es_lod_exists_in_stage(const _mesa_glsl_parse_state *state) -{ - /* Texturing functions with "LodEXT" in their name exist: - * In the fragment shader, for ES1 shader, when EXT_shader_texture_lod - * is enabled. - */ - return -// BK - EXT_shader_texture_lod is available in vertex and fragment shaders. -// state->stage == MESA_SHADER_FRAGMENT && - state->es_shader && - state->is_version(110, 100) && - state->EXT_shader_texture_lod_enable; -} - -static bool -v110_lod(const _mesa_glsl_parse_state *state) -{ - return !state->es_shader && lod_exists_in_stage(state); -} - -static bool -shader_texture_lod(const _mesa_glsl_parse_state *state) -{ - return state->ARB_shader_texture_lod_enable; -} - -static bool -es_shader_texture_lod(const _mesa_glsl_parse_state *state) -{ - return state->EXT_shader_texture_lod_enable; -} - -static bool -es_shadow_samplers(const _mesa_glsl_parse_state *state) -{ - return state->EXT_shadow_samplers_enable; -} - -static bool -shader_texture_lod_and_rect(const _mesa_glsl_parse_state *state) -{ - return state->ARB_shader_texture_lod_enable && - state->ARB_texture_rectangle_enable; -} - -static bool -shader_bit_encoding(const _mesa_glsl_parse_state *state) -{ - return state->is_version(330, 300) || - state->ARB_shader_bit_encoding_enable || - state->ARB_gpu_shader5_enable; -} - -static bool -shader_integer_mix(const _mesa_glsl_parse_state *state) -{ - return v130(state) && state->EXT_shader_integer_mix_enable; -} - -static bool -shader_packing_or_es3(const _mesa_glsl_parse_state *state) -{ - return state->ARB_shading_language_packing_enable || - state->is_version(400, 300); -} - -static bool -shader_packing_or_es3_or_gpu_shader5(const _mesa_glsl_parse_state *state) -{ - return state->ARB_shading_language_packing_enable || - state->ARB_gpu_shader5_enable || - state->is_version(400, 300); -} - -static bool -gpu_shader5(const _mesa_glsl_parse_state *state) -{ - return state->is_version(400, 0) || state->ARB_gpu_shader5_enable; -} - -static bool -shader_packing_or_gpu_shader5(const _mesa_glsl_parse_state *state) -{ - return state->ARB_shading_language_packing_enable || - gpu_shader5(state); -} - -static bool -fs_gpu_shader5(const _mesa_glsl_parse_state *state) -{ - return state->stage == MESA_SHADER_FRAGMENT && - (state->is_version(400, 0) || state->ARB_gpu_shader5_enable); -} - - -static bool -texture_array_lod(const _mesa_glsl_parse_state *state) -{ - return lod_exists_in_stage(state) && - state->EXT_texture_array_enable; -} - -static bool -fs_texture_array(const _mesa_glsl_parse_state *state) -{ - return state->stage == MESA_SHADER_FRAGMENT && - state->EXT_texture_array_enable; -} - -static bool -texture_array(const _mesa_glsl_parse_state *state) -{ - return state->EXT_texture_array_enable; -} - -static bool -texture_multisample(const _mesa_glsl_parse_state *state) -{ - return state->is_version(150, 0) || - state->ARB_texture_multisample_enable; -} - -static bool -fs_texture_cube_map_array(const _mesa_glsl_parse_state *state) -{ - return state->stage == MESA_SHADER_FRAGMENT && - (state->is_version(400, 0) || - state->ARB_texture_cube_map_array_enable); -} - -static bool -texture_cube_map_array(const _mesa_glsl_parse_state *state) -{ - return state->is_version(400, 0) || - state->ARB_texture_cube_map_array_enable; -} - -static bool -texture_query_levels(const _mesa_glsl_parse_state *state) -{ - return state->is_version(430, 0) || - state->ARB_texture_query_levels_enable; -} - -static bool -texture_query_lod(const _mesa_glsl_parse_state *state) -{ - return state->stage == MESA_SHADER_FRAGMENT && - state->ARB_texture_query_lod_enable; -} - -static bool -texture_gather(const _mesa_glsl_parse_state *state) -{ - return state->is_version(400, 0) || - state->ARB_texture_gather_enable || - state->ARB_gpu_shader5_enable; -} - -/* Only ARB_texture_gather but not GLSL 4.0 or ARB_gpu_shader5. - * used for relaxation of const offset requirements. - */ -static bool -texture_gather_only(const _mesa_glsl_parse_state *state) -{ - return !state->is_version(400, 0) && - !state->ARB_gpu_shader5_enable && - state->ARB_texture_gather_enable; -} - -/* Desktop GL or OES_standard_derivatives + fragment shader only */ -static bool -fs_oes_derivatives(const _mesa_glsl_parse_state *state) -{ - return state->stage == MESA_SHADER_FRAGMENT && - (state->is_version(110, 300) || - state->OES_standard_derivatives_enable); -} - -static bool -fs_derivative_control(const _mesa_glsl_parse_state *state) -{ - return state->stage == MESA_SHADER_FRAGMENT && - (state->is_version(450, 0) || - state->ARB_derivative_control_enable); -} - -static bool -tex1d_lod(const _mesa_glsl_parse_state *state) -{ - return !state->es_shader && lod_exists_in_stage(state); -} - -/** True if sampler3D exists */ -static bool -tex3d(const _mesa_glsl_parse_state *state) -{ - /* sampler3D exists in all desktop GLSL versions, GLSL ES 1.00 with the - * OES_texture_3D extension, and in GLSL ES 3.00. - */ - return !state->es_shader || - state->OES_texture_3D_enable || - state->language_version >= 300; -} - -static bool -fs_tex3d(const _mesa_glsl_parse_state *state) -{ - return state->stage == MESA_SHADER_FRAGMENT && - (!state->es_shader || state->OES_texture_3D_enable); -} - -static bool -tex3d_lod(const _mesa_glsl_parse_state *state) -{ - return tex3d(state) && lod_exists_in_stage(state); -} - -static bool -shader_atomic_counters(const _mesa_glsl_parse_state *state) -{ - return state->ARB_shader_atomic_counters_enable; -} - -static bool -shader_trinary_minmax(const _mesa_glsl_parse_state *state) -{ - return state->AMD_shader_trinary_minmax_enable; -} - -static bool -shader_image_load_store(const _mesa_glsl_parse_state *state) -{ - return (state->is_version(420, 0) || - state->ARB_shader_image_load_store_enable); -} - -static bool -gs_streams(const _mesa_glsl_parse_state *state) -{ - return gpu_shader5(state) && gs_only(state); -} - -/** @} */ - -/******************************************************************************/ - -namespace { - -/** - * builtin_builder: A singleton object representing the core of the built-in - * function module. - * - * It generates IR for every built-in function signature, and organizes them - * into functions. - */ -class builtin_builder { -public: - builtin_builder(); - ~builtin_builder(); - - void initialize(); - void release(); - ir_function_signature *find(_mesa_glsl_parse_state *state, - const char *name, exec_list *actual_parameters); - - /** - * A shader to hold all the built-in signatures; created by this module. - * - * This includes signatures for every built-in, regardless of version or - * enabled extensions. The availability predicate associated with each - * signature allows matching_signature() to filter out the irrelevant ones. - */ - gl_shader *shader; - -private: - void *mem_ctx; - - /** Global variables used by built-in functions. */ - ir_variable *gl_ModelViewProjectionMatrix; - ir_variable *gl_Vertex; - - void create_shader(); - void create_intrinsics(); - void create_builtins(); - - /** - * IR builder helpers: - * - * These convenience functions assist in emitting IR, but don't necessarily - * fit in ir_builder itself. Many of them rely on having a mem_ctx class - * member available. - */ - ir_variable *in_var(const glsl_type *type, const char *name); - ir_variable *out_var(const glsl_type *type, const char *name); - ir_constant *imm(float f, unsigned vector_elements=1); - ir_constant *imm(int i, unsigned vector_elements=1); - ir_constant *imm(unsigned u, unsigned vector_elements=1); - ir_constant *imm(const glsl_type *type, const ir_constant_data &); - ir_dereference_variable *var_ref(ir_variable *var); - ir_dereference_array *array_ref(ir_variable *var, int i); - ir_swizzle *matrix_elt(ir_variable *var, int col, int row); - - ir_expression *asin_expr(ir_variable *x); - void do_atan(ir_factory &body, const glsl_type *type, ir_variable *res, operand y_over_x); - - /** - * Call function \param f with parameters specified as the linked - * list \param params of \c ir_variable objects. \param ret should - * point to the ir_variable that will hold the function return - * value, or be \c NULL if the function has void return type. - */ - ir_call *call(ir_function *f, ir_variable *ret, exec_list params); - - /** Create a new function and add the given signatures. */ - void add_function(const char *name, ...); - - enum image_function_flags { - IMAGE_FUNCTION_EMIT_STUB = (1 << 0), - IMAGE_FUNCTION_RETURNS_VOID = (1 << 1), - IMAGE_FUNCTION_HAS_VECTOR_DATA_TYPE = (1 << 2), - IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE = (1 << 3), - IMAGE_FUNCTION_READ_ONLY = (1 << 4), - IMAGE_FUNCTION_WRITE_ONLY = (1 << 5) - }; - - /** - * Create a new image built-in function for all known image types. - * \p flags is a bitfield of \c image_function_flags flags. - */ - void add_image_function(const char *name, - const char *intrinsic_name, - unsigned num_arguments, - unsigned flags); - - /** - * Create new functions for all known image built-ins and types. - * If \p glsl is \c true, use the GLSL built-in names and emit code - * to call into the actual compiler intrinsic. If \p glsl is - * false, emit a function prototype with no body for each image - * intrinsic name. - */ - void add_image_functions(bool glsl); - - ir_function_signature *new_sig(const glsl_type *return_type, - builtin_available_predicate avail, - int num_params, ...); - - /** - * Function signature generators: - * @{ - */ - ir_function_signature *unop(builtin_available_predicate avail, - ir_expression_operation opcode, - const glsl_type *return_type, - const glsl_type *param_type); - ir_function_signature *binop(ir_expression_operation opcode, - builtin_available_predicate avail, - const glsl_type *return_type, - const glsl_type *param0_type, - const glsl_type *param1_type); - -#define B0(X) ir_function_signature *_##X(); -#define B1(X) ir_function_signature *_##X(const glsl_type *); -#define B2(X) ir_function_signature *_##X(const glsl_type *, const glsl_type *); -#define B3(X) ir_function_signature *_##X(const glsl_type *, const glsl_type *, const glsl_type *); -#define BA1(X) ir_function_signature *_##X(builtin_available_predicate, const glsl_type *); -#define BA2(X) ir_function_signature *_##X(builtin_available_predicate, const glsl_type *, const glsl_type *); - B1(radians) - B1(degrees) - B1(sin) - B1(cos) - B1(tan) - B1(asin) - B1(acos) - B1(atan2) - B1(atan) - B1(sinh) - B1(cosh) - B1(tanh) - B1(asinh) - B1(acosh) - B1(atanh) - B1(pow) - B1(exp) - B1(log) - B1(exp2) - B1(log2) - B1(sqrt) - B1(inversesqrt) - B1(abs) - B1(sign) - B1(floor) - B1(trunc) - B1(round) - B1(roundEven) - B1(ceil) - B1(fract) - B2(mod) - B1(modf) - BA2(min) - BA2(max) - BA2(clamp) - B2(mix_lrp) - ir_function_signature *_mix_sel(builtin_available_predicate avail, - const glsl_type *val_type, - const glsl_type *blend_type); - B2(step) - B2(smoothstep) - B1(isnan) - B1(isinf) - B1(floatBitsToInt) - B1(floatBitsToUint) - B1(intBitsToFloat) - B1(uintBitsToFloat) - ir_function_signature *_packUnorm2x16(builtin_available_predicate avail); - ir_function_signature *_packSnorm2x16(builtin_available_predicate avail); - ir_function_signature *_packUnorm4x8(builtin_available_predicate avail); - ir_function_signature *_packSnorm4x8(builtin_available_predicate avail); - ir_function_signature *_unpackUnorm2x16(builtin_available_predicate avail); - ir_function_signature *_unpackSnorm2x16(builtin_available_predicate avail); - ir_function_signature *_unpackUnorm4x8(builtin_available_predicate avail); - ir_function_signature *_unpackSnorm4x8(builtin_available_predicate avail); - ir_function_signature *_packHalf2x16(builtin_available_predicate avail); - ir_function_signature *_unpackHalf2x16(builtin_available_predicate avail); - B1(length) - B1(distance); - B1(dot); - B1(cross); - B1(normalize); - B0(ftransform); - B1(faceforward); - B1(reflect); - B1(refract); - B1(matrixCompMult); - B1(outerProduct); - B0(determinant_mat2); - B0(determinant_mat3); - B0(determinant_mat4); - B0(inverse_mat2); - B0(inverse_mat3); - B0(inverse_mat4); - B1(transpose); - BA1(lessThan); - BA1(lessThanEqual); - BA1(greaterThan); - BA1(greaterThanEqual); - BA1(equal); - BA1(notEqual); - B1(any); - B1(all); - B1(not); - B2(textureSize); - ir_function_signature *_textureSize(builtin_available_predicate avail, - const glsl_type *return_type, - const glsl_type *sampler_type); - -/** Flags to _texture() */ -#define TEX_PROJECT 1 -#define TEX_OFFSET 2 -#define TEX_COMPONENT 4 -#define TEX_OFFSET_NONCONST 8 -#define TEX_OFFSET_ARRAY 16 - - ir_function_signature *_texture(ir_texture_opcode opcode, - builtin_available_predicate avail, - const glsl_type *return_type, - const glsl_type *sampler_type, - const glsl_type *coord_type, - int flags = 0); - B0(textureCubeArrayShadow); - ir_function_signature *_texelFetch(builtin_available_predicate avail, - const glsl_type *return_type, - const glsl_type *sampler_type, - const glsl_type *coord_type, - const glsl_type *offset_type = NULL); - - B0(EmitVertex) - B0(EndPrimitive) - ir_function_signature *_EmitStreamVertex(builtin_available_predicate avail, - const glsl_type *stream_type); - ir_function_signature *_EndStreamPrimitive(builtin_available_predicate avail, - const glsl_type *stream_type); - - B2(textureQueryLod); - B1(textureQueryLevels); - B1(dFdx); - B1(dFdy); - B1(fwidth); - B1(dFdxCoarse); - B1(dFdyCoarse); - B1(fwidthCoarse); - B1(dFdxFine); - B1(dFdyFine); - B1(fwidthFine); - B1(noise1); - B1(noise2); - B1(noise3); - B1(noise4); - - B1(bitfieldExtract) - B1(bitfieldInsert) - B1(bitfieldReverse) - B1(bitCount) - B1(findLSB) - B1(findMSB) - B1(fma) - B2(ldexp) - B2(frexp) - B1(uaddCarry) - B1(usubBorrow) - B1(mulExtended) - B1(interpolateAtCentroid) - B1(interpolateAtOffset) - B1(interpolateAtSample) - - ir_function_signature *_atomic_intrinsic(builtin_available_predicate avail); - ir_function_signature *_atomic_op(const char *intrinsic, - builtin_available_predicate avail); - - B1(min3) - B1(max3) - B1(mid3) - - ir_function_signature *_image_prototype(const glsl_type *image_type, - const char *intrinsic_name, - unsigned num_arguments, - unsigned flags); - ir_function_signature *_image(const glsl_type *image_type, - const char *intrinsic_name, - unsigned num_arguments, - unsigned flags); - - ir_function_signature *_memory_barrier_intrinsic( - builtin_available_predicate avail); - ir_function_signature *_memory_barrier( - builtin_available_predicate avail); - -#undef B0 -#undef B1 -#undef B2 -#undef B3 -#undef BA1 -#undef BA2 - /** @} */ -}; - -} /* anonymous namespace */ - -/** - * Core builtin_builder functionality: - * @{ - */ -builtin_builder::builtin_builder() - : shader(NULL), - gl_ModelViewProjectionMatrix(NULL), - gl_Vertex(NULL) -{ - mem_ctx = NULL; -} - -builtin_builder::~builtin_builder() -{ - ralloc_free(mem_ctx); -} - -ir_function_signature * -builtin_builder::find(_mesa_glsl_parse_state *state, - const char *name, exec_list *actual_parameters) -{ - /* The shader currently being compiled requested a built-in function; - * it needs to link against builtin_builder::shader in order to get them. - * - * Even if we don't find a matching signature, we still need to do this so - * that the "no matching signature" error will list potential candidates - * from the available built-ins. - */ - state->uses_builtin_functions = true; - - ir_function *f = shader->symbols->get_function(name); - if (f == NULL) - return NULL; - - ir_function_signature *sig = - f->matching_signature(state, actual_parameters, true); - if (sig == NULL) - return NULL; - - return sig; -} - -void -builtin_builder::initialize() -{ - /* If already initialized, don't do it again. */ - if (mem_ctx != NULL) - return; - - mem_ctx = ralloc_context(NULL); - create_shader(); - create_intrinsics(); - create_builtins(); -} - -void -builtin_builder::release() -{ - ralloc_free(mem_ctx); - mem_ctx = NULL; - - ralloc_free(shader); - shader = NULL; -} - -void -builtin_builder::create_shader() -{ - /* The target doesn't actually matter. There's no target for generic - * GLSL utility code that could be linked against any stage, so just - * arbitrarily pick GL_VERTEX_SHADER. - */ - shader = _mesa_new_shader(NULL, 0, GL_VERTEX_SHADER); - shader->symbols = new(mem_ctx) glsl_symbol_table; - - gl_ModelViewProjectionMatrix = - new(mem_ctx) ir_variable(glsl_type::mat4_type, - "gl_ModelViewProjectionMatrix", - ir_var_uniform, glsl_precision_high); - - shader->symbols->add_variable(gl_ModelViewProjectionMatrix); - - gl_Vertex = in_var(glsl_type::vec4_type, "gl_Vertex"); - shader->symbols->add_variable(gl_Vertex); -} - -/** @} */ - -/** - * Create ir_function and ir_function_signature objects for each - * intrinsic. - */ -void -builtin_builder::create_intrinsics() -{ - add_function("__intrinsic_atomic_read", - _atomic_intrinsic(shader_atomic_counters), - NULL); - add_function("__intrinsic_atomic_increment", - _atomic_intrinsic(shader_atomic_counters), - NULL); - add_function("__intrinsic_atomic_predecrement", - _atomic_intrinsic(shader_atomic_counters), - NULL); - - add_image_functions(false); - - add_function("__intrinsic_memory_barrier", - _memory_barrier_intrinsic(shader_image_load_store), - NULL); -} - -/** - * Create ir_function and ir_function_signature objects for each built-in. - * - * Contains a list of every available built-in. - */ -void -builtin_builder::create_builtins() -{ -#define F(NAME) \ - add_function(#NAME, \ - _##NAME(glsl_type::float_type), \ - _##NAME(glsl_type::vec2_type), \ - _##NAME(glsl_type::vec3_type), \ - _##NAME(glsl_type::vec4_type), \ - NULL); - -#define FI(NAME) \ - add_function(#NAME, \ - _##NAME(glsl_type::float_type), \ - _##NAME(glsl_type::vec2_type), \ - _##NAME(glsl_type::vec3_type), \ - _##NAME(glsl_type::vec4_type), \ - _##NAME(glsl_type::int_type), \ - _##NAME(glsl_type::ivec2_type), \ - _##NAME(glsl_type::ivec3_type), \ - _##NAME(glsl_type::ivec4_type), \ - NULL); - -#define FIU(NAME) \ - add_function(#NAME, \ - _##NAME(always_available, glsl_type::float_type), \ - _##NAME(always_available, glsl_type::vec2_type), \ - _##NAME(always_available, glsl_type::vec3_type), \ - _##NAME(always_available, glsl_type::vec4_type), \ - \ - _##NAME(always_available, glsl_type::int_type), \ - _##NAME(always_available, glsl_type::ivec2_type), \ - _##NAME(always_available, glsl_type::ivec3_type), \ - _##NAME(always_available, glsl_type::ivec4_type), \ - \ - _##NAME(v130, glsl_type::uint_type), \ - _##NAME(v130, glsl_type::uvec2_type), \ - _##NAME(v130, glsl_type::uvec3_type), \ - _##NAME(v130, glsl_type::uvec4_type), \ - NULL); - -#define IU(NAME) \ - add_function(#NAME, \ - _##NAME(glsl_type::int_type), \ - _##NAME(glsl_type::ivec2_type), \ - _##NAME(glsl_type::ivec3_type), \ - _##NAME(glsl_type::ivec4_type), \ - \ - _##NAME(glsl_type::uint_type), \ - _##NAME(glsl_type::uvec2_type), \ - _##NAME(glsl_type::uvec3_type), \ - _##NAME(glsl_type::uvec4_type), \ - NULL); - -#define FIUB(NAME) \ - add_function(#NAME, \ - _##NAME(always_available, glsl_type::float_type), \ - _##NAME(always_available, glsl_type::vec2_type), \ - _##NAME(always_available, glsl_type::vec3_type), \ - _##NAME(always_available, glsl_type::vec4_type), \ - \ - _##NAME(always_available, glsl_type::int_type), \ - _##NAME(always_available, glsl_type::ivec2_type), \ - _##NAME(always_available, glsl_type::ivec3_type), \ - _##NAME(always_available, glsl_type::ivec4_type), \ - \ - _##NAME(v130, glsl_type::uint_type), \ - _##NAME(v130, glsl_type::uvec2_type), \ - _##NAME(v130, glsl_type::uvec3_type), \ - _##NAME(v130, glsl_type::uvec4_type), \ - \ - _##NAME(always_available, glsl_type::bool_type), \ - _##NAME(always_available, glsl_type::bvec2_type), \ - _##NAME(always_available, glsl_type::bvec3_type), \ - _##NAME(always_available, glsl_type::bvec4_type), \ - NULL); - -#define FIU2_MIXED(NAME) \ - add_function(#NAME, \ - _##NAME(always_available, glsl_type::float_type, glsl_type::float_type), \ - _##NAME(always_available, glsl_type::vec2_type, glsl_type::float_type), \ - _##NAME(always_available, glsl_type::vec3_type, glsl_type::float_type), \ - _##NAME(always_available, glsl_type::vec4_type, glsl_type::float_type), \ - \ - _##NAME(always_available, glsl_type::vec2_type, glsl_type::vec2_type), \ - _##NAME(always_available, glsl_type::vec3_type, glsl_type::vec3_type), \ - _##NAME(always_available, glsl_type::vec4_type, glsl_type::vec4_type), \ - \ - _##NAME(always_available, glsl_type::int_type, glsl_type::int_type), \ - _##NAME(always_available, glsl_type::ivec2_type, glsl_type::int_type), \ - _##NAME(always_available, glsl_type::ivec3_type, glsl_type::int_type), \ - _##NAME(always_available, glsl_type::ivec4_type, glsl_type::int_type), \ - \ - _##NAME(always_available, glsl_type::ivec2_type, glsl_type::ivec2_type), \ - _##NAME(always_available, glsl_type::ivec3_type, glsl_type::ivec3_type), \ - _##NAME(always_available, glsl_type::ivec4_type, glsl_type::ivec4_type), \ - \ - _##NAME(v130, glsl_type::uint_type, glsl_type::uint_type), \ - _##NAME(v130, glsl_type::uvec2_type, glsl_type::uint_type), \ - _##NAME(v130, glsl_type::uvec3_type, glsl_type::uint_type), \ - _##NAME(v130, glsl_type::uvec4_type, glsl_type::uint_type), \ - \ - _##NAME(v130, glsl_type::uvec2_type, glsl_type::uvec2_type), \ - _##NAME(v130, glsl_type::uvec3_type, glsl_type::uvec3_type), \ - _##NAME(v130, glsl_type::uvec4_type, glsl_type::uvec4_type), \ - NULL); - - F(radians) - F(degrees) - F(sin) - F(cos) - F(tan) - F(asin) - F(acos) - - add_function("atan", - _atan(glsl_type::float_type), - _atan(glsl_type::vec2_type), - _atan(glsl_type::vec3_type), - _atan(glsl_type::vec4_type), - _atan2(glsl_type::float_type), - _atan2(glsl_type::vec2_type), - _atan2(glsl_type::vec3_type), - _atan2(glsl_type::vec4_type), - NULL); - - F(sinh) - F(cosh) - F(tanh) - F(asinh) - F(acosh) - F(atanh) - F(pow) - F(exp) - F(log) - F(exp2) - F(log2) - F(sqrt) - F(inversesqrt) - FI(abs) - FI(sign) - F(floor) - F(trunc) - F(round) - F(roundEven) - F(ceil) - F(fract) - - add_function("mod", - _mod(glsl_type::float_type, glsl_type::float_type), - _mod(glsl_type::vec2_type, glsl_type::float_type), - _mod(glsl_type::vec3_type, glsl_type::float_type), - _mod(glsl_type::vec4_type, glsl_type::float_type), - - _mod(glsl_type::vec2_type, glsl_type::vec2_type), - _mod(glsl_type::vec3_type, glsl_type::vec3_type), - _mod(glsl_type::vec4_type, glsl_type::vec4_type), - NULL); - - F(modf) - - FIU2_MIXED(min) - FIU2_MIXED(max) - FIU2_MIXED(clamp) - - add_function("mix", - _mix_lrp(glsl_type::float_type, glsl_type::float_type), - _mix_lrp(glsl_type::vec2_type, glsl_type::float_type), - _mix_lrp(glsl_type::vec3_type, glsl_type::float_type), - _mix_lrp(glsl_type::vec4_type, glsl_type::float_type), - - _mix_lrp(glsl_type::vec2_type, glsl_type::vec2_type), - _mix_lrp(glsl_type::vec3_type, glsl_type::vec3_type), - _mix_lrp(glsl_type::vec4_type, glsl_type::vec4_type), - - _mix_sel(v130, glsl_type::float_type, glsl_type::bool_type), - _mix_sel(v130, glsl_type::vec2_type, glsl_type::bvec2_type), - _mix_sel(v130, glsl_type::vec3_type, glsl_type::bvec3_type), - _mix_sel(v130, glsl_type::vec4_type, glsl_type::bvec4_type), - - _mix_sel(shader_integer_mix, glsl_type::int_type, glsl_type::bool_type), - _mix_sel(shader_integer_mix, glsl_type::ivec2_type, glsl_type::bvec2_type), - _mix_sel(shader_integer_mix, glsl_type::ivec3_type, glsl_type::bvec3_type), - _mix_sel(shader_integer_mix, glsl_type::ivec4_type, glsl_type::bvec4_type), - - _mix_sel(shader_integer_mix, glsl_type::uint_type, glsl_type::bool_type), - _mix_sel(shader_integer_mix, glsl_type::uvec2_type, glsl_type::bvec2_type), - _mix_sel(shader_integer_mix, glsl_type::uvec3_type, glsl_type::bvec3_type), - _mix_sel(shader_integer_mix, glsl_type::uvec4_type, glsl_type::bvec4_type), - - _mix_sel(shader_integer_mix, glsl_type::bool_type, glsl_type::bool_type), - _mix_sel(shader_integer_mix, glsl_type::bvec2_type, glsl_type::bvec2_type), - _mix_sel(shader_integer_mix, glsl_type::bvec3_type, glsl_type::bvec3_type), - _mix_sel(shader_integer_mix, glsl_type::bvec4_type, glsl_type::bvec4_type), - NULL); - - add_function("step", - _step(glsl_type::float_type, glsl_type::float_type), - _step(glsl_type::float_type, glsl_type::vec2_type), - _step(glsl_type::float_type, glsl_type::vec3_type), - _step(glsl_type::float_type, glsl_type::vec4_type), - - _step(glsl_type::vec2_type, glsl_type::vec2_type), - _step(glsl_type::vec3_type, glsl_type::vec3_type), - _step(glsl_type::vec4_type, glsl_type::vec4_type), - NULL); - - add_function("smoothstep", - _smoothstep(glsl_type::float_type, glsl_type::float_type), - _smoothstep(glsl_type::float_type, glsl_type::vec2_type), - _smoothstep(glsl_type::float_type, glsl_type::vec3_type), - _smoothstep(glsl_type::float_type, glsl_type::vec4_type), - - _smoothstep(glsl_type::vec2_type, glsl_type::vec2_type), - _smoothstep(glsl_type::vec3_type, glsl_type::vec3_type), - _smoothstep(glsl_type::vec4_type, glsl_type::vec4_type), - NULL); - - F(isnan) - F(isinf) - - F(floatBitsToInt) - F(floatBitsToUint) - add_function("intBitsToFloat", - _intBitsToFloat(glsl_type::int_type), - _intBitsToFloat(glsl_type::ivec2_type), - _intBitsToFloat(glsl_type::ivec3_type), - _intBitsToFloat(glsl_type::ivec4_type), - NULL); - add_function("uintBitsToFloat", - _uintBitsToFloat(glsl_type::uint_type), - _uintBitsToFloat(glsl_type::uvec2_type), - _uintBitsToFloat(glsl_type::uvec3_type), - _uintBitsToFloat(glsl_type::uvec4_type), - NULL); - - add_function("packUnorm2x16", _packUnorm2x16(shader_packing_or_es3_or_gpu_shader5), NULL); - add_function("packSnorm2x16", _packSnorm2x16(shader_packing_or_es3), NULL); - add_function("packUnorm4x8", _packUnorm4x8(shader_packing_or_gpu_shader5), NULL); - add_function("packSnorm4x8", _packSnorm4x8(shader_packing_or_gpu_shader5), NULL); - add_function("unpackUnorm2x16", _unpackUnorm2x16(shader_packing_or_es3_or_gpu_shader5), NULL); - add_function("unpackSnorm2x16", _unpackSnorm2x16(shader_packing_or_es3), NULL); - add_function("unpackUnorm4x8", _unpackUnorm4x8(shader_packing_or_gpu_shader5), NULL); - add_function("unpackSnorm4x8", _unpackSnorm4x8(shader_packing_or_gpu_shader5), NULL); - add_function("packHalf2x16", _packHalf2x16(shader_packing_or_es3), NULL); - add_function("unpackHalf2x16", _unpackHalf2x16(shader_packing_or_es3), NULL); - - F(length) - F(distance) - F(dot) - - add_function("cross", _cross(glsl_type::vec3_type), NULL); - - F(normalize) - add_function("ftransform", _ftransform(), NULL); - F(faceforward) - F(reflect) - F(refract) - // ... - add_function("matrixCompMult", - _matrixCompMult(glsl_type::mat2_type), - _matrixCompMult(glsl_type::mat3_type), - _matrixCompMult(glsl_type::mat4_type), - _matrixCompMult(glsl_type::mat2x3_type), - _matrixCompMult(glsl_type::mat2x4_type), - _matrixCompMult(glsl_type::mat3x2_type), - _matrixCompMult(glsl_type::mat3x4_type), - _matrixCompMult(glsl_type::mat4x2_type), - _matrixCompMult(glsl_type::mat4x3_type), - NULL); - add_function("outerProduct", - _outerProduct(glsl_type::mat2_type), - _outerProduct(glsl_type::mat3_type), - _outerProduct(glsl_type::mat4_type), - _outerProduct(glsl_type::mat2x3_type), - _outerProduct(glsl_type::mat2x4_type), - _outerProduct(glsl_type::mat3x2_type), - _outerProduct(glsl_type::mat3x4_type), - _outerProduct(glsl_type::mat4x2_type), - _outerProduct(glsl_type::mat4x3_type), - NULL); - add_function("determinant", - _determinant_mat2(), - _determinant_mat3(), - _determinant_mat4(), - NULL); - add_function("inverse", - _inverse_mat2(), - _inverse_mat3(), - _inverse_mat4(), - NULL); - add_function("transpose", - _transpose(glsl_type::mat2_type), - _transpose(glsl_type::mat3_type), - _transpose(glsl_type::mat4_type), - _transpose(glsl_type::mat2x3_type), - _transpose(glsl_type::mat2x4_type), - _transpose(glsl_type::mat3x2_type), - _transpose(glsl_type::mat3x4_type), - _transpose(glsl_type::mat4x2_type), - _transpose(glsl_type::mat4x3_type), - NULL); - FIU(lessThan) - FIU(lessThanEqual) - FIU(greaterThan) - FIU(greaterThanEqual) - FIUB(notEqual) - FIUB(equal) - - add_function("any", - _any(glsl_type::bvec2_type), - _any(glsl_type::bvec3_type), - _any(glsl_type::bvec4_type), - NULL); - - add_function("all", - _all(glsl_type::bvec2_type), - _all(glsl_type::bvec3_type), - _all(glsl_type::bvec4_type), - NULL); - - add_function("not", - _not(glsl_type::bvec2_type), - _not(glsl_type::bvec3_type), - _not(glsl_type::bvec4_type), - NULL); - - add_function("textureSize", - _textureSize(v130, glsl_type::int_type, glsl_type::sampler1D_type), - _textureSize(v130, glsl_type::int_type, glsl_type::isampler1D_type), - _textureSize(v130, glsl_type::int_type, glsl_type::usampler1D_type), - - _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler2D_type), - _textureSize(v130, glsl_type::ivec2_type, glsl_type::isampler2D_type), - _textureSize(v130, glsl_type::ivec2_type, glsl_type::usampler2D_type), - - _textureSize(v130, glsl_type::ivec3_type, glsl_type::sampler3D_type), - _textureSize(v130, glsl_type::ivec3_type, glsl_type::isampler3D_type), - _textureSize(v130, glsl_type::ivec3_type, glsl_type::usampler3D_type), - - _textureSize(v130, glsl_type::ivec2_type, glsl_type::samplerCube_type), - _textureSize(v130, glsl_type::ivec2_type, glsl_type::isamplerCube_type), - _textureSize(v130, glsl_type::ivec2_type, glsl_type::usamplerCube_type), - - _textureSize(v130, glsl_type::int_type, glsl_type::sampler1DShadow_type), - _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler2DShadow_type), - _textureSize(v130, glsl_type::ivec2_type, glsl_type::samplerCubeShadow_type), - - _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler1DArray_type), - _textureSize(v130, glsl_type::ivec2_type, glsl_type::isampler1DArray_type), - _textureSize(v130, glsl_type::ivec2_type, glsl_type::usampler1DArray_type), - _textureSize(v130, glsl_type::ivec3_type, glsl_type::sampler2DArray_type), - _textureSize(v130, glsl_type::ivec3_type, glsl_type::isampler2DArray_type), - _textureSize(v130, glsl_type::ivec3_type, glsl_type::usampler2DArray_type), - - _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler1DArrayShadow_type), - _textureSize(v130, glsl_type::ivec3_type, glsl_type::sampler2DArrayShadow_type), - - _textureSize(texture_cube_map_array, glsl_type::ivec3_type, glsl_type::samplerCubeArray_type), - _textureSize(texture_cube_map_array, glsl_type::ivec3_type, glsl_type::isamplerCubeArray_type), - _textureSize(texture_cube_map_array, glsl_type::ivec3_type, glsl_type::usamplerCubeArray_type), - _textureSize(texture_cube_map_array, glsl_type::ivec3_type, glsl_type::samplerCubeArrayShadow_type), - - _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler2DRect_type), - _textureSize(v130, glsl_type::ivec2_type, glsl_type::isampler2DRect_type), - _textureSize(v130, glsl_type::ivec2_type, glsl_type::usampler2DRect_type), - _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler2DRectShadow_type), - - _textureSize(v140, glsl_type::int_type, glsl_type::samplerBuffer_type), - _textureSize(v140, glsl_type::int_type, glsl_type::isamplerBuffer_type), - _textureSize(v140, glsl_type::int_type, glsl_type::usamplerBuffer_type), - _textureSize(texture_multisample, glsl_type::ivec2_type, glsl_type::sampler2DMS_type), - _textureSize(texture_multisample, glsl_type::ivec2_type, glsl_type::isampler2DMS_type), - _textureSize(texture_multisample, glsl_type::ivec2_type, glsl_type::usampler2DMS_type), - - _textureSize(texture_multisample, glsl_type::ivec3_type, glsl_type::sampler2DMSArray_type), - _textureSize(texture_multisample, glsl_type::ivec3_type, glsl_type::isampler2DMSArray_type), - _textureSize(texture_multisample, glsl_type::ivec3_type, glsl_type::usampler2DMSArray_type), - NULL); - - add_function("texture", - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type), - - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type), - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type), - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::samplerCubeShadow_type, glsl_type::vec4_type), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type), - - _texture(ir_tex, texture_cube_map_array, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type), - _texture(ir_tex, texture_cube_map_array, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type), - _texture(ir_tex, texture_cube_map_array, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type), - - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type), - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type), - /* samplerCubeArrayShadow is special; it has an extra parameter - * for the shadow comparitor since there is no vec5 type. - */ - _textureCubeArrayShadow(), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type), - - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type), - - _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type), - _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type), - _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type), - - _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type), - _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type), - _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type), - - _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type), - _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type), - _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type), - - _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type), - _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type), - _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type), - - _texture(ir_txb, v130_fs_only, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type), - _texture(ir_txb, v130_fs_only, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type), - _texture(ir_txb, v130_fs_only, glsl_type::float_type, glsl_type::samplerCubeShadow_type, glsl_type::vec4_type), - - _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type), - _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type), - _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type), - - _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type), - _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type), - _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type), - - _texture(ir_txb, fs_texture_cube_map_array, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type), - _texture(ir_txb, fs_texture_cube_map_array, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type), - _texture(ir_txb, fs_texture_cube_map_array, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type), - - _texture(ir_txb, v130_fs_only, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type), - NULL); - - add_function("textureLod", - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type), - - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type), - - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type), - - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type), - - _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type), - _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type), - - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type), - - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type), - - _texture(ir_txl, texture_cube_map_array, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type), - _texture(ir_txl, texture_cube_map_array, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type), - _texture(ir_txl, texture_cube_map_array, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type), - - _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type), - NULL); - - add_function("textureOffset", - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET), - - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET), - _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET), - _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET), - - _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET), - - _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_txb, v130_fs_only, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txb, v130_fs_only, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET), - - _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_txb, v130_fs_only, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET), - NULL); - - add_function("textureProj", - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_txb, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txb, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("texelFetch", - _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::int_type), - _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::int_type), - _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::int_type), - - _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::ivec2_type), - _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::ivec2_type), - _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::ivec2_type), - - _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::ivec3_type), - _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::ivec3_type), - _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::ivec3_type), - - _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::ivec2_type), - _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::ivec2_type), - _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::ivec2_type), - - _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::ivec2_type), - _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::ivec2_type), - _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::ivec2_type), - - _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::ivec3_type), - _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::ivec3_type), - _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::ivec3_type), - - _texelFetch(v140, glsl_type::vec4_type, glsl_type::samplerBuffer_type, glsl_type::int_type), - _texelFetch(v140, glsl_type::ivec4_type, glsl_type::isamplerBuffer_type, glsl_type::int_type), - _texelFetch(v140, glsl_type::uvec4_type, glsl_type::usamplerBuffer_type, glsl_type::int_type), - - _texelFetch(texture_multisample, glsl_type::vec4_type, glsl_type::sampler2DMS_type, glsl_type::ivec2_type), - _texelFetch(texture_multisample, glsl_type::ivec4_type, glsl_type::isampler2DMS_type, glsl_type::ivec2_type), - _texelFetch(texture_multisample, glsl_type::uvec4_type, glsl_type::usampler2DMS_type, glsl_type::ivec2_type), - - _texelFetch(texture_multisample, glsl_type::vec4_type, glsl_type::sampler2DMSArray_type, glsl_type::ivec3_type), - _texelFetch(texture_multisample, glsl_type::ivec4_type, glsl_type::isampler2DMSArray_type, glsl_type::ivec3_type), - _texelFetch(texture_multisample, glsl_type::uvec4_type, glsl_type::usampler2DMSArray_type, glsl_type::ivec3_type), - NULL); - - add_function("texelFetchOffset", - _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::int_type, glsl_type::int_type), - _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::int_type, glsl_type::int_type), - _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::int_type, glsl_type::int_type), - - _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::ivec2_type, glsl_type::ivec2_type), - _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::ivec2_type, glsl_type::ivec2_type), - _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::ivec2_type, glsl_type::ivec2_type), - - _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::ivec3_type, glsl_type::ivec3_type), - _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::ivec3_type, glsl_type::ivec3_type), - _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::ivec3_type, glsl_type::ivec3_type), - - _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::ivec2_type, glsl_type::ivec2_type), - _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::ivec2_type, glsl_type::ivec2_type), - _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::ivec2_type, glsl_type::ivec2_type), - - _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::ivec2_type, glsl_type::int_type), - _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::ivec2_type, glsl_type::int_type), - _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::ivec2_type, glsl_type::int_type), - - _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::ivec3_type, glsl_type::ivec2_type), - _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::ivec3_type, glsl_type::ivec2_type), - _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::ivec3_type, glsl_type::ivec2_type), - - NULL); - - add_function("textureProjOffset", - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_txb, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txb, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - NULL); - - add_function("textureLodOffset", - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET), - - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET), - - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET), - - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET), - NULL); - - add_function("textureProjLod", - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("textureProjLodOffset", - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - NULL); - - add_function("textureGrad", - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type), - - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type), - - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type), - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type), - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::samplerCubeShadow_type, glsl_type::vec4_type), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type), - - _texture(ir_txd, texture_cube_map_array, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type), - _texture(ir_txd, texture_cube_map_array, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type), - _texture(ir_txd, texture_cube_map_array, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type), - - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type), - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type), - NULL); - - add_function("textureGradOffset", - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET), - - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type, TEX_OFFSET), - NULL); - - add_function("textureProjGrad", - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT), - - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("textureProjGradOffset", - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET), - NULL); - - add_function("EmitVertex", _EmitVertex(), NULL); - add_function("EndPrimitive", _EndPrimitive(), NULL); - add_function("EmitStreamVertex", - _EmitStreamVertex(gs_streams, glsl_type::uint_type), - _EmitStreamVertex(gs_streams, glsl_type::int_type), - NULL); - add_function("EndStreamPrimitive", - _EndStreamPrimitive(gs_streams, glsl_type::uint_type), - _EndStreamPrimitive(gs_streams, glsl_type::int_type), - NULL); - - add_function("textureQueryLOD", - _textureQueryLod(glsl_type::sampler1D_type, glsl_type::float_type), - _textureQueryLod(glsl_type::isampler1D_type, glsl_type::float_type), - _textureQueryLod(glsl_type::usampler1D_type, glsl_type::float_type), - - _textureQueryLod(glsl_type::sampler2D_type, glsl_type::vec2_type), - _textureQueryLod(glsl_type::isampler2D_type, glsl_type::vec2_type), - _textureQueryLod(glsl_type::usampler2D_type, glsl_type::vec2_type), - - _textureQueryLod(glsl_type::sampler3D_type, glsl_type::vec3_type), - _textureQueryLod(glsl_type::isampler3D_type, glsl_type::vec3_type), - _textureQueryLod(glsl_type::usampler3D_type, glsl_type::vec3_type), - - _textureQueryLod(glsl_type::samplerCube_type, glsl_type::vec3_type), - _textureQueryLod(glsl_type::isamplerCube_type, glsl_type::vec3_type), - _textureQueryLod(glsl_type::usamplerCube_type, glsl_type::vec3_type), - - _textureQueryLod(glsl_type::sampler1DArray_type, glsl_type::float_type), - _textureQueryLod(glsl_type::isampler1DArray_type, glsl_type::float_type), - _textureQueryLod(glsl_type::usampler1DArray_type, glsl_type::float_type), - - _textureQueryLod(glsl_type::sampler2DArray_type, glsl_type::vec2_type), - _textureQueryLod(glsl_type::isampler2DArray_type, glsl_type::vec2_type), - _textureQueryLod(glsl_type::usampler2DArray_type, glsl_type::vec2_type), - - _textureQueryLod(glsl_type::samplerCubeArray_type, glsl_type::vec3_type), - _textureQueryLod(glsl_type::isamplerCubeArray_type, glsl_type::vec3_type), - _textureQueryLod(glsl_type::usamplerCubeArray_type, glsl_type::vec3_type), - - _textureQueryLod(glsl_type::sampler1DShadow_type, glsl_type::float_type), - _textureQueryLod(glsl_type::sampler2DShadow_type, glsl_type::vec2_type), - _textureQueryLod(glsl_type::samplerCubeShadow_type, glsl_type::vec3_type), - _textureQueryLod(glsl_type::sampler1DArrayShadow_type, glsl_type::float_type), - _textureQueryLod(glsl_type::sampler2DArrayShadow_type, glsl_type::vec2_type), - _textureQueryLod(glsl_type::samplerCubeArrayShadow_type, glsl_type::vec3_type), - NULL); - - add_function("textureQueryLevels", - _textureQueryLevels(glsl_type::sampler1D_type), - _textureQueryLevels(glsl_type::sampler2D_type), - _textureQueryLevels(glsl_type::sampler3D_type), - _textureQueryLevels(glsl_type::samplerCube_type), - _textureQueryLevels(glsl_type::sampler1DArray_type), - _textureQueryLevels(glsl_type::sampler2DArray_type), - _textureQueryLevels(glsl_type::samplerCubeArray_type), - _textureQueryLevels(glsl_type::sampler1DShadow_type), - _textureQueryLevels(glsl_type::sampler2DShadow_type), - _textureQueryLevels(glsl_type::samplerCubeShadow_type), - _textureQueryLevels(glsl_type::sampler1DArrayShadow_type), - _textureQueryLevels(glsl_type::sampler2DArrayShadow_type), - _textureQueryLevels(glsl_type::samplerCubeArrayShadow_type), - - _textureQueryLevels(glsl_type::isampler1D_type), - _textureQueryLevels(glsl_type::isampler2D_type), - _textureQueryLevels(glsl_type::isampler3D_type), - _textureQueryLevels(glsl_type::isamplerCube_type), - _textureQueryLevels(glsl_type::isampler1DArray_type), - _textureQueryLevels(glsl_type::isampler2DArray_type), - _textureQueryLevels(glsl_type::isamplerCubeArray_type), - - _textureQueryLevels(glsl_type::usampler1D_type), - _textureQueryLevels(glsl_type::usampler2D_type), - _textureQueryLevels(glsl_type::usampler3D_type), - _textureQueryLevels(glsl_type::usamplerCube_type), - _textureQueryLevels(glsl_type::usampler1DArray_type), - _textureQueryLevels(glsl_type::usampler2DArray_type), - _textureQueryLevels(glsl_type::usamplerCubeArray_type), - - NULL); - - add_function("texture1D", - _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type), - _texture(ir_txb, v110_fs_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type), - NULL); - - add_function("texture1DArray", - _texture(ir_tex, texture_array, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type), - _texture(ir_txb, fs_texture_array, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type), - NULL); - - add_function("texture1DProj", - _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txb, v110_fs_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_txb, v110_fs_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("texture1DLod", - _texture(ir_txl, tex1d_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type), - NULL); - - add_function("texture1DArrayLod", - _texture(ir_txl, texture_array_lod, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type), - NULL); - - add_function("texture1DProjLod", - _texture(ir_txl, tex1d_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_txl, tex1d_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("texture2D", - _texture(ir_tex, always_available, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type), - _texture(ir_txb, fs_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type), - _texture(ir_tex, texture_external, glsl_type::vec4_type, glsl_type::samplerExternalOES_type, glsl_type::vec2_type), - NULL); - - add_function("texture2DArray", - _texture(ir_tex, texture_array, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type), - _texture(ir_txb, fs_texture_array, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type), - NULL); - - add_function("texture2DProj", - _texture(ir_tex, always_available, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_tex, always_available, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txb, fs_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txb, fs_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_tex, texture_external, glsl_type::vec4_type, glsl_type::samplerExternalOES_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_tex, texture_external, glsl_type::vec4_type, glsl_type::samplerExternalOES_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("texture2DLod", - _texture(ir_txl, lod_exists_in_stage, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type), - NULL); - - add_function("texture2DArrayLod", - _texture(ir_txl, texture_array_lod, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type), - NULL); - - add_function("texture2DProjLod", - _texture(ir_txl, lod_exists_in_stage, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txl, lod_exists_in_stage, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("texture3D", - _texture(ir_tex, tex3d, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type), - _texture(ir_txb, fs_tex3d, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type), - NULL); - - add_function("texture3DProj", - _texture(ir_tex, tex3d, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txb, fs_tex3d, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("texture3DLod", - _texture(ir_txl, tex3d_lod, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type), - NULL); - - add_function("texture3DProjLod", - _texture(ir_txl, tex3d_lod, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("textureCube", - _texture(ir_tex, always_available, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type), - _texture(ir_txb, fs_only, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type), - NULL); - - add_function("textureCubeLod", - _texture(ir_txl, lod_exists_in_stage, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type), - NULL); - - add_function("texture2DRect", - _texture(ir_tex, texture_rectangle, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type), - NULL); - - add_function("texture2DRectProj", - _texture(ir_tex, texture_rectangle, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_tex, texture_rectangle, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("texture2DLodEXT", - _texture(ir_txl, es_lod_exists_in_stage, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type), - NULL); - add_function("texture2DProjLodEXT", - _texture(ir_txl, es_lod_exists_in_stage, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txl, es_lod_exists_in_stage, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - add_function("textureCubeLodEXT", - _texture(ir_txl, es_lod_exists_in_stage, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type), - NULL); - - add_function("shadow1D", - _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type), - _texture(ir_txb, v110_fs_only, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type), - NULL); - - add_function("shadow1DArray", - _texture(ir_tex, texture_array, glsl_type::vec4_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type), - _texture(ir_txb, fs_texture_array, glsl_type::vec4_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type), - NULL); - - add_function("shadow2D", - _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type), - _texture(ir_txb, v110_fs_only, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type), - NULL); - add_function("shadow2DEXT", - _texture(ir_tex, es_shadow_samplers, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type), - NULL); - - add_function("shadow2DArray", - _texture(ir_tex, texture_array, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type), - _texture(ir_txb, fs_texture_array, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type), - NULL); - - add_function("shadow1DProj", - _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txb, v110_fs_only, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("shadow2DProj", - _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - _texture(ir_txb, v110_fs_only, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - add_function("shadow2DProjEXT", - _texture(ir_tex, es_shadow_samplers, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("shadow1DLod", - _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type), - NULL); - - add_function("shadow2DLod", - _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type), - NULL); - - add_function("shadow1DArrayLod", - _texture(ir_txl, texture_array_lod, glsl_type::vec4_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type), - NULL); - - add_function("shadow1DProjLod", - _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("shadow2DProjLod", - _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("shadow2DRect", - _texture(ir_tex, texture_rectangle, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type), - NULL); - - add_function("shadow2DRectProj", - _texture(ir_tex, texture_rectangle, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("texture1DGradARB", - _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type), - NULL); - - add_function("texture1DProjGradARB", - _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT), - _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("texture2DGradARB", - _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type), - NULL); - - add_function("texture2DProjGradARB", - _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("texture3DGradARB", - _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type), - NULL); - - add_function("texture3DProjGradARB", - _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("textureCubeGradARB", - _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type), - NULL); - - add_function("texture2DGradEXT", - _texture(ir_txd, es_shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type), - NULL); - add_function("texture2DProjGradEXT", - _texture(ir_txd, es_shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txd, es_shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - add_function("textureCubeGradEXT", - _texture(ir_txd, es_shader_texture_lod, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type), - NULL); - - add_function("shadow1DGradARB", - _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type), - NULL); - - add_function("shadow1DProjGradARB", - _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("shadow2DGradARB", - _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type), - NULL); - - add_function("shadow2DProjGradARB", - _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("texture2DRectGradARB", - _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type), - NULL); - - add_function("texture2DRectProjGradARB", - _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT), - _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("shadow2DRectGradARB", - _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type), - NULL); - - add_function("shadow2DRectProjGradARB", - _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT), - NULL); - - add_function("textureGather", - _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type), - _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type), - _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type), - - _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type), - _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type), - _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type), - - _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type), - _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type), - _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type), - - _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type), - _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type), - _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_COMPONENT), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_COMPONENT), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_COMPONENT), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type, TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type, TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type, TEX_COMPONENT), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type, TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type, TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type, TEX_COMPONENT), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec2_type), - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec3_type), - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::samplerCubeShadow_type, glsl_type::vec3_type), - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::samplerCubeArrayShadow_type, glsl_type::vec4_type), - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec2_type), - NULL); - - add_function("textureGatherOffset", - _texture(ir_tg4, texture_gather_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_tg4, texture_gather_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET), - _texture(ir_tg4, texture_gather_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET), - - _texture(ir_tg4, texture_gather_only, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_tg4, texture_gather_only, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET), - _texture(ir_tg4, texture_gather_only, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_NONCONST), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_NONCONST), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_NONCONST), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST | TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST | TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST | TEX_COMPONENT), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_NONCONST | TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_NONCONST | TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_NONCONST | TEX_COMPONENT), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST | TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST | TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST | TEX_COMPONENT), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST), - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET_NONCONST), - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST), - NULL); - - add_function("textureGatherOffsets", - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY | TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY | TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY | TEX_COMPONENT), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_ARRAY), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_ARRAY), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_ARRAY), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_ARRAY | TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_ARRAY | TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_ARRAY | TEX_COMPONENT), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY | TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY | TEX_COMPONENT), - _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY | TEX_COMPONENT), - - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY), - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET_ARRAY), - _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY), - NULL); - - F(dFdx) - F(dFdy) - F(fwidth) - F(dFdxCoarse) - F(dFdyCoarse) - F(fwidthCoarse) - F(dFdxFine) - F(dFdyFine) - F(fwidthFine) - F(noise1) - F(noise2) - F(noise3) - F(noise4) - - IU(bitfieldExtract) - IU(bitfieldInsert) - IU(bitfieldReverse) - IU(bitCount) - IU(findLSB) - IU(findMSB) - F(fma) - - add_function("ldexp", - _ldexp(glsl_type::float_type, glsl_type::int_type), - _ldexp(glsl_type::vec2_type, glsl_type::ivec2_type), - _ldexp(glsl_type::vec3_type, glsl_type::ivec3_type), - _ldexp(glsl_type::vec4_type, glsl_type::ivec4_type), - NULL); - - add_function("frexp", - _frexp(glsl_type::float_type, glsl_type::int_type), - _frexp(glsl_type::vec2_type, glsl_type::ivec2_type), - _frexp(glsl_type::vec3_type, glsl_type::ivec3_type), - _frexp(glsl_type::vec4_type, glsl_type::ivec4_type), - NULL); - add_function("uaddCarry", - _uaddCarry(glsl_type::uint_type), - _uaddCarry(glsl_type::uvec2_type), - _uaddCarry(glsl_type::uvec3_type), - _uaddCarry(glsl_type::uvec4_type), - NULL); - add_function("usubBorrow", - _usubBorrow(glsl_type::uint_type), - _usubBorrow(glsl_type::uvec2_type), - _usubBorrow(glsl_type::uvec3_type), - _usubBorrow(glsl_type::uvec4_type), - NULL); - add_function("imulExtended", - _mulExtended(glsl_type::int_type), - _mulExtended(glsl_type::ivec2_type), - _mulExtended(glsl_type::ivec3_type), - _mulExtended(glsl_type::ivec4_type), - NULL); - add_function("umulExtended", - _mulExtended(glsl_type::uint_type), - _mulExtended(glsl_type::uvec2_type), - _mulExtended(glsl_type::uvec3_type), - _mulExtended(glsl_type::uvec4_type), - NULL); - add_function("interpolateAtCentroid", - _interpolateAtCentroid(glsl_type::float_type), - _interpolateAtCentroid(glsl_type::vec2_type), - _interpolateAtCentroid(glsl_type::vec3_type), - _interpolateAtCentroid(glsl_type::vec4_type), - NULL); - add_function("interpolateAtOffset", - _interpolateAtOffset(glsl_type::float_type), - _interpolateAtOffset(glsl_type::vec2_type), - _interpolateAtOffset(glsl_type::vec3_type), - _interpolateAtOffset(glsl_type::vec4_type), - NULL); - add_function("interpolateAtSample", - _interpolateAtSample(glsl_type::float_type), - _interpolateAtSample(glsl_type::vec2_type), - _interpolateAtSample(glsl_type::vec3_type), - _interpolateAtSample(glsl_type::vec4_type), - NULL); - - add_function("atomicCounter", - _atomic_op("__intrinsic_atomic_read", - shader_atomic_counters), - NULL); - add_function("atomicCounterIncrement", - _atomic_op("__intrinsic_atomic_increment", - shader_atomic_counters), - NULL); - add_function("atomicCounterDecrement", - _atomic_op("__intrinsic_atomic_predecrement", - shader_atomic_counters), - NULL); - - add_function("min3", - _min3(glsl_type::float_type), - _min3(glsl_type::vec2_type), - _min3(glsl_type::vec3_type), - _min3(glsl_type::vec4_type), - - _min3(glsl_type::int_type), - _min3(glsl_type::ivec2_type), - _min3(glsl_type::ivec3_type), - _min3(glsl_type::ivec4_type), - - _min3(glsl_type::uint_type), - _min3(glsl_type::uvec2_type), - _min3(glsl_type::uvec3_type), - _min3(glsl_type::uvec4_type), - NULL); - - add_function("max3", - _max3(glsl_type::float_type), - _max3(glsl_type::vec2_type), - _max3(glsl_type::vec3_type), - _max3(glsl_type::vec4_type), - - _max3(glsl_type::int_type), - _max3(glsl_type::ivec2_type), - _max3(glsl_type::ivec3_type), - _max3(glsl_type::ivec4_type), - - _max3(glsl_type::uint_type), - _max3(glsl_type::uvec2_type), - _max3(glsl_type::uvec3_type), - _max3(glsl_type::uvec4_type), - NULL); - - add_function("mid3", - _mid3(glsl_type::float_type), - _mid3(glsl_type::vec2_type), - _mid3(glsl_type::vec3_type), - _mid3(glsl_type::vec4_type), - - _mid3(glsl_type::int_type), - _mid3(glsl_type::ivec2_type), - _mid3(glsl_type::ivec3_type), - _mid3(glsl_type::ivec4_type), - - _mid3(glsl_type::uint_type), - _mid3(glsl_type::uvec2_type), - _mid3(glsl_type::uvec3_type), - _mid3(glsl_type::uvec4_type), - NULL); - - add_image_functions(true); - - add_function("memoryBarrier", - _memory_barrier(shader_image_load_store), - NULL); - -#undef F -#undef FI -#undef FIU -#undef FIUB -#undef FIU2_MIXED -} - -void -builtin_builder::add_function(const char *name, ...) -{ - va_list ap; - - ir_function *f = new(mem_ctx) ir_function(name); - - va_start(ap, name); - while (true) { - ir_function_signature *sig = va_arg(ap, ir_function_signature *); - if (sig == NULL) - break; - - if (false) { - exec_list stuff; - stuff.push_tail(sig); - validate_ir_tree(&stuff); - } - - f->add_signature(sig); - } - va_end(ap); - - shader->symbols->add_function(f); -} - -void -builtin_builder::add_image_function(const char *name, - const char *intrinsic_name, - unsigned num_arguments, - unsigned flags) -{ - static const glsl_type *const types[] = { - glsl_type::image1D_type, - glsl_type::image2D_type, - glsl_type::image3D_type, - glsl_type::image2DRect_type, - glsl_type::imageCube_type, - glsl_type::imageBuffer_type, - glsl_type::image1DArray_type, - glsl_type::image2DArray_type, - glsl_type::imageCubeArray_type, - glsl_type::image2DMS_type, - glsl_type::image2DMSArray_type, - glsl_type::iimage1D_type, - glsl_type::iimage2D_type, - glsl_type::iimage3D_type, - glsl_type::iimage2DRect_type, - glsl_type::iimageCube_type, - glsl_type::iimageBuffer_type, - glsl_type::iimage1DArray_type, - glsl_type::iimage2DArray_type, - glsl_type::iimageCubeArray_type, - glsl_type::iimage2DMS_type, - glsl_type::iimage2DMSArray_type, - glsl_type::uimage1D_type, - glsl_type::uimage2D_type, - glsl_type::uimage3D_type, - glsl_type::uimage2DRect_type, - glsl_type::uimageCube_type, - glsl_type::uimageBuffer_type, - glsl_type::uimage1DArray_type, - glsl_type::uimage2DArray_type, - glsl_type::uimageCubeArray_type, - glsl_type::uimage2DMS_type, - glsl_type::uimage2DMSArray_type - }; - ir_function *f = new(mem_ctx) ir_function(name); - - for (unsigned i = 0; i < Elements(types); ++i) { - if (types[i]->sampler_type != GLSL_TYPE_FLOAT || - (flags & IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE)) - f->add_signature(_image(types[i], intrinsic_name, - num_arguments, flags)); - } - - shader->symbols->add_function(f); -} - -void -builtin_builder::add_image_functions(bool glsl) -{ - const unsigned flags = (glsl ? IMAGE_FUNCTION_EMIT_STUB : 0); - - add_image_function(glsl ? "imageLoad" : "__intrinsic_image_load", - "__intrinsic_image_load", 0, - (flags | IMAGE_FUNCTION_HAS_VECTOR_DATA_TYPE | - IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE | - IMAGE_FUNCTION_READ_ONLY)); - - add_image_function(glsl ? "imageStore" : "__intrinsic_image_store", - "__intrinsic_image_store", 1, - (flags | IMAGE_FUNCTION_RETURNS_VOID | - IMAGE_FUNCTION_HAS_VECTOR_DATA_TYPE | - IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE | - IMAGE_FUNCTION_WRITE_ONLY)); - - add_image_function(glsl ? "imageAtomicAdd" : "__intrinsic_image_atomic_add", - "__intrinsic_image_atomic_add", 1, flags); - - add_image_function(glsl ? "imageAtomicMin" : "__intrinsic_image_atomic_min", - "__intrinsic_image_atomic_min", 1, flags); - - add_image_function(glsl ? "imageAtomicMax" : "__intrinsic_image_atomic_max", - "__intrinsic_image_atomic_max", 1, flags); - - add_image_function(glsl ? "imageAtomicAnd" : "__intrinsic_image_atomic_and", - "__intrinsic_image_atomic_and", 1, flags); - - add_image_function(glsl ? "imageAtomicOr" : "__intrinsic_image_atomic_or", - "__intrinsic_image_atomic_or", 1, flags); - - add_image_function(glsl ? "imageAtomicXor" : "__intrinsic_image_atomic_xor", - "__intrinsic_image_atomic_xor", 1, flags); - - add_image_function((glsl ? "imageAtomicExchange" : - "__intrinsic_image_atomic_exchange"), - "__intrinsic_image_atomic_exchange", 1, flags); - - add_image_function((glsl ? "imageAtomicCompSwap" : - "__intrinsic_image_atomic_comp_swap"), - "__intrinsic_image_atomic_comp_swap", 2, flags); -} - -ir_variable * -builtin_builder::in_var(const glsl_type *type, const char *name) -{ - return new(mem_ctx) ir_variable(type, name, ir_var_function_in, glsl_precision_undefined); -} - -ir_variable * -builtin_builder::out_var(const glsl_type *type, const char *name) -{ - return new(mem_ctx) ir_variable(type, name, ir_var_function_out, glsl_precision_undefined); -} - -ir_constant * -builtin_builder::imm(float f, unsigned vector_elements) -{ - return new(mem_ctx) ir_constant(f, vector_elements); -} - -ir_constant * -builtin_builder::imm(int i, unsigned vector_elements) -{ - return new(mem_ctx) ir_constant(i, vector_elements); -} - -ir_constant * -builtin_builder::imm(unsigned u, unsigned vector_elements) -{ - return new(mem_ctx) ir_constant(u, vector_elements); -} - -ir_constant * -builtin_builder::imm(const glsl_type *type, const ir_constant_data &data) -{ - return new(mem_ctx) ir_constant(type, &data); -} - -ir_dereference_variable * -builtin_builder::var_ref(ir_variable *var) -{ - return new(mem_ctx) ir_dereference_variable(var); -} - -ir_dereference_array * -builtin_builder::array_ref(ir_variable *var, int idx) -{ - return new(mem_ctx) ir_dereference_array(var, imm(idx)); -} - -/** Return an element of a matrix */ -ir_swizzle * -builtin_builder::matrix_elt(ir_variable *var, int column, int row) -{ - return swizzle(array_ref(var, column), row, 1); -} - -/** - * Implementations of built-in functions: - * @{ - */ -ir_function_signature * -builtin_builder::new_sig(const glsl_type *return_type, - builtin_available_predicate avail, - int num_params, - ...) -{ - va_list ap; - - ir_function_signature *sig = - new(mem_ctx) ir_function_signature(return_type, glsl_precision_undefined, avail); - - exec_list plist; - va_start(ap, num_params); - for (int i = 0; i < num_params; i++) { - plist.push_tail(va_arg(ap, ir_variable *)); - } - va_end(ap); - - sig->replace_parameters(&plist); - return sig; -} - -#define MAKE_SIG(return_type, avail, ...) \ - ir_function_signature *sig = \ - new_sig(return_type, avail, __VA_ARGS__); \ - ir_factory body(&sig->body, mem_ctx); \ - sig->is_defined = true; - -#define MAKE_INTRINSIC(return_type, avail, ...) \ - ir_function_signature *sig = \ - new_sig(return_type, avail, __VA_ARGS__); \ - sig->is_intrinsic = true; - -ir_function_signature * -builtin_builder::unop(builtin_available_predicate avail, - ir_expression_operation opcode, - const glsl_type *return_type, - const glsl_type *param_type) -{ - ir_variable *x = in_var(param_type, "x"); - MAKE_SIG(return_type, avail, 1, x); - body.emit(ret(expr(opcode, x))); - return sig; -} - -#define UNOP(NAME, OPCODE, AVAIL) \ -ir_function_signature * \ -builtin_builder::_##NAME(const glsl_type *type) \ -{ \ - return unop(&AVAIL, OPCODE, type, type); \ -} - -ir_function_signature * -builtin_builder::binop(ir_expression_operation opcode, - builtin_available_predicate avail, - const glsl_type *return_type, - const glsl_type *param0_type, - const glsl_type *param1_type) -{ - ir_variable *x = in_var(param0_type, "x"); - ir_variable *y = in_var(param1_type, "y"); - MAKE_SIG(return_type, avail, 2, x, y); - body.emit(ret(expr(opcode, x, y))); - return sig; -} - -#define BINOP(NAME, OPCODE, AVAIL) \ -ir_function_signature * \ -builtin_builder::_##NAME(const glsl_type *return_type, \ - const glsl_type *param0_type, \ - const glsl_type *param1_type) \ -{ \ - return binop(&AVAIL, OPCODE, return_type, param0_type, param1_type); \ -} - -/** - * Angle and Trigonometry Functions @{ - */ - -ir_function_signature * -builtin_builder::_radians(const glsl_type *type) -{ - ir_variable *degrees = in_var(type, "degrees"); - MAKE_SIG(type, always_available, 1, degrees); - body.emit(ret(mul(degrees, imm(0.0174532925f)))); - return sig; -} - -ir_function_signature * -builtin_builder::_degrees(const glsl_type *type) -{ - ir_variable *radians = in_var(type, "radians"); - MAKE_SIG(type, always_available, 1, radians); - body.emit(ret(mul(radians, imm(57.29578f)))); - return sig; -} - -UNOP(sin, ir_unop_sin, always_available) -UNOP(cos, ir_unop_cos, always_available) - -ir_function_signature * -builtin_builder::_tan(const glsl_type *type) -{ - ir_variable *theta = in_var(type, "theta"); - MAKE_SIG(type, always_available, 1, theta); - body.emit(ret(div(sin(theta), cos(theta)))); - return sig; -} - -ir_expression * -builtin_builder::asin_expr(ir_variable *x) -{ - return mul(sign(x), - sub(imm(M_PI_2f), - mul(sqrt(sub(imm(1.0f), abs(x))), - add(imm(M_PI_2f), - mul(abs(x), - add(imm(M_PI_4f - 1.0f), - mul(abs(x), - add(imm(0.086566724f), - mul(abs(x), imm(-0.03102955f)))))))))); -} - -ir_call * -builtin_builder::call(ir_function *f, ir_variable *ret, exec_list params) -{ - exec_list actual_params; - - foreach_in_list(ir_variable, var, ¶ms) { - actual_params.push_tail(var_ref(var)); - } - - ir_function_signature *sig = - f->exact_matching_signature(NULL, &actual_params); - if (!sig) - return NULL; - - ir_dereference_variable *deref = - (sig->return_type->is_void() ? NULL : var_ref(ret)); - - return new(mem_ctx) ir_call(sig, deref, &actual_params); -} - -ir_function_signature * -builtin_builder::_asin(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(type, always_available, 1, x); - - body.emit(ret(asin_expr(x))); - - return sig; -} - -ir_function_signature * -builtin_builder::_acos(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(type, always_available, 1, x); - - body.emit(ret(sub(imm(M_PI_2f), asin_expr(x)))); - - return sig; -} - -ir_function_signature * -builtin_builder::_atan2(const glsl_type *type) -{ - ir_variable *vec_y = in_var(type, "vec_y"); - ir_variable *vec_x = in_var(type, "vec_x"); - MAKE_SIG(type, always_available, 2, vec_y, vec_x); - - ir_variable *vec_result = body.make_temp(type, "vec_result"); - ir_variable *r = body.make_temp(glsl_type::float_type, "r"); - for (unsigned i = 0; i < type->vector_elements; i++) { - ir_variable *y = body.make_temp(glsl_type::float_type, "y"); - ir_variable *x = body.make_temp(glsl_type::float_type, "x"); - body.emit(assign(y, swizzle(vec_y, i, 1))); - body.emit(assign(x, swizzle(vec_x, i, 1))); - - /* If |x| >= 1.0e-8 * |y|: */ - ir_if *outer_if = - new(mem_ctx) ir_if(greater(abs(x), mul(imm(1.0e-8f), abs(y)))); - - ir_factory outer_then(&outer_if->then_instructions, mem_ctx); - - /* Then...call atan(y/x) */ - do_atan(body, glsl_type::float_type, r, div(y, x)); - - /* ...and fix it up: */ - ir_if *inner_if = new(mem_ctx) ir_if(less(x, imm(0.0f))); - inner_if->then_instructions.push_tail( - if_tree(gequal(y, imm(0.0f)), - assign(r, add(r, imm(M_PIf))), - assign(r, sub(r, imm(M_PIf))))); - outer_then.emit(inner_if); - - /* Else... */ - outer_if->else_instructions.push_tail( - assign(r, mul(sign(y), imm(M_PI_2f)))); - - body.emit(outer_if); - - body.emit(assign(vec_result, r, 1 << i)); - } - body.emit(ret(vec_result)); - - return sig; -} - -void -builtin_builder::do_atan(ir_factory &body, const glsl_type *type, ir_variable *res, operand y_over_x) -{ - /* - * range-reduction, first step: - * - * / y_over_x if |y_over_x| <= 1.0; - * x = < - * \ 1.0 / y_over_x otherwise - */ - ir_variable *x = body.make_temp(type, "atan_x"); - body.emit(assign(x, div(min2(abs(y_over_x), - imm(1.0f)), - max2(abs(y_over_x), - imm(1.0f))))); - - /* - * approximate atan by evaluating polynomial: - * - * x * 0.9999793128310355 - x^3 * 0.3326756418091246 + - * x^5 * 0.1938924977115610 - x^7 * 0.1173503194786851 + - * x^9 * 0.0536813784310406 - x^11 * 0.0121323213173444 - */ - ir_variable *tmp = body.make_temp(type, "atan_tmp"); - body.emit(assign(tmp, mul(x, x))); - body.emit(assign(tmp, mul(add(mul(sub(mul(add(mul(sub(mul(add(mul(imm(-0.0121323213173444f), - tmp), - imm(0.0536813784310406f)), - tmp), - imm(0.1173503194786851f)), - tmp), - imm(0.1938924977115610f)), - tmp), - imm(0.3326756418091246f)), - tmp), - imm(0.9999793128310355f)), - x))); - - /* range-reduction fixup */ - body.emit(assign(tmp, add(tmp, - mul(b2f(greater(abs(y_over_x), - imm(1.0f, type->components()))), - add(mul(tmp, - imm(-2.0f)), - imm(M_PI_2f)))))); - - /* sign fixup */ - body.emit(assign(res, mul(tmp, sign(y_over_x)))); -} - -ir_function_signature * -builtin_builder::_atan(const glsl_type *type) -{ - ir_variable *y_over_x = in_var(type, "y_over_x"); - MAKE_SIG(type, always_available, 1, y_over_x); - - ir_variable *tmp = body.make_temp(type, "tmp"); - do_atan(body, type, tmp, y_over_x); - body.emit(ret(tmp)); - - return sig; -} - -ir_function_signature * -builtin_builder::_sinh(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(type, v130, 1, x); - - /* 0.5 * (e^x - e^(-x)) */ - body.emit(ret(mul(imm(0.5f), sub(exp(x), exp(neg(x)))))); - - return sig; -} - -ir_function_signature * -builtin_builder::_cosh(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(type, v130, 1, x); - - /* 0.5 * (e^x + e^(-x)) */ - body.emit(ret(mul(imm(0.5f), add(exp(x), exp(neg(x)))))); - - return sig; -} - -ir_function_signature * -builtin_builder::_tanh(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(type, v130, 1, x); - - /* (e^x - e^(-x)) / (e^x + e^(-x)) */ - body.emit(ret(div(sub(exp(x), exp(neg(x))), - add(exp(x), exp(neg(x)))))); - - return sig; -} - -ir_function_signature * -builtin_builder::_asinh(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(type, v130, 1, x); - - body.emit(ret(mul(sign(x), log(add(abs(x), sqrt(add(mul(x, x), - imm(1.0f)))))))); - return sig; -} - -ir_function_signature * -builtin_builder::_acosh(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(type, v130, 1, x); - - body.emit(ret(log(add(x, sqrt(sub(mul(x, x), imm(1.0f))))))); - return sig; -} - -ir_function_signature * -builtin_builder::_atanh(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(type, v130, 1, x); - - body.emit(ret(mul(imm(0.5f), log(div(add(imm(1.0f), x), - sub(imm(1.0f), x)))))); - return sig; -} -/** @} */ - -/** - * Exponential Functions @{ - */ - -ir_function_signature * -builtin_builder::_pow(const glsl_type *type) -{ - return binop(ir_binop_pow, always_available, type, type, type); -} - -UNOP(exp, ir_unop_exp, always_available) -UNOP(log, ir_unop_log, always_available) -UNOP(exp2, ir_unop_exp2, always_available) -UNOP(log2, ir_unop_log2, always_available) -UNOP(sqrt, ir_unop_sqrt, always_available) -UNOP(inversesqrt, ir_unop_rsq, always_available) - -/** @} */ - -UNOP(abs, ir_unop_abs, always_available) -UNOP(sign, ir_unop_sign, always_available) -UNOP(floor, ir_unop_floor, always_available) -UNOP(trunc, ir_unop_trunc, v130) -UNOP(round, ir_unop_round_even, always_available) -UNOP(roundEven, ir_unop_round_even, always_available) -UNOP(ceil, ir_unop_ceil, always_available) -UNOP(fract, ir_unop_fract, always_available) - -ir_function_signature * -builtin_builder::_mod(const glsl_type *x_type, const glsl_type *y_type) -{ - return binop(ir_binop_mod, always_available, x_type, x_type, y_type); -} - -ir_function_signature * -builtin_builder::_modf(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - ir_variable *i = out_var(type, "i"); - MAKE_SIG(type, v130, 2, x, i); - - ir_variable *t = body.make_temp(type, "t"); - body.emit(assign(t, expr(ir_unop_trunc, x))); - body.emit(assign(i, t)); - body.emit(ret(sub(x, t))); - - return sig; -} - -ir_function_signature * -builtin_builder::_min(builtin_available_predicate avail, - const glsl_type *x_type, const glsl_type *y_type) -{ - return binop(ir_binop_min, avail, x_type, x_type, y_type); -} - -ir_function_signature * -builtin_builder::_max(builtin_available_predicate avail, - const glsl_type *x_type, const glsl_type *y_type) -{ - return binop(ir_binop_max, avail, x_type, x_type, y_type); -} - -ir_function_signature * -builtin_builder::_clamp(builtin_available_predicate avail, - const glsl_type *val_type, const glsl_type *bound_type) -{ - ir_variable *x = in_var(val_type, "x"); - ir_variable *minVal = in_var(bound_type, "minVal"); - ir_variable *maxVal = in_var(bound_type, "maxVal"); - MAKE_SIG(val_type, avail, 3, x, minVal, maxVal); - - body.emit(ret(clamp(x, minVal, maxVal))); - - return sig; -} - -ir_function_signature * -builtin_builder::_mix_lrp(const glsl_type *val_type, const glsl_type *blend_type) -{ - ir_variable *x = in_var(val_type, "x"); - ir_variable *y = in_var(val_type, "y"); - ir_variable *a = in_var(blend_type, "a"); - MAKE_SIG(val_type, always_available, 3, x, y, a); - - body.emit(ret(lrp(x, y, a))); - - return sig; -} - -ir_function_signature * -builtin_builder::_mix_sel(builtin_available_predicate avail, - const glsl_type *val_type, - const glsl_type *blend_type) -{ - ir_variable *x = in_var(val_type, "x"); - ir_variable *y = in_var(val_type, "y"); - ir_variable *a = in_var(blend_type, "a"); - MAKE_SIG(val_type, avail, 3, x, y, a); - - /* csel matches the ternary operator in that a selector of true choses the - * first argument. This differs from mix(x, y, false) which choses the - * second argument (to remain consistent with the interpolating version of - * mix() which takes a blend factor from 0.0 to 1.0 where 0.0 is only x. - * - * To handle the behavior mismatch, reverse the x and y arguments. - */ - body.emit(ret(csel(a, y, x))); - - return sig; -} - -ir_function_signature * -builtin_builder::_step(const glsl_type *edge_type, const glsl_type *x_type) -{ - ir_variable *edge = in_var(edge_type, "edge"); - ir_variable *x = in_var(x_type, "x"); - MAKE_SIG(x_type, always_available, 2, edge, x); - - ir_variable *t = body.make_temp(x_type, "t"); - if (x_type->vector_elements == 1) { - /* Both are floats */ - body.emit(assign(t, b2f(gequal(x, edge)))); - } else if (edge_type->vector_elements == 1) { - /* x is a vector but edge is a float */ - for (unsigned i = 0; i < x_type->vector_elements; i++) { - body.emit(assign(t, b2f(gequal(swizzle(x, i, 1), edge)), 1 << i)); - } - } else { - /* Both are vectors */ - for (unsigned i = 0; i < x_type->vector_elements; i++) { - body.emit(assign(t, b2f(gequal(swizzle(x, i, 1), swizzle(edge, i, 1))), - 1 << i)); - } - } - body.emit(ret(t)); - - return sig; -} - -ir_function_signature * -builtin_builder::_smoothstep(const glsl_type *edge_type, const glsl_type *x_type) -{ - ir_variable *edge0 = in_var(edge_type, "edge0"); - ir_variable *edge1 = in_var(edge_type, "edge1"); - ir_variable *x = in_var(x_type, "x"); - MAKE_SIG(x_type, always_available, 3, edge0, edge1, x); - - /* From the GLSL 1.10 specification: - * - * genType t; - * t = clamp((x - edge0) / (edge1 - edge0), 0, 1); - * return t * t * (3 - 2 * t); - */ - - ir_variable *t = body.make_temp(x_type, "t"); - body.emit(assign(t, clamp(div(sub(x, edge0), sub(edge1, edge0)), - imm(0.0f), imm(1.0f)))); - - body.emit(ret(mul(t, mul(t, sub(imm(3.0f), mul(imm(2.0f), t)))))); - - return sig; -} - -ir_function_signature * -builtin_builder::_isnan(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(glsl_type::bvec(type->vector_elements), v130, 1, x); - - body.emit(ret(nequal(x, x))); - - return sig; -} - -ir_function_signature * -builtin_builder::_isinf(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(glsl_type::bvec(type->vector_elements), v130, 1, x); - - ir_constant_data infinities; - for (unsigned i = 0; i < type->vector_elements; i++) { - infinities.f[i] = std::numeric_limits::infinity(); - } - - body.emit(ret(equal(abs(x), imm(type, infinities)))); - - return sig; -} - -ir_function_signature * -builtin_builder::_floatBitsToInt(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(glsl_type::ivec(type->vector_elements), shader_bit_encoding, 1, x); - body.emit(ret(bitcast_f2i(x))); - return sig; -} - -ir_function_signature * -builtin_builder::_floatBitsToUint(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(glsl_type::uvec(type->vector_elements), shader_bit_encoding, 1, x); - body.emit(ret(bitcast_f2u(x))); - return sig; -} - -ir_function_signature * -builtin_builder::_intBitsToFloat(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(glsl_type::vec(type->vector_elements), shader_bit_encoding, 1, x); - body.emit(ret(bitcast_i2f(x))); - return sig; -} - -ir_function_signature * -builtin_builder::_uintBitsToFloat(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(glsl_type::vec(type->vector_elements), shader_bit_encoding, 1, x); - body.emit(ret(bitcast_u2f(x))); - return sig; -} - -ir_function_signature * -builtin_builder::_packUnorm2x16(builtin_available_predicate avail) -{ - ir_variable *v = in_var(glsl_type::vec2_type, "v"); - MAKE_SIG(glsl_type::uint_type, avail, 1, v); - body.emit(ret(expr(ir_unop_pack_unorm_2x16, v))); - return sig; -} - -ir_function_signature * -builtin_builder::_packSnorm2x16(builtin_available_predicate avail) -{ - ir_variable *v = in_var(glsl_type::vec2_type, "v"); - MAKE_SIG(glsl_type::uint_type, avail, 1, v); - body.emit(ret(expr(ir_unop_pack_snorm_2x16, v))); - return sig; -} - -ir_function_signature * -builtin_builder::_packUnorm4x8(builtin_available_predicate avail) -{ - ir_variable *v = in_var(glsl_type::vec4_type, "v"); - MAKE_SIG(glsl_type::uint_type, avail, 1, v); - body.emit(ret(expr(ir_unop_pack_unorm_4x8, v))); - return sig; -} - -ir_function_signature * -builtin_builder::_packSnorm4x8(builtin_available_predicate avail) -{ - ir_variable *v = in_var(glsl_type::vec4_type, "v"); - MAKE_SIG(glsl_type::uint_type, avail, 1, v); - body.emit(ret(expr(ir_unop_pack_snorm_4x8, v))); - return sig; -} - -ir_function_signature * -builtin_builder::_unpackUnorm2x16(builtin_available_predicate avail) -{ - ir_variable *p = in_var(glsl_type::uint_type, "p"); - MAKE_SIG(glsl_type::vec2_type, avail, 1, p); - body.emit(ret(expr(ir_unop_unpack_unorm_2x16, p))); - return sig; -} - -ir_function_signature * -builtin_builder::_unpackSnorm2x16(builtin_available_predicate avail) -{ - ir_variable *p = in_var(glsl_type::uint_type, "p"); - MAKE_SIG(glsl_type::vec2_type, avail, 1, p); - body.emit(ret(expr(ir_unop_unpack_snorm_2x16, p))); - return sig; -} - - -ir_function_signature * -builtin_builder::_unpackUnorm4x8(builtin_available_predicate avail) -{ - ir_variable *p = in_var(glsl_type::uint_type, "p"); - MAKE_SIG(glsl_type::vec4_type, avail, 1, p); - body.emit(ret(expr(ir_unop_unpack_unorm_4x8, p))); - return sig; -} - -ir_function_signature * -builtin_builder::_unpackSnorm4x8(builtin_available_predicate avail) -{ - ir_variable *p = in_var(glsl_type::uint_type, "p"); - MAKE_SIG(glsl_type::vec4_type, avail, 1, p); - body.emit(ret(expr(ir_unop_unpack_snorm_4x8, p))); - return sig; -} - -ir_function_signature * -builtin_builder::_packHalf2x16(builtin_available_predicate avail) -{ - ir_variable *v = in_var(glsl_type::vec2_type, "v"); - MAKE_SIG(glsl_type::uint_type, avail, 1, v); - body.emit(ret(expr(ir_unop_pack_half_2x16, v))); - return sig; -} - -ir_function_signature * -builtin_builder::_unpackHalf2x16(builtin_available_predicate avail) -{ - ir_variable *p = in_var(glsl_type::uint_type, "p"); - MAKE_SIG(glsl_type::vec2_type, avail, 1, p); - body.emit(ret(expr(ir_unop_unpack_half_2x16, p))); - return sig; -} - -ir_function_signature * -builtin_builder::_length(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(glsl_type::float_type, always_available, 1, x); - - body.emit(ret(sqrt(dot(x, x)))); - - return sig; -} - -ir_function_signature * -builtin_builder::_distance(const glsl_type *type) -{ - ir_variable *p0 = in_var(type, "p0"); - ir_variable *p1 = in_var(type, "p1"); - MAKE_SIG(glsl_type::float_type, always_available, 2, p0, p1); - - if (type->vector_elements == 1) { - body.emit(ret(abs(sub(p0, p1)))); - } else { - ir_variable *p = body.make_temp(type, "p"); - body.emit(assign(p, sub(p0, p1))); - body.emit(ret(sqrt(dot(p, p)))); - } - - return sig; -} - -ir_function_signature * -builtin_builder::_dot(const glsl_type *type) -{ - if (type->vector_elements == 1) - return binop(ir_binop_mul, always_available, type, type, type); - - return binop(ir_binop_dot, always_available, - glsl_type::float_type, type, type); -} - -ir_function_signature * -builtin_builder::_cross(const glsl_type *type) -{ - ir_variable *a = in_var(type, "a"); - ir_variable *b = in_var(type, "b"); - MAKE_SIG(type, always_available, 2, a, b); - - int yzx = MAKE_SWIZZLE4(SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, 0); - int zxy = MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, 0); - - body.emit(ret(sub(mul(swizzle(a, yzx, 3), swizzle(b, zxy, 3)), - mul(swizzle(a, zxy, 3), swizzle(b, yzx, 3))))); - - return sig; -} - -ir_function_signature * -builtin_builder::_normalize(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - MAKE_SIG(type, always_available, 1, x); - - if (type->vector_elements == 1) { - body.emit(ret(sign(x))); - } else { - body.emit(ret(expr(ir_unop_normalize, x))); - } - - return sig; -} - -ir_function_signature * -builtin_builder::_ftransform() -{ - MAKE_SIG(glsl_type::vec4_type, compatibility_vs_only, 0); - - body.emit(ret(new(mem_ctx) ir_expression(ir_binop_mul, - glsl_type::vec4_type, - var_ref(gl_ModelViewProjectionMatrix), - var_ref(gl_Vertex)))); - - /* FINISHME: Once the ir_expression() constructor handles type inference - * for matrix operations, we can simplify this to: - * - * body.emit(ret(mul(gl_ModelViewProjectionMatrix, gl_Vertex))); - */ - return sig; -} - -ir_function_signature * -builtin_builder::_faceforward(const glsl_type *type) -{ - ir_variable *N = in_var(type, "N"); - ir_variable *I = in_var(type, "I"); - ir_variable *Nref = in_var(type, "Nref"); - MAKE_SIG(type, always_available, 3, N, I, Nref); - - body.emit(if_tree(less(dot(Nref, I), imm(0.0f)), - ret(N), ret(neg(N)))); - - return sig; -} - -ir_function_signature * -builtin_builder::_reflect(const glsl_type *type) -{ - ir_variable *I = in_var(type, "I"); - ir_variable *N = in_var(type, "N"); - MAKE_SIG(type, always_available, 2, I, N); - - /* I - 2 * dot(N, I) * N */ - body.emit(ret(sub(I, mul(imm(2.0f), mul(dot(N, I), N))))); - - return sig; -} - -ir_function_signature * -builtin_builder::_refract(const glsl_type *type) -{ - ir_variable *I = in_var(type, "I"); - ir_variable *N = in_var(type, "N"); - ir_variable *eta = in_var(glsl_type::float_type, "eta"); - MAKE_SIG(type, always_available, 3, I, N, eta); - - ir_variable *n_dot_i = body.make_temp(glsl_type::float_type, "n_dot_i"); - body.emit(assign(n_dot_i, dot(N, I))); - - /* From the GLSL 1.10 specification: - * k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I)) - * if (k < 0.0) - * return genType(0.0) - * else - * return eta * I - (eta * dot(N, I) + sqrt(k)) * N - */ - ir_variable *k = body.make_temp(glsl_type::float_type, "k"); - body.emit(assign(k, sub(imm(1.0f), - mul(eta, mul(eta, sub(imm(1.0f), - mul(n_dot_i, n_dot_i))))))); - body.emit(if_tree(less(k, imm(0.0f)), - ret(ir_constant::zero(mem_ctx, type)), - ret(sub(mul(eta, I), - mul(add(mul(eta, n_dot_i), sqrt(k)), N))))); - - return sig; -} - -ir_function_signature * -builtin_builder::_matrixCompMult(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - ir_variable *y = in_var(type, "y"); - MAKE_SIG(type, always_available, 2, x, y); - - ir_variable *z = body.make_temp(type, "z"); - for (unsigned i = 0; i < type->matrix_columns; i++) { - body.emit(assign(array_ref(z, i), mul(array_ref(x, i), array_ref(y, i)))); - } - body.emit(ret(z)); - - return sig; -} - -ir_function_signature * -builtin_builder::_outerProduct(const glsl_type *type) -{ - ir_variable *c = in_var(glsl_type::vec(type->vector_elements), "c"); - ir_variable *r = in_var(glsl_type::vec(type->matrix_columns), "r"); - MAKE_SIG(type, v120, 2, c, r); - - ir_variable *m = body.make_temp(type, "m"); - for (unsigned i = 0; i < type->matrix_columns; i++) { - body.emit(assign(array_ref(m, i), mul(c, swizzle(r, i, 1)))); - } - body.emit(ret(m)); - - return sig; -} - -ir_function_signature * -builtin_builder::_transpose(const glsl_type *orig_type) -{ - const glsl_type *transpose_type = - glsl_type::get_instance(GLSL_TYPE_FLOAT, - orig_type->matrix_columns, - orig_type->vector_elements); - - ir_variable *m = in_var(orig_type, "m"); - MAKE_SIG(transpose_type, v120, 1, m); - - ir_variable *t = body.make_temp(transpose_type, "t"); - for (unsigned i = 0; i < orig_type->matrix_columns; i++) { - for (unsigned j = 0; j < orig_type->vector_elements; j++) { - body.emit(assign(array_ref(t, j), - matrix_elt(m, i, j), - 1 << i)); - } - } - body.emit(ret(t)); - - return sig; -} - -ir_function_signature * -builtin_builder::_determinant_mat2() -{ - ir_variable *m = in_var(glsl_type::mat2_type, "m"); - MAKE_SIG(glsl_type::float_type, v120, 1, m); - - body.emit(ret(sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 1, 1)), - mul(matrix_elt(m, 1, 0), matrix_elt(m, 0, 1))))); - - return sig; -} - -ir_function_signature * -builtin_builder::_determinant_mat3() -{ - ir_variable *m = in_var(glsl_type::mat3_type, "m"); - MAKE_SIG(glsl_type::float_type, v120, 1, m); - - ir_expression *f1 = - sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 2)), - mul(matrix_elt(m, 1, 2), matrix_elt(m, 2, 1))); - - ir_expression *f2 = - sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 2)), - mul(matrix_elt(m, 1, 2), matrix_elt(m, 2, 0))); - - ir_expression *f3 = - sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 1)), - mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 0))); - - body.emit(ret(add(sub(mul(matrix_elt(m, 0, 0), f1), - mul(matrix_elt(m, 0, 1), f2)), - mul(matrix_elt(m, 0, 2), f3)))); - - return sig; -} - -ir_function_signature * -builtin_builder::_determinant_mat4() -{ - ir_variable *m = in_var(glsl_type::mat4_type, "m"); - MAKE_SIG(glsl_type::float_type, v120, 1, m); - - ir_variable *SubFactor00 = body.make_temp(glsl_type::float_type, "SubFactor00"); - ir_variable *SubFactor01 = body.make_temp(glsl_type::float_type, "SubFactor01"); - ir_variable *SubFactor02 = body.make_temp(glsl_type::float_type, "SubFactor02"); - ir_variable *SubFactor03 = body.make_temp(glsl_type::float_type, "SubFactor03"); - ir_variable *SubFactor04 = body.make_temp(glsl_type::float_type, "SubFactor04"); - ir_variable *SubFactor05 = body.make_temp(glsl_type::float_type, "SubFactor05"); - ir_variable *SubFactor06 = body.make_temp(glsl_type::float_type, "SubFactor06"); - ir_variable *SubFactor07 = body.make_temp(glsl_type::float_type, "SubFactor07"); - ir_variable *SubFactor08 = body.make_temp(glsl_type::float_type, "SubFactor08"); - ir_variable *SubFactor09 = body.make_temp(glsl_type::float_type, "SubFactor09"); - ir_variable *SubFactor10 = body.make_temp(glsl_type::float_type, "SubFactor10"); - ir_variable *SubFactor11 = body.make_temp(glsl_type::float_type, "SubFactor11"); - ir_variable *SubFactor12 = body.make_temp(glsl_type::float_type, "SubFactor12"); - ir_variable *SubFactor13 = body.make_temp(glsl_type::float_type, "SubFactor13"); - ir_variable *SubFactor14 = body.make_temp(glsl_type::float_type, "SubFactor14"); - ir_variable *SubFactor15 = body.make_temp(glsl_type::float_type, "SubFactor15"); - ir_variable *SubFactor16 = body.make_temp(glsl_type::float_type, "SubFactor16"); - ir_variable *SubFactor17 = body.make_temp(glsl_type::float_type, "SubFactor17"); - ir_variable *SubFactor18 = body.make_temp(glsl_type::float_type, "SubFactor18"); - - body.emit(assign(SubFactor00, sub(mul(matrix_elt(m, 2, 2), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 2), matrix_elt(m, 2, 3))))); - body.emit(assign(SubFactor01, sub(mul(matrix_elt(m, 2, 1), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 2, 3))))); - body.emit(assign(SubFactor02, sub(mul(matrix_elt(m, 2, 1), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 2, 2))))); - body.emit(assign(SubFactor03, sub(mul(matrix_elt(m, 2, 0), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 2, 3))))); - body.emit(assign(SubFactor04, sub(mul(matrix_elt(m, 2, 0), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 2, 2))))); - body.emit(assign(SubFactor05, sub(mul(matrix_elt(m, 2, 0), matrix_elt(m, 3, 1)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 2, 1))))); - body.emit(assign(SubFactor06, sub(mul(matrix_elt(m, 1, 2), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 2), matrix_elt(m, 1, 3))))); - body.emit(assign(SubFactor07, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 1, 3))))); - body.emit(assign(SubFactor08, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 1, 2))))); - body.emit(assign(SubFactor09, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 1, 3))))); - body.emit(assign(SubFactor10, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 1, 2))))); - body.emit(assign(SubFactor11, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 1, 3))))); - body.emit(assign(SubFactor12, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 3, 1)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 1, 1))))); - body.emit(assign(SubFactor13, sub(mul(matrix_elt(m, 1, 2), matrix_elt(m, 2, 3)), mul(matrix_elt(m, 2, 2), matrix_elt(m, 1, 3))))); - body.emit(assign(SubFactor14, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 3)), mul(matrix_elt(m, 2, 1), matrix_elt(m, 1, 3))))); - body.emit(assign(SubFactor15, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 2)), mul(matrix_elt(m, 2, 1), matrix_elt(m, 1, 2))))); - body.emit(assign(SubFactor16, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 3)), mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 3))))); - body.emit(assign(SubFactor17, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 2)), mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 2))))); - body.emit(assign(SubFactor18, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 1)), mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 1))))); - - ir_variable *adj_0 = body.make_temp(glsl_type::vec4_type, "adj_0"); - - body.emit(assign(adj_0, - add(sub(mul(matrix_elt(m, 1, 1), SubFactor00), - mul(matrix_elt(m, 1, 2), SubFactor01)), - mul(matrix_elt(m, 1, 3), SubFactor02)), - WRITEMASK_X)); - body.emit(assign(adj_0, neg( - add(sub(mul(matrix_elt(m, 1, 0), SubFactor00), - mul(matrix_elt(m, 1, 2), SubFactor03)), - mul(matrix_elt(m, 1, 3), SubFactor04))), - WRITEMASK_Y)); - body.emit(assign(adj_0, - add(sub(mul(matrix_elt(m, 1, 0), SubFactor01), - mul(matrix_elt(m, 1, 1), SubFactor03)), - mul(matrix_elt(m, 1, 3), SubFactor05)), - WRITEMASK_Z)); - body.emit(assign(adj_0, neg( - add(sub(mul(matrix_elt(m, 1, 0), SubFactor02), - mul(matrix_elt(m, 1, 1), SubFactor04)), - mul(matrix_elt(m, 1, 2), SubFactor05))), - WRITEMASK_W)); - - body.emit(ret(dot(array_ref(m, 0), adj_0))); - - return sig; -} - -ir_function_signature * -builtin_builder::_inverse_mat2() -{ - ir_variable *m = in_var(glsl_type::mat2_type, "m"); - MAKE_SIG(glsl_type::mat2_type, v120, 1, m); - - ir_variable *adj = body.make_temp(glsl_type::mat2_type, "adj"); - body.emit(assign(array_ref(adj, 0), matrix_elt(m, 1, 1), 1 << 0)); - body.emit(assign(array_ref(adj, 0), neg(matrix_elt(m, 0, 1)), 1 << 1)); - body.emit(assign(array_ref(adj, 1), neg(matrix_elt(m, 1, 0)), 1 << 0)); - body.emit(assign(array_ref(adj, 1), matrix_elt(m, 0, 0), 1 << 1)); - - ir_expression *det = - sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 1, 1)), - mul(matrix_elt(m, 1, 0), matrix_elt(m, 0, 1))); - - body.emit(ret(div(adj, det))); - return sig; -} - -ir_function_signature * -builtin_builder::_inverse_mat3() -{ - ir_variable *m = in_var(glsl_type::mat3_type, "m"); - MAKE_SIG(glsl_type::mat3_type, v120, 1, m); - - ir_variable *f11_22_21_12 = body.make_temp(glsl_type::float_type, "f11_22_21_12"); - ir_variable *f10_22_20_12 = body.make_temp(glsl_type::float_type, "f10_22_20_12"); - ir_variable *f10_21_20_11 = body.make_temp(glsl_type::float_type, "f10_21_20_11"); - - body.emit(assign(f11_22_21_12, - sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 2)), - mul(matrix_elt(m, 2, 1), matrix_elt(m, 1, 2))))); - body.emit(assign(f10_22_20_12, - sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 2)), - mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 2))))); - body.emit(assign(f10_21_20_11, - sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 1)), - mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 1))))); - - ir_variable *adj = body.make_temp(glsl_type::mat3_type, "adj"); - body.emit(assign(array_ref(adj, 0), f11_22_21_12, WRITEMASK_X)); - body.emit(assign(array_ref(adj, 1), neg(f10_22_20_12), WRITEMASK_X)); - body.emit(assign(array_ref(adj, 2), f10_21_20_11, WRITEMASK_X)); - - body.emit(assign(array_ref(adj, 0), neg( - sub(mul(matrix_elt(m, 0, 1), matrix_elt(m, 2, 2)), - mul(matrix_elt(m, 2, 1), matrix_elt(m, 0, 2)))), - WRITEMASK_Y)); - body.emit(assign(array_ref(adj, 1), - sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 2, 2)), - mul(matrix_elt(m, 2, 0), matrix_elt(m, 0, 2))), - WRITEMASK_Y)); - body.emit(assign(array_ref(adj, 2), neg( - sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 2, 1)), - mul(matrix_elt(m, 2, 0), matrix_elt(m, 0, 1)))), - WRITEMASK_Y)); - - body.emit(assign(array_ref(adj, 0), - sub(mul(matrix_elt(m, 0, 1), matrix_elt(m, 1, 2)), - mul(matrix_elt(m, 1, 1), matrix_elt(m, 0, 2))), - WRITEMASK_Z)); - body.emit(assign(array_ref(adj, 1), neg( - sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 1, 2)), - mul(matrix_elt(m, 1, 0), matrix_elt(m, 0, 2)))), - WRITEMASK_Z)); - body.emit(assign(array_ref(adj, 2), - sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 1, 1)), - mul(matrix_elt(m, 1, 0), matrix_elt(m, 0, 1))), - WRITEMASK_Z)); - - ir_expression *det = - add(sub(mul(matrix_elt(m, 0, 0), f11_22_21_12), - mul(matrix_elt(m, 0, 1), f10_22_20_12)), - mul(matrix_elt(m, 0, 2), f10_21_20_11)); - - body.emit(ret(div(adj, det))); - - return sig; -} - -ir_function_signature * -builtin_builder::_inverse_mat4() -{ - ir_variable *m = in_var(glsl_type::mat4_type, "m"); - MAKE_SIG(glsl_type::mat4_type, v120, 1, m); - - ir_variable *SubFactor00 = body.make_temp(glsl_type::float_type, "SubFactor00"); - ir_variable *SubFactor01 = body.make_temp(glsl_type::float_type, "SubFactor01"); - ir_variable *SubFactor02 = body.make_temp(glsl_type::float_type, "SubFactor02"); - ir_variable *SubFactor03 = body.make_temp(glsl_type::float_type, "SubFactor03"); - ir_variable *SubFactor04 = body.make_temp(glsl_type::float_type, "SubFactor04"); - ir_variable *SubFactor05 = body.make_temp(glsl_type::float_type, "SubFactor05"); - ir_variable *SubFactor06 = body.make_temp(glsl_type::float_type, "SubFactor06"); - ir_variable *SubFactor07 = body.make_temp(glsl_type::float_type, "SubFactor07"); - ir_variable *SubFactor08 = body.make_temp(glsl_type::float_type, "SubFactor08"); - ir_variable *SubFactor09 = body.make_temp(glsl_type::float_type, "SubFactor09"); - ir_variable *SubFactor10 = body.make_temp(glsl_type::float_type, "SubFactor10"); - ir_variable *SubFactor11 = body.make_temp(glsl_type::float_type, "SubFactor11"); - ir_variable *SubFactor12 = body.make_temp(glsl_type::float_type, "SubFactor12"); - ir_variable *SubFactor13 = body.make_temp(glsl_type::float_type, "SubFactor13"); - ir_variable *SubFactor14 = body.make_temp(glsl_type::float_type, "SubFactor14"); - ir_variable *SubFactor15 = body.make_temp(glsl_type::float_type, "SubFactor15"); - ir_variable *SubFactor16 = body.make_temp(glsl_type::float_type, "SubFactor16"); - ir_variable *SubFactor17 = body.make_temp(glsl_type::float_type, "SubFactor17"); - ir_variable *SubFactor18 = body.make_temp(glsl_type::float_type, "SubFactor18"); - - body.emit(assign(SubFactor00, sub(mul(matrix_elt(m, 2, 2), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 2), matrix_elt(m, 2, 3))))); - body.emit(assign(SubFactor01, sub(mul(matrix_elt(m, 2, 1), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 2, 3))))); - body.emit(assign(SubFactor02, sub(mul(matrix_elt(m, 2, 1), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 2, 2))))); - body.emit(assign(SubFactor03, sub(mul(matrix_elt(m, 2, 0), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 2, 3))))); - body.emit(assign(SubFactor04, sub(mul(matrix_elt(m, 2, 0), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 2, 2))))); - body.emit(assign(SubFactor05, sub(mul(matrix_elt(m, 2, 0), matrix_elt(m, 3, 1)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 2, 1))))); - body.emit(assign(SubFactor06, sub(mul(matrix_elt(m, 1, 2), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 2), matrix_elt(m, 1, 3))))); - body.emit(assign(SubFactor07, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 1, 3))))); - body.emit(assign(SubFactor08, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 1, 2))))); - body.emit(assign(SubFactor09, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 1, 3))))); - body.emit(assign(SubFactor10, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 1, 2))))); - body.emit(assign(SubFactor11, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 1, 3))))); - body.emit(assign(SubFactor12, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 3, 1)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 1, 1))))); - body.emit(assign(SubFactor13, sub(mul(matrix_elt(m, 1, 2), matrix_elt(m, 2, 3)), mul(matrix_elt(m, 2, 2), matrix_elt(m, 1, 3))))); - body.emit(assign(SubFactor14, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 3)), mul(matrix_elt(m, 2, 1), matrix_elt(m, 1, 3))))); - body.emit(assign(SubFactor15, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 2)), mul(matrix_elt(m, 2, 1), matrix_elt(m, 1, 2))))); - body.emit(assign(SubFactor16, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 3)), mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 3))))); - body.emit(assign(SubFactor17, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 2)), mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 2))))); - body.emit(assign(SubFactor18, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 1)), mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 1))))); - - ir_variable *adj = body.make_temp(glsl_type::mat4_type, "adj"); - body.emit(assign(array_ref(adj, 0), - add(sub(mul(matrix_elt(m, 1, 1), SubFactor00), - mul(matrix_elt(m, 1, 2), SubFactor01)), - mul(matrix_elt(m, 1, 3), SubFactor02)), - WRITEMASK_X)); - body.emit(assign(array_ref(adj, 1), neg( - add(sub(mul(matrix_elt(m, 1, 0), SubFactor00), - mul(matrix_elt(m, 1, 2), SubFactor03)), - mul(matrix_elt(m, 1, 3), SubFactor04))), - WRITEMASK_X)); - body.emit(assign(array_ref(adj, 2), - add(sub(mul(matrix_elt(m, 1, 0), SubFactor01), - mul(matrix_elt(m, 1, 1), SubFactor03)), - mul(matrix_elt(m, 1, 3), SubFactor05)), - WRITEMASK_X)); - body.emit(assign(array_ref(adj, 3), neg( - add(sub(mul(matrix_elt(m, 1, 0), SubFactor02), - mul(matrix_elt(m, 1, 1), SubFactor04)), - mul(matrix_elt(m, 1, 2), SubFactor05))), - WRITEMASK_X)); - - body.emit(assign(array_ref(adj, 0), neg( - add(sub(mul(matrix_elt(m, 0, 1), SubFactor00), - mul(matrix_elt(m, 0, 2), SubFactor01)), - mul(matrix_elt(m, 0, 3), SubFactor02))), - WRITEMASK_Y)); - body.emit(assign(array_ref(adj, 1), - add(sub(mul(matrix_elt(m, 0, 0), SubFactor00), - mul(matrix_elt(m, 0, 2), SubFactor03)), - mul(matrix_elt(m, 0, 3), SubFactor04)), - WRITEMASK_Y)); - body.emit(assign(array_ref(adj, 2), neg( - add(sub(mul(matrix_elt(m, 0, 0), SubFactor01), - mul(matrix_elt(m, 0, 1), SubFactor03)), - mul(matrix_elt(m, 0, 3), SubFactor05))), - WRITEMASK_Y)); - body.emit(assign(array_ref(adj, 3), - add(sub(mul(matrix_elt(m, 0, 0), SubFactor02), - mul(matrix_elt(m, 0, 1), SubFactor04)), - mul(matrix_elt(m, 0, 2), SubFactor05)), - WRITEMASK_Y)); - - body.emit(assign(array_ref(adj, 0), - add(sub(mul(matrix_elt(m, 0, 1), SubFactor06), - mul(matrix_elt(m, 0, 2), SubFactor07)), - mul(matrix_elt(m, 0, 3), SubFactor08)), - WRITEMASK_Z)); - body.emit(assign(array_ref(adj, 1), neg( - add(sub(mul(matrix_elt(m, 0, 0), SubFactor06), - mul(matrix_elt(m, 0, 2), SubFactor09)), - mul(matrix_elt(m, 0, 3), SubFactor10))), - WRITEMASK_Z)); - body.emit(assign(array_ref(adj, 2), - add(sub(mul(matrix_elt(m, 0, 0), SubFactor11), - mul(matrix_elt(m, 0, 1), SubFactor09)), - mul(matrix_elt(m, 0, 3), SubFactor12)), - WRITEMASK_Z)); - body.emit(assign(array_ref(adj, 3), neg( - add(sub(mul(matrix_elt(m, 0, 0), SubFactor08), - mul(matrix_elt(m, 0, 1), SubFactor10)), - mul(matrix_elt(m, 0, 2), SubFactor12))), - WRITEMASK_Z)); - - body.emit(assign(array_ref(adj, 0), neg( - add(sub(mul(matrix_elt(m, 0, 1), SubFactor13), - mul(matrix_elt(m, 0, 2), SubFactor14)), - mul(matrix_elt(m, 0, 3), SubFactor15))), - WRITEMASK_W)); - body.emit(assign(array_ref(adj, 1), - add(sub(mul(matrix_elt(m, 0, 0), SubFactor13), - mul(matrix_elt(m, 0, 2), SubFactor16)), - mul(matrix_elt(m, 0, 3), SubFactor17)), - WRITEMASK_W)); - body.emit(assign(array_ref(adj, 2), neg( - add(sub(mul(matrix_elt(m, 0, 0), SubFactor14), - mul(matrix_elt(m, 0, 1), SubFactor16)), - mul(matrix_elt(m, 0, 3), SubFactor18))), - WRITEMASK_W)); - body.emit(assign(array_ref(adj, 3), - add(sub(mul(matrix_elt(m, 0, 0), SubFactor15), - mul(matrix_elt(m, 0, 1), SubFactor17)), - mul(matrix_elt(m, 0, 2), SubFactor18)), - WRITEMASK_W)); - - ir_expression *det = - add(mul(matrix_elt(m, 0, 0), matrix_elt(adj, 0, 0)), - add(mul(matrix_elt(m, 0, 1), matrix_elt(adj, 1, 0)), - add(mul(matrix_elt(m, 0, 2), matrix_elt(adj, 2, 0)), - mul(matrix_elt(m, 0, 3), matrix_elt(adj, 3, 0))))); - - body.emit(ret(div(adj, det))); - - return sig; -} - - -ir_function_signature * -builtin_builder::_lessThan(builtin_available_predicate avail, - const glsl_type *type) -{ - return binop(ir_binop_less, avail, - glsl_type::bvec(type->vector_elements), type, type); -} - -ir_function_signature * -builtin_builder::_lessThanEqual(builtin_available_predicate avail, - const glsl_type *type) -{ - return binop(ir_binop_lequal, avail, - glsl_type::bvec(type->vector_elements), type, type); -} - -ir_function_signature * -builtin_builder::_greaterThan(builtin_available_predicate avail, - const glsl_type *type) -{ - return binop(ir_binop_greater, avail, - glsl_type::bvec(type->vector_elements), type, type); -} - -ir_function_signature * -builtin_builder::_greaterThanEqual(builtin_available_predicate avail, - const glsl_type *type) -{ - return binop(ir_binop_gequal, avail, - glsl_type::bvec(type->vector_elements), type, type); -} - -ir_function_signature * -builtin_builder::_equal(builtin_available_predicate avail, - const glsl_type *type) -{ - return binop(ir_binop_equal, avail, - glsl_type::bvec(type->vector_elements), type, type); -} - -ir_function_signature * -builtin_builder::_notEqual(builtin_available_predicate avail, - const glsl_type *type) -{ - return binop(ir_binop_nequal, avail, - glsl_type::bvec(type->vector_elements), type, type); -} - -ir_function_signature * -builtin_builder::_any(const glsl_type *type) -{ - return unop(always_available, ir_unop_any, glsl_type::bool_type, type); -} - -ir_function_signature * -builtin_builder::_all(const glsl_type *type) -{ - ir_variable *v = in_var(type, "v"); - MAKE_SIG(glsl_type::bool_type, always_available, 1, v); - - switch (type->vector_elements) { - case 2: - body.emit(ret(logic_and(swizzle_x(v), swizzle_y(v)))); - break; - case 3: - body.emit(ret(logic_and(logic_and(swizzle_x(v), swizzle_y(v)), - swizzle_z(v)))); - break; - case 4: - body.emit(ret(logic_and(logic_and(logic_and(swizzle_x(v), swizzle_y(v)), - swizzle_z(v)), - swizzle_w(v)))); - break; - } - - return sig; -} - -UNOP(not, ir_unop_logic_not, always_available) - -ir_function_signature * -builtin_builder::_textureSize(builtin_available_predicate avail, - const glsl_type *return_type, - const glsl_type *sampler_type) -{ - ir_variable *s = in_var(sampler_type, "sampler"); - /* The sampler always exists; add optional lod later. */ - MAKE_SIG(return_type, avail, 1, s); - - ir_texture *tex = new(mem_ctx) ir_texture(ir_txs); - tex->set_sampler(new(mem_ctx) ir_dereference_variable(s), return_type); - - if (ir_texture::has_lod(sampler_type)) { - ir_variable *lod = in_var(glsl_type::int_type, "lod"); - sig->parameters.push_tail(lod); - tex->lod_info.lod = var_ref(lod); - } else { - tex->lod_info.lod = imm(0u); - } - - body.emit(ret(tex)); - - return sig; -} - -ir_function_signature * -builtin_builder::_texture(ir_texture_opcode opcode, - builtin_available_predicate avail, - const glsl_type *return_type, - const glsl_type *sampler_type, - const glsl_type *coord_type, - int flags) -{ - ir_variable *s = in_var(sampler_type, "sampler"); - ir_variable *P = in_var(coord_type, "P"); - /* The sampler and coordinate always exist; add optional parameters later. */ - MAKE_SIG(return_type, avail, 2, s, P); - - ir_texture *tex = new(mem_ctx) ir_texture(opcode); - tex->set_sampler(var_ref(s), return_type); - - const int coord_size = sampler_type->coordinate_components(); - - // removed for glsl optimizer - //if (coord_size == coord_type->vector_elements) { - tex->coordinate = var_ref(P); - //} else { - // /* The incoming coordinate also has the projector or shadow comparitor, - // * so we need to swizzle those away. - // */ - // tex->coordinate = swizzle_for_size(P, coord_size); - //} - -#if 0 // removed for glsl optimizer - /* The projector is always in the last component. */ - if (flags & TEX_PROJECT) - tex->projector = swizzle(P, coord_type->vector_elements - 1, 1); - - if (sampler_type->sampler_shadow) { - if (opcode == ir_tg4) { - /* gather has refz as a separate parameter, immediately after the - * coordinate - */ - ir_variable *refz = in_var(glsl_type::float_type, "refz"); - sig->parameters.push_tail(refz); - tex->shadow_comparitor = var_ref(refz); - } else { - /* The shadow comparitor is normally in the Z component, but a few types - * have sufficiently large coordinates that it's in W. - */ - tex->shadow_comparitor = swizzle(P, MAX2(coord_size, SWIZZLE_Z), 1); - } - } -#endif // #if 0 - - if (opcode == ir_txl) { - ir_variable *lod = in_var(glsl_type::float_type, "lod"); - sig->parameters.push_tail(lod); - tex->lod_info.lod = var_ref(lod); - } else if (opcode == ir_txd) { - int grad_size = coord_size - (sampler_type->sampler_array ? 1 : 0); - ir_variable *dPdx = in_var(glsl_type::vec(grad_size), "dPdx"); - ir_variable *dPdy = in_var(glsl_type::vec(grad_size), "dPdy"); - sig->parameters.push_tail(dPdx); - sig->parameters.push_tail(dPdy); - tex->lod_info.grad.dPdx = var_ref(dPdx); - tex->lod_info.grad.dPdy = var_ref(dPdy); - } - - if (flags & (TEX_OFFSET | TEX_OFFSET_NONCONST)) { - int offset_size = coord_size - (sampler_type->sampler_array ? 1 : 0); - ir_variable *offset = - new(mem_ctx) ir_variable(glsl_type::ivec(offset_size), "offset", - (flags & TEX_OFFSET) ? ir_var_const_in : ir_var_function_in, glsl_precision_undefined); - sig->parameters.push_tail(offset); - tex->offset = var_ref(offset); - } - - if (flags & TEX_OFFSET_ARRAY) { - ir_variable *offsets = - new(mem_ctx) ir_variable(glsl_type::get_array_instance(glsl_type::ivec2_type, 4), - "offsets", ir_var_const_in, glsl_precision_undefined); - sig->parameters.push_tail(offsets); - tex->offset = var_ref(offsets); - } - - if (opcode == ir_tg4) { - if (flags & TEX_COMPONENT) { - ir_variable *component = - new(mem_ctx) ir_variable(glsl_type::int_type, "comp", ir_var_const_in, glsl_precision_undefined); - sig->parameters.push_tail(component); - tex->lod_info.component = var_ref(component); - } - else { - tex->lod_info.component = imm(0); - } - } - - /* The "bias" parameter comes /after/ the "offset" parameter, which is - * inconsistent with both textureLodOffset and textureGradOffset. - */ - if (opcode == ir_txb) { - ir_variable *bias = in_var(glsl_type::float_type, "bias"); - sig->parameters.push_tail(bias); - tex->lod_info.bias = var_ref(bias); - } - - body.emit(ret(tex)); - - return sig; -} - -ir_function_signature * -builtin_builder::_textureCubeArrayShadow() -{ - ir_variable *s = in_var(glsl_type::samplerCubeArrayShadow_type, "sampler"); - ir_variable *P = in_var(glsl_type::vec4_type, "P"); - ir_variable *compare = in_var(glsl_type::float_type, "compare"); - MAKE_SIG(glsl_type::float_type, texture_cube_map_array, 3, s, P, compare); - - ir_texture *tex = new(mem_ctx) ir_texture(ir_tex); - tex->set_sampler(var_ref(s), glsl_type::float_type); - - tex->coordinate = var_ref(P); - //tex->shadow_comparitor = var_ref(compare); //@TODO ? - - body.emit(ret(tex)); - - return sig; -} - -ir_function_signature * -builtin_builder::_texelFetch(builtin_available_predicate avail, - const glsl_type *return_type, - const glsl_type *sampler_type, - const glsl_type *coord_type, - const glsl_type *offset_type) -{ - ir_variable *s = in_var(sampler_type, "sampler"); - ir_variable *P = in_var(coord_type, "P"); - /* The sampler and coordinate always exist; add optional parameters later. */ - MAKE_SIG(return_type, avail, 2, s, P); - - ir_texture *tex = new(mem_ctx) ir_texture(ir_txf); - tex->coordinate = var_ref(P); - tex->set_sampler(var_ref(s), return_type); - - if (sampler_type->sampler_dimensionality == GLSL_SAMPLER_DIM_MS) { - ir_variable *sample = in_var(glsl_type::int_type, "sample"); - sig->parameters.push_tail(sample); - tex->lod_info.sample_index = var_ref(sample); - tex->op = ir_txf_ms; - } else if (ir_texture::has_lod(sampler_type)) { - ir_variable *lod = in_var(glsl_type::int_type, "lod"); - sig->parameters.push_tail(lod); - tex->lod_info.lod = var_ref(lod); - } else { - tex->lod_info.lod = imm(0u); - } - - if (offset_type != NULL) { - ir_variable *offset = - new(mem_ctx) ir_variable(offset_type, "offset", ir_var_const_in, glsl_precision_undefined); - sig->parameters.push_tail(offset); - tex->offset = var_ref(offset); - } - - body.emit(ret(tex)); - - return sig; -} - -ir_function_signature * -builtin_builder::_EmitVertex() -{ - MAKE_SIG(glsl_type::void_type, gs_only, 0); - - ir_rvalue *stream = new(mem_ctx) ir_constant(0, 1); - body.emit(new(mem_ctx) ir_emit_vertex(stream)); - - return sig; -} - -ir_function_signature * -builtin_builder::_EmitStreamVertex(builtin_available_predicate avail, - const glsl_type *stream_type) -{ - /* Section 8.12 (Geometry Shader Functions) of the GLSL 4.0 spec says: - * - * "Emit the current values of output variables to the current output - * primitive on stream stream. The argument to stream must be a constant - * integral expression." - */ - ir_variable *stream = - new(mem_ctx) ir_variable(stream_type, "stream", ir_var_const_in, glsl_precision_undefined); - - MAKE_SIG(glsl_type::void_type, avail, 1, stream); - - body.emit(new(mem_ctx) ir_emit_vertex(var_ref(stream))); - - return sig; -} - -ir_function_signature * -builtin_builder::_EndPrimitive() -{ - MAKE_SIG(glsl_type::void_type, gs_only, 0); - - ir_rvalue *stream = new(mem_ctx) ir_constant(0, 1); - body.emit(new(mem_ctx) ir_end_primitive(stream)); - - return sig; -} - -ir_function_signature * -builtin_builder::_EndStreamPrimitive(builtin_available_predicate avail, - const glsl_type *stream_type) -{ - /* Section 8.12 (Geometry Shader Functions) of the GLSL 4.0 spec says: - * - * "Completes the current output primitive on stream stream and starts - * a new one. The argument to stream must be a constant integral - * expression." - */ - ir_variable *stream = - new(mem_ctx) ir_variable(stream_type, "stream", ir_var_const_in, glsl_precision_undefined); - - MAKE_SIG(glsl_type::void_type, avail, 1, stream); - - body.emit(new(mem_ctx) ir_end_primitive(var_ref(stream))); - - return sig; -} - -ir_function_signature * -builtin_builder::_textureQueryLod(const glsl_type *sampler_type, - const glsl_type *coord_type) -{ - ir_variable *s = in_var(sampler_type, "sampler"); - ir_variable *coord = in_var(coord_type, "coord"); - /* The sampler and coordinate always exist; add optional parameters later. */ - MAKE_SIG(glsl_type::vec2_type, texture_query_lod, 2, s, coord); - - ir_texture *tex = new(mem_ctx) ir_texture(ir_lod); - tex->coordinate = var_ref(coord); - tex->set_sampler(var_ref(s), glsl_type::vec2_type); - - body.emit(ret(tex)); - - return sig; -} - -ir_function_signature * -builtin_builder::_textureQueryLevels(const glsl_type *sampler_type) -{ - ir_variable *s = in_var(sampler_type, "sampler"); - const glsl_type *return_type = glsl_type::int_type; - MAKE_SIG(return_type, texture_query_levels, 1, s); - - ir_texture *tex = new(mem_ctx) ir_texture(ir_query_levels); - tex->set_sampler(var_ref(s), return_type); - - body.emit(ret(tex)); - - return sig; -} - -UNOP(dFdx, ir_unop_dFdx, fs_oes_derivatives) -UNOP(dFdxCoarse, ir_unop_dFdx_coarse, fs_derivative_control) -UNOP(dFdxFine, ir_unop_dFdx_fine, fs_derivative_control) -UNOP(dFdy, ir_unop_dFdy, fs_oes_derivatives) -UNOP(dFdyCoarse, ir_unop_dFdy_coarse, fs_derivative_control) -UNOP(dFdyFine, ir_unop_dFdy_fine, fs_derivative_control) - -ir_function_signature * -builtin_builder::_fwidth(const glsl_type *type) -{ - ir_variable *p = in_var(type, "p"); - MAKE_SIG(type, fs_oes_derivatives, 1, p); - - body.emit(ret(add(abs(expr(ir_unop_dFdx, p)), abs(expr(ir_unop_dFdy, p))))); - - return sig; -} - -ir_function_signature * -builtin_builder::_fwidthCoarse(const glsl_type *type) -{ - ir_variable *p = in_var(type, "p"); - MAKE_SIG(type, fs_derivative_control, 1, p); - - body.emit(ret(add(abs(expr(ir_unop_dFdx_coarse, p)), - abs(expr(ir_unop_dFdy_coarse, p))))); - - return sig; -} - -ir_function_signature * -builtin_builder::_fwidthFine(const glsl_type *type) -{ - ir_variable *p = in_var(type, "p"); - MAKE_SIG(type, fs_derivative_control, 1, p); - - body.emit(ret(add(abs(expr(ir_unop_dFdx_fine, p)), - abs(expr(ir_unop_dFdy_fine, p))))); - - return sig; -} - -ir_function_signature * -builtin_builder::_noise1(const glsl_type *type) -{ - return unop(v110, ir_unop_noise, glsl_type::float_type, type); -} - -ir_function_signature * -builtin_builder::_noise2(const glsl_type *type) -{ - ir_variable *p = in_var(type, "p"); - MAKE_SIG(glsl_type::vec2_type, v110, 1, p); - - ir_constant_data b_offset; - b_offset.f[0] = 601.0f; - b_offset.f[1] = 313.0f; - b_offset.f[2] = 29.0f; - b_offset.f[3] = 277.0f; - - ir_variable *a = body.make_temp(glsl_type::float_type, "a"); - ir_variable *b = body.make_temp(glsl_type::float_type, "b"); - ir_variable *t = body.make_temp(glsl_type::vec2_type, "t"); - body.emit(assign(a, expr(ir_unop_noise, p))); - body.emit(assign(b, expr(ir_unop_noise, add(p, imm(type, b_offset))))); - body.emit(assign(t, a, WRITEMASK_X)); - body.emit(assign(t, b, WRITEMASK_Y)); - body.emit(ret(t)); - - return sig; -} - -ir_function_signature * -builtin_builder::_noise3(const glsl_type *type) -{ - ir_variable *p = in_var(type, "p"); - MAKE_SIG(glsl_type::vec3_type, v110, 1, p); - - ir_constant_data b_offset; - b_offset.f[0] = 601.0f; - b_offset.f[1] = 313.0f; - b_offset.f[2] = 29.0f; - b_offset.f[3] = 277.0f; - - ir_constant_data c_offset; - c_offset.f[0] = 1559.0f; - c_offset.f[1] = 113.0f; - c_offset.f[2] = 1861.0f; - c_offset.f[3] = 797.0f; - - ir_variable *a = body.make_temp(glsl_type::float_type, "a"); - ir_variable *b = body.make_temp(glsl_type::float_type, "b"); - ir_variable *c = body.make_temp(glsl_type::float_type, "c"); - ir_variable *t = body.make_temp(glsl_type::vec3_type, "t"); - body.emit(assign(a, expr(ir_unop_noise, p))); - body.emit(assign(b, expr(ir_unop_noise, add(p, imm(type, b_offset))))); - body.emit(assign(c, expr(ir_unop_noise, add(p, imm(type, c_offset))))); - body.emit(assign(t, a, WRITEMASK_X)); - body.emit(assign(t, b, WRITEMASK_Y)); - body.emit(assign(t, c, WRITEMASK_Z)); - body.emit(ret(t)); - - return sig; -} - -ir_function_signature * -builtin_builder::_noise4(const glsl_type *type) -{ - ir_variable *p = in_var(type, "p"); - MAKE_SIG(glsl_type::vec4_type, v110, 1, p); - - ir_variable *_p = body.make_temp(type, "_p"); - - ir_constant_data p_offset; - p_offset.f[0] = 1559.0f; - p_offset.f[1] = 113.0f; - p_offset.f[2] = 1861.0f; - p_offset.f[3] = 797.0f; - - body.emit(assign(_p, add(p, imm(type, p_offset)))); - - ir_constant_data offset; - offset.f[0] = 601.0f; - offset.f[1] = 313.0f; - offset.f[2] = 29.0f; - offset.f[3] = 277.0f; - - ir_variable *a = body.make_temp(glsl_type::float_type, "a"); - ir_variable *b = body.make_temp(glsl_type::float_type, "b"); - ir_variable *c = body.make_temp(glsl_type::float_type, "c"); - ir_variable *d = body.make_temp(glsl_type::float_type, "d"); - ir_variable *t = body.make_temp(glsl_type::vec4_type, "t"); - body.emit(assign(a, expr(ir_unop_noise, p))); - body.emit(assign(b, expr(ir_unop_noise, add(p, imm(type, offset))))); - body.emit(assign(c, expr(ir_unop_noise, _p))); - body.emit(assign(d, expr(ir_unop_noise, add(_p, imm(type, offset))))); - body.emit(assign(t, a, WRITEMASK_X)); - body.emit(assign(t, b, WRITEMASK_Y)); - body.emit(assign(t, c, WRITEMASK_Z)); - body.emit(assign(t, d, WRITEMASK_W)); - body.emit(ret(t)); - - return sig; -} - -ir_function_signature * -builtin_builder::_bitfieldExtract(const glsl_type *type) -{ - ir_variable *value = in_var(type, "value"); - ir_variable *offset = in_var(glsl_type::int_type, "offset"); - ir_variable *bits = in_var(glsl_type::int_type, "bits"); - MAKE_SIG(type, gpu_shader5, 3, value, offset, bits); - - body.emit(ret(expr(ir_triop_bitfield_extract, value, offset, bits))); - - return sig; -} - -ir_function_signature * -builtin_builder::_bitfieldInsert(const glsl_type *type) -{ - ir_variable *base = in_var(type, "base"); - ir_variable *insert = in_var(type, "insert"); - ir_variable *offset = in_var(glsl_type::int_type, "offset"); - ir_variable *bits = in_var(glsl_type::int_type, "bits"); - MAKE_SIG(type, gpu_shader5, 4, base, insert, offset, bits); - - body.emit(ret(bitfield_insert(base, insert, offset, bits))); - - return sig; -} - -UNOP(bitfieldReverse, ir_unop_bitfield_reverse, gpu_shader5) - -ir_function_signature * -builtin_builder::_bitCount(const glsl_type *type) -{ - return unop(gpu_shader5, ir_unop_bit_count, - glsl_type::ivec(type->vector_elements), type); -} - -ir_function_signature * -builtin_builder::_findLSB(const glsl_type *type) -{ - return unop(gpu_shader5, ir_unop_find_lsb, - glsl_type::ivec(type->vector_elements), type); -} - -ir_function_signature * -builtin_builder::_findMSB(const glsl_type *type) -{ - return unop(gpu_shader5, ir_unop_find_msb, - glsl_type::ivec(type->vector_elements), type); -} - -ir_function_signature * -builtin_builder::_fma(const glsl_type *type) -{ - ir_variable *a = in_var(type, "a"); - ir_variable *b = in_var(type, "b"); - ir_variable *c = in_var(type, "c"); - MAKE_SIG(type, gpu_shader5, 3, a, b, c); - - body.emit(ret(ir_builder::fma(a, b, c))); - - return sig; -} - -ir_function_signature * -builtin_builder::_ldexp(const glsl_type *x_type, const glsl_type *exp_type) -{ - return binop(ir_binop_ldexp, gpu_shader5, x_type, x_type, exp_type); -} - -ir_function_signature * -builtin_builder::_frexp(const glsl_type *x_type, const glsl_type *exp_type) -{ - ir_variable *x = in_var(x_type, "x"); - ir_variable *exponent = out_var(exp_type, "exp"); - MAKE_SIG(x_type, gpu_shader5, 2, x, exponent); - - const unsigned vec_elem = x_type->vector_elements; - const glsl_type *bvec = glsl_type::get_instance(GLSL_TYPE_BOOL, vec_elem, 1); - const glsl_type *uvec = glsl_type::get_instance(GLSL_TYPE_UINT, vec_elem, 1); - - /* Single-precision floating-point values are stored as - * 1 sign bit; - * 8 exponent bits; - * 23 mantissa bits. - * - * An exponent shift of 23 will shift the mantissa out, leaving only the - * exponent and sign bit (which itself may be zero, if the absolute value - * was taken before the bitcast and shift. - */ - ir_constant *exponent_shift = imm(23); - ir_constant *exponent_bias = imm(-126, vec_elem); - - ir_constant *sign_mantissa_mask = imm(0x807fffffu, vec_elem); - - /* Exponent of floating-point values in the range [0.5, 1.0). */ - ir_constant *exponent_value = imm(0x3f000000u, vec_elem); - - ir_variable *is_not_zero = body.make_temp(bvec, "is_not_zero"); - body.emit(assign(is_not_zero, nequal(abs(x), imm(0.0f, vec_elem)))); - - /* Since abs(x) ensures that the sign bit is zero, we don't need to bitcast - * to unsigned integers to ensure that 1 bits aren't shifted in. - */ - body.emit(assign(exponent, rshift(bitcast_f2i(abs(x)), exponent_shift))); - body.emit(assign(exponent, add(exponent, csel(is_not_zero, exponent_bias, - imm(0, vec_elem))))); - - ir_variable *bits = body.make_temp(uvec, "bits"); - body.emit(assign(bits, bitcast_f2u(x))); - body.emit(assign(bits, bit_and(bits, sign_mantissa_mask))); - body.emit(assign(bits, bit_or(bits, csel(is_not_zero, exponent_value, - imm(0u, vec_elem))))); - body.emit(ret(bitcast_u2f(bits))); - - return sig; -} - -ir_function_signature * -builtin_builder::_uaddCarry(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - ir_variable *y = in_var(type, "y"); - ir_variable *carry = out_var(type, "carry"); - MAKE_SIG(type, gpu_shader5, 3, x, y, carry); - - body.emit(assign(carry, ir_builder::carry(x, y))); - body.emit(ret(add(x, y))); - - return sig; -} - -ir_function_signature * -builtin_builder::_usubBorrow(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - ir_variable *y = in_var(type, "y"); - ir_variable *borrow = out_var(type, "borrow"); - MAKE_SIG(type, gpu_shader5, 3, x, y, borrow); - - body.emit(assign(borrow, ir_builder::borrow(x, y))); - body.emit(ret(sub(x, y))); - - return sig; -} - -/** - * For both imulExtended() and umulExtended() built-ins. - */ -ir_function_signature * -builtin_builder::_mulExtended(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - ir_variable *y = in_var(type, "y"); - ir_variable *msb = out_var(type, "msb"); - ir_variable *lsb = out_var(type, "lsb"); - MAKE_SIG(glsl_type::void_type, gpu_shader5, 4, x, y, msb, lsb); - - body.emit(assign(msb, imul_high(x, y))); - body.emit(assign(lsb, mul(x, y))); - - return sig; -} - -ir_function_signature * -builtin_builder::_interpolateAtCentroid(const glsl_type *type) -{ - ir_variable *interpolant = in_var(type, "interpolant"); - interpolant->data.must_be_shader_input = 1; - MAKE_SIG(type, fs_gpu_shader5, 1, interpolant); - - body.emit(ret(interpolate_at_centroid(interpolant))); - - return sig; -} - -ir_function_signature * -builtin_builder::_interpolateAtOffset(const glsl_type *type) -{ - ir_variable *interpolant = in_var(type, "interpolant"); - interpolant->data.must_be_shader_input = 1; - ir_variable *offset = in_var(glsl_type::vec2_type, "offset"); - MAKE_SIG(type, fs_gpu_shader5, 2, interpolant, offset); - - body.emit(ret(interpolate_at_offset(interpolant, offset))); - - return sig; -} - -ir_function_signature * -builtin_builder::_interpolateAtSample(const glsl_type *type) -{ - ir_variable *interpolant = in_var(type, "interpolant"); - interpolant->data.must_be_shader_input = 1; - ir_variable *sample_num = in_var(glsl_type::int_type, "sample_num"); - MAKE_SIG(type, fs_gpu_shader5, 2, interpolant, sample_num); - - body.emit(ret(interpolate_at_sample(interpolant, sample_num))); - - return sig; -} - -ir_function_signature * -builtin_builder::_atomic_intrinsic(builtin_available_predicate avail) -{ - ir_variable *counter = in_var(glsl_type::atomic_uint_type, "counter"); - MAKE_INTRINSIC(glsl_type::uint_type, avail, 1, counter); - return sig; -} - -ir_function_signature * -builtin_builder::_atomic_op(const char *intrinsic, - builtin_available_predicate avail) -{ - ir_variable *counter = in_var(glsl_type::atomic_uint_type, "atomic_counter"); - MAKE_SIG(glsl_type::uint_type, avail, 1, counter); - - ir_variable *retval = body.make_temp(glsl_type::uint_type, "atomic_retval"); - body.emit(call(shader->symbols->get_function(intrinsic), retval, - sig->parameters)); - body.emit(ret(retval)); - return sig; -} - -ir_function_signature * -builtin_builder::_min3(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - ir_variable *y = in_var(type, "y"); - ir_variable *z = in_var(type, "z"); - MAKE_SIG(type, shader_trinary_minmax, 3, x, y, z); - - ir_expression *min3 = min2(x, min2(y,z)); - body.emit(ret(min3)); - - return sig; -} - -ir_function_signature * -builtin_builder::_max3(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - ir_variable *y = in_var(type, "y"); - ir_variable *z = in_var(type, "z"); - MAKE_SIG(type, shader_trinary_minmax, 3, x, y, z); - - ir_expression *max3 = max2(x, max2(y,z)); - body.emit(ret(max3)); - - return sig; -} - -ir_function_signature * -builtin_builder::_mid3(const glsl_type *type) -{ - ir_variable *x = in_var(type, "x"); - ir_variable *y = in_var(type, "y"); - ir_variable *z = in_var(type, "z"); - MAKE_SIG(type, shader_trinary_minmax, 3, x, y, z); - - ir_expression *mid3 = max2(min2(x, y), max2(min2(x, z), min2(y, z))); - body.emit(ret(mid3)); - - return sig; -} - -ir_function_signature * -builtin_builder::_image_prototype(const glsl_type *image_type, - const char *intrinsic_name, - unsigned num_arguments, - unsigned flags) -{ - const glsl_type *data_type = glsl_type::get_instance( - image_type->sampler_type, - (flags & IMAGE_FUNCTION_HAS_VECTOR_DATA_TYPE ? 4 : 1), - 1); - const glsl_type *ret_type = (flags & IMAGE_FUNCTION_RETURNS_VOID ? - glsl_type::void_type : data_type); - - /* Addressing arguments that are always present. */ - ir_variable *image = in_var(image_type, "image"); - ir_variable *coord = in_var( - glsl_type::ivec(image_type->coordinate_components()), "coord"); - - ir_function_signature *sig = new_sig( - ret_type, shader_image_load_store, 2, image, coord); - - /* Sample index for multisample images. */ - if (image_type->sampler_dimensionality == GLSL_SAMPLER_DIM_MS) - sig->parameters.push_tail(in_var(glsl_type::int_type, "sample")); - - /* Data arguments. */ - for (unsigned i = 0; i < num_arguments; ++i) { - char *arg_name = ralloc_asprintf(NULL, "arg%d", i); - sig->parameters.push_tail(in_var(data_type, arg_name)); - ralloc_free(arg_name); - } - - /* Set the maximal set of qualifiers allowed for this image - * built-in. Function calls with arguments having fewer - * qualifiers than present in the prototype are allowed by the - * spec, but not with more, i.e. this will make the compiler - * accept everything that needs to be accepted, and reject cases - * like loads from write-only or stores to read-only images. - */ - image->data.image_read_only = (flags & IMAGE_FUNCTION_READ_ONLY) != 0; - image->data.image_write_only = (flags & IMAGE_FUNCTION_WRITE_ONLY) != 0; - image->data.image_coherent = true; - image->data.image_volatile = true; - image->data.image_restrict = true; - - return sig; -} - -ir_function_signature * -builtin_builder::_image(const glsl_type *image_type, - const char *intrinsic_name, - unsigned num_arguments, - unsigned flags) -{ - ir_function_signature *sig = _image_prototype(image_type, intrinsic_name, - num_arguments, flags); - - if (flags & IMAGE_FUNCTION_EMIT_STUB) { - ir_factory body(&sig->body, mem_ctx); - ir_function *f = shader->symbols->get_function(intrinsic_name); - - if (flags & IMAGE_FUNCTION_RETURNS_VOID) { - body.emit(call(f, NULL, sig->parameters)); - } else { - ir_variable *ret_val = - body.make_temp(sig->return_type, "_ret_val"); - body.emit(call(f, ret_val, sig->parameters)); - body.emit(ret(ret_val)); - } - - sig->is_defined = true; - - } else { - sig->is_intrinsic = true; - } - - return sig; -} - -ir_function_signature * -builtin_builder::_memory_barrier_intrinsic(builtin_available_predicate avail) -{ - MAKE_INTRINSIC(glsl_type::void_type, avail, 0); - return sig; -} - -ir_function_signature * -builtin_builder::_memory_barrier(builtin_available_predicate avail) -{ - MAKE_SIG(glsl_type::void_type, avail, 0); - body.emit(call(shader->symbols->get_function("__intrinsic_memory_barrier"), - NULL, sig->parameters)); - return sig; -} - -/** @} */ - -/******************************************************************************/ - -//@TODO: implement -typedef int mtx_t; -#define _MTX_INITIALIZER_NP 0 -#define mtx_lock(name) -#define mtx_unlock(name) - - -/* The singleton instance of builtin_builder. */ -static builtin_builder builtins; -static mtx_t builtins_lock = _MTX_INITIALIZER_NP; - -/** - * External API (exposing the built-in module to the rest of the compiler): - * @{ - */ -void -_mesa_glsl_initialize_builtin_functions() -{ - mtx_lock(&builtins_lock); - builtins.initialize(); - mtx_unlock(&builtins_lock); -} - -void -_mesa_glsl_release_builtin_functions() -{ - mtx_lock(&builtins_lock); - builtins.release(); - mtx_unlock(&builtins_lock); -} - -ir_function_signature * -_mesa_glsl_find_builtin_function(_mesa_glsl_parse_state *state, - const char *name, exec_list *actual_parameters) -{ - ir_function_signature * s; - mtx_lock(&builtins_lock); - s = builtins.find(state, name, actual_parameters); - mtx_unlock(&builtins_lock); - return s; -} - -gl_shader * -_mesa_glsl_get_builtin_function_shader() -{ - return builtins.shader; -} - -/** @} */ diff --git a/3rdparty/glsl-optimizer/src/glsl/builtin_type_macros.h b/3rdparty/glsl-optimizer/src/glsl/builtin_type_macros.h deleted file mode 100644 index 236e1ce8c..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/builtin_type_macros.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright © 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file builtin_type_macros.h - * - * This contains definitions for all GLSL built-in types, regardless of what - * language version or extension might provide them. - */ - -#include "glsl_types.h" - -DECL_TYPE(error, GL_INVALID_ENUM, GLSL_TYPE_ERROR, 0, 0) -DECL_TYPE(void, GL_INVALID_ENUM, GLSL_TYPE_VOID, 0, 0) - -DECL_TYPE(bool, GL_BOOL, GLSL_TYPE_BOOL, 1, 1) -DECL_TYPE(bvec2, GL_BOOL_VEC2, GLSL_TYPE_BOOL, 2, 1) -DECL_TYPE(bvec3, GL_BOOL_VEC3, GLSL_TYPE_BOOL, 3, 1) -DECL_TYPE(bvec4, GL_BOOL_VEC4, GLSL_TYPE_BOOL, 4, 1) - -DECL_TYPE(int, GL_INT, GLSL_TYPE_INT, 1, 1) -DECL_TYPE(ivec2, GL_INT_VEC2, GLSL_TYPE_INT, 2, 1) -DECL_TYPE(ivec3, GL_INT_VEC3, GLSL_TYPE_INT, 3, 1) -DECL_TYPE(ivec4, GL_INT_VEC4, GLSL_TYPE_INT, 4, 1) - -DECL_TYPE(uint, GL_UNSIGNED_INT, GLSL_TYPE_UINT, 1, 1) -DECL_TYPE(uvec2, GL_UNSIGNED_INT_VEC2, GLSL_TYPE_UINT, 2, 1) -DECL_TYPE(uvec3, GL_UNSIGNED_INT_VEC3, GLSL_TYPE_UINT, 3, 1) -DECL_TYPE(uvec4, GL_UNSIGNED_INT_VEC4, GLSL_TYPE_UINT, 4, 1) - -DECL_TYPE(float, GL_FLOAT, GLSL_TYPE_FLOAT, 1, 1) -DECL_TYPE(vec2, GL_FLOAT_VEC2, GLSL_TYPE_FLOAT, 2, 1) -DECL_TYPE(vec3, GL_FLOAT_VEC3, GLSL_TYPE_FLOAT, 3, 1) -DECL_TYPE(vec4, GL_FLOAT_VEC4, GLSL_TYPE_FLOAT, 4, 1) - -DECL_TYPE(mat2, GL_FLOAT_MAT2, GLSL_TYPE_FLOAT, 2, 2) -DECL_TYPE(mat3, GL_FLOAT_MAT3, GLSL_TYPE_FLOAT, 3, 3) -DECL_TYPE(mat4, GL_FLOAT_MAT4, GLSL_TYPE_FLOAT, 4, 4) - -DECL_TYPE(mat2x3, GL_FLOAT_MAT2x3, GLSL_TYPE_FLOAT, 3, 2) -DECL_TYPE(mat2x4, GL_FLOAT_MAT2x4, GLSL_TYPE_FLOAT, 4, 2) -DECL_TYPE(mat3x2, GL_FLOAT_MAT3x2, GLSL_TYPE_FLOAT, 2, 3) -DECL_TYPE(mat3x4, GL_FLOAT_MAT3x4, GLSL_TYPE_FLOAT, 4, 3) -DECL_TYPE(mat4x2, GL_FLOAT_MAT4x2, GLSL_TYPE_FLOAT, 2, 4) -DECL_TYPE(mat4x3, GL_FLOAT_MAT4x3, GLSL_TYPE_FLOAT, 3, 4) - -DECL_TYPE(sampler1D, GL_SAMPLER_1D, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_1D, 0, 0, GLSL_TYPE_FLOAT) -DECL_TYPE(sampler2D, GL_SAMPLER_2D, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_2D, 0, 0, GLSL_TYPE_FLOAT) -DECL_TYPE(sampler3D, GL_SAMPLER_3D, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_3D, 0, 0, GLSL_TYPE_FLOAT) -DECL_TYPE(samplerCube, GL_SAMPLER_CUBE, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_CUBE, 0, 0, GLSL_TYPE_FLOAT) -DECL_TYPE(sampler1DArray, GL_SAMPLER_1D_ARRAY, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_1D, 0, 1, GLSL_TYPE_FLOAT) -DECL_TYPE(sampler2DArray, GL_SAMPLER_2D_ARRAY, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_2D, 0, 1, GLSL_TYPE_FLOAT) -DECL_TYPE(samplerCubeArray, GL_SAMPLER_CUBE_MAP_ARRAY, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_CUBE, 0, 1, GLSL_TYPE_FLOAT) -DECL_TYPE(sampler2DRect, GL_SAMPLER_2D_RECT, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_RECT, 0, 0, GLSL_TYPE_FLOAT) -DECL_TYPE(samplerBuffer, GL_SAMPLER_BUFFER, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_BUF, 0, 0, GLSL_TYPE_FLOAT) -DECL_TYPE(sampler2DMS, GL_SAMPLER_2D_MULTISAMPLE, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_MS, 0, 0, GLSL_TYPE_FLOAT) -DECL_TYPE(sampler2DMSArray, GL_SAMPLER_2D_MULTISAMPLE_ARRAY, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_MS, 0, 1, GLSL_TYPE_FLOAT) - -DECL_TYPE(isampler1D, GL_INT_SAMPLER_1D, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_1D, 0, 0, GLSL_TYPE_INT) -DECL_TYPE(isampler2D, GL_INT_SAMPLER_2D, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_2D, 0, 0, GLSL_TYPE_INT) -DECL_TYPE(isampler3D, GL_INT_SAMPLER_3D, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_3D, 0, 0, GLSL_TYPE_INT) -DECL_TYPE(isamplerCube, GL_INT_SAMPLER_CUBE, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_CUBE, 0, 0, GLSL_TYPE_INT) -DECL_TYPE(isampler1DArray, GL_INT_SAMPLER_1D_ARRAY, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_1D, 0, 1, GLSL_TYPE_INT) -DECL_TYPE(isampler2DArray, GL_INT_SAMPLER_2D_ARRAY, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_2D, 0, 1, GLSL_TYPE_INT) -DECL_TYPE(isamplerCubeArray, GL_INT_SAMPLER_CUBE_MAP_ARRAY, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_CUBE, 0, 1, GLSL_TYPE_INT) -DECL_TYPE(isampler2DRect, GL_INT_SAMPLER_2D_RECT, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_RECT, 0, 0, GLSL_TYPE_INT) -DECL_TYPE(isamplerBuffer, GL_INT_SAMPLER_BUFFER, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_BUF, 0, 0, GLSL_TYPE_INT) -DECL_TYPE(isampler2DMS, GL_INT_SAMPLER_2D_MULTISAMPLE, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_MS, 0, 0, GLSL_TYPE_INT) -DECL_TYPE(isampler2DMSArray, GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_MS, 0, 1, GLSL_TYPE_INT) - -DECL_TYPE(usampler1D, GL_UNSIGNED_INT_SAMPLER_1D, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_1D, 0, 0, GLSL_TYPE_UINT) -DECL_TYPE(usampler2D, GL_UNSIGNED_INT_SAMPLER_2D, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_2D, 0, 0, GLSL_TYPE_UINT) -DECL_TYPE(usampler3D, GL_UNSIGNED_INT_SAMPLER_3D, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_3D, 0, 0, GLSL_TYPE_UINT) -DECL_TYPE(usamplerCube, GL_UNSIGNED_INT_SAMPLER_CUBE, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_CUBE, 0, 0, GLSL_TYPE_UINT) -DECL_TYPE(usampler1DArray, GL_UNSIGNED_INT_SAMPLER_1D_ARRAY, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_1D, 0, 1, GLSL_TYPE_UINT) -DECL_TYPE(usampler2DArray, GL_UNSIGNED_INT_SAMPLER_2D_ARRAY, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_2D, 0, 1, GLSL_TYPE_UINT) -DECL_TYPE(usamplerCubeArray, GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_CUBE, 0, 1, GLSL_TYPE_UINT) -DECL_TYPE(usampler2DRect, GL_UNSIGNED_INT_SAMPLER_2D_RECT, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_RECT, 0, 0, GLSL_TYPE_UINT) -DECL_TYPE(usamplerBuffer, GL_UNSIGNED_INT_SAMPLER_BUFFER, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_BUF, 0, 0, GLSL_TYPE_UINT) -DECL_TYPE(usampler2DMS, GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_MS, 0, 0, GLSL_TYPE_UINT) -DECL_TYPE(usampler2DMSArray, GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_MS, 0, 1, GLSL_TYPE_UINT) - -DECL_TYPE(sampler1DShadow, GL_SAMPLER_1D_SHADOW, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_1D, 1, 0, GLSL_TYPE_FLOAT) -DECL_TYPE(sampler2DShadow, GL_SAMPLER_2D_SHADOW, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_2D, 1, 0, GLSL_TYPE_FLOAT) -DECL_TYPE(samplerCubeShadow, GL_SAMPLER_CUBE_SHADOW, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_CUBE, 1, 0, GLSL_TYPE_FLOAT) -DECL_TYPE(sampler1DArrayShadow, GL_SAMPLER_1D_ARRAY_SHADOW, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_1D, 1, 1, GLSL_TYPE_FLOAT) -DECL_TYPE(sampler2DArrayShadow, GL_SAMPLER_2D_ARRAY_SHADOW, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_2D, 1, 1, GLSL_TYPE_FLOAT) -DECL_TYPE(samplerCubeArrayShadow, GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_CUBE, 1, 1, GLSL_TYPE_FLOAT) -DECL_TYPE(sampler2DRectShadow, GL_SAMPLER_2D_RECT_SHADOW, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_RECT, 1, 0, GLSL_TYPE_FLOAT) - -DECL_TYPE(samplerExternalOES, GL_SAMPLER_EXTERNAL_OES, GLSL_TYPE_SAMPLER, GLSL_SAMPLER_DIM_EXTERNAL, 0, 0, GLSL_TYPE_FLOAT) - -DECL_TYPE(image1D, GL_IMAGE_1D, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_1D, 0, 0, GLSL_TYPE_FLOAT); -DECL_TYPE(image2D, GL_IMAGE_2D, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_2D, 0, 0, GLSL_TYPE_FLOAT); -DECL_TYPE(image3D, GL_IMAGE_3D, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_3D, 0, 0, GLSL_TYPE_FLOAT); -DECL_TYPE(image2DRect, GL_IMAGE_2D_RECT, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_RECT, 0, 0, GLSL_TYPE_FLOAT); -DECL_TYPE(imageCube, GL_IMAGE_CUBE, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_CUBE, 0, 0, GLSL_TYPE_FLOAT); -DECL_TYPE(imageBuffer, GL_IMAGE_BUFFER, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_BUF, 0, 0, GLSL_TYPE_FLOAT); -DECL_TYPE(image1DArray, GL_IMAGE_1D_ARRAY, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_1D, 0, 1, GLSL_TYPE_FLOAT); -DECL_TYPE(image2DArray, GL_IMAGE_2D_ARRAY, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_2D, 0, 1, GLSL_TYPE_FLOAT); -DECL_TYPE(imageCubeArray, GL_IMAGE_CUBE_MAP_ARRAY, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_CUBE, 0, 1, GLSL_TYPE_FLOAT); -DECL_TYPE(image2DMS, GL_IMAGE_2D_MULTISAMPLE, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_MS, 0, 0, GLSL_TYPE_FLOAT); -DECL_TYPE(image2DMSArray, GL_IMAGE_2D_MULTISAMPLE_ARRAY, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_MS, 0, 1, GLSL_TYPE_FLOAT); -DECL_TYPE(iimage1D, GL_INT_IMAGE_1D, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_1D, 0, 0, GLSL_TYPE_INT); -DECL_TYPE(iimage2D, GL_INT_IMAGE_2D, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_2D, 0, 0, GLSL_TYPE_INT); -DECL_TYPE(iimage3D, GL_INT_IMAGE_3D, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_3D, 0, 0, GLSL_TYPE_INT); -DECL_TYPE(iimage2DRect, GL_INT_IMAGE_2D_RECT, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_RECT, 0, 0, GLSL_TYPE_INT); -DECL_TYPE(iimageCube, GL_INT_IMAGE_CUBE, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_CUBE, 0, 0, GLSL_TYPE_INT); -DECL_TYPE(iimageBuffer, GL_INT_IMAGE_BUFFER, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_BUF, 0, 0, GLSL_TYPE_INT); -DECL_TYPE(iimage1DArray, GL_INT_IMAGE_1D_ARRAY, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_1D, 0, 1, GLSL_TYPE_INT); -DECL_TYPE(iimage2DArray, GL_INT_IMAGE_2D_ARRAY, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_2D, 0, 1, GLSL_TYPE_INT); -DECL_TYPE(iimageCubeArray, GL_INT_IMAGE_CUBE_MAP_ARRAY, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_CUBE, 0, 1, GLSL_TYPE_INT); -DECL_TYPE(iimage2DMS, GL_INT_IMAGE_2D_MULTISAMPLE, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_MS, 0, 0, GLSL_TYPE_INT); -DECL_TYPE(iimage2DMSArray, GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_MS, 0, 1, GLSL_TYPE_INT); -DECL_TYPE(uimage1D, GL_UNSIGNED_INT_IMAGE_1D, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_1D, 0, 0, GLSL_TYPE_UINT); -DECL_TYPE(uimage2D, GL_UNSIGNED_INT_IMAGE_2D, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_2D, 0, 0, GLSL_TYPE_UINT); -DECL_TYPE(uimage3D, GL_UNSIGNED_INT_IMAGE_3D, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_3D, 0, 0, GLSL_TYPE_UINT); -DECL_TYPE(uimage2DRect, GL_UNSIGNED_INT_IMAGE_2D_RECT, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_RECT, 0, 0, GLSL_TYPE_UINT); -DECL_TYPE(uimageCube, GL_UNSIGNED_INT_IMAGE_CUBE, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_CUBE, 0, 0, GLSL_TYPE_UINT); -DECL_TYPE(uimageBuffer, GL_UNSIGNED_INT_IMAGE_BUFFER, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_BUF, 0, 0, GLSL_TYPE_UINT); -DECL_TYPE(uimage1DArray, GL_UNSIGNED_INT_IMAGE_1D_ARRAY, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_1D, 0, 1, GLSL_TYPE_UINT); -DECL_TYPE(uimage2DArray, GL_UNSIGNED_INT_IMAGE_2D_ARRAY, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_2D, 0, 1, GLSL_TYPE_UINT); -DECL_TYPE(uimageCubeArray, GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_CUBE, 0, 1, GLSL_TYPE_UINT); -DECL_TYPE(uimage2DMS, GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_MS, 0, 0, GLSL_TYPE_UINT); -DECL_TYPE(uimage2DMSArray, GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY, GLSL_TYPE_IMAGE, GLSL_SAMPLER_DIM_MS, 0, 1, GLSL_TYPE_UINT); - -DECL_TYPE(atomic_uint, GL_UNSIGNED_INT_ATOMIC_COUNTER, GLSL_TYPE_ATOMIC_UINT, 1, 1) - -STRUCT_TYPE(gl_DepthRangeParameters) -STRUCT_TYPE(gl_PointParameters) -STRUCT_TYPE(gl_MaterialParameters) -STRUCT_TYPE(gl_LightSourceParameters) -STRUCT_TYPE(gl_LightModelParameters) -STRUCT_TYPE(gl_LightModelProducts) -STRUCT_TYPE(gl_LightProducts) -STRUCT_TYPE(gl_FogParameters) diff --git a/3rdparty/glsl-optimizer/src/glsl/builtin_types.cpp b/3rdparty/glsl-optimizer/src/glsl/builtin_types.cpp deleted file mode 100644 index 0105d1fb8..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/builtin_types.cpp +++ /dev/null @@ -1,369 +0,0 @@ -/* - * Copyright © 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file builtin_types.cpp - * - * The glsl_type class has static members to represent all the built-in types - * (such as the glsl_type::_float_type flyweight) as well as convenience pointer - * accessors (such as glsl_type::float_type). Those global variables are - * declared and initialized in this file. - * - * This also contains _mesa_glsl_initialize_types(), a function which populates - * a symbol table with the available built-in types for a particular language - * version and set of enabled extensions. - */ - -#include "glsl_types.h" -#include "glsl_parser_extras.h" -#include "util/macros.h" - -/** - * Declarations of type flyweights (glsl_type::_foo_type) and - * convenience pointers (glsl_type::foo_type). - * @{ - */ -#define DECL_TYPE(NAME, ...) \ - const glsl_type glsl_type::_##NAME##_type = glsl_type(__VA_ARGS__, #NAME); \ - const glsl_type *const glsl_type::NAME##_type = &glsl_type::_##NAME##_type; - -#define STRUCT_TYPE(NAME) \ - const glsl_type glsl_type::_struct_##NAME##_type = \ - glsl_type(NAME##_fields, ARRAY_SIZE(NAME##_fields), #NAME); \ - const glsl_type *const glsl_type::struct_##NAME##_type = \ - &glsl_type::_struct_##NAME##_type; - -static const struct glsl_struct_field gl_DepthRangeParameters_fields[] = { - { glsl_type::float_type, "near", glsl_precision_high, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "far", glsl_precision_high, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "diff", glsl_precision_high, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, -}; - -static const struct glsl_struct_field gl_PointParameters_fields[] = { - { glsl_type::float_type, "size", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "sizeMin", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "sizeMax", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "fadeThresholdSize", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "distanceConstantAttenuation", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "distanceLinearAttenuation", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "distanceQuadraticAttenuation", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, -}; - -static const struct glsl_struct_field gl_MaterialParameters_fields[] = { - { glsl_type::vec4_type, "emission", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::vec4_type, "ambient", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::vec4_type, "diffuse", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::vec4_type, "specular", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "shininess", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, -}; - -static const struct glsl_struct_field gl_LightSourceParameters_fields[] = { - { glsl_type::vec4_type, "ambient", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::vec4_type, "diffuse", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::vec4_type, "specular", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::vec4_type, "position", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::vec4_type, "halfVector", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::vec3_type, "spotDirection", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "spotExponent", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "spotCutoff", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "spotCosCutoff", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "constantAttenuation", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "linearAttenuation", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "quadraticAttenuation", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, -}; - -static const struct glsl_struct_field gl_LightModelParameters_fields[] = { - { glsl_type::vec4_type, "ambient", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, -}; - -static const struct glsl_struct_field gl_LightModelProducts_fields[] = { - { glsl_type::vec4_type, "sceneColor", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, -}; - -static const struct glsl_struct_field gl_LightProducts_fields[] = { - { glsl_type::vec4_type, "ambient", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::vec4_type, "diffuse", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::vec4_type, "specular", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, -}; - -static const struct glsl_struct_field gl_FogParameters_fields[] = { - { glsl_type::vec4_type, "color", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "density", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "start", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "end", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, - { glsl_type::float_type, "scale", glsl_precision_undefined, -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 }, -}; - -#include "builtin_type_macros.h" -/** @} */ - -/** - * Code to populate a symbol table with the built-in types available in a - * particular shading language version. The table below contains tags every - * type with the GLSL/GLSL ES versions where it was introduced. - * - * @{ - */ -#define T(TYPE, MIN_GL, MIN_ES) \ - { glsl_type::TYPE##_type, MIN_GL, MIN_ES }, - -const static struct builtin_type_versions { - const glsl_type *const type; - int min_gl; - int min_es; -} builtin_type_versions[] = { - T(void, 110, 100) - T(bool, 110, 100) - T(bvec2, 110, 100) - T(bvec3, 110, 100) - T(bvec4, 110, 100) - T(int, 110, 100) - T(ivec2, 110, 100) - T(ivec3, 110, 100) - T(ivec4, 110, 100) - T(uint, 130, 300) - T(uvec2, 130, 300) - T(uvec3, 130, 300) - T(uvec4, 130, 300) - T(float, 110, 100) - T(vec2, 110, 100) - T(vec3, 110, 100) - T(vec4, 110, 100) - T(mat2, 110, 100) - T(mat3, 110, 100) - T(mat4, 110, 100) - T(mat2x3, 120, 300) - T(mat2x4, 120, 300) - T(mat3x2, 120, 300) - T(mat3x4, 120, 300) - T(mat4x2, 120, 300) - T(mat4x3, 120, 300) - - T(sampler1D, 110, 999) - T(sampler2D, 110, 100) - T(sampler3D, 110, 300) - T(samplerCube, 110, 100) - T(sampler1DArray, 130, 999) - T(sampler2DArray, 130, 300) - T(samplerCubeArray, 400, 999) - T(sampler2DRect, 140, 999) - T(samplerBuffer, 140, 999) - T(sampler2DMS, 150, 999) - T(sampler2DMSArray, 150, 999) - - T(isampler1D, 130, 999) - T(isampler2D, 130, 300) - T(isampler3D, 130, 300) - T(isamplerCube, 130, 300) - T(isampler1DArray, 130, 999) - T(isampler2DArray, 130, 300) - T(isamplerCubeArray, 400, 999) - T(isampler2DRect, 140, 999) - T(isamplerBuffer, 140, 999) - T(isampler2DMS, 150, 999) - T(isampler2DMSArray, 150, 999) - - T(usampler1D, 130, 999) - T(usampler2D, 130, 300) - T(usampler3D, 130, 300) - T(usamplerCube, 130, 300) - T(usampler1DArray, 130, 999) - T(usampler2DArray, 130, 300) - T(usamplerCubeArray, 400, 999) - T(usampler2DRect, 140, 999) - T(usamplerBuffer, 140, 999) - T(usampler2DMS, 150, 999) - T(usampler2DMSArray, 150, 999) - - T(sampler1DShadow, 110, 999) - T(sampler2DShadow, 110, 300) - T(samplerCubeShadow, 130, 300) - T(sampler1DArrayShadow, 130, 999) - T(sampler2DArrayShadow, 130, 300) - T(samplerCubeArrayShadow, 400, 999) - T(sampler2DRectShadow, 140, 999) - - T(struct_gl_DepthRangeParameters, 110, 100) - - T(image1D, 420, 999) - T(image2D, 420, 999) - T(image3D, 420, 999) - T(image2DRect, 420, 999) - T(imageCube, 420, 999) - T(imageBuffer, 420, 999) - T(image1DArray, 420, 999) - T(image2DArray, 420, 999) - T(imageCubeArray, 420, 999) - T(image2DMS, 420, 999) - T(image2DMSArray, 420, 999) - T(iimage1D, 420, 999) - T(iimage2D, 420, 999) - T(iimage3D, 420, 999) - T(iimage2DRect, 420, 999) - T(iimageCube, 420, 999) - T(iimageBuffer, 420, 999) - T(iimage1DArray, 420, 999) - T(iimage2DArray, 420, 999) - T(iimageCubeArray, 420, 999) - T(iimage2DMS, 420, 999) - T(iimage2DMSArray, 420, 999) - T(uimage1D, 420, 999) - T(uimage2D, 420, 999) - T(uimage3D, 420, 999) - T(uimage2DRect, 420, 999) - T(uimageCube, 420, 999) - T(uimageBuffer, 420, 999) - T(uimage1DArray, 420, 999) - T(uimage2DArray, 420, 999) - T(uimageCubeArray, 420, 999) - T(uimage2DMS, 420, 999) - T(uimage2DMSArray, 420, 999) - - T(atomic_uint, 420, 999) -}; - -static const glsl_type *const deprecated_types[] = { - glsl_type::struct_gl_PointParameters_type, - glsl_type::struct_gl_MaterialParameters_type, - glsl_type::struct_gl_LightSourceParameters_type, - glsl_type::struct_gl_LightModelParameters_type, - glsl_type::struct_gl_LightModelProducts_type, - glsl_type::struct_gl_LightProducts_type, - glsl_type::struct_gl_FogParameters_type, -}; - -static inline void -add_type(glsl_symbol_table *symbols, const glsl_type *const type) -{ - symbols->add_type(type->name, type); -} - -/** - * Populate the symbol table with available built-in types. - */ -void -_mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state) -{ - struct glsl_symbol_table *symbols = state->symbols; - - for (unsigned i = 0; i < ARRAY_SIZE(builtin_type_versions); i++) { - const struct builtin_type_versions *const t = &builtin_type_versions[i]; - if (state->is_version(t->min_gl, t->min_es)) { - add_type(symbols, t->type); - } - } - - /* Add deprecated structure types. While these were deprecated in 1.30, - * they're still present. We've removed them in 1.40+ (OpenGL 3.1+). - */ - if (!state->es_shader && state->language_version < 140) { - for (unsigned i = 0; i < ARRAY_SIZE(deprecated_types); i++) { - add_type(symbols, deprecated_types[i]); - } - } - - /* Add types for enabled extensions. They may have already been added - * by the version-based loop, but attempting to add them a second time - * is harmless. - */ - if (state->ARB_texture_cube_map_array_enable) { - add_type(symbols, glsl_type::samplerCubeArray_type); - add_type(symbols, glsl_type::samplerCubeArrayShadow_type); - add_type(symbols, glsl_type::isamplerCubeArray_type); - add_type(symbols, glsl_type::usamplerCubeArray_type); - } - - if (state->ARB_texture_multisample_enable) { - add_type(symbols, glsl_type::sampler2DMS_type); - add_type(symbols, glsl_type::isampler2DMS_type); - add_type(symbols, glsl_type::usampler2DMS_type); - add_type(symbols, glsl_type::sampler2DMSArray_type); - add_type(symbols, glsl_type::isampler2DMSArray_type); - add_type(symbols, glsl_type::usampler2DMSArray_type); - } - - if (state->ARB_texture_rectangle_enable) { - add_type(symbols, glsl_type::sampler2DRect_type); - add_type(symbols, glsl_type::sampler2DRectShadow_type); - } - - if (state->EXT_texture_array_enable) { - add_type(symbols, glsl_type::sampler1DArray_type); - add_type(symbols, glsl_type::sampler2DArray_type); - add_type(symbols, glsl_type::sampler1DArrayShadow_type); - add_type(symbols, glsl_type::sampler2DArrayShadow_type); - } - - if (state->OES_EGL_image_external_enable) { - add_type(symbols, glsl_type::samplerExternalOES_type); - } - - if (state->EXT_shadow_samplers_enable) { - add_type(symbols, glsl_type::sampler2DShadow_type); - } - - if (state->OES_texture_3D_enable) { - add_type(symbols, glsl_type::sampler3D_type); - } - - if (state->ARB_shader_image_load_store_enable) { - add_type(symbols, glsl_type::image1D_type); - add_type(symbols, glsl_type::image2D_type); - add_type(symbols, glsl_type::image3D_type); - add_type(symbols, glsl_type::image2DRect_type); - add_type(symbols, glsl_type::imageCube_type); - add_type(symbols, glsl_type::imageBuffer_type); - add_type(symbols, glsl_type::image1DArray_type); - add_type(symbols, glsl_type::image2DArray_type); - add_type(symbols, glsl_type::imageCubeArray_type); - add_type(symbols, glsl_type::image2DMS_type); - add_type(symbols, glsl_type::image2DMSArray_type); - add_type(symbols, glsl_type::iimage1D_type); - add_type(symbols, glsl_type::iimage2D_type); - add_type(symbols, glsl_type::iimage3D_type); - add_type(symbols, glsl_type::iimage2DRect_type); - add_type(symbols, glsl_type::iimageCube_type); - add_type(symbols, glsl_type::iimageBuffer_type); - add_type(symbols, glsl_type::iimage1DArray_type); - add_type(symbols, glsl_type::iimage2DArray_type); - add_type(symbols, glsl_type::iimageCubeArray_type); - add_type(symbols, glsl_type::iimage2DMS_type); - add_type(symbols, glsl_type::iimage2DMSArray_type); - add_type(symbols, glsl_type::uimage1D_type); - add_type(symbols, glsl_type::uimage2D_type); - add_type(symbols, glsl_type::uimage3D_type); - add_type(symbols, glsl_type::uimage2DRect_type); - add_type(symbols, glsl_type::uimageCube_type); - add_type(symbols, glsl_type::uimageBuffer_type); - add_type(symbols, glsl_type::uimage1DArray_type); - add_type(symbols, glsl_type::uimage2DArray_type); - add_type(symbols, glsl_type::uimageCubeArray_type); - add_type(symbols, glsl_type::uimage2DMS_type); - add_type(symbols, glsl_type::uimage2DMSArray_type); - } - - if (state->ARB_shader_atomic_counters_enable) { - add_type(symbols, glsl_type::atomic_uint_type); - } -} -/** @} */ diff --git a/3rdparty/glsl-optimizer/src/glsl/builtin_variables.cpp b/3rdparty/glsl-optimizer/src/glsl/builtin_variables.cpp deleted file mode 100644 index f32271dad..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/builtin_variables.cpp +++ /dev/null @@ -1,1111 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "ir.h" -#include "glsl_parser_extras.h" -#include "glsl_symbol_table.h" -#include "main/core.h" -#include "program/prog_parameter.h" -#include "program/prog_statevars.h" -#include "program/prog_instruction.h" - -// these two are ripped from mesa/main/uniforms.h in upstream -struct gl_builtin_uniform_element { - const char *field; - int tokens[STATE_LENGTH]; - int swizzle; -}; -struct gl_builtin_uniform_desc { - const char *name; - const struct gl_builtin_uniform_element *elements; - unsigned int num_elements; -}; - - -static const struct gl_builtin_uniform_element gl_NumSamples_elements[] = { - {NULL, {STATE_NUM_SAMPLES, 0, 0}, SWIZZLE_XXXX} -}; - - -static const struct gl_builtin_uniform_element gl_DepthRange_elements[] = { - {"near", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_XXXX}, - {"far", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_YYYY}, - {"diff", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_ZZZZ}, -}; - -static const struct gl_builtin_uniform_element gl_ClipPlane_elements[] = { - {NULL, {STATE_CLIPPLANE, 0, 0}, SWIZZLE_XYZW} -}; - -static const struct gl_builtin_uniform_element gl_Point_elements[] = { - {"size", {STATE_POINT_SIZE}, SWIZZLE_XXXX}, - {"sizeMin", {STATE_POINT_SIZE}, SWIZZLE_YYYY}, - {"sizeMax", {STATE_POINT_SIZE}, SWIZZLE_ZZZZ}, - {"fadeThresholdSize", {STATE_POINT_SIZE}, SWIZZLE_WWWW}, - {"distanceConstantAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_XXXX}, - {"distanceLinearAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_YYYY}, - {"distanceQuadraticAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_ZZZZ}, -}; - -static const struct gl_builtin_uniform_element gl_FrontMaterial_elements[] = { - {"emission", {STATE_MATERIAL, 0, STATE_EMISSION}, SWIZZLE_XYZW}, - {"ambient", {STATE_MATERIAL, 0, STATE_AMBIENT}, SWIZZLE_XYZW}, - {"diffuse", {STATE_MATERIAL, 0, STATE_DIFFUSE}, SWIZZLE_XYZW}, - {"specular", {STATE_MATERIAL, 0, STATE_SPECULAR}, SWIZZLE_XYZW}, - {"shininess", {STATE_MATERIAL, 0, STATE_SHININESS}, SWIZZLE_XXXX}, -}; - -static const struct gl_builtin_uniform_element gl_BackMaterial_elements[] = { - {"emission", {STATE_MATERIAL, 1, STATE_EMISSION}, SWIZZLE_XYZW}, - {"ambient", {STATE_MATERIAL, 1, STATE_AMBIENT}, SWIZZLE_XYZW}, - {"diffuse", {STATE_MATERIAL, 1, STATE_DIFFUSE}, SWIZZLE_XYZW}, - {"specular", {STATE_MATERIAL, 1, STATE_SPECULAR}, SWIZZLE_XYZW}, - {"shininess", {STATE_MATERIAL, 1, STATE_SHININESS}, SWIZZLE_XXXX}, -}; - -static const struct gl_builtin_uniform_element gl_LightSource_elements[] = { - {"ambient", {STATE_LIGHT, 0, STATE_AMBIENT}, SWIZZLE_XYZW}, - {"diffuse", {STATE_LIGHT, 0, STATE_DIFFUSE}, SWIZZLE_XYZW}, - {"specular", {STATE_LIGHT, 0, STATE_SPECULAR}, SWIZZLE_XYZW}, - {"position", {STATE_LIGHT, 0, STATE_POSITION}, SWIZZLE_XYZW}, - {"halfVector", {STATE_LIGHT, 0, STATE_HALF_VECTOR}, SWIZZLE_XYZW}, - {"spotDirection", {STATE_LIGHT, 0, STATE_SPOT_DIRECTION}, - MAKE_SWIZZLE4(SWIZZLE_X, - SWIZZLE_Y, - SWIZZLE_Z, - SWIZZLE_Z)}, - {"spotCosCutoff", {STATE_LIGHT, 0, STATE_SPOT_DIRECTION}, SWIZZLE_WWWW}, - {"spotCutoff", {STATE_LIGHT, 0, STATE_SPOT_CUTOFF}, SWIZZLE_XXXX}, - {"spotExponent", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_WWWW}, - {"constantAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_XXXX}, - {"linearAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_YYYY}, - {"quadraticAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_ZZZZ}, -}; - -static const struct gl_builtin_uniform_element gl_LightModel_elements[] = { - {"ambient", {STATE_LIGHTMODEL_AMBIENT, 0}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_FrontLightModelProduct_elements[] = { - {"sceneColor", {STATE_LIGHTMODEL_SCENECOLOR, 0}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_BackLightModelProduct_elements[] = { - {"sceneColor", {STATE_LIGHTMODEL_SCENECOLOR, 1}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_FrontLightProduct_elements[] = { - {"ambient", {STATE_LIGHTPROD, 0, 0, STATE_AMBIENT}, SWIZZLE_XYZW}, - {"diffuse", {STATE_LIGHTPROD, 0, 0, STATE_DIFFUSE}, SWIZZLE_XYZW}, - {"specular", {STATE_LIGHTPROD, 0, 0, STATE_SPECULAR}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_BackLightProduct_elements[] = { - {"ambient", {STATE_LIGHTPROD, 0, 1, STATE_AMBIENT}, SWIZZLE_XYZW}, - {"diffuse", {STATE_LIGHTPROD, 0, 1, STATE_DIFFUSE}, SWIZZLE_XYZW}, - {"specular", {STATE_LIGHTPROD, 0, 1, STATE_SPECULAR}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_TextureEnvColor_elements[] = { - {NULL, {STATE_TEXENV_COLOR, 0}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_EyePlaneS_elements[] = { - {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_S}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_EyePlaneT_elements[] = { - {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_T}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_EyePlaneR_elements[] = { - {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_R}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_EyePlaneQ_elements[] = { - {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_Q}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_ObjectPlaneS_elements[] = { - {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_S}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_ObjectPlaneT_elements[] = { - {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_T}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_ObjectPlaneR_elements[] = { - {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_R}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_ObjectPlaneQ_elements[] = { - {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_Q}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_Fog_elements[] = { - {"color", {STATE_FOG_COLOR}, SWIZZLE_XYZW}, - {"density", {STATE_FOG_PARAMS}, SWIZZLE_XXXX}, - {"start", {STATE_FOG_PARAMS}, SWIZZLE_YYYY}, - {"end", {STATE_FOG_PARAMS}, SWIZZLE_ZZZZ}, - {"scale", {STATE_FOG_PARAMS}, SWIZZLE_WWWW}, -}; - -static const struct gl_builtin_uniform_element gl_NormalScale_elements[] = { - {NULL, {STATE_NORMAL_SCALE}, SWIZZLE_XXXX}, -}; - -static const struct gl_builtin_uniform_element gl_FogParamsOptimizedMESA_elements[] = { - {NULL, {STATE_INTERNAL, STATE_FOG_PARAMS_OPTIMIZED}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_CurrentAttribVertMESA_elements[] = { - {NULL, {STATE_INTERNAL, STATE_CURRENT_ATTRIB, 0}, SWIZZLE_XYZW}, -}; - -static const struct gl_builtin_uniform_element gl_CurrentAttribFragMESA_elements[] = { - {NULL, {STATE_INTERNAL, STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED, 0}, SWIZZLE_XYZW}, -}; - -#define MATRIX(name, statevar, modifier) \ - static const struct gl_builtin_uniform_element name ## _elements[] = { \ - { NULL, { statevar, 0, 0, 0, modifier}, SWIZZLE_XYZW }, \ - { NULL, { statevar, 0, 1, 1, modifier}, SWIZZLE_XYZW }, \ - { NULL, { statevar, 0, 2, 2, modifier}, SWIZZLE_XYZW }, \ - { NULL, { statevar, 0, 3, 3, modifier}, SWIZZLE_XYZW }, \ - } - -MATRIX(gl_ModelViewMatrix, - STATE_MODELVIEW_MATRIX, STATE_MATRIX_TRANSPOSE); -MATRIX(gl_ModelViewMatrixInverse, - STATE_MODELVIEW_MATRIX, STATE_MATRIX_INVTRANS); -MATRIX(gl_ModelViewMatrixTranspose, - STATE_MODELVIEW_MATRIX, 0); -MATRIX(gl_ModelViewMatrixInverseTranspose, - STATE_MODELVIEW_MATRIX, STATE_MATRIX_INVERSE); - -MATRIX(gl_ProjectionMatrix, - STATE_PROJECTION_MATRIX, STATE_MATRIX_TRANSPOSE); -MATRIX(gl_ProjectionMatrixInverse, - STATE_PROJECTION_MATRIX, STATE_MATRIX_INVTRANS); -MATRIX(gl_ProjectionMatrixTranspose, - STATE_PROJECTION_MATRIX, 0); -MATRIX(gl_ProjectionMatrixInverseTranspose, - STATE_PROJECTION_MATRIX, STATE_MATRIX_INVERSE); - -MATRIX(gl_ModelViewProjectionMatrix, - STATE_MVP_MATRIX, STATE_MATRIX_TRANSPOSE); -MATRIX(gl_ModelViewProjectionMatrixInverse, - STATE_MVP_MATRIX, STATE_MATRIX_INVTRANS); -MATRIX(gl_ModelViewProjectionMatrixTranspose, - STATE_MVP_MATRIX, 0); -MATRIX(gl_ModelViewProjectionMatrixInverseTranspose, - STATE_MVP_MATRIX, STATE_MATRIX_INVERSE); - -MATRIX(gl_TextureMatrix, - STATE_TEXTURE_MATRIX, STATE_MATRIX_TRANSPOSE); -MATRIX(gl_TextureMatrixInverse, - STATE_TEXTURE_MATRIX, STATE_MATRIX_INVTRANS); -MATRIX(gl_TextureMatrixTranspose, - STATE_TEXTURE_MATRIX, 0); -MATRIX(gl_TextureMatrixInverseTranspose, - STATE_TEXTURE_MATRIX, STATE_MATRIX_INVERSE); - -static const struct gl_builtin_uniform_element gl_NormalMatrix_elements[] = { - { NULL, { STATE_MODELVIEW_MATRIX, 0, 0, 0, STATE_MATRIX_INVERSE}, - MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) }, - { NULL, { STATE_MODELVIEW_MATRIX, 0, 1, 1, STATE_MATRIX_INVERSE}, - MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) }, - { NULL, { STATE_MODELVIEW_MATRIX, 0, 2, 2, STATE_MATRIX_INVERSE}, - MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) }, -}; - -#undef MATRIX - -#define STATEVAR(name) {#name, name ## _elements, Elements(name ## _elements)} - -static const struct gl_builtin_uniform_desc _mesa_builtin_uniform_desc[] = { - STATEVAR(gl_NumSamples), - STATEVAR(gl_DepthRange), - STATEVAR(gl_ClipPlane), - STATEVAR(gl_Point), - STATEVAR(gl_FrontMaterial), - STATEVAR(gl_BackMaterial), - STATEVAR(gl_LightSource), - STATEVAR(gl_LightModel), - STATEVAR(gl_FrontLightModelProduct), - STATEVAR(gl_BackLightModelProduct), - STATEVAR(gl_FrontLightProduct), - STATEVAR(gl_BackLightProduct), - STATEVAR(gl_TextureEnvColor), - STATEVAR(gl_EyePlaneS), - STATEVAR(gl_EyePlaneT), - STATEVAR(gl_EyePlaneR), - STATEVAR(gl_EyePlaneQ), - STATEVAR(gl_ObjectPlaneS), - STATEVAR(gl_ObjectPlaneT), - STATEVAR(gl_ObjectPlaneR), - STATEVAR(gl_ObjectPlaneQ), - STATEVAR(gl_Fog), - - STATEVAR(gl_ModelViewMatrix), - STATEVAR(gl_ModelViewMatrixInverse), - STATEVAR(gl_ModelViewMatrixTranspose), - STATEVAR(gl_ModelViewMatrixInverseTranspose), - - STATEVAR(gl_ProjectionMatrix), - STATEVAR(gl_ProjectionMatrixInverse), - STATEVAR(gl_ProjectionMatrixTranspose), - STATEVAR(gl_ProjectionMatrixInverseTranspose), - - STATEVAR(gl_ModelViewProjectionMatrix), - STATEVAR(gl_ModelViewProjectionMatrixInverse), - STATEVAR(gl_ModelViewProjectionMatrixTranspose), - STATEVAR(gl_ModelViewProjectionMatrixInverseTranspose), - - STATEVAR(gl_TextureMatrix), - STATEVAR(gl_TextureMatrixInverse), - STATEVAR(gl_TextureMatrixTranspose), - STATEVAR(gl_TextureMatrixInverseTranspose), - - STATEVAR(gl_NormalMatrix), - STATEVAR(gl_NormalScale), - - STATEVAR(gl_FogParamsOptimizedMESA), - STATEVAR(gl_CurrentAttribVertMESA), - STATEVAR(gl_CurrentAttribFragMESA), - - {NULL, NULL, 0} -}; - - -namespace { - -/** - * Data structure that accumulates fields for the gl_PerVertex interface - * block. - */ -class per_vertex_accumulator -{ -public: - per_vertex_accumulator(); - void add_field(int slot, const glsl_type *type, const char *name, glsl_precision prec); - const glsl_type *construct_interface_instance() const; - -private: - glsl_struct_field fields[10]; - unsigned num_fields; -}; - - -per_vertex_accumulator::per_vertex_accumulator() - : fields(), - num_fields(0) -{ -} - - -void -per_vertex_accumulator::add_field(int slot, const glsl_type *type, - const char *name, glsl_precision prec) -{ - assert(this->num_fields < ARRAY_SIZE(this->fields)); - this->fields[this->num_fields].type = type; - this->fields[this->num_fields].name = name; - this->fields[this->num_fields].matrix_layout = GLSL_MATRIX_LAYOUT_INHERITED; - this->fields[this->num_fields].precision = prec; - this->fields[this->num_fields].location = slot; - this->fields[this->num_fields].interpolation = INTERP_QUALIFIER_NONE; - this->fields[this->num_fields].centroid = 0; - this->fields[this->num_fields].sample = 0; - this->num_fields++; -} - - -const glsl_type * -per_vertex_accumulator::construct_interface_instance() const -{ - return glsl_type::get_interface_instance(this->fields, this->num_fields, - GLSL_INTERFACE_PACKING_STD140, - "gl_PerVertex"); -} - - -class builtin_variable_generator -{ -public: - builtin_variable_generator(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - void generate_constants(); - void generate_uniforms(); - void generate_vs_special_vars(); - void generate_gs_special_vars(); - void generate_fs_special_vars(); - void generate_cs_special_vars(); - void generate_varyings(); - -private: - const glsl_type *array(const glsl_type *base, unsigned elements) - { - return glsl_type::get_array_instance(base, elements); - } - - const glsl_type *type(const char *name) - { - return symtab->get_type(name); - } - - ir_variable *add_input(int slot, const glsl_type *type, const char *name, glsl_precision prec) - { - return add_variable(name, type, ir_var_shader_in, slot, prec); - } - - ir_variable *add_output(int slot, const glsl_type *type, const char *name, glsl_precision prec) - { - return add_variable(name, type, ir_var_shader_out, slot, prec); - } - - ir_variable *add_system_value(int slot, const glsl_type *type, - const char *name, glsl_precision prec) - { - return add_variable(name, type, ir_var_system_value, slot, prec); - } - - ir_variable *add_variable(const char *name, const glsl_type *type, - enum ir_variable_mode mode, int slot, glsl_precision prec); - ir_variable *add_uniform(const glsl_type *type, const char *name, glsl_precision prec = glsl_precision_undefined); - ir_variable *add_const(const char *name, int value); - ir_variable *add_const_ivec3(const char *name, int x, int y, int z); - void add_varying(int slot, const glsl_type *type, const char *name, - const char *name_as_gs_input, glsl_precision prec); - - exec_list * const instructions; - struct _mesa_glsl_parse_state * const state; - glsl_symbol_table * const symtab; - - /** - * True if compatibility-profile-only variables should be included. (In - * desktop GL, these are always included when the GLSL version is 1.30 and - * or below). - */ - const bool compatibility; - - const glsl_type * const bool_t; - const glsl_type * const int_t; - const glsl_type * const uint_t; - const glsl_type * const float_t; - const glsl_type * const vec2_t; - const glsl_type * const vec3_t; - const glsl_type * const vec4_t; - const glsl_type * const mat3_t; - const glsl_type * const mat4_t; - - per_vertex_accumulator per_vertex_in; - per_vertex_accumulator per_vertex_out; -}; - - -builtin_variable_generator::builtin_variable_generator( - exec_list *instructions, struct _mesa_glsl_parse_state *state) - : instructions(instructions), state(state), symtab(state->symbols), - compatibility(!state->is_version(140, 100)), - bool_t(glsl_type::bool_type), int_t(glsl_type::int_type), uint_t(glsl_type::uint_type), - float_t(glsl_type::float_type), vec2_t(glsl_type::vec2_type), - vec3_t(glsl_type::vec3_type), vec4_t(glsl_type::vec4_type), - mat3_t(glsl_type::mat3_type), mat4_t(glsl_type::mat4_type) -{ -} - - -ir_variable * -builtin_variable_generator::add_variable(const char *name, - const glsl_type *type, - enum ir_variable_mode mode, int slot, glsl_precision prec) - -{ - if (!this->state->es_shader) - prec = glsl_precision_undefined; - ir_variable *var = new(symtab) ir_variable(type, name, mode, prec); - var->data.how_declared = ir_var_declared_implicitly; - - switch (var->data.mode) { - case ir_var_auto: - case ir_var_shader_in: - case ir_var_uniform: - case ir_var_system_value: - var->data.read_only = true; - break; - case ir_var_shader_out: - break; - default: - /* The only variables that are added using this function should be - * uniforms, shader inputs, and shader outputs, constants (which use - * ir_var_auto), and system values. - */ - assert(0); - break; - } - - var->data.location = slot; - var->data.explicit_location = (slot >= 0); - var->data.explicit_index = 0; - - /* Once the variable is created an initialized, add it to the symbol table - * and add the declaration to the IR stream. - */ - instructions->push_tail(var); - - symtab->add_variable(var); - return var; -} - - -ir_variable * -builtin_variable_generator::add_uniform(const glsl_type *type, - const char *name, glsl_precision prec) -{ - ir_variable *const uni = add_variable(name, type, ir_var_uniform, -1, prec); - - unsigned i; - for (i = 0; _mesa_builtin_uniform_desc[i].name != NULL; i++) { - if (strcmp(_mesa_builtin_uniform_desc[i].name, name) == 0) { - break; - } - } - - assert(_mesa_builtin_uniform_desc[i].name != NULL); - const struct gl_builtin_uniform_desc* const statevar = - &_mesa_builtin_uniform_desc[i]; - - const unsigned array_count = type->is_array() ? type->length : 1; - - ir_state_slot *slots = - uni->allocate_state_slots(array_count * statevar->num_elements); - - for (unsigned a = 0; a < array_count; a++) { - for (unsigned j = 0; j < statevar->num_elements; j++) { - const struct gl_builtin_uniform_element *element = - &statevar->elements[j]; - - memcpy(slots->tokens, element->tokens, sizeof(element->tokens)); - if (type->is_array()) { - if (strcmp(name, "gl_CurrentAttribVertMESA") == 0 || - strcmp(name, "gl_CurrentAttribFragMESA") == 0) { - slots->tokens[2] = a; - } else { - slots->tokens[1] = a; - } - } - - slots->swizzle = element->swizzle; - slots++; - } - } - - return uni; -} - - -ir_variable * -builtin_variable_generator::add_const(const char *name, int value) -{ - ir_variable *const var = add_variable(name, glsl_type::int_type, - ir_var_auto, -1, glsl_precision_undefined); - var->constant_value = new(var) ir_constant(value); - var->constant_initializer = new(var) ir_constant(value); - var->data.has_initializer = true; - return var; -} - - -ir_variable * -builtin_variable_generator::add_const_ivec3(const char *name, int x, int y, - int z) -{ - ir_variable *const var = add_variable(name, glsl_type::ivec3_type, - ir_var_auto, -1, glsl_precision_undefined); - ir_constant_data data; - memset(&data, 0, sizeof(data)); - data.i[0] = x; - data.i[1] = y; - data.i[2] = z; - var->constant_value = new(var) ir_constant(glsl_type::ivec3_type, &data); - var->constant_initializer = - new(var) ir_constant(glsl_type::ivec3_type, &data); - var->data.has_initializer = true; - return var; -} - - -void -builtin_variable_generator::generate_constants() -{ - add_const("gl_MaxVertexAttribs", state->Const.MaxVertexAttribs); - add_const("gl_MaxVertexTextureImageUnits", - state->Const.MaxVertexTextureImageUnits); - add_const("gl_MaxCombinedTextureImageUnits", - state->Const.MaxCombinedTextureImageUnits); - add_const("gl_MaxTextureImageUnits", state->Const.MaxTextureImageUnits); - add_const("gl_MaxDrawBuffers", state->Const.MaxDrawBuffers); - - /* Max uniforms/varyings: GLSL ES counts these in units of vectors; desktop - * GL counts them in units of "components" or "floats". - */ - if (state->es_shader) { - add_const("gl_MaxVertexUniformVectors", - state->Const.MaxVertexUniformComponents / 4); - add_const("gl_MaxFragmentUniformVectors", - state->Const.MaxFragmentUniformComponents / 4); - - /* In GLSL ES 3.00, gl_MaxVaryingVectors was split out to separate - * vertex and fragment shader constants. - */ - if (state->is_version(0, 300)) { - add_const("gl_MaxVertexOutputVectors", - state->ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4); - add_const("gl_MaxFragmentInputVectors", - state->ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents / 4); - } else { - add_const("gl_MaxVaryingVectors", - state->ctx->Const.MaxVarying); - } - } else { - add_const("gl_MaxVertexUniformComponents", - state->Const.MaxVertexUniformComponents); - - /* Note: gl_MaxVaryingFloats was deprecated in GLSL 1.30+, but not - * removed - */ - add_const("gl_MaxVaryingFloats", state->ctx->Const.MaxVarying * 4); - - add_const("gl_MaxFragmentUniformComponents", - state->Const.MaxFragmentUniformComponents); - } - - /* Texel offsets were introduced in ARB_shading_language_420pack (which - * requires desktop GLSL version 130), and adopted into desktop GLSL - * version 4.20 and GLSL ES version 3.00. - */ - if ((state->is_version(130, 0) && - state->ARB_shading_language_420pack_enable) || - state->is_version(420, 300)) { - add_const("gl_MinProgramTexelOffset", - state->Const.MinProgramTexelOffset); - add_const("gl_MaxProgramTexelOffset", - state->Const.MaxProgramTexelOffset); - } - - if (state->is_version(130, 0)) { - add_const("gl_MaxClipDistances", state->Const.MaxClipPlanes); - add_const("gl_MaxVaryingComponents", state->ctx->Const.MaxVarying * 4); - } - - if (state->is_version(150, 0)) { - add_const("gl_MaxVertexOutputComponents", - state->Const.MaxVertexOutputComponents); - add_const("gl_MaxGeometryInputComponents", - state->Const.MaxGeometryInputComponents); - add_const("gl_MaxGeometryOutputComponents", - state->Const.MaxGeometryOutputComponents); - add_const("gl_MaxFragmentInputComponents", - state->Const.MaxFragmentInputComponents); - add_const("gl_MaxGeometryTextureImageUnits", - state->Const.MaxGeometryTextureImageUnits); - add_const("gl_MaxGeometryOutputVertices", - state->Const.MaxGeometryOutputVertices); - add_const("gl_MaxGeometryTotalOutputComponents", - state->Const.MaxGeometryTotalOutputComponents); - add_const("gl_MaxGeometryUniformComponents", - state->Const.MaxGeometryUniformComponents); - - /* Note: the GLSL 1.50-4.40 specs require - * gl_MaxGeometryVaryingComponents to be present, and to be at least 64. - * But they do not define what it means (and there does not appear to be - * any corresponding constant in the GL specs). However, - * ARB_geometry_shader4 defines MAX_GEOMETRY_VARYING_COMPONENTS_ARB to - * be the maximum number of components available for use as geometry - * outputs. So we assume this is a synonym for - * gl_MaxGeometryOutputComponents. - */ - add_const("gl_MaxGeometryVaryingComponents", - state->Const.MaxGeometryOutputComponents); - } - - if (compatibility) { - /* Note: gl_MaxLights stopped being listed as an explicit constant in - * GLSL 1.30, however it continues to be referred to (as a minimum size - * for compatibility-mode uniforms) all the way up through GLSL 4.30, so - * this seems like it was probably an oversight. - */ - add_const("gl_MaxLights", state->Const.MaxLights); - - add_const("gl_MaxClipPlanes", state->Const.MaxClipPlanes); - - /* Note: gl_MaxTextureUnits wasn't made compatibility-only until GLSL - * 1.50, however this seems like it was probably an oversight. - */ - add_const("gl_MaxTextureUnits", state->Const.MaxTextureUnits); - - /* Note: gl_MaxTextureCoords was left out of GLSL 1.40, but it was - * re-introduced in GLSL 1.50, so this seems like it was probably an - * oversight. - */ - add_const("gl_MaxTextureCoords", state->Const.MaxTextureCoords); - } - - if (state->ARB_shader_atomic_counters_enable) { - add_const("gl_MaxVertexAtomicCounters", - state->Const.MaxVertexAtomicCounters); - add_const("gl_MaxGeometryAtomicCounters", - state->Const.MaxGeometryAtomicCounters); - add_const("gl_MaxFragmentAtomicCounters", - state->Const.MaxFragmentAtomicCounters); - add_const("gl_MaxCombinedAtomicCounters", - state->Const.MaxCombinedAtomicCounters); - add_const("gl_MaxAtomicCounterBindings", - state->Const.MaxAtomicBufferBindings); - add_const("gl_MaxTessControlAtomicCounters", 0); - add_const("gl_MaxTessEvaluationAtomicCounters", 0); - } - - if (state->is_version(430, 0) || state->ARB_compute_shader_enable) { - add_const("gl_MaxComputeAtomicCounterBuffers", MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS); - add_const("gl_MaxComputeAtomicCounters", MAX_COMPUTE_ATOMIC_COUNTERS); - add_const("gl_MaxComputeImageUniforms", MAX_COMPUTE_IMAGE_UNIFORMS); - add_const("gl_MaxComputeTextureImageUnits", MAX_COMPUTE_TEXTURE_IMAGE_UNITS); - add_const("gl_MaxComputeUniformComponents", MAX_COMPUTE_UNIFORM_COMPONENTS); - - add_const_ivec3("gl_MaxComputeWorkGroupCount", - state->Const.MaxComputeWorkGroupCount[0], - state->Const.MaxComputeWorkGroupCount[1], - state->Const.MaxComputeWorkGroupCount[2]); - add_const_ivec3("gl_MaxComputeWorkGroupSize", - state->Const.MaxComputeWorkGroupSize[0], - state->Const.MaxComputeWorkGroupSize[1], - state->Const.MaxComputeWorkGroupSize[2]); - - /* From the GLSL 4.40 spec, section 7.1 (Built-In Language Variables): - * - * The built-in constant gl_WorkGroupSize is a compute-shader - * constant containing the local work-group size of the shader. The - * size of the work group in the X, Y, and Z dimensions is stored in - * the x, y, and z components. The constants values in - * gl_WorkGroupSize will match those specified in the required - * local_size_x, local_size_y, and local_size_z layout qualifiers - * for the current shader. This is a constant so that it can be - * used to size arrays of memory that can be shared within the local - * work group. It is a compile-time error to use gl_WorkGroupSize - * in a shader that does not declare a fixed local group size, or - * before that shader has declared a fixed local group size, using - * local_size_x, local_size_y, and local_size_z. - * - * To prevent the shader from trying to refer to gl_WorkGroupSize before - * the layout declaration, we don't define it here. Intead we define it - * in ast_cs_input_layout::hir(). - */ - } - - if (state->is_version(420, 0) || - state->ARB_shader_image_load_store_enable) { - add_const("gl_MaxImageUnits", - state->Const.MaxImageUnits); - add_const("gl_MaxCombinedImageUnitsAndFragmentOutputs", - state->Const.MaxCombinedImageUnitsAndFragmentOutputs); - add_const("gl_MaxImageSamples", - state->Const.MaxImageSamples); - add_const("gl_MaxVertexImageUniforms", - state->Const.MaxVertexImageUniforms); - add_const("gl_MaxTessControlImageUniforms", 0); - add_const("gl_MaxTessEvaluationImageUniforms", 0); - add_const("gl_MaxGeometryImageUniforms", - state->Const.MaxGeometryImageUniforms); - add_const("gl_MaxFragmentImageUniforms", - state->Const.MaxFragmentImageUniforms); - add_const("gl_MaxCombinedImageUniforms", - state->Const.MaxCombinedImageUniforms); - } -} - - -/** - * Generate uniform variables (which exist in all types of shaders). - */ -void -builtin_variable_generator::generate_uniforms() -{ - add_uniform(int_t, "gl_NumSamples", glsl_precision_undefined); - add_uniform(type("gl_DepthRangeParameters"), "gl_DepthRange", glsl_precision_undefined); - add_uniform(array(vec4_t, VERT_ATTRIB_MAX), "gl_CurrentAttribVertMESA", glsl_precision_undefined); - add_uniform(array(vec4_t, VARYING_SLOT_MAX), "gl_CurrentAttribFragMESA", glsl_precision_undefined); - - if (compatibility) { - add_uniform(mat4_t, "gl_ModelViewMatrix"); - add_uniform(mat4_t, "gl_ProjectionMatrix"); - add_uniform(mat4_t, "gl_ModelViewProjectionMatrix"); - add_uniform(mat3_t, "gl_NormalMatrix"); - add_uniform(mat4_t, "gl_ModelViewMatrixInverse"); - add_uniform(mat4_t, "gl_ProjectionMatrixInverse"); - add_uniform(mat4_t, "gl_ModelViewProjectionMatrixInverse"); - add_uniform(mat4_t, "gl_ModelViewMatrixTranspose"); - add_uniform(mat4_t, "gl_ProjectionMatrixTranspose"); - add_uniform(mat4_t, "gl_ModelViewProjectionMatrixTranspose"); - add_uniform(mat4_t, "gl_ModelViewMatrixInverseTranspose"); - add_uniform(mat4_t, "gl_ProjectionMatrixInverseTranspose"); - add_uniform(mat4_t, "gl_ModelViewProjectionMatrixInverseTranspose"); - add_uniform(float_t, "gl_NormalScale"); - add_uniform(type("gl_LightModelParameters"), "gl_LightModel"); - add_uniform(vec4_t, "gl_FogParamsOptimizedMESA"); - - const glsl_type *const mat4_array_type = - array(mat4_t, state->Const.MaxTextureCoords); - add_uniform(mat4_array_type, "gl_TextureMatrix", glsl_precision_undefined); - add_uniform(mat4_array_type, "gl_TextureMatrixInverse", glsl_precision_undefined); - add_uniform(mat4_array_type, "gl_TextureMatrixTranspose", glsl_precision_undefined); - add_uniform(mat4_array_type, "gl_TextureMatrixInverseTranspose", glsl_precision_undefined); - - add_uniform(array(vec4_t, state->Const.MaxClipPlanes), "gl_ClipPlane", glsl_precision_undefined); - add_uniform(type("gl_PointParameters"), "gl_Point", glsl_precision_undefined); - - const glsl_type *const material_parameters_type = - type("gl_MaterialParameters"); - add_uniform(material_parameters_type, "gl_FrontMaterial", glsl_precision_undefined); - add_uniform(material_parameters_type, "gl_BackMaterial", glsl_precision_undefined); - - add_uniform(array(type("gl_LightSourceParameters"), - state->Const.MaxLights), - "gl_LightSource", glsl_precision_undefined); - - const glsl_type *const light_model_products_type = - type("gl_LightModelProducts"); - add_uniform(light_model_products_type, "gl_FrontLightModelProduct", glsl_precision_undefined); - add_uniform(light_model_products_type, "gl_BackLightModelProduct", glsl_precision_undefined); - - const glsl_type *const light_products_type = - array(type("gl_LightProducts"), state->Const.MaxLights); - add_uniform(light_products_type, "gl_FrontLightProduct", glsl_precision_undefined); - add_uniform(light_products_type, "gl_BackLightProduct", glsl_precision_undefined); - - add_uniform(array(vec4_t, state->Const.MaxTextureUnits), - "gl_TextureEnvColor", glsl_precision_undefined); - - const glsl_type *const texcoords_vec4 = - array(vec4_t, state->Const.MaxTextureCoords); - add_uniform(texcoords_vec4, "gl_EyePlaneS", glsl_precision_undefined); - add_uniform(texcoords_vec4, "gl_EyePlaneT", glsl_precision_undefined); - add_uniform(texcoords_vec4, "gl_EyePlaneR", glsl_precision_undefined); - add_uniform(texcoords_vec4, "gl_EyePlaneQ", glsl_precision_undefined); - add_uniform(texcoords_vec4, "gl_ObjectPlaneS", glsl_precision_undefined); - add_uniform(texcoords_vec4, "gl_ObjectPlaneT", glsl_precision_undefined); - add_uniform(texcoords_vec4, "gl_ObjectPlaneR", glsl_precision_undefined); - add_uniform(texcoords_vec4, "gl_ObjectPlaneQ", glsl_precision_undefined); - - add_uniform(type("gl_FogParameters"), "gl_Fog", glsl_precision_undefined); - } -} - - -/** - * Generate variables which only exist in vertex shaders. - */ -void -builtin_variable_generator::generate_vs_special_vars() -{ - - if (state->is_version(130, 300) || state->EXT_gpu_shader4_enable) - add_system_value(SYSTEM_VALUE_VERTEX_ID, state->metal_target ? uint_t : int_t, "gl_VertexID", glsl_precision_high); - if (state->ARB_draw_instanced_enable) - add_system_value(SYSTEM_VALUE_INSTANCE_ID, int_t, "gl_InstanceIDARB", glsl_precision_high); - if (state->EXT_draw_instanced_enable) - add_system_value(SYSTEM_VALUE_INSTANCE_ID, int_t, "gl_InstanceIDEXT", glsl_precision_high); - if (state->ARB_draw_instanced_enable || state->is_version(140, 300)) - add_system_value(SYSTEM_VALUE_INSTANCE_ID, state->metal_target ? uint_t : int_t, "gl_InstanceID", glsl_precision_high); - if (state->AMD_vertex_shader_layer_enable || state->ARB_shader_viewport_layer_array_enable) - add_output(VARYING_SLOT_LAYER, int_t, "gl_Layer", glsl_precision_high); - if (state->AMD_vertex_shader_viewport_index_enable || state->ARB_shader_viewport_layer_array_enable) - add_output(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex", glsl_precision_high); - if (compatibility) { - add_input(VERT_ATTRIB_POS, vec4_t, "gl_Vertex", glsl_precision_high); - add_input(VERT_ATTRIB_NORMAL, vec3_t, "gl_Normal", glsl_precision_medium); - add_input(VERT_ATTRIB_COLOR0, vec4_t, "gl_Color", glsl_precision_medium); - add_input(VERT_ATTRIB_COLOR1, vec4_t, "gl_SecondaryColor", glsl_precision_medium); - add_input(VERT_ATTRIB_TEX0, vec4_t, "gl_MultiTexCoord0", glsl_precision_high); - add_input(VERT_ATTRIB_TEX1, vec4_t, "gl_MultiTexCoord1", glsl_precision_high); - add_input(VERT_ATTRIB_TEX2, vec4_t, "gl_MultiTexCoord2", glsl_precision_high); - add_input(VERT_ATTRIB_TEX3, vec4_t, "gl_MultiTexCoord3", glsl_precision_high); - add_input(VERT_ATTRIB_TEX4, vec4_t, "gl_MultiTexCoord4", glsl_precision_high); - add_input(VERT_ATTRIB_TEX5, vec4_t, "gl_MultiTexCoord5", glsl_precision_high); - add_input(VERT_ATTRIB_TEX6, vec4_t, "gl_MultiTexCoord6", glsl_precision_high); - add_input(VERT_ATTRIB_TEX7, vec4_t, "gl_MultiTexCoord7", glsl_precision_high); - add_input(VERT_ATTRIB_FOG, float_t, "gl_FogCoord", glsl_precision_high); - } -} - - -/** - * Generate variables which only exist in geometry shaders. - */ -void -builtin_variable_generator::generate_gs_special_vars() -{ - add_output(VARYING_SLOT_LAYER, int_t, "gl_Layer", glsl_precision_high); - if (state->ARB_viewport_array_enable) - add_output(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex", glsl_precision_high); - if (state->ARB_gpu_shader5_enable) - add_system_value(SYSTEM_VALUE_INVOCATION_ID, int_t, "gl_InvocationID", glsl_precision_high); - - /* Although gl_PrimitiveID appears in tessellation control and tessellation - * evaluation shaders, it has a different function there than it has in - * geometry shaders, so we treat it (and its counterpart gl_PrimitiveIDIn) - * as special geometry shader variables. - * - * Note that although the general convention of suffixing geometry shader - * input varyings with "In" was not adopted into GLSL 1.50, it is used in - * the specific case of gl_PrimitiveIDIn. So we don't need to treat - * gl_PrimitiveIDIn as an {ARB,EXT}_geometry_shader4-only variable. - */ - ir_variable *var; - var = add_input(VARYING_SLOT_PRIMITIVE_ID, int_t, "gl_PrimitiveIDIn", glsl_precision_high); - var->data.interpolation = INTERP_QUALIFIER_FLAT; - var = add_output(VARYING_SLOT_PRIMITIVE_ID, int_t, "gl_PrimitiveID", glsl_precision_high); - var->data.interpolation = INTERP_QUALIFIER_FLAT; -} - - -/** - * Generate variables which only exist in fragment shaders. - */ -void -builtin_variable_generator::generate_fs_special_vars() -{ - add_input(VARYING_SLOT_POS, vec4_t, "gl_FragCoord", glsl_precision_high); - add_input(VARYING_SLOT_FACE, bool_t, "gl_FrontFacing", glsl_precision_low); - if (state->is_version(120, 100)) - add_input(VARYING_SLOT_PNTC, vec2_t, "gl_PointCoord", state->metal_target ? glsl_precision_high : glsl_precision_medium); - - if (state->is_version(150, 0)) { - ir_variable *var = - add_input(VARYING_SLOT_PRIMITIVE_ID, int_t, "gl_PrimitiveID", glsl_precision_high); - var->data.interpolation = INTERP_QUALIFIER_FLAT; - } - - /* gl_FragColor and gl_FragData were deprecated starting in desktop GLSL - * 1.30, and were relegated to the compatibility profile in GLSL 4.20. - * They were removed from GLSL ES 3.00. - */ - if (compatibility || !state->is_version(420, 300)) { - add_output(FRAG_RESULT_COLOR, vec4_t, "gl_FragColor", glsl_precision_medium); - add_output(FRAG_RESULT_DATA0, - array(vec4_t, state->Const.MaxDrawBuffers), "gl_FragData", glsl_precision_medium); - } - - /* gl_FragDepth has always been in desktop GLSL, but did not appear in GLSL - * ES 1.00. - */ - if (state->is_version(110, 300)) - add_output(FRAG_RESULT_DEPTH, float_t, "gl_FragDepth", glsl_precision_high); - - if (state->ARB_shader_stencil_export_enable) { - ir_variable *const var = - add_output(FRAG_RESULT_STENCIL, int_t, "gl_FragStencilRefARB", glsl_precision_high); - if (state->ARB_shader_stencil_export_warn) - var->enable_extension_warning("GL_ARB_shader_stencil_export"); - } - - if (state->AMD_shader_stencil_export_enable) { - ir_variable *const var = - add_output(FRAG_RESULT_STENCIL, int_t, "gl_FragStencilRefAMD", glsl_precision_high); - if (state->AMD_shader_stencil_export_warn) - var->enable_extension_warning("GL_AMD_shader_stencil_export"); - } - - if (state->EXT_frag_depth_enable) { - ir_variable *const var = - add_output(FRAG_RESULT_DEPTH, float_t, "gl_FragDepthEXT", glsl_precision_high); - if (state->EXT_frag_depth_warn) - var->enable_extension_warning("GL_EXT_frag_depth"); - } - - if (state->EXT_shader_framebuffer_fetch_enable) { - ir_variable *const var = - add_input(VARYING_SLOT_VAR0, array(vec4_t, state->Const.MaxDrawBuffers), "gl_LastFragData", glsl_precision_medium); - if (state->EXT_shader_framebuffer_fetch_warn) - var->enable_extension_warning("GL_EXT_shader_framebuffer_fetch"); - } - - { - // BK - gl_PrimitiveID - ir_variable *var; - var = add_output(VARYING_SLOT_PRIMITIVE_ID, int_t, "gl_PrimitiveID", glsl_precision_high); - var->data.interpolation = INTERP_QUALIFIER_FLAT; - } - - if (state->ARB_sample_shading_enable) { - add_system_value(SYSTEM_VALUE_SAMPLE_ID, int_t, "gl_SampleID", glsl_precision_high); - add_system_value(SYSTEM_VALUE_SAMPLE_POS, vec2_t, "gl_SamplePosition", glsl_precision_high); - /* From the ARB_sample_shading specification: - * "The number of elements in the array is ceil(/32), where - * is the maximum number of color samples supported by the - * implementation." - * Since no drivers expose more than 32x MSAA, we can simply set - * the array size to 1 rather than computing it. - */ - add_output(FRAG_RESULT_SAMPLE_MASK, array(int_t, 1), "gl_SampleMask", glsl_precision_high); - } - - if (state->ARB_gpu_shader5_enable) { - add_system_value(SYSTEM_VALUE_SAMPLE_MASK_IN, array(int_t, 1), "gl_SampleMaskIn", glsl_precision_high); - } - - if (state->ARB_fragment_layer_viewport_enable) { - add_input(VARYING_SLOT_LAYER, int_t, "gl_Layer", glsl_precision_high); - add_input(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex", glsl_precision_high); - } -} - - -/** - * Generate variables which only exist in compute shaders. - */ -void -builtin_variable_generator::generate_cs_special_vars() -{ - /* TODO: finish this. */ -} - - -/** - * Add a single "varying" variable. The variable's type and direction (input - * or output) are adjusted as appropriate for the type of shader being - * compiled. For geometry shaders using {ARB,EXT}_geometry_shader4, - * name_as_gs_input is used for the input (to avoid ambiguity). - */ -void -builtin_variable_generator::add_varying(int slot, const glsl_type *type, - const char *name, - const char *name_as_gs_input, - glsl_precision prec) -{ - switch (state->stage) { - case MESA_SHADER_GEOMETRY: - this->per_vertex_in.add_field(slot, type, name, prec); - /* FALLTHROUGH */ - case MESA_SHADER_VERTEX: - this->per_vertex_out.add_field(slot, type, name, prec); - break; - case MESA_SHADER_FRAGMENT: - add_input(slot, type, name, prec); - break; - case MESA_SHADER_COMPUTE: - /* Compute shaders don't have varyings. */ - break; - } -} - - -/** - * Generate variables that are used to communicate data from one shader stage - * to the next ("varyings"). - */ -void -builtin_variable_generator::generate_varyings() -{ -#define ADD_VARYING(loc, type, name, prec) \ - add_varying(loc, type, name, name "In", prec) - - /* gl_Position and gl_PointSize are not visible from fragment shaders. */ - if (state->stage != MESA_SHADER_FRAGMENT) { - ADD_VARYING(VARYING_SLOT_POS, vec4_t, "gl_Position", glsl_precision_high); - ADD_VARYING(VARYING_SLOT_PSIZ, float_t, "gl_PointSize", glsl_precision_high); - } - - if (state->is_version(130, 0)) { - ADD_VARYING(VARYING_SLOT_CLIP_DIST0, array(float_t, 0), - "gl_ClipDistance", glsl_precision_high); - } - - if (compatibility) { - ADD_VARYING(VARYING_SLOT_TEX0, array(vec4_t, 0), "gl_TexCoord", glsl_precision_undefined); - ADD_VARYING(VARYING_SLOT_FOGC, float_t, "gl_FogFragCoord", glsl_precision_undefined); - if (state->stage == MESA_SHADER_FRAGMENT) { - ADD_VARYING(VARYING_SLOT_COL0, vec4_t, "gl_Color", glsl_precision_medium); - ADD_VARYING(VARYING_SLOT_COL1, vec4_t, "gl_SecondaryColor", glsl_precision_medium); - } else { - ADD_VARYING(VARYING_SLOT_CLIP_VERTEX, vec4_t, "gl_ClipVertex", glsl_precision_high); - ADD_VARYING(VARYING_SLOT_COL0, vec4_t, "gl_FrontColor", glsl_precision_medium); - ADD_VARYING(VARYING_SLOT_BFC0, vec4_t, "gl_BackColor", glsl_precision_medium); - ADD_VARYING(VARYING_SLOT_COL1, vec4_t, "gl_FrontSecondaryColor", glsl_precision_medium); - ADD_VARYING(VARYING_SLOT_BFC1, vec4_t, "gl_BackSecondaryColor", glsl_precision_medium); - } - } - - if (state->stage == MESA_SHADER_GEOMETRY) { - const glsl_type *per_vertex_in_type = - this->per_vertex_in.construct_interface_instance(); - add_variable("gl_in", array(per_vertex_in_type, 0), - ir_var_shader_in, -1, glsl_precision_undefined); - } - if (state->stage == MESA_SHADER_VERTEX || state->stage == MESA_SHADER_GEOMETRY) { - const glsl_type *per_vertex_out_type = - this->per_vertex_out.construct_interface_instance(); - const glsl_struct_field *fields = per_vertex_out_type->fields.structure; - for (unsigned i = 0; i < per_vertex_out_type->length; i++) { - ir_variable *var = - add_variable(fields[i].name, fields[i].type, ir_var_shader_out, - fields[i].location, fields[i].precision); - var->data.interpolation = fields[i].interpolation; - var->data.centroid = fields[i].centroid; - var->data.sample = fields[i].sample; - var->init_interface_type(per_vertex_out_type); - } - } -} - - -}; /* Anonymous namespace */ - - -void -_mesa_glsl_initialize_variables(exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - builtin_variable_generator gen(instructions, state); - - gen.generate_constants(); - gen.generate_uniforms(); - - gen.generate_varyings(); - - switch (state->stage) { - case MESA_SHADER_VERTEX: - gen.generate_vs_special_vars(); - break; - case MESA_SHADER_GEOMETRY: - gen.generate_gs_special_vars(); - break; - case MESA_SHADER_FRAGMENT: - gen.generate_fs_special_vars(); - break; - case MESA_SHADER_COMPUTE: - gen.generate_cs_special_vars(); - break; - } -} diff --git a/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-lex.c b/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-lex.c deleted file mode 100644 index a2de3dd35..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-lex.c +++ /dev/null @@ -1,3139 +0,0 @@ -#line 2 "src/glsl/glcpp/glcpp-lex.c" - -#line 4 "src/glsl/glcpp/glcpp-lex.c" - -#define YY_INT_ALIGNED short int - -/* A lexical scanner generated by flex */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 6 -#define YY_FLEX_SUBMINOR_VERSION 4 -#if YY_FLEX_SUBMINOR_VERSION > 0 -#define FLEX_BETA -#endif - -#ifdef yy_create_buffer -#define glcpp__create_buffer_ALREADY_DEFINED -#else -#define yy_create_buffer glcpp__create_buffer -#endif - -#ifdef yy_delete_buffer -#define glcpp__delete_buffer_ALREADY_DEFINED -#else -#define yy_delete_buffer glcpp__delete_buffer -#endif - -#ifdef yy_scan_buffer -#define glcpp__scan_buffer_ALREADY_DEFINED -#else -#define yy_scan_buffer glcpp__scan_buffer -#endif - -#ifdef yy_scan_string -#define glcpp__scan_string_ALREADY_DEFINED -#else -#define yy_scan_string glcpp__scan_string -#endif - -#ifdef yy_scan_bytes -#define glcpp__scan_bytes_ALREADY_DEFINED -#else -#define yy_scan_bytes glcpp__scan_bytes -#endif - -#ifdef yy_init_buffer -#define glcpp__init_buffer_ALREADY_DEFINED -#else -#define yy_init_buffer glcpp__init_buffer -#endif - -#ifdef yy_flush_buffer -#define glcpp__flush_buffer_ALREADY_DEFINED -#else -#define yy_flush_buffer glcpp__flush_buffer -#endif - -#ifdef yy_load_buffer_state -#define glcpp__load_buffer_state_ALREADY_DEFINED -#else -#define yy_load_buffer_state glcpp__load_buffer_state -#endif - -#ifdef yy_switch_to_buffer -#define glcpp__switch_to_buffer_ALREADY_DEFINED -#else -#define yy_switch_to_buffer glcpp__switch_to_buffer -#endif - -#ifdef yypush_buffer_state -#define glcpp_push_buffer_state_ALREADY_DEFINED -#else -#define yypush_buffer_state glcpp_push_buffer_state -#endif - -#ifdef yypop_buffer_state -#define glcpp_pop_buffer_state_ALREADY_DEFINED -#else -#define yypop_buffer_state glcpp_pop_buffer_state -#endif - -#ifdef yyensure_buffer_stack -#define glcpp_ensure_buffer_stack_ALREADY_DEFINED -#else -#define yyensure_buffer_stack glcpp_ensure_buffer_stack -#endif - -#ifdef yylex -#define glcpp_lex_ALREADY_DEFINED -#else -#define yylex glcpp_lex -#endif - -#ifdef yyrestart -#define glcpp_restart_ALREADY_DEFINED -#else -#define yyrestart glcpp_restart -#endif - -#ifdef yylex_init -#define glcpp_lex_init_ALREADY_DEFINED -#else -#define yylex_init glcpp_lex_init -#endif - -#ifdef yylex_init_extra -#define glcpp_lex_init_extra_ALREADY_DEFINED -#else -#define yylex_init_extra glcpp_lex_init_extra -#endif - -#ifdef yylex_destroy -#define glcpp_lex_destroy_ALREADY_DEFINED -#else -#define yylex_destroy glcpp_lex_destroy -#endif - -#ifdef yyget_debug -#define glcpp_get_debug_ALREADY_DEFINED -#else -#define yyget_debug glcpp_get_debug -#endif - -#ifdef yyset_debug -#define glcpp_set_debug_ALREADY_DEFINED -#else -#define yyset_debug glcpp_set_debug -#endif - -#ifdef yyget_extra -#define glcpp_get_extra_ALREADY_DEFINED -#else -#define yyget_extra glcpp_get_extra -#endif - -#ifdef yyset_extra -#define glcpp_set_extra_ALREADY_DEFINED -#else -#define yyset_extra glcpp_set_extra -#endif - -#ifdef yyget_in -#define glcpp_get_in_ALREADY_DEFINED -#else -#define yyget_in glcpp_get_in -#endif - -#ifdef yyset_in -#define glcpp_set_in_ALREADY_DEFINED -#else -#define yyset_in glcpp_set_in -#endif - -#ifdef yyget_out -#define glcpp_get_out_ALREADY_DEFINED -#else -#define yyget_out glcpp_get_out -#endif - -#ifdef yyset_out -#define glcpp_set_out_ALREADY_DEFINED -#else -#define yyset_out glcpp_set_out -#endif - -#ifdef yyget_leng -#define glcpp_get_leng_ALREADY_DEFINED -#else -#define yyget_leng glcpp_get_leng -#endif - -#ifdef yyget_text -#define glcpp_get_text_ALREADY_DEFINED -#else -#define yyget_text glcpp_get_text -#endif - -#ifdef yyget_lineno -#define glcpp_get_lineno_ALREADY_DEFINED -#else -#define yyget_lineno glcpp_get_lineno -#endif - -#ifdef yyset_lineno -#define glcpp_set_lineno_ALREADY_DEFINED -#else -#define yyset_lineno glcpp_set_lineno -#endif - -#ifdef yyget_column -#define glcpp_get_column_ALREADY_DEFINED -#else -#define yyget_column glcpp_get_column -#endif - -#ifdef yyset_column -#define glcpp_set_column_ALREADY_DEFINED -#else -#define yyset_column glcpp_set_column -#endif - -#ifdef yywrap -#define glcpp_wrap_ALREADY_DEFINED -#else -#define yywrap glcpp_wrap -#endif - -#ifdef yyget_lval -#define glcpp_get_lval_ALREADY_DEFINED -#else -#define yyget_lval glcpp_get_lval -#endif - -#ifdef yyset_lval -#define glcpp_set_lval_ALREADY_DEFINED -#else -#define yyset_lval glcpp_set_lval -#endif - -#ifdef yyget_lloc -#define glcpp_get_lloc_ALREADY_DEFINED -#else -#define yyget_lloc glcpp_get_lloc -#endif - -#ifdef yyset_lloc -#define glcpp_set_lloc_ALREADY_DEFINED -#else -#define yyset_lloc glcpp_set_lloc -#endif - -#ifdef yyalloc -#define glcpp_alloc_ALREADY_DEFINED -#else -#define yyalloc glcpp_alloc -#endif - -#ifdef yyrealloc -#define glcpp_realloc_ALREADY_DEFINED -#else -#define yyrealloc glcpp_realloc -#endif - -#ifdef yyfree -#define glcpp_free_ALREADY_DEFINED -#else -#define yyfree glcpp_free -#endif - -/* First, we deal with platform-specific or compiler-specific issues. */ - -/* begin standard C headers. */ -#include -#include -#include -#include - -/* end standard C headers. */ - -/* flex integer type definitions */ - -#ifndef FLEXINT_H -#define FLEXINT_H - -/* C99 systems have . Non-C99 systems may or may not. */ - -#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - -/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, - * if you want the limit (max/min) macros for int types. - */ -#ifndef __STDC_LIMIT_MACROS -#define __STDC_LIMIT_MACROS 1 -#endif - -#include -typedef int8_t flex_int8_t; -typedef uint8_t flex_uint8_t; -typedef int16_t flex_int16_t; -typedef uint16_t flex_uint16_t; -typedef int32_t flex_int32_t; -typedef uint32_t flex_uint32_t; -#else -typedef signed char flex_int8_t; -typedef short int flex_int16_t; -typedef int flex_int32_t; -typedef unsigned char flex_uint8_t; -typedef unsigned short int flex_uint16_t; -typedef unsigned int flex_uint32_t; - -/* Limits of integral types. */ -#ifndef INT8_MIN -#define INT8_MIN (-128) -#endif -#ifndef INT16_MIN -#define INT16_MIN (-32767-1) -#endif -#ifndef INT32_MIN -#define INT32_MIN (-2147483647-1) -#endif -#ifndef INT8_MAX -#define INT8_MAX (127) -#endif -#ifndef INT16_MAX -#define INT16_MAX (32767) -#endif -#ifndef INT32_MAX -#define INT32_MAX (2147483647) -#endif -#ifndef UINT8_MAX -#define UINT8_MAX (255U) -#endif -#ifndef UINT16_MAX -#define UINT16_MAX (65535U) -#endif -#ifndef UINT32_MAX -#define UINT32_MAX (4294967295U) -#endif - -#ifndef SIZE_MAX -#define SIZE_MAX (~(size_t)0) -#endif - -#endif /* ! C99 */ - -#endif /* ! FLEXINT_H */ - -/* begin standard C++ headers. */ - -/* TODO: this is always defined, so inline it */ -#define yyconst const - -#if defined(__GNUC__) && __GNUC__ >= 3 -#define yynoreturn __attribute__((__noreturn__)) -#else -#define yynoreturn -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an - * integer in range [0..255] for use as an array index. - */ -#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) - -/* An opaque pointer. */ -#ifndef YY_TYPEDEF_YY_SCANNER_T -#define YY_TYPEDEF_YY_SCANNER_T -typedef void* yyscan_t; -#endif - -/* For convenience, these vars (plus the bison vars far below) - are macros in the reentrant scanner. */ -#define yyin yyg->yyin_r -#define yyout yyg->yyout_r -#define yyextra yyg->yyextra_r -#define yyleng yyg->yyleng_r -#define yytext yyg->yytext_r -#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) -#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) -#define yy_flex_debug yyg->yy_flex_debug_r - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN yyg->yy_start = 1 + 2 * -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START ((yyg->yy_start - 1) / 2) -#define YYSTATE YY_START -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart( yyin , yyscanner ) -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else -#define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ -#endif - -/* The state buf must be large enough to hold one state per character in the main buffer. - */ -#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) - -#ifndef YY_TYPEDEF_YY_BUFFER_STATE -#define YY_TYPEDEF_YY_BUFFER_STATE -typedef struct yy_buffer_state *YY_BUFFER_STATE; -#endif - -#ifndef YY_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T -typedef size_t yy_size_t; -#endif - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - - #define YY_LESS_LINENO(n) - #define YY_LINENO_REWIND_TO(ptr) - -/* Return all but the first "n" matched characters back to the input stream. */ -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - *yy_cp = yyg->yy_hold_char; \ - YY_RESTORE_YY_MORE_OFFSET \ - yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) -#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) - -#ifndef YY_STRUCT_YY_BUFFER_STATE -#define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - int yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; - -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - - }; -#endif /* !YY_STRUCT_YY_BUFFER_STATE */ - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - * - * Returns the top of the stack, or NULL. - */ -#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ - ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ - : NULL) -/* Same as previous macro, but useful when we know that the buffer stack is not - * NULL or when we need an lvalue. For internal use only. - */ -#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] - -void yyrestart ( FILE *input_file , yyscan_t yyscanner ); -void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); -void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); -void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); -void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); -void yypop_buffer_state ( yyscan_t yyscanner ); - -static void yyensure_buffer_stack ( yyscan_t yyscanner ); -static void yy_load_buffer_state ( yyscan_t yyscanner ); -static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner ); -#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner) - -YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner ); - -void *yyalloc ( yy_size_t , yyscan_t yyscanner ); -void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); -void yyfree ( void * , yyscan_t yyscanner ); - -#define yy_new_buffer yy_create_buffer -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! YY_CURRENT_BUFFER ){ \ - yyensure_buffer_stack (yyscanner); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ - } -#define yy_set_bol(at_bol) \ - { \ - if ( ! YY_CURRENT_BUFFER ){\ - yyensure_buffer_stack (yyscanner); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ - } -#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) - -/* Begin user sect3 */ - -#define glcpp_wrap(yyscanner) (/*CONSTCOND*/1) -#define YY_SKIP_YYWRAP -typedef flex_uint8_t YY_CHAR; - -typedef int yy_state_type; - -#define yytext_ptr yytext_r - -static yy_state_type yy_get_previous_state ( yyscan_t yyscanner ); -static yy_state_type yy_try_NUL_trans ( yy_state_type current_state , yyscan_t yyscanner); -static int yy_get_next_buffer ( yyscan_t yyscanner ); -static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - yyg->yytext_ptr = yy_bp; \ - yyleng = (int) (yy_cp - yy_bp); \ - yyg->yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ - yyg->yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 52 -#define YY_END_OF_BUFFER 53 -/* This struct is not used in this scanner, - but its presence is necessary. */ -struct yy_trans_info - { - flex_int32_t yy_verify; - flex_int32_t yy_nxt; - }; -static const flex_int16_t yy_accept[174] = - { 0, - 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 53, 48, 49, 50, 51, 50, - 47, 8, 47, 47, 47, 47, 47, 47, 31, 30, - 47, 47, 47, 45, 45, 47, 3, 4, 4, 5, - 29, 27, 51, 26, 24, 23, 13, 13, 24, 24, - 24, 24, 24, 24, 24, 24, 48, 50, 38, 43, - 39, 41, 42, 46, 2, 1, 46, 31, 46, 31, - 46, 30, 30, 33, 35, 37, 36, 34, 45, 45, - 40, 3, 4, 4, 4, 5, 6, 6, 5, 7, - 29, 27, 28, 1, 25, 26, 23, 13, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 1, 32, - 32, 45, 4, 6, 28, 1, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, 0, 0, 0, 32, - 45, 0, 0, 18, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 45, 0, 17, 19, 20, 0, 14, - 0, 12, 0, 22, 0, 45, 21, 20, 0, 15, - 11, 0, 44, 21, 0, 11, 11, 10, 0, 0, - 9, 11, 0 - } ; - -static const YY_CHAR yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 4, 4, 5, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 6, 1, 7, 1, 8, 9, 1, 10, - 8, 11, 12, 8, 13, 14, 15, 16, 17, 17, - 17, 17, 17, 17, 17, 18, 18, 1, 8, 19, - 20, 21, 1, 1, 22, 22, 22, 22, 23, 22, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, - 24, 24, 24, 24, 26, 24, 24, 27, 24, 24, - 8, 1, 8, 8, 24, 1, 28, 22, 22, 29, - - 30, 31, 32, 24, 33, 24, 24, 34, 35, 36, - 37, 38, 24, 39, 40, 41, 42, 43, 24, 44, - 24, 24, 8, 45, 8, 8, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static const YY_CHAR yy_meta[46] = - { 0, - 1, 2, 3, 2, 3, 1, 1, 1, 1, 4, - 5, 1, 1, 6, 1, 7, 7, 7, 1, 1, - 1, 7, 7, 7, 7, 7, 7, 7, 8, 7, - 7, 7, 7, 7, 7, 8, 7, 7, 7, 7, - 7, 7, 7, 7, 1 - } ; - -static const flex_int16_t yy_base[191] = - { 0, - 0, 0, 43, 44, 55, 0, 47, 48, 99, 141, - 102, 103, 106, 107, 435, 433, 436, 428, 436, 429, - 411, 423, 436, 420, 416, 414, 99, 107, 169, 198, - 100, 406, 103, 0, 395, 379, 122, 418, 419, 144, - 0, 419, 115, 410, 436, 417, 413, 414, 120, 386, - 114, 384, 381, 374, 376, 381, 409, 436, 436, 436, - 436, 436, 436, 138, 436, 0, 139, 164, 197, 126, - 229, 0, 139, 436, 436, 436, 436, 436, 0, 378, - 436, 131, 403, 404, 436, 186, 401, 402, 197, 436, - 0, 402, 0, 163, 436, 393, 400, 436, 370, 133, - - 371, 360, 357, 169, 361, 368, 366, 355, 0, 146, - 191, 360, 436, 436, 0, 227, 359, 360, 360, 356, - 351, 357, 436, 356, 356, 341, 329, 319, 301, 206, - 304, 297, 0, 436, 297, 288, 276, 280, 268, 261, - 220, 219, 216, 218, 214, 436, 436, 0, 203, 436, - 207, 232, 198, 436, 188, 164, 185, 0, 145, 436, - 251, 124, 0, 155, 117, 227, 259, 436, 138, 85, - 111, 234, 436, 264, 272, 280, 283, 285, 293, 301, - 309, 317, 322, 330, 338, 346, 354, 362, 368, 376 - } ; - -static const flex_int16_t yy_def[191] = - { 0, - 173, 1, 174, 174, 173, 5, 175, 175, 176, 176, - 175, 175, 175, 175, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 177, 177, - 173, 173, 173, 178, 178, 173, 179, 173, 173, 180, - 181, 173, 182, 183, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 177, 173, 184, 177, 30, 177, 69, - 69, 30, 69, 173, 173, 173, 173, 173, 178, 178, - 173, 179, 173, 173, 173, 180, 173, 173, 180, 173, - 181, 173, 185, 186, 173, 183, 173, 173, 173, 173, - - 173, 173, 173, 187, 173, 173, 173, 173, 184, 71, - 71, 178, 173, 173, 185, 186, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 69, - 178, 173, 188, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 178, 173, 173, 173, 189, 173, 173, - 173, 173, 173, 173, 173, 178, 173, 189, 173, 173, - 190, 173, 178, 173, 173, 190, 190, 173, 173, 173, - 173, 190, 0, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173 - } ; - -static const flex_int16_t yy_nxt[482] = - { 0, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 23, - 23, 25, 26, 27, 28, 29, 30, 30, 31, 32, - 33, 34, 34, 34, 34, 34, 34, 34, 35, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 36, 38, 38, 39, 39, 18, - 18, 20, 20, 40, 40, 41, 42, 18, 19, 20, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 43, - 41, 41, 41, 41, 41, 41, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 41, - - 46, 47, 19, 48, 18, 18, 20, 20, 18, 18, - 20, 20, 171, 49, 64, 64, 64, 65, 74, 75, - 172, 66, 77, 78, 83, 65, 84, 50, 51, 94, - 65, 52, 53, 83, 66, 84, 54, 173, 173, 171, - 55, 56, 46, 47, 19, 48, 87, 100, 88, 101, - 173, 173, 102, 170, 89, 49, 164, 103, 90, 169, - 69, 69, 69, 69, 109, 118, 109, 69, 69, 50, - 51, 130, 119, 52, 53, 69, 69, 165, 54, 68, - 68, 67, 55, 56, 68, 68, 164, 130, 87, 70, - 88, 69, 163, 69, 70, 71, 173, 124, 69, 87, - - 173, 88, 67, 67, 125, 70, 69, 89, 67, 67, - 70, 90, 71, 72, 72, 72, 130, 173, 173, 69, - 69, 69, 69, 73, 162, 161, 69, 69, 109, 173, - 109, 173, 130, 152, 69, 69, 173, 160, 173, 73, - 173, 173, 159, 157, 110, 110, 110, 156, 155, 154, - 110, 111, 167, 168, 153, 168, 110, 110, 111, 110, - 167, 168, 152, 168, 37, 37, 37, 37, 37, 37, - 37, 37, 19, 19, 19, 19, 19, 19, 19, 19, - 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, - 67, 79, 79, 82, 82, 82, 82, 151, 82, 82, - - 82, 86, 86, 86, 86, 86, 86, 86, 86, 91, - 150, 149, 91, 91, 91, 91, 91, 93, 93, 93, - 93, 93, 93, 93, 93, 96, 148, 147, 96, 96, - 109, 109, 145, 109, 109, 109, 109, 109, 115, 144, - 143, 115, 115, 115, 115, 115, 116, 116, 142, 116, - 116, 116, 116, 116, 123, 123, 123, 123, 123, 123, - 141, 123, 146, 146, 146, 146, 146, 146, 158, 158, - 140, 158, 158, 158, 158, 158, 166, 166, 166, 166, - 166, 166, 166, 166, 139, 138, 137, 136, 135, 134, - 133, 132, 131, 129, 128, 127, 126, 122, 121, 120, - - 117, 97, 95, 92, 114, 114, 113, 113, 112, 57, - 108, 107, 106, 105, 104, 99, 98, 98, 97, 95, - 92, 85, 85, 81, 80, 76, 63, 62, 61, 60, - 59, 58, 58, 57, 173, 15, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173 - } ; - -static const flex_int16_t yy_chk[482] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 4, 3, 4, 7, - 8, 7, 8, 3, 4, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - - 9, 9, 9, 9, 11, 12, 11, 12, 13, 14, - 13, 14, 171, 9, 27, 27, 27, 28, 31, 31, - 170, 28, 33, 33, 37, 43, 37, 9, 9, 43, - 49, 9, 9, 82, 49, 82, 9, 70, 70, 169, - 9, 9, 10, 10, 10, 10, 40, 51, 40, 51, - 73, 73, 51, 165, 40, 10, 164, 51, 40, 162, - 64, 67, 64, 67, 94, 100, 94, 64, 67, 10, - 10, 110, 100, 10, 10, 64, 67, 159, 10, 68, - 68, 68, 10, 10, 29, 29, 157, 110, 86, 68, - 86, 29, 156, 29, 29, 29, 86, 104, 29, 89, - - 86, 89, 111, 111, 104, 68, 29, 89, 69, 69, - 29, 89, 29, 30, 30, 30, 111, 130, 130, 69, - 30, 69, 30, 30, 155, 153, 69, 30, 116, 166, - 116, 166, 111, 152, 69, 30, 172, 151, 172, 30, - 71, 71, 149, 145, 71, 71, 71, 144, 143, 142, - 71, 71, 161, 161, 141, 161, 71, 71, 71, 71, - 167, 167, 140, 167, 174, 174, 174, 174, 174, 174, - 174, 174, 175, 175, 175, 175, 175, 175, 175, 175, - 176, 176, 176, 176, 176, 176, 176, 176, 177, 177, - 177, 178, 178, 179, 179, 179, 179, 139, 179, 179, - - 179, 180, 180, 180, 180, 180, 180, 180, 180, 181, - 138, 137, 181, 181, 181, 181, 181, 182, 182, 182, - 182, 182, 182, 182, 182, 183, 136, 135, 183, 183, - 184, 184, 132, 184, 184, 184, 184, 184, 185, 131, - 129, 185, 185, 185, 185, 185, 186, 186, 128, 186, - 186, 186, 186, 186, 187, 187, 187, 187, 187, 187, - 127, 187, 188, 188, 188, 188, 188, 188, 189, 189, - 126, 189, 189, 189, 189, 189, 190, 190, 190, 190, - 190, 190, 190, 190, 125, 124, 122, 121, 120, 119, - 118, 117, 112, 108, 107, 106, 105, 103, 102, 101, - - 99, 97, 96, 92, 88, 87, 84, 83, 80, 57, - 56, 55, 54, 53, 52, 50, 48, 47, 46, 44, - 42, 39, 38, 36, 35, 32, 26, 25, 24, 22, - 21, 20, 18, 16, 15, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173 - } ; - -/* The intent behind this definition is that it'll catch - * any uses of REJECT which flex missed. - */ -#define REJECT reject_used_but_not_detected -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET -#line 1 "src/glsl/glcpp/glcpp-lex.l" -#line 2 "src/glsl/glcpp/glcpp-lex.l" -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include -#include -#include - -#include "glcpp.h" -#include "glcpp-parse.h" - -/* Flex annoyingly generates some functions without making them - * static. Let's declare them here. */ -int glcpp_get_column (yyscan_t yyscanner); -void glcpp_set_column (int column_no , yyscan_t yyscanner); - -#ifdef _MSC_VER -#define YY_NO_UNISTD_H -#pragma warning(disable: 4267) // warning C4267: '=' : conversion from 'size_t' to 'int', possible loss of data -#endif - -#define YY_NO_INPUT - -#define YY_USER_ACTION \ - do { \ - if (parser->has_new_line_number) \ - yylineno = parser->new_line_number; \ - if (parser->has_new_source_number) \ - yylloc->source = parser->new_source_number; \ - yylloc->first_column = yycolumn + 1; \ - yylloc->first_line = yylloc->last_line = yylineno; \ - yycolumn += yyleng; \ - yylloc->last_column = yycolumn + 1; \ - parser->has_new_line_number = 0; \ - parser->has_new_source_number = 0; \ - } while(0); - -#define YY_USER_INIT \ - do { \ - yylineno = 1; \ - yycolumn = 0; \ - yylloc->source = 0; \ - } while(0) - -/* It's ugly to have macros that have return statements inside of - * them, but flex-based lexer generation is all built around the - * return statement. - * - * To mitigate the ugliness, we defer as much of the logic as possible - * to an actual function, not a macro (see - * glcpplex_update_state_per_token) and we make the word RETURN - * prominent in all of the macros which may return. - * - * The most-commonly-used macro is RETURN_TOKEN which will perform all - * necessary state updates based on the provided token,, then - * conditionally return the token. It will not return a token if the - * parser is currently skipping tokens, (such as within #if - * 0...#else). - * - * The RETURN_TOKEN_NEVER_SKIP macro is a lower-level variant that - * makes the token returning unconditional. This is needed for things - * like #if and the tokens of its condition, (since these must be - * evaluated by the parser even when otherwise skipping). - * - * Finally, RETURN_STRING_TOKEN is a simple convenience wrapper on top - * of RETURN_TOKEN that performs a string copy of yytext before the - * return. - */ -#define RETURN_TOKEN_NEVER_SKIP(token) \ - do { \ - if (glcpp_lex_update_state_per_token (parser, token)) \ - return token; \ - } while (0) - -#define RETURN_TOKEN(token) \ - do { \ - if (! parser->skipping) { \ - RETURN_TOKEN_NEVER_SKIP(token); \ - } \ - } while(0) - -#define RETURN_STRING_TOKEN(token) \ - do { \ - if (! parser->skipping) { \ - yylval->str = ralloc_strdup (yyextra, yytext); \ - RETURN_TOKEN_NEVER_SKIP (token); \ - } \ - } while(0) - - -/* Update all state necessary for each token being returned. - * - * Here we'll be tracking newlines and spaces so that the lexer can - * alter its behavior as necessary, (for example, '#' has special - * significance if it is the first non-whitespace, non-comment token - * in a line, but does not otherwise). - * - * NOTE: If this function returns FALSE, then no token should be - * returned at all. This is used to suprress duplicate SPACE tokens. - */ -static int -glcpp_lex_update_state_per_token (glcpp_parser_t *parser, int token) -{ - /* After the first non-space token in a line, we won't - * allow any '#' to introduce a directive. */ - if (token == NEWLINE) { - parser->first_non_space_token_this_line = 1; - } else if (token != SPACE) { - parser->first_non_space_token_this_line = 0; - } - - /* Track newlines just to know whether a newline needs - * to be inserted if end-of-file comes early. */ - if (token == NEWLINE) { - parser->last_token_was_newline = 1; - } else { - parser->last_token_was_newline = 0; - } - - /* Track spaces to avoid emitting multiple SPACE - * tokens in a row. */ - if (token == SPACE) { - if (! parser->last_token_was_space) { - parser->last_token_was_space = 1; - return 1; - } else { - parser->last_token_was_space = 1; - return 0; - } - } else { - parser->last_token_was_space = 0; - return 1; - } -} - - -#line 976 "src/glsl/glcpp/glcpp-lex.c" -#line 167 "src/glsl/glcpp/glcpp-lex.l" - /* Note: When adding any start conditions to this list, you must also - * update the "Internal compiler error" catch-all rule near the end of - * this file. */ - -/* The OTHER class is simply a catch-all for things that the CPP -parser just doesn't care about. Since flex regular expressions that -match longer strings take priority over those matching shorter -strings, we have to be careful to avoid OTHER matching and hiding -something that CPP does care about. So we simply exclude all -characters that appear in any other expressions. */ -#line 988 "src/glsl/glcpp/glcpp-lex.c" - -#define INITIAL 0 -#define COMMENT 1 -#define DEFINE 2 -#define DONE 3 -#define HASH 4 -#define NEWLINE_CATCHUP 5 -#define UNREACHABLE 6 - -#define YY_EXTRA_TYPE glcpp_parser_t * - -/* Holds the entire state of the reentrant scanner. */ -struct yyguts_t - { - - /* User-defined. Not touched by flex. */ - YY_EXTRA_TYPE yyextra_r; - - /* The rest are the same as the globals declared in the non-reentrant scanner. */ - FILE *yyin_r, *yyout_r; - size_t yy_buffer_stack_top; /**< index of top of stack. */ - size_t yy_buffer_stack_max; /**< capacity of stack. */ - YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ - char yy_hold_char; - int yy_n_chars; - int yyleng_r; - char *yy_c_buf_p; - int yy_init; - int yy_start; - int yy_did_buffer_switch_on_eof; - int yy_start_stack_ptr; - int yy_start_stack_depth; - int *yy_start_stack; - yy_state_type yy_last_accepting_state; - char* yy_last_accepting_cpos; - - int yylineno_r; - int yy_flex_debug_r; - - char *yytext_r; - int yy_more_flag; - int yy_more_len; - - YYSTYPE * yylval_r; - - YYLTYPE * yylloc_r; - - }; /* end struct yyguts_t */ - -static int yy_init_globals ( yyscan_t yyscanner ); - - /* This must go here because YYSTYPE and YYLTYPE are included - * from bison output in section 1.*/ - # define yylval yyg->yylval_r - - # define yylloc yyg->yylloc_r - -int yylex_init (yyscan_t* scanner); - -int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); - -/* Accessor methods to globals. - These are made visible to non-reentrant scanners for convenience. */ - -int yylex_destroy ( yyscan_t yyscanner ); - -int yyget_debug ( yyscan_t yyscanner ); - -void yyset_debug ( int debug_flag , yyscan_t yyscanner ); - -YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); - -void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); - -FILE *yyget_in ( yyscan_t yyscanner ); - -void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); - -FILE *yyget_out ( yyscan_t yyscanner ); - -void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); - - int yyget_leng ( yyscan_t yyscanner ); - -char *yyget_text ( yyscan_t yyscanner ); - -int yyget_lineno ( yyscan_t yyscanner ); - -void yyset_lineno ( int _line_number , yyscan_t yyscanner ); - -int yyget_column ( yyscan_t yyscanner ); - -void yyset_column ( int _column_no , yyscan_t yyscanner ); - -YYSTYPE * yyget_lval ( yyscan_t yyscanner ); - -void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner ); - - YYLTYPE *yyget_lloc ( yyscan_t yyscanner ); - - void yyset_lloc ( YYLTYPE * yylloc_param , yyscan_t yyscanner ); - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap ( yyscan_t yyscanner ); -#else -extern int yywrap ( yyscan_t yyscanner ); -#endif -#endif - -#ifndef YY_NO_UNPUT - - static void yyunput ( int c, char *buf_ptr , yyscan_t yyscanner); - -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen ( const char * , yyscan_t yyscanner); -#endif - -#ifndef YY_NO_INPUT -#ifdef __cplusplus -static int yyinput ( yyscan_t yyscanner ); -#else -static int input ( yyscan_t yyscanner ); -#endif - -#endif - - static void yy_push_state ( int _new_state , yyscan_t yyscanner); - - static void yy_pop_state ( yyscan_t yyscanner ); - - static int yy_top_state ( yyscan_t yyscanner ); - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else -#define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ -#endif - -/* Copy whatever the last rule matched to the standard output. */ -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ - { \ - int c = '*'; \ - int n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else \ - { \ - errno=0; \ - while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(yyin); \ - } \ - }\ -\ - -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) -#endif - -/* end tables serialization structures and prototypes */ - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL_IS_OURS 1 - -extern int yylex \ - (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner); - -#define YY_DECL int yylex \ - (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner) -#endif /* !YY_DECL */ - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK /*LINTED*/break; -#endif - -#define YY_RULE_SETUP \ - YY_USER_ACTION - -/** The main scanner function which does all the work. - */ -YY_DECL -{ - yy_state_type yy_current_state; - char *yy_cp, *yy_bp; - int yy_act; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - yylval = yylval_param; - - yylloc = yylloc_param; - - if ( !yyg->yy_init ) - { - yyg->yy_init = 1; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! yyg->yy_start ) - yyg->yy_start = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! YY_CURRENT_BUFFER ) { - yyensure_buffer_stack (yyscanner); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); - } - - yy_load_buffer_state( yyscanner ); - } - - { -#line 196 "src/glsl/glcpp/glcpp-lex.l" - - - glcpp_parser_t *parser = yyextra; - - /* When we lex a multi-line comment, we replace it (as - * specified) with a single space. But if the comment spanned - * multiple lines, then subsequent parsing stages will not - * count correct line numbers. To avoid this problem we keep - * track of all newlines that were commented out by a - * multi-line comment, and we emit a NEWLINE token for each at - * the next legal opportunity, (which is when the lexer would - * be emitting a NEWLINE token anyway). - */ - if (YY_START == NEWLINE_CATCHUP) { - if (parser->commented_newlines) - parser->commented_newlines--; - if (parser->commented_newlines == 0) - BEGIN INITIAL; - RETURN_TOKEN_NEVER_SKIP (NEWLINE); - } - - /* Set up the parser->skipping bit here before doing any lexing. - * - * This bit controls whether tokens are skipped, (as implemented by - * RETURN_TOKEN), such as between "#if 0" and "#endif". - * - * The parser maintains a skip_stack indicating whether we should be - * skipping, (and nested levels of #if/#ifdef/#ifndef/#endif) will - * push and pop items from the stack. - * - * Here are the rules for determining whether we are skipping: - * - * 1. If the skip stack is NULL, we are outside of all #if blocks - * and we are not skipping. - * - * 2. If the skip stack is non-NULL, the type of the top node in - * the stack determines whether to skip. A type of - * SKIP_NO_SKIP is used for blocks wheere we are emitting - * tokens, (such as between #if 1 and #endif, or after the - * #else of an #if 0, etc.). - * - * 3. The lexing_directive bit overrides the skip stack. This bit - * is set when we are actively lexing the expression for a - * pre-processor condition, (such as #if, #elif, or #else). In - * this case, even if otherwise skipping, we need to emit the - * tokens for this condition so that the parser can evaluate - * the expression. (For, #else, there's no expression, but we - * emit tokens so the parser can generate a nice error message - * if there are any tokens here). - */ - if (parser->skip_stack && - parser->skip_stack->type != SKIP_NO_SKIP && - ! parser->lexing_directive) - { - parser->skipping = 1; - } else { - parser->skipping = 0; - } - - /* Single-line comments */ -#line 1335 "src/glsl/glcpp/glcpp-lex.c" - - while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ - { - yy_cp = yyg->yy_c_buf_p; - - /* Support of yytext. */ - *yy_cp = yyg->yy_hold_char; - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = yyg->yy_start; -yy_match: - do - { - YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; - if ( yy_accept[yy_current_state] ) - { - yyg->yy_last_accepting_state = yy_current_state; - yyg->yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 174 ) - yy_c = yy_meta[yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - ++yy_cp; - } - while ( yy_current_state != 173 ); - yy_cp = yyg->yy_last_accepting_cpos; - yy_current_state = yyg->yy_last_accepting_state; - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - - YY_DO_BEFORE_ACTION; - -do_action: /* This label is used only to access EOF actions. */ - - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = yyg->yy_hold_char; - yy_cp = yyg->yy_last_accepting_cpos; - yy_current_state = yyg->yy_last_accepting_state; - goto yy_find_action; - -case 1: -YY_RULE_SETUP -#line 256 "src/glsl/glcpp/glcpp-lex.l" -{ -} - YY_BREAK -/* Multi-line comments */ -case 2: -YY_RULE_SETUP -#line 260 "src/glsl/glcpp/glcpp-lex.l" -{ yy_push_state(COMMENT, yyscanner); } - YY_BREAK -case 3: -YY_RULE_SETUP -#line 261 "src/glsl/glcpp/glcpp-lex.l" - - YY_BREAK -case 4: -/* rule 4 can match eol */ -YY_RULE_SETUP -#line 262 "src/glsl/glcpp/glcpp-lex.l" -{ yylineno++; yycolumn = 0; parser->commented_newlines++; } - YY_BREAK -case 5: -YY_RULE_SETUP -#line 263 "src/glsl/glcpp/glcpp-lex.l" - - YY_BREAK -case 6: -/* rule 6 can match eol */ -YY_RULE_SETUP -#line 264 "src/glsl/glcpp/glcpp-lex.l" -{ yylineno++; yycolumn = 0; parser->commented_newlines++; } - YY_BREAK -case 7: -YY_RULE_SETUP -#line 265 "src/glsl/glcpp/glcpp-lex.l" -{ - yy_pop_state(yyscanner); - /* In the start condition, we don't want any SPACE token. */ - if (yyextra->space_tokens && YY_START != HASH) - RETURN_TOKEN (SPACE); -} - YY_BREAK -case 8: -YY_RULE_SETUP -#line 272 "src/glsl/glcpp/glcpp-lex.l" -{ - - /* If the '#' is the first non-whitespace, non-comment token on this - * line, then it introduces a directive, switch to the start - * condition. - * - * Otherwise, this is just punctuation, so return the HASH_TOKEN - * token. */ - if (parser->first_non_space_token_this_line) { - BEGIN HASH; - } - - RETURN_TOKEN_NEVER_SKIP (HASH_TOKEN); -} - YY_BREAK -case 9: -YY_RULE_SETUP -#line 287 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - yyextra->space_tokens = 0; - RETURN_STRING_TOKEN (VERSION_TOKEN); -} - YY_BREAK -/* Swallow empty #pragma directives, (to avoid confusing the - * downstream compiler). - * - * Note: We use a simple regular expression for the lookahead - * here. Specifically, we cannot use the complete {NEWLINE} expression - * since it uses alternation and we've found that there's a flex bug - * where using alternation in the lookahead portion of a pattern - * triggers a buffer overrun. */ -case 10: -/* rule 10 can match eol */ -*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ -YY_LINENO_REWIND_TO(yy_cp - 1); -yyg->yy_c_buf_p = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 301 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; -} - YY_BREAK -/* glcpp doesn't handle #extension, #version, or #pragma directives. - * Simply pass them through to the main compiler's lexer/parser. */ -case 11: -YY_RULE_SETUP -#line 307 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - RETURN_STRING_TOKEN (PRAGMA); -} - YY_BREAK -case 12: -YY_RULE_SETUP -#line 312 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - RETURN_TOKEN (LINE); -} - YY_BREAK -case 13: -/* rule 13 can match eol */ -YY_RULE_SETUP -#line 317 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - RETURN_TOKEN_NEVER_SKIP (NEWLINE); -} - YY_BREAK -/* For the pre-processor directives, we return these tokens - * even when we are otherwise skipping. */ -case 14: -YY_RULE_SETUP -#line 324 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - yyextra->lexing_directive = 1; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (IFDEF); -} - YY_BREAK -case 15: -YY_RULE_SETUP -#line 331 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - yyextra->lexing_directive = 1; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (IFNDEF); -} - YY_BREAK -case 16: -/* rule 16 can match eol */ -*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ -YY_LINENO_REWIND_TO(yy_bp + 2); -yyg->yy_c_buf_p = yy_cp = yy_bp + 2; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 338 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - yyextra->lexing_directive = 1; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (IF); -} - YY_BREAK -case 17: -/* rule 17 can match eol */ -*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ -YY_LINENO_REWIND_TO(yy_bp + 4); -yyg->yy_c_buf_p = yy_cp = yy_bp + 4; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 345 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - yyextra->lexing_directive = 1; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (ELIF); -} - YY_BREAK -case 18: -YY_RULE_SETUP -#line 352 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (ELSE); -} - YY_BREAK -case 19: -YY_RULE_SETUP -#line 358 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (ENDIF); -} - YY_BREAK -case 20: -YY_RULE_SETUP -#line 364 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - RETURN_STRING_TOKEN (ERROR_TOKEN); -} - YY_BREAK -/* After we see a "#define" we enter the start state - * for the lexer. Within we are looking for the first - * identifier and specifically checking whether the identifier - * is followed by a '(' or not, (to lex either a - * FUNC_IDENTIFIER or an OBJ_IDENITIFIER token). - * - * While in the state we also need to explicitly - * handle a few other things that may appear before the - * identifier: - * - * * Comments, (handled above with the main support for - * comments). - * - * * Whitespace (simply ignored) - * - * * Anything else, (not an identifier, not a comment, - * and not whitespace). This will generate an error. - */ -case 21: -YY_RULE_SETUP -#line 387 "src/glsl/glcpp/glcpp-lex.l" -{ - if (! parser->skipping) { - BEGIN DEFINE; - yyextra->space_tokens = 0; - RETURN_TOKEN (DEFINE_TOKEN); - } -} - YY_BREAK -case 22: -YY_RULE_SETUP -#line 395 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - yyextra->space_tokens = 0; - RETURN_TOKEN (UNDEF); -} - YY_BREAK -case 23: -YY_RULE_SETUP -#line 401 "src/glsl/glcpp/glcpp-lex.l" -{ - /* Nothing to do here. Importantly, don't leave the - * start condition, since it's legal to have space between the - * '#' and the directive.. */ -} - YY_BREAK -/* This will catch any non-directive garbage after a HASH */ -case 24: -YY_RULE_SETUP -#line 408 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - RETURN_TOKEN (GARBAGE); -} - YY_BREAK -/* An identifier immediately followed by '(' */ -case 25: -*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ -yyg->yy_c_buf_p = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 414 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - RETURN_STRING_TOKEN (FUNC_IDENTIFIER); -} - YY_BREAK -/* An identifier not immediately followed by '(' */ -case 26: -YY_RULE_SETUP -#line 420 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - RETURN_STRING_TOKEN (OBJ_IDENTIFIER); -} - YY_BREAK -/* Whitespace */ -case 27: -YY_RULE_SETUP -#line 426 "src/glsl/glcpp/glcpp-lex.l" -{ - /* Just ignore it. Nothing to do here. */ -} - YY_BREAK -/* '/' not followed by '*', so not a comment. This is an error. */ -case 28: -/* rule 28 can match eol */ -YY_RULE_SETUP -#line 431 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - glcpp_error(yylloc, yyextra, "#define followed by a non-identifier: %s", yytext); - RETURN_STRING_TOKEN (INTEGER_STRING); -} - YY_BREAK -/* A character that can't start an identifier, comment, or - * space. This is an error. */ -case 29: -YY_RULE_SETUP -#line 439 "src/glsl/glcpp/glcpp-lex.l" -{ - BEGIN INITIAL; - glcpp_error(yylloc, yyextra, "#define followed by a non-identifier: %s", yytext); - RETURN_STRING_TOKEN (INTEGER_STRING); -} - YY_BREAK -case 30: -YY_RULE_SETUP -#line 445 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_STRING_TOKEN (INTEGER_STRING); -} - YY_BREAK -case 31: -YY_RULE_SETUP -#line 449 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_STRING_TOKEN (INTEGER_STRING); -} - YY_BREAK -case 32: -YY_RULE_SETUP -#line 453 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_STRING_TOKEN (INTEGER_STRING); -} - YY_BREAK -case 33: -YY_RULE_SETUP -#line 457 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_TOKEN (LEFT_SHIFT); -} - YY_BREAK -case 34: -YY_RULE_SETUP -#line 461 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_TOKEN (RIGHT_SHIFT); -} - YY_BREAK -case 35: -YY_RULE_SETUP -#line 465 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_TOKEN (LESS_OR_EQUAL); -} - YY_BREAK -case 36: -YY_RULE_SETUP -#line 469 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_TOKEN (GREATER_OR_EQUAL); -} - YY_BREAK -case 37: -YY_RULE_SETUP -#line 473 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_TOKEN (EQUAL); -} - YY_BREAK -case 38: -YY_RULE_SETUP -#line 477 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_TOKEN (NOT_EQUAL); -} - YY_BREAK -case 39: -YY_RULE_SETUP -#line 481 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_TOKEN (AND); -} - YY_BREAK -case 40: -YY_RULE_SETUP -#line 485 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_TOKEN (OR); -} - YY_BREAK -case 41: -YY_RULE_SETUP -#line 489 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_TOKEN (PLUS_PLUS); -} - YY_BREAK -case 42: -YY_RULE_SETUP -#line 493 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_TOKEN (MINUS_MINUS); -} - YY_BREAK -case 43: -YY_RULE_SETUP -#line 497 "src/glsl/glcpp/glcpp-lex.l" -{ - if (! parser->skipping) { - if (parser->is_gles) - glcpp_error(yylloc, yyextra, "Token pasting (##) is illegal in GLES"); - RETURN_TOKEN (PASTE); - } -} - YY_BREAK -case 44: -YY_RULE_SETUP -#line 505 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_TOKEN (DEFINED); -} - YY_BREAK -case 45: -YY_RULE_SETUP -#line 509 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_STRING_TOKEN (IDENTIFIER); -} - YY_BREAK -case 46: -YY_RULE_SETUP -#line 513 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_STRING_TOKEN (OTHER); -} - YY_BREAK -case 47: -YY_RULE_SETUP -#line 517 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_TOKEN (yytext[0]); -} - YY_BREAK -case 48: -YY_RULE_SETUP -#line 521 "src/glsl/glcpp/glcpp-lex.l" -{ - RETURN_STRING_TOKEN (OTHER); -} - YY_BREAK -case 49: -YY_RULE_SETUP -#line 525 "src/glsl/glcpp/glcpp-lex.l" -{ - if (yyextra->space_tokens) { - RETURN_TOKEN (SPACE); - } -} - YY_BREAK -/* We preserve all newlines, even between #if 0..#endif, so no - skipping.. */ -case 50: -/* rule 50 can match eol */ -YY_RULE_SETUP -#line 533 "src/glsl/glcpp/glcpp-lex.l" -{ - if (parser->commented_newlines) { - BEGIN NEWLINE_CATCHUP; - } else { - BEGIN INITIAL; - } - yyextra->space_tokens = 1; - yyextra->lexing_directive = 0; - yylineno++; - yycolumn = 0; - RETURN_TOKEN_NEVER_SKIP (NEWLINE); -} - YY_BREAK -case YY_STATE_EOF(INITIAL): -case YY_STATE_EOF(COMMENT): -case YY_STATE_EOF(DEFINE): -case YY_STATE_EOF(HASH): -#line 546 "src/glsl/glcpp/glcpp-lex.l" -{ - if (YY_START == COMMENT) - glcpp_error(yylloc, yyextra, "Unterminated comment"); - BEGIN DONE; /* Don't keep matching this rule forever. */ - yyextra->lexing_directive = 0; - if (! parser->last_token_was_newline) - RETURN_TOKEN (NEWLINE); -} - YY_BREAK -/* This is a catch-all to avoid the annoying default flex action which - * matches any character and prints it. If any input ever matches this - * rule, then we have made a mistake above and need to fix one or more - * of the preceding patterns to match that input. */ -case 51: -YY_RULE_SETUP -#line 560 "src/glsl/glcpp/glcpp-lex.l" -{ - glcpp_error(yylloc, yyextra, "Internal compiler error: Unexpected character: %s", yytext); - - /* We don't actually use the UNREACHABLE start condition. We - only have this block here so that we can pretend to call some - generated functions, (to avoid "defined but not used" - warnings. */ - if (YY_START == UNREACHABLE) { - unput('.'); - yy_top_state(yyextra); - } -} - YY_BREAK -case 52: -YY_RULE_SETUP -#line 573 "src/glsl/glcpp/glcpp-lex.l" -YY_FATAL_ERROR( "flex scanner jammed" ); - YY_BREAK -#line 1895 "src/glsl/glcpp/glcpp-lex.c" -case YY_STATE_EOF(DONE): -case YY_STATE_EOF(NEWLINE_CATCHUP): -case YY_STATE_EOF(UNREACHABLE): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = yyg->yy_hold_char; - YY_RESTORE_YY_MORE_OFFSET - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between YY_CURRENT_BUFFER and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( yyscanner ); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); - - yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++yyg->yy_c_buf_p; - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = yyg->yy_last_accepting_cpos; - yy_current_state = yyg->yy_last_accepting_state; - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer( yyscanner ) ) - { - case EOB_ACT_END_OF_FILE: - { - yyg->yy_did_buffer_switch_on_eof = 0; - - if ( yywrap( yyscanner ) ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! yyg->yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - yyg->yy_c_buf_p = - yyg->yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( yyscanner ); - - yy_cp = yyg->yy_c_buf_p; - yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - yyg->yy_c_buf_p = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; - - yy_current_state = yy_get_previous_state( yyscanner ); - - yy_cp = yyg->yy_c_buf_p; - yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of user's declarations */ -} /* end of yylex */ - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ -static int yy_get_next_buffer (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - char *source = yyg->yytext_ptr; - int number_to_move, i; - int ret_val; - - if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1); - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; - - else - { - int num_to_read = - YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; - - int yy_c_buf_p_offset = - (int) (yyg->yy_c_buf_p - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - yyrealloc( (void *) b->yy_ch_buf, - (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = NULL; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - - number_to_move - 1; - - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), - yyg->yy_n_chars, num_to_read ); - - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; - } - - if ( yyg->yy_n_chars == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin , yyscanner); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( - (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner ); - if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - /* "- 2" to take care of EOB's */ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); - } - - yyg->yy_n_chars += number_to_move; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; - - return ret_val; -} - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - - static yy_state_type yy_get_previous_state (yyscan_t yyscanner) -{ - yy_state_type yy_current_state; - char *yy_cp; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - yy_current_state = yyg->yy_start; - - for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) - { - YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - yyg->yy_last_accepting_state = yy_current_state; - yyg->yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 174 ) - yy_c = yy_meta[yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - } - - return yy_current_state; -} - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) -{ - int yy_is_jam; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ - char *yy_cp = yyg->yy_c_buf_p; - - YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - yyg->yy_last_accepting_state = yy_current_state; - yyg->yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 174 ) - yy_c = yy_meta[yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 173); - - (void)yyg; - return yy_is_jam ? 0 : yy_current_state; -} - -#ifndef YY_NO_UNPUT - - static void yyunput (int c, char * yy_bp , yyscan_t yyscanner) -{ - char *yy_cp; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - yy_cp = yyg->yy_c_buf_p; - - /* undo effects of setting up yytext */ - *yy_cp = yyg->yy_hold_char; - - if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) - { /* need to shift things up to make room */ - /* +2 for EOB chars. */ - int number_to_move = yyg->yy_n_chars + 2; - char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; - char *source = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; - - while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - *--dest = *--source; - - yy_cp += (int) (dest - source); - yy_bp += (int) (dest - source); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = - yyg->yy_n_chars = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; - - if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) - YY_FATAL_ERROR( "flex scanner push-back overflow" ); - } - - *--yy_cp = (char) c; - - yyg->yytext_ptr = yy_bp; - yyg->yy_hold_char = *yy_cp; - yyg->yy_c_buf_p = yy_cp; -} - -#endif - -#ifndef YY_NO_INPUT -#ifdef __cplusplus - static int yyinput (yyscan_t yyscanner) -#else - static int input (yyscan_t yyscanner) -#endif - -{ - int c; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - *yyg->yy_c_buf_p = yyg->yy_hold_char; - - if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) - /* This was really a NUL. */ - *yyg->yy_c_buf_p = '\0'; - - else - { /* need more input */ - int offset = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr); - ++yyg->yy_c_buf_p; - - switch ( yy_get_next_buffer( yyscanner ) ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - yyrestart( yyin , yyscanner); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: - { - if ( yywrap( yyscanner ) ) - return 0; - - if ( ! yyg->yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(yyscanner); -#else - return input(yyscanner); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - yyg->yy_c_buf_p = yyg->yytext_ptr + offset; - break; - } - } - } - - c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ - *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ - yyg->yy_hold_char = *++yyg->yy_c_buf_p; - - return c; -} -#endif /* ifndef YY_NO_INPUT */ - -/** Immediately switch to a different input stream. - * @param input_file A readable stream. - * @param yyscanner The scanner object. - * @note This function does not reset the start condition to @c INITIAL . - */ - void yyrestart (FILE * input_file , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - if ( ! YY_CURRENT_BUFFER ){ - yyensure_buffer_stack (yyscanner); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); - } - - yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner); - yy_load_buffer_state( yyscanner ); -} - -/** Switch to a different input buffer. - * @param new_buffer The new input buffer. - * @param yyscanner The scanner object. - */ - void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - /* TODO. We should be able to replace this entire function body - * with - * yypop_buffer_state(); - * yypush_buffer_state(new_buffer); - */ - yyensure_buffer_stack (yyscanner); - if ( YY_CURRENT_BUFFER == new_buffer ) - return; - - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *yyg->yy_c_buf_p = yyg->yy_hold_char; - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; - } - - YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state( yyscanner ); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - yyg->yy_did_buffer_switch_on_eof = 1; -} - -static void yy_load_buffer_state (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - yyg->yy_hold_char = *yyg->yy_c_buf_p; -} - -/** Allocate and initialize an input buffer state. - * @param file A readable stream. - * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. - * @param yyscanner The scanner object. - * @return the allocated buffer state. - */ - YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) -{ - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer( b, file , yyscanner); - - return b; -} - -/** Destroy the buffer. - * @param b a buffer created with yy_create_buffer() - * @param yyscanner The scanner object. - */ - void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - if ( ! b ) - return; - - if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ - YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yyfree( (void *) b->yy_ch_buf , yyscanner ); - - yyfree( (void *) b , yyscanner ); -} - -/* Initializes or reinitializes a buffer. - * This function is sometimes called more than once on the same buffer, - * such as during a yyrestart() or at EOF. - */ - static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) - -{ - int oerrno = errno; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - yy_flush_buffer( b , yyscanner); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - - /* If b is the current buffer, then yy_init_buffer was _probably_ - * called from yyrestart() or through yy_get_next_buffer. - * In that case, we don't want to reset the lineno or column. - */ - if (b != YY_CURRENT_BUFFER){ - b->yy_bs_lineno = 1; - b->yy_bs_column = 0; - } - - b->yy_is_interactive = 0; - - errno = oerrno; -} - -/** Discard all buffered characters. On the next scan, YY_INPUT will be called. - * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. - * @param yyscanner The scanner object. - */ - void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - if ( ! b ) - return; - - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == YY_CURRENT_BUFFER ) - yy_load_buffer_state( yyscanner ); -} - -/** Pushes the new state onto the stack. The new state becomes - * the current state. This function will allocate the stack - * if necessary. - * @param new_buffer The new state. - * @param yyscanner The scanner object. - */ -void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - if (new_buffer == NULL) - return; - - yyensure_buffer_stack(yyscanner); - - /* This block is copied from yy_switch_to_buffer. */ - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *yyg->yy_c_buf_p = yyg->yy_hold_char; - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; - } - - /* Only push if top exists. Otherwise, replace top. */ - if (YY_CURRENT_BUFFER) - yyg->yy_buffer_stack_top++; - YY_CURRENT_BUFFER_LVALUE = new_buffer; - - /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( yyscanner ); - yyg->yy_did_buffer_switch_on_eof = 1; -} - -/** Removes and deletes the top of the stack, if present. - * The next element becomes the new top. - * @param yyscanner The scanner object. - */ -void yypop_buffer_state (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - if (!YY_CURRENT_BUFFER) - return; - - yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner); - YY_CURRENT_BUFFER_LVALUE = NULL; - if (yyg->yy_buffer_stack_top > 0) - --yyg->yy_buffer_stack_top; - - if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( yyscanner ); - yyg->yy_did_buffer_switch_on_eof = 1; - } -} - -/* Allocates the stack if it does not exist. - * Guarantees space for at least one push. - */ -static void yyensure_buffer_stack (yyscan_t yyscanner) -{ - yy_size_t num_to_alloc; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - if (!yyg->yy_buffer_stack) { - - /* First allocation is just for 2 elements, since we don't know if this - * scanner will even need a stack. We use 2 instead of 1 to avoid an - * immediate realloc on the next call. - */ - num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ - yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc - (num_to_alloc * sizeof(struct yy_buffer_state*) - , yyscanner); - if ( ! yyg->yy_buffer_stack ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - - memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - - yyg->yy_buffer_stack_max = num_to_alloc; - yyg->yy_buffer_stack_top = 0; - return; - } - - if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ - - /* Increase the buffer to prepare for a possible push. */ - yy_size_t grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = yyg->yy_buffer_stack_max + grow_size; - yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc - (yyg->yy_buffer_stack, - num_to_alloc * sizeof(struct yy_buffer_state*) - , yyscanner); - if ( ! yyg->yy_buffer_stack ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - - /* zero only the new slots.*/ - memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); - yyg->yy_buffer_stack_max = num_to_alloc; - } -} - -/** Setup the input buffer state to scan directly from a user-specified character buffer. - * @param base the character buffer - * @param size the size in bytes of the character buffer - * @param yyscanner The scanner object. - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) -{ - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return NULL; - - b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = NULL; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer( b , yyscanner ); - - return b; -} - -/** Setup the input buffer state to scan a string. The next call to yylex() will - * scan from a @e copy of @a str. - * @param yystr a NUL-terminated string to scan - * @param yyscanner The scanner object. - * @return the newly allocated buffer state object. - * @note If you want to scan bytes that may contain NUL values, then use - * yy_scan_bytes() instead. - */ -YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner) -{ - - return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner); -} - -/** Setup the input buffer state to scan the given bytes. The next call to yylex() will - * scan from a @e copy of @a bytes. - * @param yybytes the byte buffer to scan - * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. - * @param yyscanner The scanner object. - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner) -{ - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = (yy_size_t) (_yybytes_len + 2); - buf = (char *) yyalloc( n , yyscanner ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < _yybytes_len; ++i ) - buf[i] = yybytes[i]; - - buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer( buf, n , yyscanner); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; -} - - static void yy_push_state (int _new_state , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - if ( yyg->yy_start_stack_ptr >= yyg->yy_start_stack_depth ) - { - yy_size_t new_size; - - yyg->yy_start_stack_depth += YY_START_STACK_INCR; - new_size = (yy_size_t) yyg->yy_start_stack_depth * sizeof( int ); - - if ( ! yyg->yy_start_stack ) - yyg->yy_start_stack = (int *) yyalloc( new_size , yyscanner ); - - else - yyg->yy_start_stack = (int *) yyrealloc( - (void *) yyg->yy_start_stack, new_size , yyscanner ); - - if ( ! yyg->yy_start_stack ) - YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); - } - - yyg->yy_start_stack[yyg->yy_start_stack_ptr++] = YY_START; - - BEGIN(_new_state); -} - - static void yy_pop_state (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - if ( --yyg->yy_start_stack_ptr < 0 ) - YY_FATAL_ERROR( "start-condition stack underflow" ); - - BEGIN(yyg->yy_start_stack[yyg->yy_start_stack_ptr]); -} - - static int yy_top_state (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yyg->yy_start_stack[yyg->yy_start_stack_ptr - 1]; -} - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); -} - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - yytext[yyleng] = yyg->yy_hold_char; \ - yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ - yyg->yy_hold_char = *yyg->yy_c_buf_p; \ - *yyg->yy_c_buf_p = '\0'; \ - yyleng = yyless_macro_arg; \ - } \ - while ( 0 ) - -/* Accessor methods (get/set functions) to struct members. */ - -/** Get the user-defined data for this scanner. - * @param yyscanner The scanner object. - */ -YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yyextra; -} - -/** Get the current line number. - * @param yyscanner The scanner object. - */ -int yyget_lineno (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - if (! YY_CURRENT_BUFFER) - return 0; - - return yylineno; -} - -/** Get the current column number. - * @param yyscanner The scanner object. - */ -int yyget_column (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - if (! YY_CURRENT_BUFFER) - return 0; - - return yycolumn; -} - -/** Get the input stream. - * @param yyscanner The scanner object. - */ -FILE *yyget_in (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yyin; -} - -/** Get the output stream. - * @param yyscanner The scanner object. - */ -FILE *yyget_out (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yyout; -} - -/** Get the length of the current token. - * @param yyscanner The scanner object. - */ -int yyget_leng (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yyleng; -} - -/** Get the current token. - * @param yyscanner The scanner object. - */ - -char *yyget_text (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yytext; -} - -/** Set the user-defined data. This data is never touched by the scanner. - * @param user_defined The data to be associated with this scanner. - * @param yyscanner The scanner object. - */ -void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyextra = user_defined ; -} - -/** Set the current line number. - * @param _line_number line number - * @param yyscanner The scanner object. - */ -void yyset_lineno (int _line_number , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - /* lineno is only valid if an input buffer exists. */ - if (! YY_CURRENT_BUFFER ) - YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); - - yylineno = _line_number; -} - -/** Set the current column. - * @param _column_no column number - * @param yyscanner The scanner object. - */ -void yyset_column (int _column_no , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - /* column is only valid if an input buffer exists. */ - if (! YY_CURRENT_BUFFER ) - YY_FATAL_ERROR( "yyset_column called with no buffer" ); - - yycolumn = _column_no; -} - -/** Set the input stream. This does not discard the current - * input buffer. - * @param _in_str A readable stream. - * @param yyscanner The scanner object. - * @see yy_switch_to_buffer - */ -void yyset_in (FILE * _in_str , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyin = _in_str ; -} - -void yyset_out (FILE * _out_str , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyout = _out_str ; -} - -int yyget_debug (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yy_flex_debug; -} - -void yyset_debug (int _bdebug , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yy_flex_debug = _bdebug ; -} - -/* Accessor methods for yylval and yylloc */ - -YYSTYPE * yyget_lval (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yylval; -} - -void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yylval = yylval_param; -} - -YYLTYPE *yyget_lloc (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yylloc; -} - -void yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yylloc = yylloc_param; -} - -/* User-visible API */ - -/* yylex_init is special because it creates the scanner itself, so it is - * the ONLY reentrant function that doesn't take the scanner as the last argument. - * That's why we explicitly handle the declaration, instead of using our macros. - */ -int yylex_init(yyscan_t* ptr_yy_globals) -{ - if (ptr_yy_globals == NULL){ - errno = EINVAL; - return 1; - } - - *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); - - if (*ptr_yy_globals == NULL){ - errno = ENOMEM; - return 1; - } - - /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ - memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); - - return yy_init_globals ( *ptr_yy_globals ); -} - -/* yylex_init_extra has the same functionality as yylex_init, but follows the - * convention of taking the scanner as the last argument. Note however, that - * this is a *pointer* to a scanner, as it will be allocated by this call (and - * is the reason, too, why this function also must handle its own declaration). - * The user defined value in the first argument will be available to yyalloc in - * the yyextra field. - */ -int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals ) -{ - struct yyguts_t dummy_yyguts; - - yyset_extra (yy_user_defined, &dummy_yyguts); - - if (ptr_yy_globals == NULL){ - errno = EINVAL; - return 1; - } - - *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); - - if (*ptr_yy_globals == NULL){ - errno = ENOMEM; - return 1; - } - - /* By setting to 0xAA, we expose bugs in - yy_init_globals. Leave at 0x00 for releases. */ - memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); - - yyset_extra (yy_user_defined, *ptr_yy_globals); - - return yy_init_globals ( *ptr_yy_globals ); -} - -static int yy_init_globals (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - /* Initialization is the same as for the non-reentrant scanner. - * This function is called from yylex_destroy(), so don't allocate here. - */ - - yyg->yy_buffer_stack = NULL; - yyg->yy_buffer_stack_top = 0; - yyg->yy_buffer_stack_max = 0; - yyg->yy_c_buf_p = NULL; - yyg->yy_init = 0; - yyg->yy_start = 0; - - yyg->yy_start_stack_ptr = 0; - yyg->yy_start_stack_depth = 0; - yyg->yy_start_stack = NULL; - -/* Defined in main.c */ -#ifdef YY_STDINIT - yyin = stdin; - yyout = stdout; -#else - yyin = NULL; - yyout = NULL; -#endif - - /* For future reference: Set errno on error, since we are called by - * yylex_init() - */ - return 0; -} - -/* yylex_destroy is for both reentrant and non-reentrant scanners. */ -int yylex_destroy (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - /* Pop the buffer stack, destroying each element. */ - while(YY_CURRENT_BUFFER){ - yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner ); - YY_CURRENT_BUFFER_LVALUE = NULL; - yypop_buffer_state(yyscanner); - } - - /* Destroy the stack itself. */ - yyfree(yyg->yy_buffer_stack , yyscanner); - yyg->yy_buffer_stack = NULL; - - /* Destroy the start condition stack. */ - yyfree( yyg->yy_start_stack , yyscanner ); - yyg->yy_start_stack = NULL; - - /* Reset the globals. This is important in a non-reentrant scanner so the next time - * yylex() is called, initialization will occur. */ - yy_init_globals( yyscanner); - - /* Destroy the main struct (reentrant only). */ - yyfree ( yyscanner , yyscanner ); - yyscanner = NULL; - return 0; -} - -/* - * Internal utility routines. - */ - -#ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - - int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; -} -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (const char * s , yyscan_t yyscanner) -{ - int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; -} -#endif - -void *yyalloc (yy_size_t size , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - return malloc(size); -} - -void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return realloc(ptr, size); -} - -void yyfree (void * ptr , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ -} - -#define YYTABLES_NAME "yytables" - -#line 573 "src/glsl/glcpp/glcpp-lex.l" - - -void -glcpp_lex_set_source_string(glcpp_parser_t *parser, const char *shader) -{ - yy_scan_string(shader, parser->scanner); -} - diff --git a/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-lex.l b/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-lex.l deleted file mode 100644 index 8b20fabd9..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-lex.l +++ /dev/null @@ -1,578 +0,0 @@ -%{ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include -#include -#include - -#include "glcpp.h" -#include "glcpp-parse.h" - -/* Flex annoyingly generates some functions without making them - * static. Let's declare them here. */ -int glcpp_get_column (yyscan_t yyscanner); -void glcpp_set_column (int column_no , yyscan_t yyscanner); - -#ifdef _MSC_VER -#define YY_NO_UNISTD_H -#pragma warning(disable: 4267) // warning C4267: '=' : conversion from 'size_t' to 'int', possible loss of data -#endif - -#define YY_NO_INPUT - -#define YY_USER_ACTION \ - do { \ - if (parser->has_new_line_number) \ - yylineno = parser->new_line_number; \ - if (parser->has_new_source_number) \ - yylloc->source = parser->new_source_number; \ - yylloc->first_column = yycolumn + 1; \ - yylloc->first_line = yylloc->last_line = yylineno; \ - yycolumn += yyleng; \ - yylloc->last_column = yycolumn + 1; \ - parser->has_new_line_number = 0; \ - parser->has_new_source_number = 0; \ - } while(0); - -#define YY_USER_INIT \ - do { \ - yylineno = 1; \ - yycolumn = 0; \ - yylloc->source = 0; \ - } while(0) - -/* It's ugly to have macros that have return statements inside of - * them, but flex-based lexer generation is all built around the - * return statement. - * - * To mitigate the ugliness, we defer as much of the logic as possible - * to an actual function, not a macro (see - * glcpplex_update_state_per_token) and we make the word RETURN - * prominent in all of the macros which may return. - * - * The most-commonly-used macro is RETURN_TOKEN which will perform all - * necessary state updates based on the provided token,, then - * conditionally return the token. It will not return a token if the - * parser is currently skipping tokens, (such as within #if - * 0...#else). - * - * The RETURN_TOKEN_NEVER_SKIP macro is a lower-level variant that - * makes the token returning unconditional. This is needed for things - * like #if and the tokens of its condition, (since these must be - * evaluated by the parser even when otherwise skipping). - * - * Finally, RETURN_STRING_TOKEN is a simple convenience wrapper on top - * of RETURN_TOKEN that performs a string copy of yytext before the - * return. - */ -#define RETURN_TOKEN_NEVER_SKIP(token) \ - do { \ - if (glcpp_lex_update_state_per_token (parser, token)) \ - return token; \ - } while (0) - -#define RETURN_TOKEN(token) \ - do { \ - if (! parser->skipping) { \ - RETURN_TOKEN_NEVER_SKIP(token); \ - } \ - } while(0) - -#define RETURN_STRING_TOKEN(token) \ - do { \ - if (! parser->skipping) { \ - yylval->str = ralloc_strdup (yyextra, yytext); \ - RETURN_TOKEN_NEVER_SKIP (token); \ - } \ - } while(0) - - -/* Update all state necessary for each token being returned. - * - * Here we'll be tracking newlines and spaces so that the lexer can - * alter its behavior as necessary, (for example, '#' has special - * significance if it is the first non-whitespace, non-comment token - * in a line, but does not otherwise). - * - * NOTE: If this function returns FALSE, then no token should be - * returned at all. This is used to suprress duplicate SPACE tokens. - */ -static int -glcpp_lex_update_state_per_token (glcpp_parser_t *parser, int token) -{ - /* After the first non-space token in a line, we won't - * allow any '#' to introduce a directive. */ - if (token == NEWLINE) { - parser->first_non_space_token_this_line = 1; - } else if (token != SPACE) { - parser->first_non_space_token_this_line = 0; - } - - /* Track newlines just to know whether a newline needs - * to be inserted if end-of-file comes early. */ - if (token == NEWLINE) { - parser->last_token_was_newline = 1; - } else { - parser->last_token_was_newline = 0; - } - - /* Track spaces to avoid emitting multiple SPACE - * tokens in a row. */ - if (token == SPACE) { - if (! parser->last_token_was_space) { - parser->last_token_was_space = 1; - return 1; - } else { - parser->last_token_was_space = 1; - return 0; - } - } else { - parser->last_token_was_space = 0; - return 1; - } -} - - -%} - -%option bison-bridge bison-locations reentrant noyywrap -%option extra-type="glcpp_parser_t *" -%option prefix="glcpp_" -%option stack -%option never-interactive -%option warn nodefault - - /* Note: When adding any start conditions to this list, you must also - * update the "Internal compiler error" catch-all rule near the end of - * this file. */ - -%x COMMENT DEFINE DONE HASH NEWLINE_CATCHUP UNREACHABLE - -SPACE [[:space:]] -NONSPACE [^[:space:]] -HSPACE [ \t] -HASH # -NEWLINE (\r\n|\n\r|\r|\n) -IDENTIFIER [_a-zA-Z][_a-zA-Z0-9]* -PP_NUMBER [.]?[0-9]([._a-zA-Z0-9]|[eEpP][-+])* -PUNCTUATION [][(){}.&*~!/%<>^|;,=+-] - -/* The OTHER class is simply a catch-all for things that the CPP -parser just doesn't care about. Since flex regular expressions that -match longer strings take priority over those matching shorter -strings, we have to be careful to avoid OTHER matching and hiding -something that CPP does care about. So we simply exclude all -characters that appear in any other expressions. */ - -OTHER [^][_#[:space:]#a-zA-Z0-9(){}.&*~!/%<>^|;,=+-] - -DIGITS [0-9][0-9]* -DECIMAL_INTEGER [1-9][0-9]*[uU]? -OCTAL_INTEGER 0[0-7]*[uU]? -HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]? - -%% - - glcpp_parser_t *parser = yyextra; - - /* When we lex a multi-line comment, we replace it (as - * specified) with a single space. But if the comment spanned - * multiple lines, then subsequent parsing stages will not - * count correct line numbers. To avoid this problem we keep - * track of all newlines that were commented out by a - * multi-line comment, and we emit a NEWLINE token for each at - * the next legal opportunity, (which is when the lexer would - * be emitting a NEWLINE token anyway). - */ - if (YY_START == NEWLINE_CATCHUP) { - if (parser->commented_newlines) - parser->commented_newlines--; - if (parser->commented_newlines == 0) - BEGIN INITIAL; - RETURN_TOKEN_NEVER_SKIP (NEWLINE); - } - - /* Set up the parser->skipping bit here before doing any lexing. - * - * This bit controls whether tokens are skipped, (as implemented by - * RETURN_TOKEN), such as between "#if 0" and "#endif". - * - * The parser maintains a skip_stack indicating whether we should be - * skipping, (and nested levels of #if/#ifdef/#ifndef/#endif) will - * push and pop items from the stack. - * - * Here are the rules for determining whether we are skipping: - * - * 1. If the skip stack is NULL, we are outside of all #if blocks - * and we are not skipping. - * - * 2. If the skip stack is non-NULL, the type of the top node in - * the stack determines whether to skip. A type of - * SKIP_NO_SKIP is used for blocks wheere we are emitting - * tokens, (such as between #if 1 and #endif, or after the - * #else of an #if 0, etc.). - * - * 3. The lexing_directive bit overrides the skip stack. This bit - * is set when we are actively lexing the expression for a - * pre-processor condition, (such as #if, #elif, or #else). In - * this case, even if otherwise skipping, we need to emit the - * tokens for this condition so that the parser can evaluate - * the expression. (For, #else, there's no expression, but we - * emit tokens so the parser can generate a nice error message - * if there are any tokens here). - */ - if (parser->skip_stack && - parser->skip_stack->type != SKIP_NO_SKIP && - ! parser->lexing_directive) - { - parser->skipping = 1; - } else { - parser->skipping = 0; - } - - /* Single-line comments */ -"//"[^\r\n]* { -} - - /* Multi-line comments */ -"/*" { yy_push_state(COMMENT, yyscanner); } -[^*\r\n]* -[^*\r\n]*{NEWLINE} { yylineno++; yycolumn = 0; parser->commented_newlines++; } -"*"+[^*/\r\n]* -"*"+[^*/\r\n]*{NEWLINE} { yylineno++; yycolumn = 0; parser->commented_newlines++; } -"*"+"/" { - yy_pop_state(yyscanner); - /* In the start condition, we don't want any SPACE token. */ - if (yyextra->space_tokens && YY_START != HASH) - RETURN_TOKEN (SPACE); -} - -{HASH} { - - /* If the '#' is the first non-whitespace, non-comment token on this - * line, then it introduces a directive, switch to the start - * condition. - * - * Otherwise, this is just punctuation, so return the HASH_TOKEN - * token. */ - if (parser->first_non_space_token_this_line) { - BEGIN HASH; - } - - RETURN_TOKEN_NEVER_SKIP (HASH_TOKEN); -} - -version{HSPACE}+ { - BEGIN INITIAL; - yyextra->space_tokens = 0; - RETURN_STRING_TOKEN (VERSION_TOKEN); -} - - /* Swallow empty #pragma directives, (to avoid confusing the - * downstream compiler). - * - * Note: We use a simple regular expression for the lookahead - * here. Specifically, we cannot use the complete {NEWLINE} expression - * since it uses alternation and we've found that there's a flex bug - * where using alternation in the lookahead portion of a pattern - * triggers a buffer overrun. */ -pragma{HSPACE}*/[\r\n] { - BEGIN INITIAL; -} - - /* glcpp doesn't handle #extension, #version, or #pragma directives. - * Simply pass them through to the main compiler's lexer/parser. */ -(extension|pragma)[^\r\n]* { - BEGIN INITIAL; - RETURN_STRING_TOKEN (PRAGMA); -} - -line{HSPACE}+ { - BEGIN INITIAL; - RETURN_TOKEN (LINE); -} - -{NEWLINE} { - BEGIN INITIAL; - RETURN_TOKEN_NEVER_SKIP (NEWLINE); -} - - /* For the pre-processor directives, we return these tokens - * even when we are otherwise skipping. */ -ifdef { - BEGIN INITIAL; - yyextra->lexing_directive = 1; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (IFDEF); -} - -ifndef { - BEGIN INITIAL; - yyextra->lexing_directive = 1; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (IFNDEF); -} - -if/[^_a-zA-Z0-9] { - BEGIN INITIAL; - yyextra->lexing_directive = 1; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (IF); -} - -elif/[^_a-zA-Z0-9] { - BEGIN INITIAL; - yyextra->lexing_directive = 1; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (ELIF); -} - -else { - BEGIN INITIAL; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (ELSE); -} - -endif { - BEGIN INITIAL; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (ENDIF); -} - -error[^\r\n]* { - BEGIN INITIAL; - RETURN_STRING_TOKEN (ERROR_TOKEN); -} - - /* After we see a "#define" we enter the start state - * for the lexer. Within we are looking for the first - * identifier and specifically checking whether the identifier - * is followed by a '(' or not, (to lex either a - * FUNC_IDENTIFIER or an OBJ_IDENITIFIER token). - * - * While in the state we also need to explicitly - * handle a few other things that may appear before the - * identifier: - * - * * Comments, (handled above with the main support for - * comments). - * - * * Whitespace (simply ignored) - * - * * Anything else, (not an identifier, not a comment, - * and not whitespace). This will generate an error. - */ -define{HSPACE}* { - if (! parser->skipping) { - BEGIN DEFINE; - yyextra->space_tokens = 0; - RETURN_TOKEN (DEFINE_TOKEN); - } -} - -undef { - BEGIN INITIAL; - yyextra->space_tokens = 0; - RETURN_TOKEN (UNDEF); -} - -{HSPACE}+ { - /* Nothing to do here. Importantly, don't leave the - * start condition, since it's legal to have space between the - * '#' and the directive.. */ -} - - /* This will catch any non-directive garbage after a HASH */ -{NONSPACE} { - BEGIN INITIAL; - RETURN_TOKEN (GARBAGE); -} - - /* An identifier immediately followed by '(' */ -{IDENTIFIER}/"(" { - BEGIN INITIAL; - RETURN_STRING_TOKEN (FUNC_IDENTIFIER); -} - - /* An identifier not immediately followed by '(' */ -{IDENTIFIER} { - BEGIN INITIAL; - RETURN_STRING_TOKEN (OBJ_IDENTIFIER); -} - - /* Whitespace */ -{HSPACE}+ { - /* Just ignore it. Nothing to do here. */ -} - - /* '/' not followed by '*', so not a comment. This is an error. */ -[/][^*]{NONSPACE}* { - BEGIN INITIAL; - glcpp_error(yylloc, yyextra, "#define followed by a non-identifier: %s", yytext); - RETURN_STRING_TOKEN (INTEGER_STRING); -} - - /* A character that can't start an identifier, comment, or - * space. This is an error. */ -[^_a-zA-Z/[:space:]]{NONSPACE}* { - BEGIN INITIAL; - glcpp_error(yylloc, yyextra, "#define followed by a non-identifier: %s", yytext); - RETURN_STRING_TOKEN (INTEGER_STRING); -} - -{DECIMAL_INTEGER} { - RETURN_STRING_TOKEN (INTEGER_STRING); -} - -{OCTAL_INTEGER} { - RETURN_STRING_TOKEN (INTEGER_STRING); -} - -{HEXADECIMAL_INTEGER} { - RETURN_STRING_TOKEN (INTEGER_STRING); -} - -"<<" { - RETURN_TOKEN (LEFT_SHIFT); -} - -">>" { - RETURN_TOKEN (RIGHT_SHIFT); -} - -"<=" { - RETURN_TOKEN (LESS_OR_EQUAL); -} - -">=" { - RETURN_TOKEN (GREATER_OR_EQUAL); -} - -"==" { - RETURN_TOKEN (EQUAL); -} - -"!=" { - RETURN_TOKEN (NOT_EQUAL); -} - -"&&" { - RETURN_TOKEN (AND); -} - -"||" { - RETURN_TOKEN (OR); -} - -"++" { - RETURN_TOKEN (PLUS_PLUS); -} - -"--" { - RETURN_TOKEN (MINUS_MINUS); -} - -"##" { - if (! parser->skipping) { - if (parser->is_gles) - glcpp_error(yylloc, yyextra, "Token pasting (##) is illegal in GLES"); - RETURN_TOKEN (PASTE); - } -} - -"defined" { - RETURN_TOKEN (DEFINED); -} - -{IDENTIFIER} { - RETURN_STRING_TOKEN (IDENTIFIER); -} - -{PP_NUMBER} { - RETURN_STRING_TOKEN (OTHER); -} - -{PUNCTUATION} { - RETURN_TOKEN (yytext[0]); -} - -{OTHER}+ { - RETURN_STRING_TOKEN (OTHER); -} - -{HSPACE} { - if (yyextra->space_tokens) { - RETURN_TOKEN (SPACE); - } -} - - /* We preserve all newlines, even between #if 0..#endif, so no - skipping.. */ -<*>{NEWLINE} { - if (parser->commented_newlines) { - BEGIN NEWLINE_CATCHUP; - } else { - BEGIN INITIAL; - } - yyextra->space_tokens = 1; - yyextra->lexing_directive = 0; - yylineno++; - yycolumn = 0; - RETURN_TOKEN_NEVER_SKIP (NEWLINE); -} - -<> { - if (YY_START == COMMENT) - glcpp_error(yylloc, yyextra, "Unterminated comment"); - BEGIN DONE; /* Don't keep matching this rule forever. */ - yyextra->lexing_directive = 0; - if (! parser->last_token_was_newline) - RETURN_TOKEN (NEWLINE); -} - - /* This is a catch-all to avoid the annoying default flex action which - * matches any character and prints it. If any input ever matches this - * rule, then we have made a mistake above and need to fix one or more - * of the preceding patterns to match that input. */ - -<*>. { - glcpp_error(yylloc, yyextra, "Internal compiler error: Unexpected character: %s", yytext); - - /* We don't actually use the UNREACHABLE start condition. We - only have this block here so that we can pretend to call some - generated functions, (to avoid "defined but not used" - warnings. */ - if (YY_START == UNREACHABLE) { - unput('.'); - yy_top_state(yyextra); - } -} - -%% - -void -glcpp_lex_set_source_string(glcpp_parser_t *parser, const char *shader) -{ - yy_scan_string(shader, parser->scanner); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.c b/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.c deleted file mode 100644 index 5aeb9f21e..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.c +++ /dev/null @@ -1,4889 +0,0 @@ -/* A Bison parser, made by GNU Bison 3.5.1. */ - -/* Bison implementation for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, - Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Undocumented macros, especially those whose name start with YY_, - are private implementation details. Do not rely on them. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "3.5.1" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 1 - -/* Push parsers. */ -#define YYPUSH 0 - -/* Pull parsers. */ -#define YYPULL 1 - - -/* Substitute the variable and function names. */ -#define yyparse glcpp_parser_parse -#define yylex glcpp_parser_lex -#define yyerror glcpp_parser_error -#define yydebug glcpp_parser_debug -#define yynerrs glcpp_parser_nerrs - -/* First part of user prologue. */ -#line 1 "src/glsl/glcpp/glcpp-parse.y" - -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include -#include -#include -#include -#include - -#include "glcpp.h" -#include "main/core.h" /* for struct gl_extensions */ -#include "main/mtypes.h" /* for gl_api enum */ - -static void -yyerror (YYLTYPE *locp, glcpp_parser_t *parser, const char *error); - -static void -_define_object_macro (glcpp_parser_t *parser, - YYLTYPE *loc, - const char *macro, - token_list_t *replacements); - -static void -_define_function_macro (glcpp_parser_t *parser, - YYLTYPE *loc, - const char *macro, - string_list_t *parameters, - token_list_t *replacements); - -static string_list_t * -_string_list_create (void *ctx); - -static void -_string_list_append_item (string_list_t *list, const char *str); - -static int -_string_list_contains (string_list_t *list, const char *member, int *index); - -static const char * -_string_list_has_duplicate (string_list_t *list); - -static int -_string_list_length (string_list_t *list); - -static int -_string_list_equal (string_list_t *a, string_list_t *b); - -static argument_list_t * -_argument_list_create (void *ctx); - -static void -_argument_list_append (argument_list_t *list, token_list_t *argument); - -static int -_argument_list_length (argument_list_t *list); - -static token_list_t * -_argument_list_member_at (argument_list_t *list, int index); - -/* Note: This function ralloc_steal()s the str pointer. */ -static token_t * -_token_create_str (void *ctx, int type, char *str); - -static token_t * -_token_create_ival (void *ctx, int type, int ival); - -static token_list_t * -_token_list_create (void *ctx); - -static void -_token_list_append (token_list_t *list, token_t *token); - -static void -_token_list_append_list (token_list_t *list, token_list_t *tail); - -static int -_token_list_equal_ignoring_space (token_list_t *a, token_list_t *b); - -static void -_parser_active_list_push (glcpp_parser_t *parser, - const char *identifier, - token_node_t *marker); - -static void -_parser_active_list_pop (glcpp_parser_t *parser); - -static int -_parser_active_list_contains (glcpp_parser_t *parser, const char *identifier); - -typedef enum { - EXPANSION_MODE_IGNORE_DEFINED, - EXPANSION_MODE_EVALUATE_DEFINED -} expansion_mode_t; - -/* Expand list, and begin lexing from the result (after first - * prefixing a token of type 'head_token_type'). - */ -static void -_glcpp_parser_expand_and_lex_from (glcpp_parser_t *parser, - int head_token_type, - token_list_t *list, - expansion_mode_t mode); - -/* Perform macro expansion in-place on the given list. */ -static void -_glcpp_parser_expand_token_list (glcpp_parser_t *parser, - token_list_t *list, - expansion_mode_t mode); - -static void -_glcpp_parser_print_expanded_token_list (glcpp_parser_t *parser, - token_list_t *list); - -static void -_glcpp_parser_skip_stack_push_if (glcpp_parser_t *parser, YYLTYPE *loc, - int condition); - -static void -_glcpp_parser_skip_stack_change_if (glcpp_parser_t *parser, YYLTYPE *loc, - const char *type, int condition); - -static void -_glcpp_parser_skip_stack_pop (glcpp_parser_t *parser, YYLTYPE *loc); - -static void -_glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t version, - const char *ident, bool explicitly_set); - -static int -glcpp_parser_lex (YYSTYPE *yylval, YYLTYPE *yylloc, glcpp_parser_t *parser); - -static void -glcpp_parser_lex_from (glcpp_parser_t *parser, token_list_t *list); - -static void -add_builtin_define(glcpp_parser_t *parser, const char *name, int value); - - -#line 235 "src/glsl/glcpp/glcpp-parse.c" - -# ifndef YY_CAST -# ifdef __cplusplus -# define YY_CAST(Type, Val) static_cast (Val) -# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) -# else -# define YY_CAST(Type, Val) ((Type) (Val)) -# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) -# endif -# endif -# ifndef YY_NULLPTR -# if defined __cplusplus -# if 201103L <= __cplusplus -# define YY_NULLPTR nullptr -# else -# define YY_NULLPTR 0 -# endif -# else -# define YY_NULLPTR ((void*)0) -# endif -# endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 1 -#endif - -/* Use api.header.include to #include this header - instead of duplicating it here. */ -#ifndef YY_GLCPP_PARSER_SRC_GLSL_GLCPP_GLCPP_PARSE_H_INCLUDED -# define YY_GLCPP_PARSER_SRC_GLSL_GLCPP_GLCPP_PARSE_H_INCLUDED -/* Debug traces. */ -#ifndef YYDEBUG -# define YYDEBUG 1 -#endif -#if YYDEBUG -extern int glcpp_parser_debug; -#endif - -/* Token type. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - enum yytokentype - { - DEFINED = 258, - ELIF_EXPANDED = 259, - HASH_TOKEN = 260, - DEFINE_TOKEN = 261, - FUNC_IDENTIFIER = 262, - OBJ_IDENTIFIER = 263, - ELIF = 264, - ELSE = 265, - ENDIF = 266, - ERROR_TOKEN = 267, - IF = 268, - IFDEF = 269, - IFNDEF = 270, - LINE = 271, - PRAGMA = 272, - UNDEF = 273, - VERSION_TOKEN = 274, - GARBAGE = 275, - IDENTIFIER = 276, - IF_EXPANDED = 277, - INTEGER = 278, - INTEGER_STRING = 279, - LINE_EXPANDED = 280, - NEWLINE = 281, - OTHER = 282, - PLACEHOLDER = 283, - SPACE = 284, - PLUS_PLUS = 285, - MINUS_MINUS = 286, - PASTE = 287, - OR = 288, - AND = 289, - EQUAL = 290, - NOT_EQUAL = 291, - LESS_OR_EQUAL = 292, - GREATER_OR_EQUAL = 293, - LEFT_SHIFT = 294, - RIGHT_SHIFT = 295, - UNARY = 296 - }; -#endif - -/* Value type. */ - -/* Location type. */ -#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED -typedef struct YYLTYPE YYLTYPE; -struct YYLTYPE -{ - int first_line; - int first_column; - int last_line; - int last_column; -}; -# define YYLTYPE_IS_DECLARED 1 -# define YYLTYPE_IS_TRIVIAL 1 -#endif - - - -int glcpp_parser_parse (glcpp_parser_t *parser); - -#endif /* !YY_GLCPP_PARSER_SRC_GLSL_GLCPP_GLCPP_PARSE_H_INCLUDED */ - - - -#ifdef short -# undef short -#endif - -/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure - and (if available) are included - so that the code can choose integer types of a good width. */ - -#ifndef __PTRDIFF_MAX__ -# include /* INFRINGES ON USER NAME SPACE */ -# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_STDINT_H -# endif -#endif - -/* Narrow types that promote to a signed type and that can represent a - signed or unsigned integer of at least N bits. In tables they can - save space and decrease cache pressure. Promoting to a signed type - helps avoid bugs in integer arithmetic. */ - -#ifdef __INT_LEAST8_MAX__ -typedef __INT_LEAST8_TYPE__ yytype_int8; -#elif defined YY_STDINT_H -typedef int_least8_t yytype_int8; -#else -typedef signed char yytype_int8; -#endif - -#ifdef __INT_LEAST16_MAX__ -typedef __INT_LEAST16_TYPE__ yytype_int16; -#elif defined YY_STDINT_H -typedef int_least16_t yytype_int16; -#else -typedef short yytype_int16; -#endif - -#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ -typedef __UINT_LEAST8_TYPE__ yytype_uint8; -#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ - && UINT_LEAST8_MAX <= INT_MAX) -typedef uint_least8_t yytype_uint8; -#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX -typedef unsigned char yytype_uint8; -#else -typedef short yytype_uint8; -#endif - -#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ -typedef __UINT_LEAST16_TYPE__ yytype_uint16; -#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ - && UINT_LEAST16_MAX <= INT_MAX) -typedef uint_least16_t yytype_uint16; -#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX -typedef unsigned short yytype_uint16; -#else -typedef int yytype_uint16; -#endif - -#ifndef YYPTRDIFF_T -# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ -# define YYPTRDIFF_T __PTRDIFF_TYPE__ -# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ -# elif defined PTRDIFF_MAX -# ifndef ptrdiff_t -# include /* INFRINGES ON USER NAME SPACE */ -# endif -# define YYPTRDIFF_T ptrdiff_t -# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX -# else -# define YYPTRDIFF_T long -# define YYPTRDIFF_MAXIMUM LONG_MAX -# endif -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned -# endif -#endif - -#define YYSIZE_MAXIMUM \ - YY_CAST (YYPTRDIFF_T, \ - (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ - ? YYPTRDIFF_MAXIMUM \ - : YY_CAST (YYSIZE_T, -1))) - -#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) - -/* Stored state numbers (used for stacks). */ -typedef yytype_uint8 yy_state_t; - -/* State numbers in computations. */ -typedef int yy_state_fast_t; - -#ifndef YY_ -# if defined YYENABLE_NLS && YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(Msgid) dgettext ("bison-runtime", Msgid) -# endif -# endif -# ifndef YY_ -# define YY_(Msgid) Msgid -# endif -#endif - -#ifndef YY_ATTRIBUTE_PURE -# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) -# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) -# else -# define YY_ATTRIBUTE_PURE -# endif -#endif - -#ifndef YY_ATTRIBUTE_UNUSED -# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) -# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) -# else -# define YY_ATTRIBUTE_UNUSED -# endif -#endif - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(E) ((void) (E)) -#else -# define YYUSE(E) /* empty */ -#endif - -#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ -/* Suppress an incorrect diagnostic about yylval being uninitialized. */ -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ - _Pragma ("GCC diagnostic push") \ - _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ - _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") -# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ - _Pragma ("GCC diagnostic pop") -#else -# define YY_INITIAL_VALUE(Value) Value -#endif -#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_END -#endif -#ifndef YY_INITIAL_VALUE -# define YY_INITIAL_VALUE(Value) /* Nothing. */ -#endif - -#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ -# define YY_IGNORE_USELESS_CAST_BEGIN \ - _Pragma ("GCC diagnostic push") \ - _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") -# define YY_IGNORE_USELESS_CAST_END \ - _Pragma ("GCC diagnostic pop") -#endif -#ifndef YY_IGNORE_USELESS_CAST_BEGIN -# define YY_IGNORE_USELESS_CAST_BEGIN -# define YY_IGNORE_USELESS_CAST_END -#endif - - -#define YY_ASSERT(E) ((void) (0 && (E))) - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS -# include /* INFRINGES ON USER NAME SPACE */ - /* Use EXIT_SUCCESS as a witness for stdlib.h. */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's 'empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -# endif -# if (defined __cplusplus && ! defined EXIT_SUCCESS \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined EXIT_SUCCESS -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \ - && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yy_state_t yyss_alloc; - YYSTYPE yyvs_alloc; - YYLTYPE yyls_alloc; -}; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE) \ - + YYSIZEOF (YYLTYPE)) \ - + 2 * YYSTACK_GAP_MAXIMUM) - -# define YYCOPY_NEEDED 1 - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYPTRDIFF_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / YYSIZEOF (*yyptr); \ - } \ - while (0) - -#endif - -#if defined YYCOPY_NEEDED && YYCOPY_NEEDED -/* Copy COUNT objects from SRC to DST. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(Dst, Src, Count) \ - __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) -# else -# define YYCOPY(Dst, Src, Count) \ - do \ - { \ - YYPTRDIFF_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (Dst)[yyi] = (Src)[yyi]; \ - } \ - while (0) -# endif -# endif -#endif /* !YYCOPY_NEEDED */ - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 2 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 652 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 64 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 25 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 118 -/* YYNSTATES -- Number of states. */ -#define YYNSTATES 185 - -#define YYUNDEFTOK 2 -#define YYMAXUTOK 296 - - -/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM - as returned by yylex, with out-of-bounds checking. */ -#define YYTRANSLATE(YYX) \ - (0 <= (YYX) && (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM - as returned by yylex. */ -static const yytype_int8 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 54, 2, 2, 2, 50, 37, 2, - 52, 53, 48, 46, 56, 47, 61, 49, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 62, - 40, 63, 41, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 57, 2, 58, 36, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 59, 35, 60, 55, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 38, 39, 42, 43, 44, 45, 51 -}; - -#if YYDEBUG - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ -static const yytype_int16 yyrline[] = -{ - 0, 205, 205, 207, 211, 212, 213, 218, 222, 227, - 232, 240, 253, 256, 259, 265, 268, 269, 269, 284, - 284, 287, 287, 304, 304, 327, 337, 337, 344, 344, - 351, 377, 397, 397, 410, 410, 413, 419, 425, 428, - 434, 437, 440, 446, 455, 460, 464, 471, 482, 493, - 500, 507, 514, 521, 528, 535, 542, 549, 556, 563, - 570, 577, 584, 596, 608, 615, 619, 623, 627, 631, - 637, 642, 650, 651, 655, 656, 659, 661, 667, 672, - 679, 683, 687, 691, 695, 699, 706, 707, 708, 709, - 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, - 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, - 730, 731, 732, 733, 734, 735, 736, 737, 738 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || 1 -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "DEFINED", "ELIF_EXPANDED", "HASH_TOKEN", - "DEFINE_TOKEN", "FUNC_IDENTIFIER", "OBJ_IDENTIFIER", "ELIF", "ELSE", - "ENDIF", "ERROR_TOKEN", "IF", "IFDEF", "IFNDEF", "LINE", "PRAGMA", - "UNDEF", "VERSION_TOKEN", "GARBAGE", "IDENTIFIER", "IF_EXPANDED", - "INTEGER", "INTEGER_STRING", "LINE_EXPANDED", "NEWLINE", "OTHER", - "PLACEHOLDER", "SPACE", "PLUS_PLUS", "MINUS_MINUS", "PASTE", "OR", "AND", - "'|'", "'^'", "'&'", "EQUAL", "NOT_EQUAL", "'<'", "'>'", "LESS_OR_EQUAL", - "GREATER_OR_EQUAL", "LEFT_SHIFT", "RIGHT_SHIFT", "'+'", "'-'", "'*'", - "'/'", "'%'", "UNARY", "'('", "')'", "'!'", "'~'", "','", "'['", "']'", - "'{'", "'}'", "'.'", "';'", "'='", "$accept", "input", "line", - "expanded_line", "define", "control_line", "$@1", "control_line_success", - "$@2", "$@3", "$@4", "$@5", "$@6", "$@7", "$@8", "control_line_error", - "integer_constant", "expression", "identifier_list", "text_line", - "replacement_list", "junk", "pp_tokens", "preprocessing_token", - "operator", YY_NULLPTR -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[NUM] -- (External) token number corresponding to the - (internal) symbol number NUM (which must be that of a token). */ -static const yytype_int16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 124, 94, 38, 290, 291, - 60, 62, 292, 293, 294, 295, 43, 45, 42, 47, - 37, 296, 40, 41, 33, 126, 44, 91, 93, 123, - 125, 46, 59, 61 -}; -# endif - -#define YYPACT_NINF (-142) - -#define yypact_value_is_default(Yyn) \ - ((Yyn) == YYPACT_NINF) - -#define YYTABLE_NINF (-1) - -#define yytable_value_is_error(Yyn) \ - 0 - - /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -static const yytype_int16 yypact[] = -{ - -142, 134, -142, -142, -18, 578, -142, -18, -142, -15, - -142, -142, 26, -142, -142, -142, -142, -142, -142, -142, - -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, - -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, - -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, - -142, -142, 182, -142, -142, -142, -142, -142, -18, -18, - -18, -18, -18, -142, 508, 7, 230, -142, -142, 9, - 25, -142, -142, -142, 35, -142, -15, 470, -142, 533, - 81, -142, -142, -142, -142, -142, -142, -23, -142, -142, - -142, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -142, - 65, -142, 278, 38, 58, -142, -142, 470, 90, 91, - 470, -142, 92, 37, 326, -142, -142, 89, -142, 571, - 587, 602, 83, 102, 0, 0, 33, 33, 33, 33, - 20, 20, 60, 60, -142, -142, -142, 66, 470, -142, - -142, -142, -142, 374, 470, 470, 422, 109, 110, -142, - -142, -142, -14, 131, 470, -142, 136, 470, 172, -142, - -142, -142, -142, 470, 4, -142, -142, -142, 173, 470, - 179, -142, 175, -142, -142 -}; - - /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE does not specify something else to do. Zero - means the default is an error. */ -static const yytype_int8 yydefact[] = -{ - 2, 0, 1, 83, 0, 0, 80, 0, 81, 0, - 72, 84, 85, 117, 118, 116, 112, 111, 110, 109, - 93, 107, 108, 103, 104, 105, 106, 101, 102, 95, - 96, 94, 99, 100, 88, 89, 98, 97, 114, 86, - 87, 90, 91, 92, 113, 115, 3, 7, 4, 15, - 16, 6, 0, 78, 82, 46, 44, 43, 0, 0, - 0, 0, 0, 45, 0, 19, 0, 32, 34, 0, - 23, 26, 28, 17, 0, 21, 0, 0, 38, 0, - 0, 5, 73, 85, 79, 68, 67, 0, 65, 66, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, - 0, 31, 0, 0, 0, 40, 25, 0, 0, 0, - 0, 39, 0, 0, 0, 8, 10, 0, 69, 47, - 48, 49, 50, 51, 53, 52, 57, 56, 55, 54, - 59, 58, 61, 60, 64, 63, 62, 0, 74, 20, - 30, 33, 35, 0, 76, 76, 0, 0, 0, 36, - 42, 11, 0, 0, 75, 24, 0, 77, 0, 18, - 22, 37, 70, 74, 0, 12, 27, 29, 0, 74, - 0, 13, 0, 71, 14 -}; - - /* YYPGOTO[NTERM-NUM]. */ -static const yytype_int16 yypgoto[] = -{ - -142, -142, -142, -142, -142, 47, -142, -142, -142, -142, - -142, -142, -142, -142, -142, -142, -5, -6, -142, -142, - -141, 49, -1, -50, -142 -}; - - /* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 1, 46, 47, 149, 48, 120, 49, 110, 122, - 117, 118, 119, 113, 114, 50, 63, 64, 174, 51, - 163, 166, 164, 53, 54 -}; - - /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule whose - number is the opposite. If YYTABLE_NINF, syntax error. */ -static const yytype_uint8 yytable[] = -{ - 52, 79, 84, 55, 80, 56, 57, 172, 56, 57, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 58, 59, - 128, 5, 178, 109, 60, 115, 61, 62, 182, 173, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 116, 85, 86, 87, 88, 89, 179, 158, 81, - 180, 121, 84, 159, 151, 112, 104, 105, 106, 107, - 108, 123, 147, 148, 84, 127, 124, 102, 103, 104, - 105, 106, 107, 108, 152, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 84, 56, 57, 84, 126, 106, 107, - 108, 154, 155, 157, 84, 161, 153, 84, 162, 156, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 2, 170, 171, 3, 4, 5, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 167, 167, 6, 7, 175, 8, 9, - 10, 11, 176, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 3, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 177, 181, - 183, 184, 0, 6, 168, 0, 8, 0, 82, 11, - 0, 83, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 3, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 0, 0, 0, 0, - 0, 6, 0, 0, 8, 0, 111, 11, 0, 83, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 3, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 0, 0, 0, 0, 0, 6, - 0, 0, 8, 0, 150, 11, 0, 83, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 3, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 0, 0, 0, 0, 0, 6, 0, 0, - 8, 0, 160, 11, 0, 83, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 3, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 0, 0, 0, 0, 0, 6, 0, 0, 8, 0, - 165, 11, 0, 83, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 3, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 0, 0, - 0, 0, 0, 6, 0, 0, 8, 0, 169, 11, - 0, 83, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 3, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 0, 0, 0, 0, - 0, 6, 0, 0, 8, 0, 0, 11, 0, 83, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 0, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 90, 0, 0, 0, 0, 0, - 0, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 125, - 0, 0, 0, 0, 0, 0, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 65, 0, 0, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 0, - 0, 0, 0, 0, 78, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108 -}; - -static const yytype_int16 yycheck[] = -{ - 1, 7, 52, 21, 9, 23, 24, 21, 23, 24, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 46, 47, - 53, 5, 173, 26, 52, 26, 54, 55, 179, 53, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 26, 58, 59, 60, 61, 62, 53, 21, 12, - 56, 26, 112, 26, 26, 66, 46, 47, 48, 49, - 50, 76, 7, 8, 124, 80, 77, 44, 45, 46, - 47, 48, 49, 50, 26, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 153, 23, 24, 156, 26, 48, 49, - 50, 21, 21, 21, 164, 26, 117, 167, 52, 120, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 0, 26, 26, 3, 4, 5, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 154, 155, 21, 22, 26, 24, 25, - 26, 27, 26, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 3, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 26, 26, - 21, 26, -1, 21, 155, -1, 24, -1, 26, 27, - -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 3, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, - -1, 21, -1, -1, 24, -1, 26, 27, -1, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 3, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, -1, -1, -1, -1, -1, 21, - -1, -1, 24, -1, 26, 27, -1, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 3, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, -1, -1, -1, -1, -1, 21, -1, -1, - 24, -1, 26, 27, -1, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 3, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - -1, -1, -1, -1, -1, 21, -1, -1, 24, -1, - 26, 27, -1, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 3, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, - -1, -1, -1, 21, -1, -1, 24, -1, 26, 27, - -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 3, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, - -1, 21, -1, -1, 24, -1, -1, 27, -1, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, -1, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 26, -1, -1, -1, -1, -1, - -1, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 26, - -1, -1, -1, -1, -1, -1, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 6, -1, -1, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, - -1, -1, -1, -1, 26, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50 -}; - - /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_int8 yystos[] = -{ - 0, 65, 0, 3, 4, 5, 21, 22, 24, 25, - 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 66, 67, 69, 71, - 79, 83, 86, 87, 88, 21, 23, 24, 46, 47, - 52, 54, 55, 80, 81, 6, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 26, 81, - 80, 69, 26, 29, 87, 81, 81, 81, 81, 81, - 26, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 26, - 72, 26, 86, 77, 78, 26, 26, 74, 75, 76, - 70, 26, 73, 80, 86, 26, 26, 80, 53, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 7, 8, 68, - 26, 26, 26, 86, 21, 21, 86, 21, 21, 26, - 26, 26, 52, 84, 86, 26, 85, 86, 85, 26, - 26, 26, 21, 53, 82, 26, 26, 26, 84, 53, - 56, 26, 84, 21, 26 -}; - - /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_int8 yyr1[] = -{ - 0, 64, 65, 65, 66, 66, 66, 66, 67, 67, - 67, 67, 68, 68, 68, 69, 69, 70, 69, 72, - 71, 73, 71, 74, 71, 71, 75, 71, 76, 71, - 71, 71, 77, 71, 78, 71, 71, 71, 71, 71, - 79, 79, 79, 80, 80, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, - 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88 -}; - - /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ -static const yytype_int8 yyr2[] = -{ - 0, 2, 0, 2, 1, 2, 1, 1, 3, 3, - 3, 4, 3, 5, 6, 1, 1, 0, 5, 0, - 4, 0, 5, 0, 5, 3, 0, 6, 0, 6, - 4, 3, 0, 4, 0, 4, 4, 5, 2, 3, - 3, 3, 4, 1, 1, 1, 1, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, - 1, 3, 1, 2, 0, 1, 0, 1, 1, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1 -}; - - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ - do \ - if (yychar == YYEMPTY) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - YYPOPSTACK (yylen); \ - yystate = *yyssp; \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (&yylloc, parser, YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ - while (0) - -/* Error token number */ -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (N) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (0) -#endif - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) - - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (0) - - -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ - -#ifndef YY_LOCATION_PRINT -# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL - -/* Print *YYLOCP on YYO. Private, do not rely on its existence. */ - -YY_ATTRIBUTE_UNUSED -static int -yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp) -{ - int res = 0; - int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0; - if (0 <= yylocp->first_line) - { - res += YYFPRINTF (yyo, "%d", yylocp->first_line); - if (0 <= yylocp->first_column) - res += YYFPRINTF (yyo, ".%d", yylocp->first_column); - } - if (0 <= yylocp->last_line) - { - if (yylocp->first_line < yylocp->last_line) - { - res += YYFPRINTF (yyo, "-%d", yylocp->last_line); - if (0 <= end_col) - res += YYFPRINTF (yyo, ".%d", end_col); - } - else if (0 <= end_col && yylocp->first_column < end_col) - res += YYFPRINTF (yyo, "-%d", end_col); - } - return res; - } - -# define YY_LOCATION_PRINT(File, Loc) \ - yy_location_print_ (File, &(Loc)) - -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif - - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value, Location, parser); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (0) - - -/*-----------------------------------. -| Print this symbol's value on YYO. | -`-----------------------------------*/ - -static void -yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, glcpp_parser_t *parser) -{ - FILE *yyoutput = yyo; - YYUSE (yyoutput); - YYUSE (yylocationp); - YYUSE (parser); - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyo, yytoknum[yytype], *yyvaluep); -# endif - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YYUSE (yytype); - YY_IGNORE_MAYBE_UNINITIALIZED_END -} - - -/*---------------------------. -| Print this symbol on YYO. | -`---------------------------*/ - -static void -yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, glcpp_parser_t *parser) -{ - YYFPRINTF (yyo, "%s %s (", - yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); - - YY_LOCATION_PRINT (yyo, *yylocationp); - YYFPRINTF (yyo, ": "); - yy_symbol_value_print (yyo, yytype, yyvaluep, yylocationp, parser); - YYFPRINTF (yyo, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -static void -yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) -{ - YYFPRINTF (stderr, "Stack now"); - for (; yybottom <= yytop; yybottom++) - { - int yybot = *yybottom; - YYFPRINTF (stderr, " %d", yybot); - } - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (0) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -static void -yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule, glcpp_parser_t *parser) -{ - int yylno = yyrline[yyrule]; - int yynrhs = yyr2[yyrule]; - int yyi; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, - yystos[+yyssp[yyi + 1 - yynrhs]], - &yyvsp[(yyi + 1) - (yynrhs)] - , &(yylsp[(yyi + 1) - (yynrhs)]) , parser); - YYFPRINTF (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyssp, yyvsp, yylsp, Rule, parser); \ -} while (0) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S))) -# else -/* Return the length of YYSTR. */ -static YYPTRDIFF_T -yystrlen (const char *yystr) -{ - YYPTRDIFF_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -static char * -yystpcpy (char *yydest, const char *yysrc) -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYPTRDIFF_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYPTRDIFF_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - else - goto append; - - append: - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (yyres) - return yystpcpy (yyres, yystr) - yyres; - else - return yystrlen (yystr); -} -# endif - -/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message - about the unexpected token YYTOKEN for the state stack whose top is - YYSSP. - - Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is - not large enough to hold the message. In that case, also set - *YYMSG_ALLOC to the required number of bytes. Return 2 if the - required number of bytes is too large to store. */ -static int -yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg, - yy_state_t *yyssp, int yytoken) -{ - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - /* Internationalized format string. */ - const char *yyformat = YY_NULLPTR; - /* Arguments of yyformat: reported tokens (one for the "unexpected", - one per "expected"). */ - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - /* Actual size of YYARG. */ - int yycount = 0; - /* Cumulated lengths of YYARG. */ - YYPTRDIFF_T yysize = 0; - - /* There are many possibilities here to consider: - - If this state is a consistent state with a default action, then - the only way this function was invoked is if the default action - is an error action. In that case, don't check for expected - tokens because there are none. - - The only way there can be no lookahead present (in yychar) is if - this state is a consistent state with a default action. Thus, - detecting the absence of a lookahead is sufficient to determine - that there is no unexpected or expected token to report. In that - case, just report a simple "syntax error". - - Don't assume there isn't a lookahead just because this state is a - consistent state with a default action. There might have been a - previous inconsistent state, consistent state with a non-default - action, or user semantic action that manipulated yychar. - - Of course, the expected token list depends on states to have - correct lookahead information, and it depends on the parser not - to perform extra reductions after fetching a lookahead from the - scanner and before detecting a syntax error. Thus, state merging - (from LALR or IELR) and default reductions corrupt the expected - token list. However, the list is correct for canonical LR with - one exception: it will still contain any token that will not be - accepted due to an error action in a later state. - */ - if (yytoken != YYEMPTY) - { - int yyn = yypact[+*yyssp]; - YYPTRDIFF_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); - yysize = yysize0; - yyarg[yycount++] = yytname[yytoken]; - if (!yypact_value_is_default (yyn)) - { - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. In other words, skip the first -YYN actions for - this state because they are default actions. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yyx; - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR - && !yytable_value_is_error (yytable[yyx + yyn])) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - break; - } - yyarg[yycount++] = yytname[yyx]; - { - YYPTRDIFF_T yysize1 - = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); - if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) - yysize = yysize1; - else - return 2; - } - } - } - } - - switch (yycount) - { -# define YYCASE_(N, S) \ - case N: \ - yyformat = S; \ - break - default: /* Avoid compiler warnings. */ - YYCASE_(0, YY_("syntax error")); - YYCASE_(1, YY_("syntax error, unexpected %s")); - YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); - YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); - YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); - YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); -# undef YYCASE_ - } - - { - /* Don't count the "%s"s in the final size, but reserve room for - the terminator. */ - YYPTRDIFF_T yysize1 = yysize + (yystrlen (yyformat) - 2 * yycount) + 1; - if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) - yysize = yysize1; - else - return 2; - } - - if (*yymsg_alloc < yysize) - { - *yymsg_alloc = 2 * yysize; - if (! (yysize <= *yymsg_alloc - && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) - *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; - return 1; - } - - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - { - char *yyp = *yymsg; - int yyi = 0; - while ((*yyp = *yyformat) != '\0') - if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyformat += 2; - } - else - { - ++yyp; - ++yyformat; - } - } - return 0; -} -#endif /* YYERROR_VERBOSE */ - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp, glcpp_parser_t *parser) -{ - YYUSE (yyvaluep); - YYUSE (yylocationp); - YYUSE (parser); - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YYUSE (yytype); - YY_IGNORE_MAYBE_UNINITIALIZED_END -} - - - - -/*----------. -| yyparse. | -`----------*/ - -int -yyparse (glcpp_parser_t *parser) -{ -/* The lookahead symbol. */ -int yychar; - - -/* The semantic value of the lookahead symbol. */ -/* Default value used for initialization, for pacifying older GCCs - or non-GCC compilers. */ -YY_INITIAL_VALUE (static YYSTYPE yyval_default;) -YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); - -/* Location data for the lookahead symbol. */ -static YYLTYPE yyloc_default -# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL - = { 1, 1, 1, 1 } -# endif -; -YYLTYPE yylloc = yyloc_default; - - /* Number of syntax errors so far. */ - int yynerrs; - - yy_state_fast_t yystate; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - - /* The stacks and their tools: - 'yyss': related to states. - 'yyvs': related to semantic values. - 'yyls': related to locations. - - Refer to the stacks through separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yy_state_t yyssa[YYINITDEPTH]; - yy_state_t *yyss; - yy_state_t *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs; - YYSTYPE *yyvsp; - - /* The location stack. */ - YYLTYPE yylsa[YYINITDEPTH]; - YYLTYPE *yyls; - YYLTYPE *yylsp; - - /* The locations where the error started and ended. */ - YYLTYPE yyerror_range[3]; - - YYPTRDIFF_T yystacksize; - - int yyn; - int yyresult; - /* Lookahead token as an internal (translated) token number. */ - int yytoken = 0; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - YYLTYPE yyloc; - -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf; -#endif - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N), yylsp -= (N)) - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; - - yyssp = yyss = yyssa; - yyvsp = yyvs = yyvsa; - yylsp = yyls = yylsa; - yystacksize = YYINITDEPTH; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - -/* User initialization code. */ -#line 165 "src/glsl/glcpp/glcpp-parse.y" -{ - yylloc.first_line = 1; - yylloc.first_column = 1; - yylloc.last_line = 1; - yylloc.last_column = 1; - yylloc.source = 0; -} - -#line 1658 "src/glsl/glcpp/glcpp-parse.c" - - yylsp[0] = yylloc; - goto yysetstate; - - -/*------------------------------------------------------------. -| yynewstate -- push a new state, which is found in yystate. | -`------------------------------------------------------------*/ -yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - -/*--------------------------------------------------------------------. -| yysetstate -- set current state (the top of the stack) to yystate. | -`--------------------------------------------------------------------*/ -yysetstate: - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - YY_ASSERT (0 <= yystate && yystate < YYNSTATES); - YY_IGNORE_USELESS_CAST_BEGIN - *yyssp = YY_CAST (yy_state_t, yystate); - YY_IGNORE_USELESS_CAST_END - - if (yyss + yystacksize - 1 <= yyssp) -#if !defined yyoverflow && !defined YYSTACK_RELOCATE - goto yyexhaustedlab; -#else - { - /* Get the current used size of the three stacks, in elements. */ - YYPTRDIFF_T yysize = yyssp - yyss + 1; - -# if defined yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - yy_state_t *yyss1 = yyss; - YYSTYPE *yyvs1 = yyvs; - YYLTYPE *yyls1 = yyls; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * YYSIZEOF (*yyssp), - &yyvs1, yysize * YYSIZEOF (*yyvsp), - &yyls1, yysize * YYSIZEOF (*yylsp), - &yystacksize); - yyss = yyss1; - yyvs = yyvs1; - yyls = yyls1; - } -# else /* defined YYSTACK_RELOCATE */ - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yy_state_t *yyss1 = yyss; - union yyalloc *yyptr = - YY_CAST (union yyalloc *, - YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); - YYSTACK_RELOCATE (yyls_alloc, yyls); -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - yylsp = yyls + yysize - 1; - - YY_IGNORE_USELESS_CAST_BEGIN - YYDPRINTF ((stderr, "Stack size increased to %ld\n", - YY_CAST (long, yystacksize))); - YY_IGNORE_USELESS_CAST_END - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } -#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ - - if (yystate == YYFINAL) - YYACCEPT; - - goto yybackup; - - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - /* Do appropriate processing given the current state. Read a - lookahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to lookahead token. */ - yyn = yypact[yystate]; - if (yypact_value_is_default (yyn)) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = yylex (&yylval, &yylloc, parser); - } - - if (yychar <= YYEOF) - { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yytable_value_is_error (yyn)) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the lookahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - yystate = yyn; - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - *++yylsp = yylloc; - - /* Discard the shifted token. */ - yychar = YYEMPTY; - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - '$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - /* Default location. */ - YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); - yyerror_range[1] = yyloc; - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 6: -#line 213 "src/glsl/glcpp/glcpp-parse.y" - { - _glcpp_parser_print_expanded_token_list (parser, (yyvsp[0].token_list)); - ralloc_asprintf_rewrite_tail (&parser->output, &parser->output_length, "\n"); - ralloc_free ((yyvsp[0].token_list)); - } -#line 1861 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 8: -#line 222 "src/glsl/glcpp/glcpp-parse.y" - { - if (parser->is_gles && (yyvsp[-1].expression_value).undefined_macro) - glcpp_error(& (yylsp[-2]), parser, "undefined macro %s in expression (illegal in GLES)", (yyvsp[-1].expression_value).undefined_macro); - _glcpp_parser_skip_stack_push_if (parser, & (yylsp[-2]), (yyvsp[-1].expression_value).value); - } -#line 1871 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 9: -#line 227 "src/glsl/glcpp/glcpp-parse.y" - { - if (parser->is_gles && (yyvsp[-1].expression_value).undefined_macro) - glcpp_error(& (yylsp[-2]), parser, "undefined macro %s in expression (illegal in GLES)", (yyvsp[-1].expression_value).undefined_macro); - _glcpp_parser_skip_stack_change_if (parser, & (yylsp[-2]), "elif", (yyvsp[-1].expression_value).value); - } -#line 1881 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 10: -#line 232 "src/glsl/glcpp/glcpp-parse.y" - { - parser->has_new_line_number = 1; - parser->new_line_number = (yyvsp[-1].ival); - ralloc_asprintf_rewrite_tail (&parser->output, - &parser->output_length, - "#line %" PRIiMAX "\n", - (yyvsp[-1].ival)); - } -#line 1894 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 11: -#line 240 "src/glsl/glcpp/glcpp-parse.y" - { - parser->has_new_line_number = 1; - parser->new_line_number = (yyvsp[-2].ival); - parser->has_new_source_number = 1; - parser->new_source_number = (yyvsp[-1].ival); - ralloc_asprintf_rewrite_tail (&parser->output, - &parser->output_length, - "#line %" PRIiMAX " %" PRIiMAX "\n", - (yyvsp[-2].ival), (yyvsp[-1].ival)); - } -#line 1909 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 12: -#line 253 "src/glsl/glcpp/glcpp-parse.y" - { - _define_object_macro (parser, & (yylsp[-2]), (yyvsp[-2].str), (yyvsp[-1].token_list)); - } -#line 1917 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 13: -#line 256 "src/glsl/glcpp/glcpp-parse.y" - { - _define_function_macro (parser, & (yylsp[-4]), (yyvsp[-4].str), NULL, (yyvsp[-1].token_list)); - } -#line 1925 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 14: -#line 259 "src/glsl/glcpp/glcpp-parse.y" - { - _define_function_macro (parser, & (yylsp[-5]), (yyvsp[-5].str), (yyvsp[-3].string_list), (yyvsp[-1].token_list)); - } -#line 1933 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 15: -#line 265 "src/glsl/glcpp/glcpp-parse.y" - { - ralloc_asprintf_rewrite_tail (&parser->output, &parser->output_length, "\n"); - } -#line 1941 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 17: -#line 269 "src/glsl/glcpp/glcpp-parse.y" - { - glcpp_parser_resolve_implicit_version(parser); - } -#line 1949 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 18: -#line 271 "src/glsl/glcpp/glcpp-parse.y" - { - - if (parser->skip_stack == NULL || - parser->skip_stack->type == SKIP_NO_SKIP) - { - _glcpp_parser_expand_and_lex_from (parser, - LINE_EXPANDED, (yyvsp[-1].token_list), - EXPANSION_MODE_IGNORE_DEFINED); - } - } -#line 1964 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 19: -#line 284 "src/glsl/glcpp/glcpp-parse.y" - { - glcpp_parser_resolve_implicit_version(parser); - } -#line 1972 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 21: -#line 287 "src/glsl/glcpp/glcpp-parse.y" - { - glcpp_parser_resolve_implicit_version(parser); - } -#line 1980 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 22: -#line 289 "src/glsl/glcpp/glcpp-parse.y" - { - macro_t *macro; - if (strcmp("__LINE__", (yyvsp[-1].str)) == 0 - || strcmp("__FILE__", (yyvsp[-1].str)) == 0 - || strcmp("__VERSION__", (yyvsp[-1].str)) == 0) - glcpp_error(& (yylsp[-4]), parser, "Built-in (pre-defined)" - " macro names can not be undefined."); - - macro = hash_table_find (parser->defines, (yyvsp[-1].str)); - if (macro) { - hash_table_remove (parser->defines, (yyvsp[-1].str)); - ralloc_free (macro); - } - ralloc_free ((yyvsp[-1].str)); - } -#line 2000 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 23: -#line 304 "src/glsl/glcpp/glcpp-parse.y" - { - glcpp_parser_resolve_implicit_version(parser); - } -#line 2008 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 24: -#line 306 "src/glsl/glcpp/glcpp-parse.y" - { - /* Be careful to only evaluate the 'if' expression if - * we are not skipping. When we are skipping, we - * simply push a new 0-valued 'if' onto the skip - * stack. - * - * This avoids generating diagnostics for invalid - * expressions that are being skipped. */ - if (parser->skip_stack == NULL || - parser->skip_stack->type == SKIP_NO_SKIP) - { - _glcpp_parser_expand_and_lex_from (parser, - IF_EXPANDED, (yyvsp[-1].token_list), - EXPANSION_MODE_EVALUATE_DEFINED); - } - else - { - _glcpp_parser_skip_stack_push_if (parser, & (yylsp[-4]), 0); - parser->skip_stack->type = SKIP_TO_ENDIF; - } - } -#line 2034 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 25: -#line 327 "src/glsl/glcpp/glcpp-parse.y" - { - /* #if without an expression is only an error if we - * are not skipping */ - if (parser->skip_stack == NULL || - parser->skip_stack->type == SKIP_NO_SKIP) - { - glcpp_error(& (yylsp[-2]), parser, "#if with no expression"); - } - _glcpp_parser_skip_stack_push_if (parser, & (yylsp[-2]), 0); - } -#line 2049 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 26: -#line 337 "src/glsl/glcpp/glcpp-parse.y" - { - glcpp_parser_resolve_implicit_version(parser); - } -#line 2057 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 27: -#line 339 "src/glsl/glcpp/glcpp-parse.y" - { - macro_t *macro = hash_table_find (parser->defines, (yyvsp[-2].str)); - ralloc_free ((yyvsp[-2].str)); - _glcpp_parser_skip_stack_push_if (parser, & (yylsp[-5]), macro != NULL); - } -#line 2067 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 28: -#line 344 "src/glsl/glcpp/glcpp-parse.y" - { - glcpp_parser_resolve_implicit_version(parser); - } -#line 2075 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 29: -#line 346 "src/glsl/glcpp/glcpp-parse.y" - { - macro_t *macro = hash_table_find (parser->defines, (yyvsp[-2].str)); - ralloc_free ((yyvsp[-2].str)); - _glcpp_parser_skip_stack_push_if (parser, & (yylsp[-3]), macro == NULL); - } -#line 2085 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 30: -#line 351 "src/glsl/glcpp/glcpp-parse.y" - { - /* Be careful to only evaluate the 'elif' expression - * if we are not skipping. When we are skipping, we - * simply change to a 0-valued 'elif' on the skip - * stack. - * - * This avoids generating diagnostics for invalid - * expressions that are being skipped. */ - if (parser->skip_stack && - parser->skip_stack->type == SKIP_TO_ELSE) - { - _glcpp_parser_expand_and_lex_from (parser, - ELIF_EXPANDED, (yyvsp[-1].token_list), - EXPANSION_MODE_EVALUATE_DEFINED); - } - else if (parser->skip_stack && - parser->skip_stack->has_else) - { - glcpp_error(& (yylsp[-3]), parser, "#elif after #else"); - } - else - { - _glcpp_parser_skip_stack_change_if (parser, & (yylsp[-3]), - "elif", 0); - } - } -#line 2116 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 31: -#line 377 "src/glsl/glcpp/glcpp-parse.y" - { - /* #elif without an expression is an error unless we - * are skipping. */ - if (parser->skip_stack && - parser->skip_stack->type == SKIP_TO_ELSE) - { - glcpp_error(& (yylsp[-2]), parser, "#elif with no expression"); - } - else if (parser->skip_stack && - parser->skip_stack->has_else) - { - glcpp_error(& (yylsp[-2]), parser, "#elif after #else"); - } - else - { - _glcpp_parser_skip_stack_change_if (parser, & (yylsp[-2]), - "elif", 0); - glcpp_warning(& (yylsp[-2]), parser, "ignoring illegal #elif without expression"); - } - } -#line 2141 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 32: -#line 397 "src/glsl/glcpp/glcpp-parse.y" - { parser->lexing_directive = 1; } -#line 2147 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 33: -#line 397 "src/glsl/glcpp/glcpp-parse.y" - { - if (parser->skip_stack && - parser->skip_stack->has_else) - { - glcpp_error(& (yylsp[-3]), parser, "multiple #else"); - } - else - { - _glcpp_parser_skip_stack_change_if (parser, & (yylsp[-3]), "else", 1); - if (parser->skip_stack) - parser->skip_stack->has_else = true; - } - } -#line 2165 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 34: -#line 410 "src/glsl/glcpp/glcpp-parse.y" - { - _glcpp_parser_skip_stack_pop (parser, & (yylsp[-1])); - } -#line 2173 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 36: -#line 413 "src/glsl/glcpp/glcpp-parse.y" - { - if (parser->version_resolved) { - glcpp_error(& (yylsp[-3]), parser, "#version must appear on the first line"); - } - _glcpp_parser_handle_version_declaration(parser, (yyvsp[-1].ival), NULL, true); - } -#line 2184 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 37: -#line 419 "src/glsl/glcpp/glcpp-parse.y" - { - if (parser->version_resolved) { - glcpp_error(& (yylsp[-4]), parser, "#version must appear on the first line"); - } - _glcpp_parser_handle_version_declaration(parser, (yyvsp[-2].ival), (yyvsp[-1].str), true); - } -#line 2195 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 38: -#line 425 "src/glsl/glcpp/glcpp-parse.y" - { - glcpp_parser_resolve_implicit_version(parser); - } -#line 2203 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 39: -#line 428 "src/glsl/glcpp/glcpp-parse.y" - { - ralloc_asprintf_rewrite_tail (&parser->output, &parser->output_length, "#%s", (yyvsp[-1].str)); - } -#line 2211 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 40: -#line 434 "src/glsl/glcpp/glcpp-parse.y" - { - glcpp_error(& (yylsp[-2]), parser, "#%s", (yyvsp[-1].str)); - } -#line 2219 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 41: -#line 437 "src/glsl/glcpp/glcpp-parse.y" - { - glcpp_error (& (yylsp[-2]), parser, "#define without macro name"); - } -#line 2227 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 42: -#line 440 "src/glsl/glcpp/glcpp-parse.y" - { - glcpp_error (& (yylsp[-3]), parser, "Illegal non-directive after #"); - } -#line 2235 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 43: -#line 446 "src/glsl/glcpp/glcpp-parse.y" - { - if (strlen ((yyvsp[0].str)) >= 3 && strncmp ((yyvsp[0].str), "0x", 2) == 0) { - (yyval.ival) = (int)strtoll ((yyvsp[0].str) + 2, NULL, 16); - } else if ((yyvsp[0].str)[0] == '0') { - (yyval.ival) = (int)strtoll ((yyvsp[0].str), NULL, 8); - } else { - (yyval.ival) = (int)strtoll ((yyvsp[0].str), NULL, 10); - } - } -#line 2249 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 44: -#line 455 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.ival) = (yyvsp[0].ival); - } -#line 2257 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 45: -#line 460 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[0].ival); - (yyval.expression_value).undefined_macro = NULL; - } -#line 2266 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 46: -#line 464 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = 0; - if (parser->is_gles) - (yyval.expression_value).undefined_macro = ralloc_strdup (parser, (yyvsp[0].str)); - else - (yyval.expression_value).undefined_macro = NULL; - } -#line 2278 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 47: -#line 471 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value || (yyvsp[0].expression_value).value; - - /* Short-circuit: Only flag undefined from right side - * if left side evaluates to false. - */ - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else if (! (yyvsp[-2].expression_value).value) - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2294 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 48: -#line 482 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value && (yyvsp[0].expression_value).value; - - /* Short-circuit: Only flag undefined from right-side - * if left side evaluates to true. - */ - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else if ((yyvsp[-2].expression_value).value) - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2310 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 49: -#line 493 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value | (yyvsp[0].expression_value).value; - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2322 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 50: -#line 500 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value ^ (yyvsp[0].expression_value).value; - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2334 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 51: -#line 507 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value & (yyvsp[0].expression_value).value; - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2346 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 52: -#line 514 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value != (yyvsp[0].expression_value).value; - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2358 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 53: -#line 521 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value == (yyvsp[0].expression_value).value; - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2370 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 54: -#line 528 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value >= (yyvsp[0].expression_value).value; - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2382 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 55: -#line 535 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value <= (yyvsp[0].expression_value).value; - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2394 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 56: -#line 542 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value > (yyvsp[0].expression_value).value; - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2406 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 57: -#line 549 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value < (yyvsp[0].expression_value).value; - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2418 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 58: -#line 556 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value >> (yyvsp[0].expression_value).value; - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2430 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 59: -#line 563 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value << (yyvsp[0].expression_value).value; - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2442 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 60: -#line 570 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value - (yyvsp[0].expression_value).value; - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2454 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 61: -#line 577 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value + (yyvsp[0].expression_value).value; - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2466 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 62: -#line 584 "src/glsl/glcpp/glcpp-parse.y" - { - if ((yyvsp[0].expression_value).value == 0) { - yyerror (& (yylsp[-2]), parser, - "zero modulus in preprocessor directive"); - } else { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value % (yyvsp[0].expression_value).value; - } - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2483 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 63: -#line 596 "src/glsl/glcpp/glcpp-parse.y" - { - if ((yyvsp[0].expression_value).value == 0) { - yyerror (& (yylsp[-2]), parser, - "division by 0 in preprocessor directive"); - } else { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value / (yyvsp[0].expression_value).value; - } - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2500 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 64: -#line 608 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = (yyvsp[-2].expression_value).value * (yyvsp[0].expression_value).value; - if ((yyvsp[-2].expression_value).undefined_macro) - (yyval.expression_value).undefined_macro = (yyvsp[-2].expression_value).undefined_macro; - else - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2512 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 65: -#line 615 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = ! (yyvsp[0].expression_value).value; - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2521 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 66: -#line 619 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = ~ (yyvsp[0].expression_value).value; - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2530 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 67: -#line 623 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = - (yyvsp[0].expression_value).value; - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2539 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 68: -#line 627 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value).value = + (yyvsp[0].expression_value).value; - (yyval.expression_value).undefined_macro = (yyvsp[0].expression_value).undefined_macro; - } -#line 2548 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 69: -#line 631 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.expression_value) = (yyvsp[-1].expression_value); - } -#line 2556 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 70: -#line 637 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.string_list) = _string_list_create (parser); - _string_list_append_item ((yyval.string_list), (yyvsp[0].str)); - ralloc_steal ((yyval.string_list), (yyvsp[0].str)); - } -#line 2566 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 71: -#line 642 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.string_list) = (yyvsp[-2].string_list); - _string_list_append_item ((yyval.string_list), (yyvsp[0].str)); - ralloc_steal ((yyval.string_list), (yyvsp[0].str)); - } -#line 2576 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 72: -#line 650 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.token_list) = NULL; } -#line 2582 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 74: -#line 655 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.token_list) = NULL; } -#line 2588 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 77: -#line 661 "src/glsl/glcpp/glcpp-parse.y" - { - glcpp_error(&(yylsp[0]), parser, "extra tokens at end of directive"); - } -#line 2596 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 78: -#line 667 "src/glsl/glcpp/glcpp-parse.y" - { - parser->space_tokens = 1; - (yyval.token_list) = _token_list_create (parser); - _token_list_append ((yyval.token_list), (yyvsp[0].token)); - } -#line 2606 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 79: -#line 672 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.token_list) = (yyvsp[-1].token_list); - _token_list_append ((yyval.token_list), (yyvsp[0].token)); - } -#line 2615 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 80: -#line 679 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.token) = _token_create_str (parser, IDENTIFIER, (yyvsp[0].str)); - (yyval.token)->location = yylloc; - } -#line 2624 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 81: -#line 683 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.token) = _token_create_str (parser, INTEGER_STRING, (yyvsp[0].str)); - (yyval.token)->location = yylloc; - } -#line 2633 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 82: -#line 687 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.token) = _token_create_ival (parser, (yyvsp[0].ival), (yyvsp[0].ival)); - (yyval.token)->location = yylloc; - } -#line 2642 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 83: -#line 691 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.token) = _token_create_ival (parser, DEFINED, DEFINED); - (yyval.token)->location = yylloc; - } -#line 2651 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 84: -#line 695 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.token) = _token_create_str (parser, OTHER, (yyvsp[0].str)); - (yyval.token)->location = yylloc; - } -#line 2660 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 85: -#line 699 "src/glsl/glcpp/glcpp-parse.y" - { - (yyval.token) = _token_create_ival (parser, SPACE, SPACE); - (yyval.token)->location = yylloc; - } -#line 2669 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 86: -#line 706 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '['; } -#line 2675 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 87: -#line 707 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = ']'; } -#line 2681 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 88: -#line 708 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '('; } -#line 2687 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 89: -#line 709 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = ')'; } -#line 2693 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 90: -#line 710 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '{'; } -#line 2699 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 91: -#line 711 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '}'; } -#line 2705 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 92: -#line 712 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '.'; } -#line 2711 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 93: -#line 713 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '&'; } -#line 2717 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 94: -#line 714 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '*'; } -#line 2723 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 95: -#line 715 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '+'; } -#line 2729 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 96: -#line 716 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '-'; } -#line 2735 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 97: -#line 717 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '~'; } -#line 2741 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 98: -#line 718 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '!'; } -#line 2747 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 99: -#line 719 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '/'; } -#line 2753 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 100: -#line 720 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '%'; } -#line 2759 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 101: -#line 721 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = LEFT_SHIFT; } -#line 2765 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 102: -#line 722 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = RIGHT_SHIFT; } -#line 2771 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 103: -#line 723 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '<'; } -#line 2777 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 104: -#line 724 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '>'; } -#line 2783 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 105: -#line 725 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = LESS_OR_EQUAL; } -#line 2789 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 106: -#line 726 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = GREATER_OR_EQUAL; } -#line 2795 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 107: -#line 727 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = EQUAL; } -#line 2801 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 108: -#line 728 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = NOT_EQUAL; } -#line 2807 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 109: -#line 729 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '^'; } -#line 2813 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 110: -#line 730 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '|'; } -#line 2819 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 111: -#line 731 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = AND; } -#line 2825 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 112: -#line 732 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = OR; } -#line 2831 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 113: -#line 733 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = ';'; } -#line 2837 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 114: -#line 734 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = ','; } -#line 2843 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 115: -#line 735 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = '='; } -#line 2849 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 116: -#line 736 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = PASTE; } -#line 2855 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 117: -#line 737 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = PLUS_PLUS; } -#line 2861 "src/glsl/glcpp/glcpp-parse.c" - break; - - case 118: -#line 738 "src/glsl/glcpp/glcpp-parse.y" - { (yyval.ival) = MINUS_MINUS; } -#line 2867 "src/glsl/glcpp/glcpp-parse.c" - break; - - -#line 2871 "src/glsl/glcpp/glcpp-parse.c" - - default: break; - } - /* User semantic actions sometimes alter yychar, and that requires - that yytoken be updated with the new translation. We take the - approach of translating immediately before every use of yytoken. - One alternative is translating here after every semantic action, - but that translation would be missed if the semantic action invokes - YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or - if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an - incorrect destructor might then be invoked immediately. In the - case of YYERROR or YYBACKUP, subsequent parser actions might lead - to an incorrect destructor call or verbose syntax error message - before the lookahead is translated. */ - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp = yyval; - *++yylsp = yyloc; - - /* Now 'shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - { - const int yylhs = yyr1[yyn] - YYNTOKENS; - const int yyi = yypgoto[yylhs] + *yyssp; - yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp - ? yytable[yyi] - : yydefgoto[yylhs]); - } - - goto yynewstate; - - -/*--------------------------------------. -| yyerrlab -- here on detecting error. | -`--------------------------------------*/ -yyerrlab: - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); - - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (&yylloc, parser, YY_("syntax error")); -#else -# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ - yyssp, yytoken) - { - char const *yymsgp = YY_("syntax error"); - int yysyntax_error_status; - yysyntax_error_status = YYSYNTAX_ERROR; - if (yysyntax_error_status == 0) - yymsgp = yymsg; - else if (yysyntax_error_status == 1) - { - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = YY_CAST (char *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc))); - if (!yymsg) - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - yysyntax_error_status = 2; - } - else - { - yysyntax_error_status = YYSYNTAX_ERROR; - yymsgp = yymsg; - } - } - yyerror (&yylloc, parser, yymsgp); - if (yysyntax_error_status == 2) - goto yyexhaustedlab; - } -# undef YYSYNTAX_ERROR -#endif - } - - yyerror_range[1] = yylloc; - - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval, &yylloc, parser); - yychar = YYEMPTY; - } - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - /* Pacify compilers when the user code never invokes YYERROR and the - label yyerrorlab therefore never appears in user code. */ - if (0) - YYERROR; - - /* Do not reclaim the symbols of the rule whose action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (!yypact_value_is_default (yyn)) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - yyerror_range[1] = *yylsp; - yydestruct ("Error: popping", - yystos[yystate], yyvsp, yylsp, parser); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - - yyerror_range[2] = yylloc; - /* Using YYLLOC is tempting, but would change the location of - the lookahead. YYLOC is available though. */ - YYLLOC_DEFAULT (yyloc, yyerror_range, 2); - *++yylsp = yyloc; - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - - -#if !defined yyoverflow || YYERROR_VERBOSE -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (&yylloc, parser, YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - - -/*-----------------------------------------------------. -| yyreturn -- parsing is finished, return the result. | -`-----------------------------------------------------*/ -yyreturn: - if (yychar != YYEMPTY) - { - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = YYTRANSLATE (yychar); - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval, &yylloc, parser); - } - /* Do not reclaim the symbols of the rule whose action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[+*yyssp], yyvsp, yylsp, parser); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - return yyresult; -} -#line 741 "src/glsl/glcpp/glcpp-parse.y" - - -string_list_t * -_string_list_create (void *ctx) -{ - string_list_t *list; - - list = ralloc (ctx, string_list_t); - list->head = NULL; - list->tail = NULL; - - return list; -} - -void -_string_list_append_item (string_list_t *list, const char *str) -{ - string_node_t *node; - - node = ralloc (list, string_node_t); - node->str = ralloc_strdup (node, str); - - node->next = NULL; - - if (list->head == NULL) { - list->head = node; - } else { - list->tail->next = node; - } - - list->tail = node; -} - -int -_string_list_contains (string_list_t *list, const char *member, int *index) -{ - string_node_t *node; - int i; - - if (list == NULL) - return 0; - - for (i = 0, node = list->head; node; i++, node = node->next) { - if (strcmp (node->str, member) == 0) { - if (index) - *index = i; - return 1; - } - } - - return 0; -} - -/* Return duplicate string in list (if any), NULL otherwise. */ -const char * -_string_list_has_duplicate (string_list_t *list) -{ - string_node_t *node, *dup; - - if (list == NULL) - return NULL; - - for (node = list->head; node; node = node->next) { - for (dup = node->next; dup; dup = dup->next) { - if (strcmp (node->str, dup->str) == 0) - return node->str; - } - } - - return NULL; -} - -int -_string_list_length (string_list_t *list) -{ - int length = 0; - string_node_t *node; - - if (list == NULL) - return 0; - - for (node = list->head; node; node = node->next) - length++; - - return length; -} - -int -_string_list_equal (string_list_t *a, string_list_t *b) -{ - string_node_t *node_a, *node_b; - - if (a == NULL && b == NULL) - return 1; - - if (a == NULL || b == NULL) - return 0; - - for (node_a = a->head, node_b = b->head; - node_a && node_b; - node_a = node_a->next, node_b = node_b->next) - { - if (strcmp (node_a->str, node_b->str)) - return 0; - } - - /* Catch the case of lists being different lengths, (which - * would cause the loop above to terminate after the shorter - * list). */ - return node_a == node_b; -} - -argument_list_t * -_argument_list_create (void *ctx) -{ - argument_list_t *list; - - list = ralloc (ctx, argument_list_t); - list->head = NULL; - list->tail = NULL; - - return list; -} - -void -_argument_list_append (argument_list_t *list, token_list_t *argument) -{ - argument_node_t *node; - - node = ralloc (list, argument_node_t); - node->argument = argument; - - node->next = NULL; - - if (list->head == NULL) { - list->head = node; - } else { - list->tail->next = node; - } - - list->tail = node; -} - -int -_argument_list_length (argument_list_t *list) -{ - int length = 0; - argument_node_t *node; - - if (list == NULL) - return 0; - - for (node = list->head; node; node = node->next) - length++; - - return length; -} - -token_list_t * -_argument_list_member_at (argument_list_t *list, int index) -{ - argument_node_t *node; - int i; - - if (list == NULL) - return NULL; - - node = list->head; - for (i = 0; i < index; i++) { - node = node->next; - if (node == NULL) - break; - } - - if (node) - return node->argument; - - return NULL; -} - -/* Note: This function ralloc_steal()s the str pointer. */ -token_t * -_token_create_str (void *ctx, int type, char *str) -{ - token_t *token; - - token = ralloc (ctx, token_t); - token->type = type; - token->value.str = str; - - ralloc_steal (token, str); - - return token; -} - -token_t * -_token_create_ival (void *ctx, int type, int ival) -{ - token_t *token; - - token = ralloc (ctx, token_t); - token->type = type; - token->value.ival = ival; - - return token; -} - -token_list_t * -_token_list_create (void *ctx) -{ - token_list_t *list; - - list = ralloc (ctx, token_list_t); - list->head = NULL; - list->tail = NULL; - list->non_space_tail = NULL; - - return list; -} - -void -_token_list_append (token_list_t *list, token_t *token) -{ - token_node_t *node; - - node = ralloc (list, token_node_t); - node->token = token; - node->next = NULL; - - if (list->head == NULL) { - list->head = node; - } else { - list->tail->next = node; - } - - list->tail = node; - if (token->type != SPACE) - list->non_space_tail = node; -} - -void -_token_list_append_list (token_list_t *list, token_list_t *tail) -{ - if (tail == NULL || tail->head == NULL) - return; - - if (list->head == NULL) { - list->head = tail->head; - } else { - list->tail->next = tail->head; - } - - list->tail = tail->tail; - list->non_space_tail = tail->non_space_tail; -} - -static token_list_t * -_token_list_copy (void *ctx, token_list_t *other) -{ - token_list_t *copy; - token_node_t *node; - - if (other == NULL) - return NULL; - - copy = _token_list_create (ctx); - for (node = other->head; node; node = node->next) { - token_t *new_token = ralloc (copy, token_t); - *new_token = *node->token; - _token_list_append (copy, new_token); - } - - return copy; -} - -static void -_token_list_trim_trailing_space (token_list_t *list) -{ - token_node_t *tail, *next; - - if (list->non_space_tail) { - tail = list->non_space_tail->next; - list->non_space_tail->next = NULL; - list->tail = list->non_space_tail; - - while (tail) { - next = tail->next; - ralloc_free (tail); - tail = next; - } - } -} - -static int -_token_list_is_empty_ignoring_space (token_list_t *l) -{ - token_node_t *n; - - if (l == NULL) - return 1; - - n = l->head; - while (n != NULL && n->token->type == SPACE) - n = n->next; - - return n == NULL; -} - -int -_token_list_equal_ignoring_space (token_list_t *a, token_list_t *b) -{ - token_node_t *node_a, *node_b; - - if (a == NULL || b == NULL) { - int a_empty = _token_list_is_empty_ignoring_space(a); - int b_empty = _token_list_is_empty_ignoring_space(b); - return a_empty == b_empty; - } - - node_a = a->head; - node_b = b->head; - - while (1) - { - if (node_a == NULL && node_b == NULL) - break; - - if (node_a == NULL || node_b == NULL) - return 0; - /* Make sure whitespace appears in the same places in both. - * It need not be exactly the same amount of whitespace, - * though. - */ - if (node_a->token->type == SPACE - && node_b->token->type == SPACE) { - while (node_a->token->type == SPACE) - node_a = node_a->next; - while (node_b->token->type == SPACE) - node_b = node_b->next; - continue; - } - - if (node_a->token->type != node_b->token->type) - return 0; - - switch (node_a->token->type) { - case INTEGER: - if (node_a->token->value.ival != - node_b->token->value.ival) - { - return 0; - } - break; - case IDENTIFIER: - case INTEGER_STRING: - case OTHER: - if (strcmp (node_a->token->value.str, - node_b->token->value.str)) - { - return 0; - } - break; - } - - node_a = node_a->next; - node_b = node_b->next; - } - - return 1; -} - -static void -_token_print (char **out, size_t *len, token_t *token) -{ - if (token->type < 256) { - ralloc_asprintf_rewrite_tail (out, len, "%c", token->type); - return; - } - - switch (token->type) { - case INTEGER: - ralloc_asprintf_rewrite_tail (out, len, "%" PRIiMAX, token->value.ival); - break; - case IDENTIFIER: - case INTEGER_STRING: - case OTHER: - ralloc_asprintf_rewrite_tail (out, len, "%s", token->value.str); - break; - case SPACE: - ralloc_asprintf_rewrite_tail (out, len, " "); - break; - case LEFT_SHIFT: - ralloc_asprintf_rewrite_tail (out, len, "<<"); - break; - case RIGHT_SHIFT: - ralloc_asprintf_rewrite_tail (out, len, ">>"); - break; - case LESS_OR_EQUAL: - ralloc_asprintf_rewrite_tail (out, len, "<="); - break; - case GREATER_OR_EQUAL: - ralloc_asprintf_rewrite_tail (out, len, ">="); - break; - case EQUAL: - ralloc_asprintf_rewrite_tail (out, len, "=="); - break; - case NOT_EQUAL: - ralloc_asprintf_rewrite_tail (out, len, "!="); - break; - case AND: - ralloc_asprintf_rewrite_tail (out, len, "&&"); - break; - case OR: - ralloc_asprintf_rewrite_tail (out, len, "||"); - break; - case PASTE: - ralloc_asprintf_rewrite_tail (out, len, "##"); - break; - case PLUS_PLUS: - ralloc_asprintf_rewrite_tail (out, len, "++"); - break; - case MINUS_MINUS: - ralloc_asprintf_rewrite_tail (out, len, "--"); - break; - case DEFINED: - ralloc_asprintf_rewrite_tail (out, len, "defined"); - break; - case PLACEHOLDER: - /* Nothing to print. */ - break; - default: - assert(!"Error: Don't know how to print token."); - - break; - } -} - -/* Return a new token (ralloc()ed off of 'token') formed by pasting - * 'token' and 'other'. Note that this function may return 'token' or - * 'other' directly rather than allocating anything new. - * - * Caution: Only very cursory error-checking is performed to see if - * the final result is a valid single token. */ -static token_t * -_token_paste (glcpp_parser_t *parser, token_t *token, token_t *other) -{ - token_t *combined = NULL; - - /* Pasting a placeholder onto anything makes no change. */ - if (other->type == PLACEHOLDER) - return token; - - /* When 'token' is a placeholder, just return 'other'. */ - if (token->type == PLACEHOLDER) - return other; - - /* A very few single-character punctuators can be combined - * with another to form a multi-character punctuator. */ - switch (token->type) { - case '<': - if (other->type == '<') - combined = _token_create_ival (token, LEFT_SHIFT, LEFT_SHIFT); - else if (other->type == '=') - combined = _token_create_ival (token, LESS_OR_EQUAL, LESS_OR_EQUAL); - break; - case '>': - if (other->type == '>') - combined = _token_create_ival (token, RIGHT_SHIFT, RIGHT_SHIFT); - else if (other->type == '=') - combined = _token_create_ival (token, GREATER_OR_EQUAL, GREATER_OR_EQUAL); - break; - case '=': - if (other->type == '=') - combined = _token_create_ival (token, EQUAL, EQUAL); - break; - case '!': - if (other->type == '=') - combined = _token_create_ival (token, NOT_EQUAL, NOT_EQUAL); - break; - case '&': - if (other->type == '&') - combined = _token_create_ival (token, AND, AND); - break; - case '|': - if (other->type == '|') - combined = _token_create_ival (token, OR, OR); - break; - } - - if (combined != NULL) { - /* Inherit the location from the first token */ - combined->location = token->location; - return combined; - } - - /* Two string-valued (or integer) tokens can usually just be - * mashed together. (We also handle a string followed by an - * integer here as well.) - * - * There are some exceptions here. Notably, if the first token - * is an integer (or a string representing an integer), then - * the second token must also be an integer or must be a - * string representing an integer that begins with a digit. - */ - if ((token->type == IDENTIFIER || token->type == OTHER || token->type == INTEGER_STRING || token->type == INTEGER) && - (other->type == IDENTIFIER || other->type == OTHER || other->type == INTEGER_STRING || other->type == INTEGER)) - { - char *str; - int combined_type; - - /* Check that pasting onto an integer doesn't create a - * non-integer, (that is, only digits can be - * pasted. */ - if (token->type == INTEGER_STRING || token->type == INTEGER) - { - switch (other->type) { - case INTEGER_STRING: - if (other->value.str[0] < '0' || - other->value.str[0] > '9') - goto FAIL; - break; - case INTEGER: - if (other->value.ival < 0) - goto FAIL; - break; - default: - goto FAIL; - } - } - - if (token->type == INTEGER) - str = ralloc_asprintf (token, "%" PRIiMAX, - token->value.ival); - else - str = ralloc_strdup (token, token->value.str); - - - if (other->type == INTEGER) - ralloc_asprintf_append (&str, "%" PRIiMAX, - other->value.ival); - else - ralloc_strcat (&str, other->value.str); - - /* New token is same type as original token, unless we - * started with an integer, in which case we will be - * creating an integer-string. */ - combined_type = token->type; - if (combined_type == INTEGER) - combined_type = INTEGER_STRING; - - combined = _token_create_str (token, combined_type, str); - combined->location = token->location; - return combined; - } - - FAIL: - glcpp_error (&token->location, parser, ""); - ralloc_asprintf_rewrite_tail (&parser->info_log, &parser->info_log_length, "Pasting \""); - _token_print (&parser->info_log, &parser->info_log_length, token); - ralloc_asprintf_rewrite_tail (&parser->info_log, &parser->info_log_length, "\" and \""); - _token_print (&parser->info_log, &parser->info_log_length, other); - ralloc_asprintf_rewrite_tail (&parser->info_log, &parser->info_log_length, "\" does not give a valid preprocessing token.\n"); - - return token; -} - -static void -_token_list_print (glcpp_parser_t *parser, token_list_t *list) -{ - token_node_t *node; - - if (list == NULL) - return; - - for (node = list->head; node; node = node->next) - _token_print (&parser->output, &parser->output_length, node->token); -} - -void -yyerror (YYLTYPE *locp, glcpp_parser_t *parser, const char *error) -{ - glcpp_error(locp, parser, "%s", error); -} - -static void add_builtin_define(glcpp_parser_t *parser, - const char *name, int value) -{ - token_t *tok; - token_list_t *list; - - tok = _token_create_ival (parser, INTEGER, value); - - list = _token_list_create(parser); - _token_list_append(list, tok); - _define_object_macro(parser, NULL, name, list); -} - -glcpp_parser_t * -glcpp_parser_create (const struct gl_extensions *extensions, gl_api api) -{ - glcpp_parser_t *parser; - - parser = ralloc (NULL, glcpp_parser_t); - - glcpp_lex_init_extra (parser, &parser->scanner); - parser->defines = hash_table_ctor (32, hash_table_string_hash, - hash_table_string_compare); - parser->active = NULL; - parser->lexing_directive = 0; - parser->space_tokens = 1; - parser->last_token_was_newline = 0; - parser->last_token_was_space = 0; - parser->first_non_space_token_this_line = 1; - parser->newline_as_space = 0; - parser->in_control_line = 0; - parser->paren_count = 0; - parser->commented_newlines = 0; - - parser->skip_stack = NULL; - parser->skipping = 0; - - parser->lex_from_list = NULL; - parser->lex_from_node = NULL; - - parser->output = ralloc_strdup(parser, ""); - parser->output_length = 0; - parser->info_log = ralloc_strdup(parser, ""); - parser->info_log_length = 0; - parser->error = 0; - - parser->extensions = extensions; - parser->api = api; - parser->version_resolved = false; - - parser->has_new_line_number = 0; - parser->new_line_number = 1; - parser->has_new_source_number = 0; - parser->new_source_number = 0; - - return parser; -} - -void -glcpp_parser_destroy (glcpp_parser_t *parser) -{ - glcpp_lex_destroy (parser->scanner); - hash_table_dtor (parser->defines); - ralloc_free (parser); -} - -typedef enum function_status -{ - FUNCTION_STATUS_SUCCESS, - FUNCTION_NOT_A_FUNCTION, - FUNCTION_UNBALANCED_PARENTHESES -} function_status_t; - -/* Find a set of function-like macro arguments by looking for a - * balanced set of parentheses. - * - * When called, 'node' should be the opening-parenthesis token, (or - * perhaps preceeding SPACE tokens). Upon successful return *last will - * be the last consumed node, (corresponding to the closing right - * parenthesis). - * - * Return values: - * - * FUNCTION_STATUS_SUCCESS: - * - * Successfully parsed a set of function arguments. - * - * FUNCTION_NOT_A_FUNCTION: - * - * Macro name not followed by a '('. This is not an error, but - * simply that the macro name should be treated as a non-macro. - * - * FUNCTION_UNBALANCED_PARENTHESES - * - * Macro name is not followed by a balanced set of parentheses. - */ -static function_status_t -_arguments_parse (argument_list_t *arguments, - token_node_t *node, - token_node_t **last) -{ - token_list_t *argument; - int paren_count; - - node = node->next; - - /* Ignore whitespace before first parenthesis. */ - while (node && node->token->type == SPACE) - node = node->next; - - if (node == NULL || node->token->type != '(') - return FUNCTION_NOT_A_FUNCTION; - - node = node->next; - - argument = _token_list_create (arguments); - _argument_list_append (arguments, argument); - - for (paren_count = 1; node; node = node->next) { - if (node->token->type == '(') - { - paren_count++; - } - else if (node->token->type == ')') - { - paren_count--; - if (paren_count == 0) - break; - } - - if (node->token->type == ',' && - paren_count == 1) - { - _token_list_trim_trailing_space (argument); - argument = _token_list_create (arguments); - _argument_list_append (arguments, argument); - } - else { - if (argument->head == NULL) { - /* Don't treat initial whitespace as - * part of the argument. */ - if (node->token->type == SPACE) - continue; - } - _token_list_append (argument, node->token); - } - } - - if (paren_count) - return FUNCTION_UNBALANCED_PARENTHESES; - - *last = node; - - return FUNCTION_STATUS_SUCCESS; -} - -static token_list_t * -_token_list_create_with_one_ival (void *ctx, int type, int ival) -{ - token_list_t *list; - token_t *node; - - list = _token_list_create (ctx); - node = _token_create_ival (list, type, ival); - _token_list_append (list, node); - - return list; -} - -static token_list_t * -_token_list_create_with_one_space (void *ctx) -{ - return _token_list_create_with_one_ival (ctx, SPACE, SPACE); -} - -static token_list_t * -_token_list_create_with_one_integer (void *ctx, int ival) -{ - return _token_list_create_with_one_ival (ctx, INTEGER, ival); -} - -/* Evaluate a DEFINED token node (based on subsequent tokens in the list). - * - * Note: This function must only be called when "node" is a DEFINED token, - * (and will abort with an assertion failure otherwise). - * - * If "node" is followed, (ignoring any SPACE tokens), by an IDENTIFIER token - * (optionally preceded and followed by '(' and ')' tokens) then the following - * occurs: - * - * If the identifier is a defined macro, this function returns 1. - * - * If the identifier is not a defined macro, this function returns 0. - * - * In either case, *last will be updated to the last node in the list - * consumed by the evaluation, (either the token of the identifier or the - * token of the closing parenthesis). - * - * In all other cases, (such as "node is the final node of the list", or - * "missing closing parenthesis", etc.), this function generates a - * preprocessor error, returns -1 and *last will not be set. - */ -static int -_glcpp_parser_evaluate_defined (glcpp_parser_t *parser, - token_node_t *node, - token_node_t **last) -{ - token_node_t *argument, *defined = node; - - assert (node->token->type == DEFINED); - - node = node->next; - - /* Ignore whitespace after DEFINED token. */ - while (node && node->token->type == SPACE) - node = node->next; - - if (node == NULL) - goto FAIL; - - if (node->token->type == IDENTIFIER || node->token->type == OTHER) { - argument = node; - } else if (node->token->type == '(') { - node = node->next; - - /* Ignore whitespace after '(' token. */ - while (node && node->token->type == SPACE) - node = node->next; - - if (node == NULL || (node->token->type != IDENTIFIER && - node->token->type != OTHER)) - { - goto FAIL; - } - - argument = node; - - node = node->next; - - /* Ignore whitespace after identifier, before ')' token. */ - while (node && node->token->type == SPACE) - node = node->next; - - if (node == NULL || node->token->type != ')') - goto FAIL; - } else { - goto FAIL; - } - - *last = node; - - return hash_table_find (parser->defines, - argument->token->value.str) ? 1 : 0; - -FAIL: - glcpp_error (&defined->token->location, parser, - "\"defined\" not followed by an identifier"); - return -1; -} - -/* Evaluate all DEFINED nodes in a given list, modifying the list in place. - */ -static void -_glcpp_parser_evaluate_defined_in_list (glcpp_parser_t *parser, - token_list_t *list) -{ - token_node_t *node, *node_prev, *replacement, *last = NULL; - int value; - - if (list == NULL) - return; - - node_prev = NULL; - node = list->head; - - while (node) { - - if (node->token->type != DEFINED) - goto NEXT; - - value = _glcpp_parser_evaluate_defined (parser, node, &last); - if (value == -1) - goto NEXT; - - replacement = ralloc (list, token_node_t); - replacement->token = _token_create_ival (list, INTEGER, value); - - /* Splice replacement node into list, replacing from "node" - * through "last". */ - if (node_prev) - node_prev->next = replacement; - else - list->head = replacement; - replacement->next = last->next; - if (last == list->tail) - list->tail = replacement; - - node = replacement; - - NEXT: - node_prev = node; - node = node->next; - } -} - -/* Perform macro expansion on 'list', placing the resulting tokens - * into a new list which is initialized with a first token of type - * 'head_token_type'. Then begin lexing from the resulting list, - * (return to the current lexing source when this list is exhausted). - * - * See the documentation of _glcpp_parser_expand_token_list for a description - * of the "mode" parameter. - */ -static void -_glcpp_parser_expand_and_lex_from (glcpp_parser_t *parser, - int head_token_type, - token_list_t *list, - expansion_mode_t mode) -{ - token_list_t *expanded; - token_t *token; - - expanded = _token_list_create (parser); - token = _token_create_ival (parser, head_token_type, head_token_type); - _token_list_append (expanded, token); - _glcpp_parser_expand_token_list (parser, list, mode); - _token_list_append_list (expanded, list); - glcpp_parser_lex_from (parser, expanded); -} - -static void -_glcpp_parser_apply_pastes (glcpp_parser_t *parser, token_list_t *list) -{ - token_node_t *node; - - node = list->head; - while (node) - { - token_node_t *next_non_space; - - /* Look ahead for a PASTE token, skipping space. */ - next_non_space = node->next; - while (next_non_space && next_non_space->token->type == SPACE) - next_non_space = next_non_space->next; - - if (next_non_space == NULL) - break; - - if (next_non_space->token->type != PASTE) { - node = next_non_space; - continue; - } - - /* Now find the next non-space token after the PASTE. */ - next_non_space = next_non_space->next; - while (next_non_space && next_non_space->token->type == SPACE) - next_non_space = next_non_space->next; - - if (next_non_space == NULL) { - yyerror (&node->token->location, parser, "'##' cannot appear at either end of a macro expansion\n"); - return; - } - - node->token = _token_paste (parser, node->token, next_non_space->token); - node->next = next_non_space->next; - if (next_non_space == list->tail) - list->tail = node; - } - - list->non_space_tail = list->tail; -} - -/* This is a helper function that's essentially part of the - * implementation of _glcpp_parser_expand_node. It shouldn't be called - * except for by that function. - * - * Returns NULL if node is a simple token with no expansion, (that is, - * although 'node' corresponds to an identifier defined as a - * function-like macro, it is not followed with a parenthesized - * argument list). - * - * Compute the complete expansion of node (which is a function-like - * macro) and subsequent nodes which are arguments. - * - * Returns the token list that results from the expansion and sets - * *last to the last node in the list that was consumed by the - * expansion. Specifically, *last will be set as follows: as the - * token of the closing right parenthesis. - * - * See the documentation of _glcpp_parser_expand_token_list for a description - * of the "mode" parameter. - */ -static token_list_t * -_glcpp_parser_expand_function (glcpp_parser_t *parser, - token_node_t *node, - token_node_t **last, - expansion_mode_t mode) -{ - macro_t *macro; - const char *identifier; - argument_list_t *arguments; - function_status_t status; - token_list_t *substituted; - int parameter_index; - - identifier = node->token->value.str; - - macro = hash_table_find (parser->defines, identifier); - - assert (macro->is_function); - - arguments = _argument_list_create (parser); - status = _arguments_parse (arguments, node, last); - - switch (status) { - case FUNCTION_STATUS_SUCCESS: - break; - case FUNCTION_NOT_A_FUNCTION: - return NULL; - case FUNCTION_UNBALANCED_PARENTHESES: - glcpp_error (&node->token->location, parser, "Macro %s call has unbalanced parentheses\n", identifier); - return NULL; - } - - /* Replace a macro defined as empty with a SPACE token. */ - if (macro->replacements == NULL) { - ralloc_free (arguments); - return _token_list_create_with_one_space (parser); - } - - if (! ((_argument_list_length (arguments) == - _string_list_length (macro->parameters)) || - (_string_list_length (macro->parameters) == 0 && - _argument_list_length (arguments) == 1 && - arguments->head->argument->head == NULL))) - { - glcpp_error (&node->token->location, parser, - "Error: macro %s invoked with %d arguments (expected %d)\n", - identifier, - _argument_list_length (arguments), - _string_list_length (macro->parameters)); - return NULL; - } - - /* Perform argument substitution on the replacement list. */ - substituted = _token_list_create (arguments); - - for (node = macro->replacements->head; node; node = node->next) - { - if (node->token->type == IDENTIFIER && - _string_list_contains (macro->parameters, - node->token->value.str, - ¶meter_index)) - { - token_list_t *argument; - argument = _argument_list_member_at (arguments, - parameter_index); - /* Before substituting, we expand the argument - * tokens, or append a placeholder token for - * an empty argument. */ - if (argument->head) { - token_list_t *expanded_argument; - expanded_argument = _token_list_copy (parser, - argument); - _glcpp_parser_expand_token_list (parser, - expanded_argument, - mode); - _token_list_append_list (substituted, - expanded_argument); - } else { - token_t *new_token; - - new_token = _token_create_ival (substituted, - PLACEHOLDER, - PLACEHOLDER); - _token_list_append (substituted, new_token); - } - } else { - _token_list_append (substituted, node->token); - } - } - - /* After argument substitution, and before further expansion - * below, implement token pasting. */ - - _token_list_trim_trailing_space (substituted); - - _glcpp_parser_apply_pastes (parser, substituted); - - return substituted; -} - -/* Compute the complete expansion of node, (and subsequent nodes after - * 'node' in the case that 'node' is a function-like macro and - * subsequent nodes are arguments). - * - * Returns NULL if node is a simple token with no expansion. - * - * Otherwise, returns the token list that results from the expansion - * and sets *last to the last node in the list that was consumed by - * the expansion. Specifically, *last will be set as follows: - * - * As 'node' in the case of object-like macro expansion. - * - * As the token of the closing right parenthesis in the case of - * function-like macro expansion. - * - * See the documentation of _glcpp_parser_expand_token_list for a description - * of the "mode" parameter. - */ -static token_list_t * -_glcpp_parser_expand_node (glcpp_parser_t *parser, - token_node_t *node, - token_node_t **last, - expansion_mode_t mode) -{ - token_t *token = node->token; - const char *identifier; - macro_t *macro; - - /* We only expand identifiers */ - if (token->type != IDENTIFIER) { - return NULL; - } - - *last = node; - identifier = token->value.str; - - /* Special handling for __LINE__ and __FILE__, (not through - * the hash table). */ - if (strcmp(identifier, "__LINE__") == 0) - return _token_list_create_with_one_integer (parser, node->token->location.first_line); - - if (strcmp(identifier, "__FILE__") == 0) - return _token_list_create_with_one_integer (parser, node->token->location.source); - - /* Look up this identifier in the hash table. */ - macro = hash_table_find (parser->defines, identifier); - - /* Not a macro, so no expansion needed. */ - if (macro == NULL) - return NULL; - - /* Finally, don't expand this macro if we're already actively - * expanding it, (to avoid infinite recursion). */ - if (_parser_active_list_contains (parser, identifier)) { - /* We change the token type here from IDENTIFIER to - * OTHER to prevent any future expansion of this - * unexpanded token. */ - char *str; - token_list_t *expansion; - token_t *final; - - str = ralloc_strdup (parser, token->value.str); - final = _token_create_str (parser, OTHER, str); - expansion = _token_list_create (parser); - _token_list_append (expansion, final); - return expansion; - } - - if (! macro->is_function) - { - token_list_t *replacement; - - /* Replace a macro defined as empty with a SPACE token. */ - if (macro->replacements == NULL) - return _token_list_create_with_one_space (parser); - - replacement = _token_list_copy (parser, macro->replacements); - _glcpp_parser_apply_pastes (parser, replacement); - return replacement; - } - - return _glcpp_parser_expand_function (parser, node, last, mode); -} - -/* Push a new identifier onto the parser's active list. - * - * Here, 'marker' is the token node that appears in the list after the - * expansion of 'identifier'. That is, when the list iterator begins - * examining 'marker', then it is time to pop this node from the - * active stack. - */ -static void -_parser_active_list_push (glcpp_parser_t *parser, - const char *identifier, - token_node_t *marker) -{ - active_list_t *node; - - node = ralloc (parser->active, active_list_t); - node->identifier = ralloc_strdup (node, identifier); - node->marker = marker; - node->next = parser->active; - - parser->active = node; -} - -static void -_parser_active_list_pop (glcpp_parser_t *parser) -{ - active_list_t *node = parser->active; - - if (node == NULL) { - parser->active = NULL; - return; - } - - node = parser->active->next; - ralloc_free (parser->active); - - parser->active = node; -} - -static int -_parser_active_list_contains (glcpp_parser_t *parser, const char *identifier) -{ - active_list_t *node; - - if (parser->active == NULL) - return 0; - - for (node = parser->active; node; node = node->next) - if (strcmp (node->identifier, identifier) == 0) - return 1; - - return 0; -} - -/* Walk over the token list replacing nodes with their expansion. - * Whenever nodes are expanded the walking will walk over the new - * nodes, continuing to expand as necessary. The results are placed in - * 'list' itself. - * - * The "mode" argument controls the handling of any DEFINED tokens that - * result from expansion as follows: - * - * EXPANSION_MODE_IGNORE_DEFINED: Any resulting DEFINED tokens will be - * left in the final list, unevaluated. This is the correct mode - * for expanding any list in any context other than a - * preprocessor conditional, (#if or #elif). - * - * EXPANSION_MODE_EVALUATE_DEFINED: Any resulting DEFINED tokens will be - * evaluated to 0 or 1 tokens depending on whether the following - * token is the name of a defined macro. If the DEFINED token is - * not followed by an (optionally parenthesized) identifier, then - * an error will be generated. This the correct mode for - * expanding any list in the context of a preprocessor - * conditional, (#if or #elif). - */ -static void -_glcpp_parser_expand_token_list (glcpp_parser_t *parser, - token_list_t *list, - expansion_mode_t mode) -{ - token_node_t *node_prev; - token_node_t *node, *last = NULL; - token_list_t *expansion; - active_list_t *active_initial = parser->active; - - if (list == NULL) - return; - - _token_list_trim_trailing_space (list); - - node_prev = NULL; - node = list->head; - - if (mode == EXPANSION_MODE_EVALUATE_DEFINED) - _glcpp_parser_evaluate_defined_in_list (parser, list); - - while (node) { - - while (parser->active && parser->active->marker == node) - _parser_active_list_pop (parser); - - expansion = _glcpp_parser_expand_node (parser, node, &last, mode); - if (expansion) { - token_node_t *n; - - if (mode == EXPANSION_MODE_EVALUATE_DEFINED) { - _glcpp_parser_evaluate_defined_in_list (parser, - expansion); - } - - for (n = node; n != last->next; n = n->next) - while (parser->active && - parser->active->marker == n) - { - _parser_active_list_pop (parser); - } - - _parser_active_list_push (parser, - node->token->value.str, - last->next); - - /* Splice expansion into list, supporting a - * simple deletion if the expansion is - * empty. */ - if (expansion->head) { - if (node_prev) - node_prev->next = expansion->head; - else - list->head = expansion->head; - expansion->tail->next = last->next; - if (last == list->tail) - list->tail = expansion->tail; - } else { - if (node_prev) - node_prev->next = last->next; - else - list->head = last->next; - if (last == list->tail) - list->tail = NULL; - } - } else { - node_prev = node; - } - node = node_prev ? node_prev->next : list->head; - } - - /* Remove any lingering effects of this invocation on the - * active list. That is, pop until the list looks like it did - * at the beginning of this function. */ - while (parser->active && parser->active != active_initial) - _parser_active_list_pop (parser); - - list->non_space_tail = list->tail; -} - -void -_glcpp_parser_print_expanded_token_list (glcpp_parser_t *parser, - token_list_t *list) -{ - if (list == NULL) - return; - - _glcpp_parser_expand_token_list (parser, list, EXPANSION_MODE_IGNORE_DEFINED); - - _token_list_trim_trailing_space (list); - - _token_list_print (parser, list); -} - -static void -_check_for_reserved_macro_name (glcpp_parser_t *parser, YYLTYPE *loc, - const char *identifier) -{ - /* Section 3.3 (Preprocessor) of the GLSL 1.30 spec (and later) and - * the GLSL ES spec (all versions) say: - * - * "All macro names containing two consecutive underscores ( __ ) - * are reserved for future use as predefined macro names. All - * macro names prefixed with "GL_" ("GL" followed by a single - * underscore) are also reserved." - * - * The intention is that names containing __ are reserved for internal - * use by the implementation, and names prefixed with GL_ are reserved - * for use by Khronos. Since every extension adds a name prefixed - * with GL_ (i.e., the name of the extension), that should be an - * error. Names simply containing __ are dangerous to use, but should - * be allowed. - * - * A future version of the GLSL specification will clarify this. - */ - if (strstr(identifier, "__")) { - glcpp_warning(loc, parser, - "Macro names containing \"__\" are reserved " - "for use by the implementation.\n"); - } - if (strncmp(identifier, "GL_", 3) == 0) { - glcpp_error (loc, parser, "Macro names starting with \"GL_\" are reserved.\n"); - } -} - -static int -_macro_equal (macro_t *a, macro_t *b) -{ - if (a->is_function != b->is_function) - return 0; - - if (a->is_function) { - if (! _string_list_equal (a->parameters, b->parameters)) - return 0; - } - - return _token_list_equal_ignoring_space (a->replacements, - b->replacements); -} - -void -_define_object_macro (glcpp_parser_t *parser, - YYLTYPE *loc, - const char *identifier, - token_list_t *replacements) -{ - macro_t *macro, *previous; - - /* We define pre-defined macros before we've started parsing the - * actual file. So if there's no location defined yet, that's what - * were doing and we don't want to generate an error for using the - * reserved names. */ - if (loc != NULL) - _check_for_reserved_macro_name(parser, loc, identifier); - - macro = ralloc (parser, macro_t); - - macro->is_function = 0; - macro->parameters = NULL; - macro->identifier = ralloc_strdup (macro, identifier); - macro->replacements = replacements; - ralloc_steal (macro, replacements); - - previous = hash_table_find (parser->defines, identifier); - if (previous) { - if (_macro_equal (macro, previous)) { - ralloc_free (macro); - return; - } - glcpp_error (loc, parser, "Redefinition of macro %s\n", - identifier); - } - - hash_table_insert (parser->defines, macro, identifier); -} - -void -_define_function_macro (glcpp_parser_t *parser, - YYLTYPE *loc, - const char *identifier, - string_list_t *parameters, - token_list_t *replacements) -{ - macro_t *macro, *previous; - const char *dup; - - _check_for_reserved_macro_name(parser, loc, identifier); - - /* Check for any duplicate parameter names. */ - if ((dup = _string_list_has_duplicate (parameters)) != NULL) { - glcpp_error (loc, parser, "Duplicate macro parameter \"%s\"", - dup); - } - - macro = ralloc (parser, macro_t); - ralloc_steal (macro, parameters); - ralloc_steal (macro, replacements); - - macro->is_function = 1; - macro->parameters = parameters; - macro->identifier = ralloc_strdup (macro, identifier); - macro->replacements = replacements; - previous = hash_table_find (parser->defines, identifier); - if (previous) { - if (_macro_equal (macro, previous)) { - ralloc_free (macro); - return; - } - glcpp_error (loc, parser, "Redefinition of macro %s\n", - identifier); - } - - hash_table_insert (parser->defines, macro, identifier); -} - -static int -glcpp_parser_lex (YYSTYPE *yylval, YYLTYPE *yylloc, glcpp_parser_t *parser) -{ - token_node_t *node; - int ret; - - if (parser->lex_from_list == NULL) { - ret = glcpp_lex (yylval, yylloc, parser->scanner); - - /* XXX: This ugly block of code exists for the sole - * purpose of converting a NEWLINE token into a SPACE - * token, but only in the case where we have seen a - * function-like macro name, but have not yet seen its - * closing parenthesis. - * - * There's perhaps a more compact way to do this with - * mid-rule actions in the grammar. - * - * I'm definitely not pleased with the complexity of - * this code here. - */ - if (parser->newline_as_space) - { - if (ret == '(') { - parser->paren_count++; - } else if (ret == ')') { - parser->paren_count--; - if (parser->paren_count == 0) - parser->newline_as_space = 0; - } else if (ret == NEWLINE) { - ret = SPACE; - } else if (ret != SPACE) { - if (parser->paren_count == 0) - parser->newline_as_space = 0; - } - } - else if (parser->in_control_line) - { - if (ret == NEWLINE) - parser->in_control_line = 0; - } - else if (ret == DEFINE_TOKEN || - ret == UNDEF || ret == IF || - ret == IFDEF || ret == IFNDEF || - ret == ELIF || ret == ELSE || - ret == ENDIF || ret == HASH_TOKEN) - { - parser->in_control_line = 1; - } - else if (ret == IDENTIFIER) - { - macro_t *macro; - macro = hash_table_find (parser->defines, - yylval->str); - if (macro && macro->is_function) { - parser->newline_as_space = 1; - parser->paren_count = 0; - } - } - - return ret; - } - - node = parser->lex_from_node; - - if (node == NULL) { - ralloc_free (parser->lex_from_list); - parser->lex_from_list = NULL; - return NEWLINE; - } - - *yylval = node->token->value; - ret = node->token->type; - - parser->lex_from_node = node->next; - - return ret; -} - -static void -glcpp_parser_lex_from (glcpp_parser_t *parser, token_list_t *list) -{ - token_node_t *node; - - assert (parser->lex_from_list == NULL); - - /* Copy list, eliminating any space tokens. */ - parser->lex_from_list = _token_list_create (parser); - - for (node = list->head; node; node = node->next) { - if (node->token->type == SPACE) - continue; - _token_list_append (parser->lex_from_list, node->token); - } - - ralloc_free (list); - - parser->lex_from_node = parser->lex_from_list->head; - - /* It's possible the list consisted of nothing but whitespace. */ - if (parser->lex_from_node == NULL) { - ralloc_free (parser->lex_from_list); - parser->lex_from_list = NULL; - } -} - -static void -_glcpp_parser_skip_stack_push_if (glcpp_parser_t *parser, YYLTYPE *loc, - int condition) -{ - skip_type_t current = SKIP_NO_SKIP; - skip_node_t *node; - - if (parser->skip_stack) - current = parser->skip_stack->type; - - node = ralloc (parser, skip_node_t); - node->loc = *loc; - - if (current == SKIP_NO_SKIP) { - if (condition) - node->type = SKIP_NO_SKIP; - else - node->type = SKIP_TO_ELSE; - } else { - node->type = SKIP_TO_ENDIF; - } - - node->has_else = false; - node->next = parser->skip_stack; - parser->skip_stack = node; -} - -static void -_glcpp_parser_skip_stack_change_if (glcpp_parser_t *parser, YYLTYPE *loc, - const char *type, int condition) -{ - if (parser->skip_stack == NULL) { - glcpp_error (loc, parser, "#%s without #if\n", type); - return; - } - - if (parser->skip_stack->type == SKIP_TO_ELSE) { - if (condition) - parser->skip_stack->type = SKIP_NO_SKIP; - } else { - parser->skip_stack->type = SKIP_TO_ENDIF; - } -} - -static void -_glcpp_parser_skip_stack_pop (glcpp_parser_t *parser, YYLTYPE *loc) -{ - skip_node_t *node; - - if (parser->skip_stack == NULL) { - glcpp_error (loc, parser, "#endif without #if\n"); - return; - } - - node = parser->skip_stack; - parser->skip_stack = node->next; - ralloc_free (node); -} - -static void -_glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t version, - const char *es_identifier, - bool explicitly_set) -{ - const struct gl_extensions *extensions = parser->extensions; - - if (parser->version_resolved) - return; - - parser->version_resolved = true; - - add_builtin_define (parser, "__VERSION__", version); - - parser->is_gles = (version == 100) || - (es_identifier && - (strcmp(es_identifier, "es") == 0)); - - /* Add pre-defined macros. */ - if (parser->is_gles) { - add_builtin_define(parser, "GL_ES", 1); - add_builtin_define(parser, "GL_EXT_separate_shader_objects", 1); - - if (extensions != NULL) { - if (extensions->OES_EGL_image_external) - add_builtin_define(parser, "GL_OES_EGL_image_external", 1); - if (extensions->OES_standard_derivatives) - add_builtin_define(parser, "GL_OES_standard_derivatives", 1); - } - } else { - add_builtin_define(parser, "GL_ARB_draw_buffers", 1); - add_builtin_define(parser, "GL_ARB_separate_shader_objects", 1); - add_builtin_define(parser, "GL_ARB_texture_rectangle", 1); - add_builtin_define(parser, "GL_AMD_shader_trinary_minmax", 1); - - - if (extensions != NULL) { - if (extensions->EXT_texture_array) - add_builtin_define(parser, "GL_EXT_texture_array", 1); - - if (extensions->ARB_arrays_of_arrays) - add_builtin_define(parser, "GL_ARB_arrays_of_arrays", 1); - - if (extensions->ARB_fragment_coord_conventions) - add_builtin_define(parser, "GL_ARB_fragment_coord_conventions", - 1); - - if (extensions->ARB_fragment_layer_viewport) - add_builtin_define(parser, "GL_ARB_fragment_layer_viewport", 1); - - if (extensions->ARB_explicit_attrib_location) - add_builtin_define(parser, "GL_ARB_explicit_attrib_location", 1); - - if (extensions->ARB_explicit_uniform_location) - add_builtin_define(parser, "GL_ARB_explicit_uniform_location", 1); - - if (extensions->ARB_shader_texture_lod) - add_builtin_define(parser, "GL_ARB_shader_texture_lod", 1); - - if (extensions->ARB_draw_instanced) - add_builtin_define(parser, "GL_ARB_draw_instanced", 1); - - if (extensions->EXT_draw_instanced) - add_builtin_define(parser, "GL_EXT_draw_instanced", 1); - - if (extensions->ARB_conservative_depth) { - add_builtin_define(parser, "GL_AMD_conservative_depth", 1); - add_builtin_define(parser, "GL_ARB_conservative_depth", 1); - } - - if (extensions->ARB_shader_bit_encoding) - add_builtin_define(parser, "GL_ARB_shader_bit_encoding", 1); - - if (extensions->ARB_uniform_buffer_object) - add_builtin_define(parser, "GL_ARB_uniform_buffer_object", 1); - - if (extensions->ARB_texture_cube_map_array) - add_builtin_define(parser, "GL_ARB_texture_cube_map_array", 1); - - if (extensions->ARB_shading_language_packing) - add_builtin_define(parser, "GL_ARB_shading_language_packing", 1); - - if (extensions->ARB_texture_multisample) - add_builtin_define(parser, "GL_ARB_texture_multisample", 1); - - if (extensions->ARB_texture_query_levels) - add_builtin_define(parser, "GL_ARB_texture_query_levels", 1); - - if (extensions->ARB_texture_query_lod) - add_builtin_define(parser, "GL_ARB_texture_query_lod", 1); - - if (extensions->ARB_gpu_shader5) - add_builtin_define(parser, "GL_ARB_gpu_shader5", 1); - - if (extensions->AMD_vertex_shader_layer) - add_builtin_define(parser, "GL_AMD_vertex_shader_layer", 1); - - if (extensions->AMD_vertex_shader_viewport_index) - add_builtin_define(parser, "GL_AMD_vertex_shader_viewport_index", 1); - - if (extensions->ARB_shading_language_420pack) - add_builtin_define(parser, "GL_ARB_shading_language_420pack", 1); - - if (extensions->ARB_sample_shading) - add_builtin_define(parser, "GL_ARB_sample_shading", 1); - - if (extensions->ARB_texture_gather) - add_builtin_define(parser, "GL_ARB_texture_gather", 1); - - if (extensions->ARB_shader_atomic_counters) - add_builtin_define(parser, "GL_ARB_shader_atomic_counters", 1); - - if (extensions->ARB_viewport_array) - add_builtin_define(parser, "GL_ARB_viewport_array", 1); - - if (extensions->ARB_compute_shader) - add_builtin_define(parser, "GL_ARB_compute_shader", 1); - - if (extensions->ARB_shader_image_load_store) - add_builtin_define(parser, "GL_ARB_shader_image_load_store", 1); - - if (extensions->ARB_derivative_control) - add_builtin_define(parser, "GL_ARB_derivative_control", 1); - } - } - - if (extensions != NULL) { - if (extensions->EXT_shader_integer_mix) - add_builtin_define(parser, "GL_EXT_shader_integer_mix", 1); - } - - if (version >= 150) - add_builtin_define(parser, "GL_core_profile", 1); - - /* Currently, all ES2/ES3 implementations support highp in the - * fragment shader, so we always define this macro in ES2/ES3. - * If we ever get a driver that doesn't support highp, we'll - * need to add a flag to the gl_context and check that here. - */ - if (version >= 130 || parser->is_gles) - add_builtin_define (parser, "GL_FRAGMENT_PRECISION_HIGH", 1); - - if (explicitly_set) { - ralloc_asprintf_rewrite_tail (&parser->output, &parser->output_length, - "#version %" PRIiMAX "%s%s", version, - es_identifier ? " " : "", - es_identifier ? es_identifier : ""); - } -} - -/* GLSL version if no version is explicitly specified. */ -#define IMPLICIT_GLSL_VERSION 110 -#define IMPLICIT_GLSL_ES_VERSION 100 - -/* GLSL ES version if no version is explicitly specified. */ -#define IMPLICIT_GLSL_ES_VERSION 100 - -void -glcpp_parser_resolve_implicit_version(glcpp_parser_t *parser) -{ - int language_version = parser->api == API_OPENGLES2 ? - IMPLICIT_GLSL_ES_VERSION : - IMPLICIT_GLSL_VERSION; - - _glcpp_parser_handle_version_declaration(parser, language_version, - NULL, false); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.h b/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.h deleted file mode 100644 index 9e3c96db6..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.h +++ /dev/null @@ -1,114 +0,0 @@ -/* A Bison parser, made by GNU Bison 3.5.1. */ - -/* Bison interface for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, - Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* Undocumented macros, especially those whose name start with YY_, - are private implementation details. Do not rely on them. */ - -#ifndef YY_GLCPP_PARSER_SRC_GLSL_GLCPP_GLCPP_PARSE_H_INCLUDED -# define YY_GLCPP_PARSER_SRC_GLSL_GLCPP_GLCPP_PARSE_H_INCLUDED -/* Debug traces. */ -#ifndef YYDEBUG -# define YYDEBUG 1 -#endif -#if YYDEBUG -extern int glcpp_parser_debug; -#endif - -/* Token type. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - enum yytokentype - { - DEFINED = 258, - ELIF_EXPANDED = 259, - HASH_TOKEN = 260, - DEFINE_TOKEN = 261, - FUNC_IDENTIFIER = 262, - OBJ_IDENTIFIER = 263, - ELIF = 264, - ELSE = 265, - ENDIF = 266, - ERROR_TOKEN = 267, - IF = 268, - IFDEF = 269, - IFNDEF = 270, - LINE = 271, - PRAGMA = 272, - UNDEF = 273, - VERSION_TOKEN = 274, - GARBAGE = 275, - IDENTIFIER = 276, - IF_EXPANDED = 277, - INTEGER = 278, - INTEGER_STRING = 279, - LINE_EXPANDED = 280, - NEWLINE = 281, - OTHER = 282, - PLACEHOLDER = 283, - SPACE = 284, - PLUS_PLUS = 285, - MINUS_MINUS = 286, - PASTE = 287, - OR = 288, - AND = 289, - EQUAL = 290, - NOT_EQUAL = 291, - LESS_OR_EQUAL = 292, - GREATER_OR_EQUAL = 293, - LEFT_SHIFT = 294, - RIGHT_SHIFT = 295, - UNARY = 296 - }; -#endif - -/* Value type. */ - -/* Location type. */ -#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED -typedef struct YYLTYPE YYLTYPE; -struct YYLTYPE -{ - int first_line; - int first_column; - int last_line; - int last_column; -}; -# define YYLTYPE_IS_DECLARED 1 -# define YYLTYPE_IS_TRIVIAL 1 -#endif - - - -int glcpp_parser_parse (glcpp_parser_t *parser); - -#endif /* !YY_GLCPP_PARSER_SRC_GLSL_GLCPP_GLCPP_PARSE_H_INCLUDED */ diff --git a/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.y b/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.y deleted file mode 100644 index 25a91169e..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.y +++ /dev/null @@ -1,2521 +0,0 @@ -%{ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include -#include -#include -#include -#include - -#include "glcpp.h" -#include "main/core.h" /* for struct gl_extensions */ -#include "main/mtypes.h" /* for gl_api enum */ - -static void -yyerror (YYLTYPE *locp, glcpp_parser_t *parser, const char *error); - -static void -_define_object_macro (glcpp_parser_t *parser, - YYLTYPE *loc, - const char *macro, - token_list_t *replacements); - -static void -_define_function_macro (glcpp_parser_t *parser, - YYLTYPE *loc, - const char *macro, - string_list_t *parameters, - token_list_t *replacements); - -static string_list_t * -_string_list_create (void *ctx); - -static void -_string_list_append_item (string_list_t *list, const char *str); - -static int -_string_list_contains (string_list_t *list, const char *member, int *index); - -static const char * -_string_list_has_duplicate (string_list_t *list); - -static int -_string_list_length (string_list_t *list); - -static int -_string_list_equal (string_list_t *a, string_list_t *b); - -static argument_list_t * -_argument_list_create (void *ctx); - -static void -_argument_list_append (argument_list_t *list, token_list_t *argument); - -static int -_argument_list_length (argument_list_t *list); - -static token_list_t * -_argument_list_member_at (argument_list_t *list, int index); - -/* Note: This function ralloc_steal()s the str pointer. */ -static token_t * -_token_create_str (void *ctx, int type, char *str); - -static token_t * -_token_create_ival (void *ctx, int type, int ival); - -static token_list_t * -_token_list_create (void *ctx); - -static void -_token_list_append (token_list_t *list, token_t *token); - -static void -_token_list_append_list (token_list_t *list, token_list_t *tail); - -static int -_token_list_equal_ignoring_space (token_list_t *a, token_list_t *b); - -static void -_parser_active_list_push (glcpp_parser_t *parser, - const char *identifier, - token_node_t *marker); - -static void -_parser_active_list_pop (glcpp_parser_t *parser); - -static int -_parser_active_list_contains (glcpp_parser_t *parser, const char *identifier); - -typedef enum { - EXPANSION_MODE_IGNORE_DEFINED, - EXPANSION_MODE_EVALUATE_DEFINED -} expansion_mode_t; - -/* Expand list, and begin lexing from the result (after first - * prefixing a token of type 'head_token_type'). - */ -static void -_glcpp_parser_expand_and_lex_from (glcpp_parser_t *parser, - int head_token_type, - token_list_t *list, - expansion_mode_t mode); - -/* Perform macro expansion in-place on the given list. */ -static void -_glcpp_parser_expand_token_list (glcpp_parser_t *parser, - token_list_t *list, - expansion_mode_t mode); - -static void -_glcpp_parser_print_expanded_token_list (glcpp_parser_t *parser, - token_list_t *list); - -static void -_glcpp_parser_skip_stack_push_if (glcpp_parser_t *parser, YYLTYPE *loc, - int condition); - -static void -_glcpp_parser_skip_stack_change_if (glcpp_parser_t *parser, YYLTYPE *loc, - const char *type, int condition); - -static void -_glcpp_parser_skip_stack_pop (glcpp_parser_t *parser, YYLTYPE *loc); - -static void -_glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t version, - const char *ident, bool explicitly_set); - -static int -glcpp_parser_lex (YYSTYPE *yylval, YYLTYPE *yylloc, glcpp_parser_t *parser); - -static void -glcpp_parser_lex_from (glcpp_parser_t *parser, token_list_t *list); - -static void -add_builtin_define(glcpp_parser_t *parser, const char *name, int value); - -%} - -%pure-parser -%error-verbose - -%locations -%initial-action { - @$.first_line = 1; - @$.first_column = 1; - @$.last_line = 1; - @$.last_column = 1; - @$.source = 0; -} - -%parse-param {glcpp_parser_t *parser} -%lex-param {glcpp_parser_t *parser} - -%expect 0 - - /* We use HASH_TOKEN, DEFINE_TOKEN and VERSION_TOKEN (as opposed to - * HASH, DEFINE, and VERSION) to avoid conflicts with other symbols, - * (such as the and start conditions in the lexer). */ -%token DEFINED ELIF_EXPANDED HASH_TOKEN DEFINE_TOKEN FUNC_IDENTIFIER OBJ_IDENTIFIER ELIF ELSE ENDIF ERROR_TOKEN IF IFDEF IFNDEF LINE PRAGMA UNDEF VERSION_TOKEN GARBAGE IDENTIFIER IF_EXPANDED INTEGER INTEGER_STRING LINE_EXPANDED NEWLINE OTHER PLACEHOLDER SPACE PLUS_PLUS MINUS_MINUS -%token PASTE -%type INTEGER operator SPACE integer_constant -%type expression -%type IDENTIFIER FUNC_IDENTIFIER OBJ_IDENTIFIER INTEGER_STRING OTHER ERROR_TOKEN PRAGMA -%type identifier_list -%type preprocessing_token -%type pp_tokens replacement_list text_line -%left OR -%left AND -%left '|' -%left '^' -%left '&' -%left EQUAL NOT_EQUAL -%left '<' '>' LESS_OR_EQUAL GREATER_OR_EQUAL -%left LEFT_SHIFT RIGHT_SHIFT -%left '+' '-' -%left '*' '/' '%' -%right UNARY - -%debug - -%% - -input: - /* empty */ -| input line -; - -line: - control_line -| SPACE control_line -| text_line { - _glcpp_parser_print_expanded_token_list (parser, $1); - ralloc_asprintf_rewrite_tail (&parser->output, &parser->output_length, "\n"); - ralloc_free ($1); - } -| expanded_line -; - -expanded_line: - IF_EXPANDED expression NEWLINE { - if (parser->is_gles && $2.undefined_macro) - glcpp_error(& @1, parser, "undefined macro %s in expression (illegal in GLES)", $2.undefined_macro); - _glcpp_parser_skip_stack_push_if (parser, & @1, $2.value); - } -| ELIF_EXPANDED expression NEWLINE { - if (parser->is_gles && $2.undefined_macro) - glcpp_error(& @1, parser, "undefined macro %s in expression (illegal in GLES)", $2.undefined_macro); - _glcpp_parser_skip_stack_change_if (parser, & @1, "elif", $2.value); - } -| LINE_EXPANDED integer_constant NEWLINE { - parser->has_new_line_number = 1; - parser->new_line_number = $2; - ralloc_asprintf_rewrite_tail (&parser->output, - &parser->output_length, - "#line %" PRIiMAX "\n", - $2); - } -| LINE_EXPANDED integer_constant integer_constant NEWLINE { - parser->has_new_line_number = 1; - parser->new_line_number = $2; - parser->has_new_source_number = 1; - parser->new_source_number = $3; - ralloc_asprintf_rewrite_tail (&parser->output, - &parser->output_length, - "#line %" PRIiMAX " %" PRIiMAX "\n", - $2, $3); - } -; - -define: - OBJ_IDENTIFIER replacement_list NEWLINE { - _define_object_macro (parser, & @1, $1, $2); - } -| FUNC_IDENTIFIER '(' ')' replacement_list NEWLINE { - _define_function_macro (parser, & @1, $1, NULL, $4); - } -| FUNC_IDENTIFIER '(' identifier_list ')' replacement_list NEWLINE { - _define_function_macro (parser, & @1, $1, $3, $5); - } -; - -control_line: - control_line_success { - ralloc_asprintf_rewrite_tail (&parser->output, &parser->output_length, "\n"); - } -| control_line_error -| HASH_TOKEN LINE { - glcpp_parser_resolve_implicit_version(parser); - } pp_tokens NEWLINE { - - if (parser->skip_stack == NULL || - parser->skip_stack->type == SKIP_NO_SKIP) - { - _glcpp_parser_expand_and_lex_from (parser, - LINE_EXPANDED, $4, - EXPANSION_MODE_IGNORE_DEFINED); - } - } -; - -control_line_success: - HASH_TOKEN DEFINE_TOKEN { - glcpp_parser_resolve_implicit_version(parser); - } define -| HASH_TOKEN UNDEF { - glcpp_parser_resolve_implicit_version(parser); - } IDENTIFIER NEWLINE { - macro_t *macro; - if (strcmp("__LINE__", $4) == 0 - || strcmp("__FILE__", $4) == 0 - || strcmp("__VERSION__", $4) == 0) - glcpp_error(& @1, parser, "Built-in (pre-defined)" - " macro names can not be undefined."); - - macro = hash_table_find (parser->defines, $4); - if (macro) { - hash_table_remove (parser->defines, $4); - ralloc_free (macro); - } - ralloc_free ($4); - } -| HASH_TOKEN IF { - glcpp_parser_resolve_implicit_version(parser); - } pp_tokens NEWLINE { - /* Be careful to only evaluate the 'if' expression if - * we are not skipping. When we are skipping, we - * simply push a new 0-valued 'if' onto the skip - * stack. - * - * This avoids generating diagnostics for invalid - * expressions that are being skipped. */ - if (parser->skip_stack == NULL || - parser->skip_stack->type == SKIP_NO_SKIP) - { - _glcpp_parser_expand_and_lex_from (parser, - IF_EXPANDED, $4, - EXPANSION_MODE_EVALUATE_DEFINED); - } - else - { - _glcpp_parser_skip_stack_push_if (parser, & @1, 0); - parser->skip_stack->type = SKIP_TO_ENDIF; - } - } -| HASH_TOKEN IF NEWLINE { - /* #if without an expression is only an error if we - * are not skipping */ - if (parser->skip_stack == NULL || - parser->skip_stack->type == SKIP_NO_SKIP) - { - glcpp_error(& @1, parser, "#if with no expression"); - } - _glcpp_parser_skip_stack_push_if (parser, & @1, 0); - } -| HASH_TOKEN IFDEF { - glcpp_parser_resolve_implicit_version(parser); - } IDENTIFIER junk NEWLINE { - macro_t *macro = hash_table_find (parser->defines, $4); - ralloc_free ($4); - _glcpp_parser_skip_stack_push_if (parser, & @1, macro != NULL); - } -| HASH_TOKEN IFNDEF { - glcpp_parser_resolve_implicit_version(parser); - } IDENTIFIER junk NEWLINE { - macro_t *macro = hash_table_find (parser->defines, $4); - ralloc_free ($4); - _glcpp_parser_skip_stack_push_if (parser, & @3, macro == NULL); - } -| HASH_TOKEN ELIF pp_tokens NEWLINE { - /* Be careful to only evaluate the 'elif' expression - * if we are not skipping. When we are skipping, we - * simply change to a 0-valued 'elif' on the skip - * stack. - * - * This avoids generating diagnostics for invalid - * expressions that are being skipped. */ - if (parser->skip_stack && - parser->skip_stack->type == SKIP_TO_ELSE) - { - _glcpp_parser_expand_and_lex_from (parser, - ELIF_EXPANDED, $3, - EXPANSION_MODE_EVALUATE_DEFINED); - } - else if (parser->skip_stack && - parser->skip_stack->has_else) - { - glcpp_error(& @1, parser, "#elif after #else"); - } - else - { - _glcpp_parser_skip_stack_change_if (parser, & @1, - "elif", 0); - } - } -| HASH_TOKEN ELIF NEWLINE { - /* #elif without an expression is an error unless we - * are skipping. */ - if (parser->skip_stack && - parser->skip_stack->type == SKIP_TO_ELSE) - { - glcpp_error(& @1, parser, "#elif with no expression"); - } - else if (parser->skip_stack && - parser->skip_stack->has_else) - { - glcpp_error(& @1, parser, "#elif after #else"); - } - else - { - _glcpp_parser_skip_stack_change_if (parser, & @1, - "elif", 0); - glcpp_warning(& @1, parser, "ignoring illegal #elif without expression"); - } - } -| HASH_TOKEN ELSE { parser->lexing_directive = 1; } NEWLINE { - if (parser->skip_stack && - parser->skip_stack->has_else) - { - glcpp_error(& @1, parser, "multiple #else"); - } - else - { - _glcpp_parser_skip_stack_change_if (parser, & @1, "else", 1); - if (parser->skip_stack) - parser->skip_stack->has_else = true; - } - } -| HASH_TOKEN ENDIF { - _glcpp_parser_skip_stack_pop (parser, & @1); - } NEWLINE -| HASH_TOKEN VERSION_TOKEN integer_constant NEWLINE { - if (parser->version_resolved) { - glcpp_error(& @1, parser, "#version must appear on the first line"); - } - _glcpp_parser_handle_version_declaration(parser, $3, NULL, true); - } -| HASH_TOKEN VERSION_TOKEN integer_constant IDENTIFIER NEWLINE { - if (parser->version_resolved) { - glcpp_error(& @1, parser, "#version must appear on the first line"); - } - _glcpp_parser_handle_version_declaration(parser, $3, $4, true); - } -| HASH_TOKEN NEWLINE { - glcpp_parser_resolve_implicit_version(parser); - } -| HASH_TOKEN PRAGMA NEWLINE { - ralloc_asprintf_rewrite_tail (&parser->output, &parser->output_length, "#%s", $2); - } -; - -control_line_error: - HASH_TOKEN ERROR_TOKEN NEWLINE { - glcpp_error(& @1, parser, "#%s", $2); - } -| HASH_TOKEN DEFINE_TOKEN NEWLINE { - glcpp_error (& @1, parser, "#define without macro name"); - } -| HASH_TOKEN GARBAGE pp_tokens NEWLINE { - glcpp_error (& @1, parser, "Illegal non-directive after #"); - } -; - -integer_constant: - INTEGER_STRING { - if (strlen ($1) >= 3 && strncmp ($1, "0x", 2) == 0) { - $$ = (int)strtoll ($1 + 2, NULL, 16); - } else if ($1[0] == '0') { - $$ = (int)strtoll ($1, NULL, 8); - } else { - $$ = (int)strtoll ($1, NULL, 10); - } - } -| INTEGER { - $$ = $1; - } - -expression: - integer_constant { - $$.value = $1; - $$.undefined_macro = NULL; - } -| IDENTIFIER { - $$.value = 0; - if (parser->is_gles) - $$.undefined_macro = ralloc_strdup (parser, $1); - else - $$.undefined_macro = NULL; - } -| expression OR expression { - $$.value = $1.value || $3.value; - - /* Short-circuit: Only flag undefined from right side - * if left side evaluates to false. - */ - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else if (! $1.value) - $$.undefined_macro = $3.undefined_macro; - } -| expression AND expression { - $$.value = $1.value && $3.value; - - /* Short-circuit: Only flag undefined from right-side - * if left side evaluates to true. - */ - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else if ($1.value) - $$.undefined_macro = $3.undefined_macro; - } -| expression '|' expression { - $$.value = $1.value | $3.value; - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| expression '^' expression { - $$.value = $1.value ^ $3.value; - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| expression '&' expression { - $$.value = $1.value & $3.value; - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| expression NOT_EQUAL expression { - $$.value = $1.value != $3.value; - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| expression EQUAL expression { - $$.value = $1.value == $3.value; - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| expression GREATER_OR_EQUAL expression { - $$.value = $1.value >= $3.value; - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| expression LESS_OR_EQUAL expression { - $$.value = $1.value <= $3.value; - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| expression '>' expression { - $$.value = $1.value > $3.value; - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| expression '<' expression { - $$.value = $1.value < $3.value; - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| expression RIGHT_SHIFT expression { - $$.value = $1.value >> $3.value; - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| expression LEFT_SHIFT expression { - $$.value = $1.value << $3.value; - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| expression '-' expression { - $$.value = $1.value - $3.value; - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| expression '+' expression { - $$.value = $1.value + $3.value; - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| expression '%' expression { - if ($3.value == 0) { - yyerror (& @1, parser, - "zero modulus in preprocessor directive"); - } else { - $$.value = $1.value % $3.value; - } - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| expression '/' expression { - if ($3.value == 0) { - yyerror (& @1, parser, - "division by 0 in preprocessor directive"); - } else { - $$.value = $1.value / $3.value; - } - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| expression '*' expression { - $$.value = $1.value * $3.value; - if ($1.undefined_macro) - $$.undefined_macro = $1.undefined_macro; - else - $$.undefined_macro = $3.undefined_macro; - } -| '!' expression %prec UNARY { - $$.value = ! $2.value; - $$.undefined_macro = $2.undefined_macro; - } -| '~' expression %prec UNARY { - $$.value = ~ $2.value; - $$.undefined_macro = $2.undefined_macro; - } -| '-' expression %prec UNARY { - $$.value = - $2.value; - $$.undefined_macro = $2.undefined_macro; - } -| '+' expression %prec UNARY { - $$.value = + $2.value; - $$.undefined_macro = $2.undefined_macro; - } -| '(' expression ')' { - $$ = $2; - } -; - -identifier_list: - IDENTIFIER { - $$ = _string_list_create (parser); - _string_list_append_item ($$, $1); - ralloc_steal ($$, $1); - } -| identifier_list ',' IDENTIFIER { - $$ = $1; - _string_list_append_item ($$, $3); - ralloc_steal ($$, $3); - } -; - -text_line: - NEWLINE { $$ = NULL; } -| pp_tokens NEWLINE -; - -replacement_list: - /* empty */ { $$ = NULL; } -| pp_tokens -; - -junk: - /* empty */ -| pp_tokens { - glcpp_error(&@1, parser, "extra tokens at end of directive"); - } -; - -pp_tokens: - preprocessing_token { - parser->space_tokens = 1; - $$ = _token_list_create (parser); - _token_list_append ($$, $1); - } -| pp_tokens preprocessing_token { - $$ = $1; - _token_list_append ($$, $2); - } -; - -preprocessing_token: - IDENTIFIER { - $$ = _token_create_str (parser, IDENTIFIER, $1); - $$->location = yylloc; - } -| INTEGER_STRING { - $$ = _token_create_str (parser, INTEGER_STRING, $1); - $$->location = yylloc; - } -| operator { - $$ = _token_create_ival (parser, $1, $1); - $$->location = yylloc; - } -| DEFINED { - $$ = _token_create_ival (parser, DEFINED, DEFINED); - $$->location = yylloc; - } -| OTHER { - $$ = _token_create_str (parser, OTHER, $1); - $$->location = yylloc; - } -| SPACE { - $$ = _token_create_ival (parser, SPACE, SPACE); - $$->location = yylloc; - } -; - -operator: - '[' { $$ = '['; } -| ']' { $$ = ']'; } -| '(' { $$ = '('; } -| ')' { $$ = ')'; } -| '{' { $$ = '{'; } -| '}' { $$ = '}'; } -| '.' { $$ = '.'; } -| '&' { $$ = '&'; } -| '*' { $$ = '*'; } -| '+' { $$ = '+'; } -| '-' { $$ = '-'; } -| '~' { $$ = '~'; } -| '!' { $$ = '!'; } -| '/' { $$ = '/'; } -| '%' { $$ = '%'; } -| LEFT_SHIFT { $$ = LEFT_SHIFT; } -| RIGHT_SHIFT { $$ = RIGHT_SHIFT; } -| '<' { $$ = '<'; } -| '>' { $$ = '>'; } -| LESS_OR_EQUAL { $$ = LESS_OR_EQUAL; } -| GREATER_OR_EQUAL { $$ = GREATER_OR_EQUAL; } -| EQUAL { $$ = EQUAL; } -| NOT_EQUAL { $$ = NOT_EQUAL; } -| '^' { $$ = '^'; } -| '|' { $$ = '|'; } -| AND { $$ = AND; } -| OR { $$ = OR; } -| ';' { $$ = ';'; } -| ',' { $$ = ','; } -| '=' { $$ = '='; } -| PASTE { $$ = PASTE; } -| PLUS_PLUS { $$ = PLUS_PLUS; } -| MINUS_MINUS { $$ = MINUS_MINUS; } -; - -%% - -string_list_t * -_string_list_create (void *ctx) -{ - string_list_t *list; - - list = ralloc (ctx, string_list_t); - list->head = NULL; - list->tail = NULL; - - return list; -} - -void -_string_list_append_item (string_list_t *list, const char *str) -{ - string_node_t *node; - - node = ralloc (list, string_node_t); - node->str = ralloc_strdup (node, str); - - node->next = NULL; - - if (list->head == NULL) { - list->head = node; - } else { - list->tail->next = node; - } - - list->tail = node; -} - -int -_string_list_contains (string_list_t *list, const char *member, int *index) -{ - string_node_t *node; - int i; - - if (list == NULL) - return 0; - - for (i = 0, node = list->head; node; i++, node = node->next) { - if (strcmp (node->str, member) == 0) { - if (index) - *index = i; - return 1; - } - } - - return 0; -} - -/* Return duplicate string in list (if any), NULL otherwise. */ -const char * -_string_list_has_duplicate (string_list_t *list) -{ - string_node_t *node, *dup; - - if (list == NULL) - return NULL; - - for (node = list->head; node; node = node->next) { - for (dup = node->next; dup; dup = dup->next) { - if (strcmp (node->str, dup->str) == 0) - return node->str; - } - } - - return NULL; -} - -int -_string_list_length (string_list_t *list) -{ - int length = 0; - string_node_t *node; - - if (list == NULL) - return 0; - - for (node = list->head; node; node = node->next) - length++; - - return length; -} - -int -_string_list_equal (string_list_t *a, string_list_t *b) -{ - string_node_t *node_a, *node_b; - - if (a == NULL && b == NULL) - return 1; - - if (a == NULL || b == NULL) - return 0; - - for (node_a = a->head, node_b = b->head; - node_a && node_b; - node_a = node_a->next, node_b = node_b->next) - { - if (strcmp (node_a->str, node_b->str)) - return 0; - } - - /* Catch the case of lists being different lengths, (which - * would cause the loop above to terminate after the shorter - * list). */ - return node_a == node_b; -} - -argument_list_t * -_argument_list_create (void *ctx) -{ - argument_list_t *list; - - list = ralloc (ctx, argument_list_t); - list->head = NULL; - list->tail = NULL; - - return list; -} - -void -_argument_list_append (argument_list_t *list, token_list_t *argument) -{ - argument_node_t *node; - - node = ralloc (list, argument_node_t); - node->argument = argument; - - node->next = NULL; - - if (list->head == NULL) { - list->head = node; - } else { - list->tail->next = node; - } - - list->tail = node; -} - -int -_argument_list_length (argument_list_t *list) -{ - int length = 0; - argument_node_t *node; - - if (list == NULL) - return 0; - - for (node = list->head; node; node = node->next) - length++; - - return length; -} - -token_list_t * -_argument_list_member_at (argument_list_t *list, int index) -{ - argument_node_t *node; - int i; - - if (list == NULL) - return NULL; - - node = list->head; - for (i = 0; i < index; i++) { - node = node->next; - if (node == NULL) - break; - } - - if (node) - return node->argument; - - return NULL; -} - -/* Note: This function ralloc_steal()s the str pointer. */ -token_t * -_token_create_str (void *ctx, int type, char *str) -{ - token_t *token; - - token = ralloc (ctx, token_t); - token->type = type; - token->value.str = str; - - ralloc_steal (token, str); - - return token; -} - -token_t * -_token_create_ival (void *ctx, int type, int ival) -{ - token_t *token; - - token = ralloc (ctx, token_t); - token->type = type; - token->value.ival = ival; - - return token; -} - -token_list_t * -_token_list_create (void *ctx) -{ - token_list_t *list; - - list = ralloc (ctx, token_list_t); - list->head = NULL; - list->tail = NULL; - list->non_space_tail = NULL; - - return list; -} - -void -_token_list_append (token_list_t *list, token_t *token) -{ - token_node_t *node; - - node = ralloc (list, token_node_t); - node->token = token; - node->next = NULL; - - if (list->head == NULL) { - list->head = node; - } else { - list->tail->next = node; - } - - list->tail = node; - if (token->type != SPACE) - list->non_space_tail = node; -} - -void -_token_list_append_list (token_list_t *list, token_list_t *tail) -{ - if (tail == NULL || tail->head == NULL) - return; - - if (list->head == NULL) { - list->head = tail->head; - } else { - list->tail->next = tail->head; - } - - list->tail = tail->tail; - list->non_space_tail = tail->non_space_tail; -} - -static token_list_t * -_token_list_copy (void *ctx, token_list_t *other) -{ - token_list_t *copy; - token_node_t *node; - - if (other == NULL) - return NULL; - - copy = _token_list_create (ctx); - for (node = other->head; node; node = node->next) { - token_t *new_token = ralloc (copy, token_t); - *new_token = *node->token; - _token_list_append (copy, new_token); - } - - return copy; -} - -static void -_token_list_trim_trailing_space (token_list_t *list) -{ - token_node_t *tail, *next; - - if (list->non_space_tail) { - tail = list->non_space_tail->next; - list->non_space_tail->next = NULL; - list->tail = list->non_space_tail; - - while (tail) { - next = tail->next; - ralloc_free (tail); - tail = next; - } - } -} - -static int -_token_list_is_empty_ignoring_space (token_list_t *l) -{ - token_node_t *n; - - if (l == NULL) - return 1; - - n = l->head; - while (n != NULL && n->token->type == SPACE) - n = n->next; - - return n == NULL; -} - -int -_token_list_equal_ignoring_space (token_list_t *a, token_list_t *b) -{ - token_node_t *node_a, *node_b; - - if (a == NULL || b == NULL) { - int a_empty = _token_list_is_empty_ignoring_space(a); - int b_empty = _token_list_is_empty_ignoring_space(b); - return a_empty == b_empty; - } - - node_a = a->head; - node_b = b->head; - - while (1) - { - if (node_a == NULL && node_b == NULL) - break; - - if (node_a == NULL || node_b == NULL) - return 0; - /* Make sure whitespace appears in the same places in both. - * It need not be exactly the same amount of whitespace, - * though. - */ - if (node_a->token->type == SPACE - && node_b->token->type == SPACE) { - while (node_a->token->type == SPACE) - node_a = node_a->next; - while (node_b->token->type == SPACE) - node_b = node_b->next; - continue; - } - - if (node_a->token->type != node_b->token->type) - return 0; - - switch (node_a->token->type) { - case INTEGER: - if (node_a->token->value.ival != - node_b->token->value.ival) - { - return 0; - } - break; - case IDENTIFIER: - case INTEGER_STRING: - case OTHER: - if (strcmp (node_a->token->value.str, - node_b->token->value.str)) - { - return 0; - } - break; - } - - node_a = node_a->next; - node_b = node_b->next; - } - - return 1; -} - -static void -_token_print (char **out, size_t *len, token_t *token) -{ - if (token->type < 256) { - ralloc_asprintf_rewrite_tail (out, len, "%c", token->type); - return; - } - - switch (token->type) { - case INTEGER: - ralloc_asprintf_rewrite_tail (out, len, "%" PRIiMAX, token->value.ival); - break; - case IDENTIFIER: - case INTEGER_STRING: - case OTHER: - ralloc_asprintf_rewrite_tail (out, len, "%s", token->value.str); - break; - case SPACE: - ralloc_asprintf_rewrite_tail (out, len, " "); - break; - case LEFT_SHIFT: - ralloc_asprintf_rewrite_tail (out, len, "<<"); - break; - case RIGHT_SHIFT: - ralloc_asprintf_rewrite_tail (out, len, ">>"); - break; - case LESS_OR_EQUAL: - ralloc_asprintf_rewrite_tail (out, len, "<="); - break; - case GREATER_OR_EQUAL: - ralloc_asprintf_rewrite_tail (out, len, ">="); - break; - case EQUAL: - ralloc_asprintf_rewrite_tail (out, len, "=="); - break; - case NOT_EQUAL: - ralloc_asprintf_rewrite_tail (out, len, "!="); - break; - case AND: - ralloc_asprintf_rewrite_tail (out, len, "&&"); - break; - case OR: - ralloc_asprintf_rewrite_tail (out, len, "||"); - break; - case PASTE: - ralloc_asprintf_rewrite_tail (out, len, "##"); - break; - case PLUS_PLUS: - ralloc_asprintf_rewrite_tail (out, len, "++"); - break; - case MINUS_MINUS: - ralloc_asprintf_rewrite_tail (out, len, "--"); - break; - case DEFINED: - ralloc_asprintf_rewrite_tail (out, len, "defined"); - break; - case PLACEHOLDER: - /* Nothing to print. */ - break; - default: - assert(!"Error: Don't know how to print token."); - - break; - } -} - -/* Return a new token (ralloc()ed off of 'token') formed by pasting - * 'token' and 'other'. Note that this function may return 'token' or - * 'other' directly rather than allocating anything new. - * - * Caution: Only very cursory error-checking is performed to see if - * the final result is a valid single token. */ -static token_t * -_token_paste (glcpp_parser_t *parser, token_t *token, token_t *other) -{ - token_t *combined = NULL; - - /* Pasting a placeholder onto anything makes no change. */ - if (other->type == PLACEHOLDER) - return token; - - /* When 'token' is a placeholder, just return 'other'. */ - if (token->type == PLACEHOLDER) - return other; - - /* A very few single-character punctuators can be combined - * with another to form a multi-character punctuator. */ - switch (token->type) { - case '<': - if (other->type == '<') - combined = _token_create_ival (token, LEFT_SHIFT, LEFT_SHIFT); - else if (other->type == '=') - combined = _token_create_ival (token, LESS_OR_EQUAL, LESS_OR_EQUAL); - break; - case '>': - if (other->type == '>') - combined = _token_create_ival (token, RIGHT_SHIFT, RIGHT_SHIFT); - else if (other->type == '=') - combined = _token_create_ival (token, GREATER_OR_EQUAL, GREATER_OR_EQUAL); - break; - case '=': - if (other->type == '=') - combined = _token_create_ival (token, EQUAL, EQUAL); - break; - case '!': - if (other->type == '=') - combined = _token_create_ival (token, NOT_EQUAL, NOT_EQUAL); - break; - case '&': - if (other->type == '&') - combined = _token_create_ival (token, AND, AND); - break; - case '|': - if (other->type == '|') - combined = _token_create_ival (token, OR, OR); - break; - } - - if (combined != NULL) { - /* Inherit the location from the first token */ - combined->location = token->location; - return combined; - } - - /* Two string-valued (or integer) tokens can usually just be - * mashed together. (We also handle a string followed by an - * integer here as well.) - * - * There are some exceptions here. Notably, if the first token - * is an integer (or a string representing an integer), then - * the second token must also be an integer or must be a - * string representing an integer that begins with a digit. - */ - if ((token->type == IDENTIFIER || token->type == OTHER || token->type == INTEGER_STRING || token->type == INTEGER) && - (other->type == IDENTIFIER || other->type == OTHER || other->type == INTEGER_STRING || other->type == INTEGER)) - { - char *str; - int combined_type; - - /* Check that pasting onto an integer doesn't create a - * non-integer, (that is, only digits can be - * pasted. */ - if (token->type == INTEGER_STRING || token->type == INTEGER) - { - switch (other->type) { - case INTEGER_STRING: - if (other->value.str[0] < '0' || - other->value.str[0] > '9') - goto FAIL; - break; - case INTEGER: - if (other->value.ival < 0) - goto FAIL; - break; - default: - goto FAIL; - } - } - - if (token->type == INTEGER) - str = ralloc_asprintf (token, "%" PRIiMAX, - token->value.ival); - else - str = ralloc_strdup (token, token->value.str); - - - if (other->type == INTEGER) - ralloc_asprintf_append (&str, "%" PRIiMAX, - other->value.ival); - else - ralloc_strcat (&str, other->value.str); - - /* New token is same type as original token, unless we - * started with an integer, in which case we will be - * creating an integer-string. */ - combined_type = token->type; - if (combined_type == INTEGER) - combined_type = INTEGER_STRING; - - combined = _token_create_str (token, combined_type, str); - combined->location = token->location; - return combined; - } - - FAIL: - glcpp_error (&token->location, parser, ""); - ralloc_asprintf_rewrite_tail (&parser->info_log, &parser->info_log_length, "Pasting \""); - _token_print (&parser->info_log, &parser->info_log_length, token); - ralloc_asprintf_rewrite_tail (&parser->info_log, &parser->info_log_length, "\" and \""); - _token_print (&parser->info_log, &parser->info_log_length, other); - ralloc_asprintf_rewrite_tail (&parser->info_log, &parser->info_log_length, "\" does not give a valid preprocessing token.\n"); - - return token; -} - -static void -_token_list_print (glcpp_parser_t *parser, token_list_t *list) -{ - token_node_t *node; - - if (list == NULL) - return; - - for (node = list->head; node; node = node->next) - _token_print (&parser->output, &parser->output_length, node->token); -} - -void -yyerror (YYLTYPE *locp, glcpp_parser_t *parser, const char *error) -{ - glcpp_error(locp, parser, "%s", error); -} - -static void add_builtin_define(glcpp_parser_t *parser, - const char *name, int value) -{ - token_t *tok; - token_list_t *list; - - tok = _token_create_ival (parser, INTEGER, value); - - list = _token_list_create(parser); - _token_list_append(list, tok); - _define_object_macro(parser, NULL, name, list); -} - -glcpp_parser_t * -glcpp_parser_create (const struct gl_extensions *extensions, gl_api api) -{ - glcpp_parser_t *parser; - - parser = ralloc (NULL, glcpp_parser_t); - - glcpp_lex_init_extra (parser, &parser->scanner); - parser->defines = hash_table_ctor (32, hash_table_string_hash, - hash_table_string_compare); - parser->active = NULL; - parser->lexing_directive = 0; - parser->space_tokens = 1; - parser->last_token_was_newline = 0; - parser->last_token_was_space = 0; - parser->first_non_space_token_this_line = 1; - parser->newline_as_space = 0; - parser->in_control_line = 0; - parser->paren_count = 0; - parser->commented_newlines = 0; - - parser->skip_stack = NULL; - parser->skipping = 0; - - parser->lex_from_list = NULL; - parser->lex_from_node = NULL; - - parser->output = ralloc_strdup(parser, ""); - parser->output_length = 0; - parser->info_log = ralloc_strdup(parser, ""); - parser->info_log_length = 0; - parser->error = 0; - - parser->extensions = extensions; - parser->api = api; - parser->version_resolved = false; - - parser->has_new_line_number = 0; - parser->new_line_number = 1; - parser->has_new_source_number = 0; - parser->new_source_number = 0; - - return parser; -} - -void -glcpp_parser_destroy (glcpp_parser_t *parser) -{ - glcpp_lex_destroy (parser->scanner); - hash_table_dtor (parser->defines); - ralloc_free (parser); -} - -typedef enum function_status -{ - FUNCTION_STATUS_SUCCESS, - FUNCTION_NOT_A_FUNCTION, - FUNCTION_UNBALANCED_PARENTHESES -} function_status_t; - -/* Find a set of function-like macro arguments by looking for a - * balanced set of parentheses. - * - * When called, 'node' should be the opening-parenthesis token, (or - * perhaps preceeding SPACE tokens). Upon successful return *last will - * be the last consumed node, (corresponding to the closing right - * parenthesis). - * - * Return values: - * - * FUNCTION_STATUS_SUCCESS: - * - * Successfully parsed a set of function arguments. - * - * FUNCTION_NOT_A_FUNCTION: - * - * Macro name not followed by a '('. This is not an error, but - * simply that the macro name should be treated as a non-macro. - * - * FUNCTION_UNBALANCED_PARENTHESES - * - * Macro name is not followed by a balanced set of parentheses. - */ -static function_status_t -_arguments_parse (argument_list_t *arguments, - token_node_t *node, - token_node_t **last) -{ - token_list_t *argument; - int paren_count; - - node = node->next; - - /* Ignore whitespace before first parenthesis. */ - while (node && node->token->type == SPACE) - node = node->next; - - if (node == NULL || node->token->type != '(') - return FUNCTION_NOT_A_FUNCTION; - - node = node->next; - - argument = _token_list_create (arguments); - _argument_list_append (arguments, argument); - - for (paren_count = 1; node; node = node->next) { - if (node->token->type == '(') - { - paren_count++; - } - else if (node->token->type == ')') - { - paren_count--; - if (paren_count == 0) - break; - } - - if (node->token->type == ',' && - paren_count == 1) - { - _token_list_trim_trailing_space (argument); - argument = _token_list_create (arguments); - _argument_list_append (arguments, argument); - } - else { - if (argument->head == NULL) { - /* Don't treat initial whitespace as - * part of the argument. */ - if (node->token->type == SPACE) - continue; - } - _token_list_append (argument, node->token); - } - } - - if (paren_count) - return FUNCTION_UNBALANCED_PARENTHESES; - - *last = node; - - return FUNCTION_STATUS_SUCCESS; -} - -static token_list_t * -_token_list_create_with_one_ival (void *ctx, int type, int ival) -{ - token_list_t *list; - token_t *node; - - list = _token_list_create (ctx); - node = _token_create_ival (list, type, ival); - _token_list_append (list, node); - - return list; -} - -static token_list_t * -_token_list_create_with_one_space (void *ctx) -{ - return _token_list_create_with_one_ival (ctx, SPACE, SPACE); -} - -static token_list_t * -_token_list_create_with_one_integer (void *ctx, int ival) -{ - return _token_list_create_with_one_ival (ctx, INTEGER, ival); -} - -/* Evaluate a DEFINED token node (based on subsequent tokens in the list). - * - * Note: This function must only be called when "node" is a DEFINED token, - * (and will abort with an assertion failure otherwise). - * - * If "node" is followed, (ignoring any SPACE tokens), by an IDENTIFIER token - * (optionally preceded and followed by '(' and ')' tokens) then the following - * occurs: - * - * If the identifier is a defined macro, this function returns 1. - * - * If the identifier is not a defined macro, this function returns 0. - * - * In either case, *last will be updated to the last node in the list - * consumed by the evaluation, (either the token of the identifier or the - * token of the closing parenthesis). - * - * In all other cases, (such as "node is the final node of the list", or - * "missing closing parenthesis", etc.), this function generates a - * preprocessor error, returns -1 and *last will not be set. - */ -static int -_glcpp_parser_evaluate_defined (glcpp_parser_t *parser, - token_node_t *node, - token_node_t **last) -{ - token_node_t *argument, *defined = node; - - assert (node->token->type == DEFINED); - - node = node->next; - - /* Ignore whitespace after DEFINED token. */ - while (node && node->token->type == SPACE) - node = node->next; - - if (node == NULL) - goto FAIL; - - if (node->token->type == IDENTIFIER || node->token->type == OTHER) { - argument = node; - } else if (node->token->type == '(') { - node = node->next; - - /* Ignore whitespace after '(' token. */ - while (node && node->token->type == SPACE) - node = node->next; - - if (node == NULL || (node->token->type != IDENTIFIER && - node->token->type != OTHER)) - { - goto FAIL; - } - - argument = node; - - node = node->next; - - /* Ignore whitespace after identifier, before ')' token. */ - while (node && node->token->type == SPACE) - node = node->next; - - if (node == NULL || node->token->type != ')') - goto FAIL; - } else { - goto FAIL; - } - - *last = node; - - return hash_table_find (parser->defines, - argument->token->value.str) ? 1 : 0; - -FAIL: - glcpp_error (&defined->token->location, parser, - "\"defined\" not followed by an identifier"); - return -1; -} - -/* Evaluate all DEFINED nodes in a given list, modifying the list in place. - */ -static void -_glcpp_parser_evaluate_defined_in_list (glcpp_parser_t *parser, - token_list_t *list) -{ - token_node_t *node, *node_prev, *replacement, *last = NULL; - int value; - - if (list == NULL) - return; - - node_prev = NULL; - node = list->head; - - while (node) { - - if (node->token->type != DEFINED) - goto NEXT; - - value = _glcpp_parser_evaluate_defined (parser, node, &last); - if (value == -1) - goto NEXT; - - replacement = ralloc (list, token_node_t); - replacement->token = _token_create_ival (list, INTEGER, value); - - /* Splice replacement node into list, replacing from "node" - * through "last". */ - if (node_prev) - node_prev->next = replacement; - else - list->head = replacement; - replacement->next = last->next; - if (last == list->tail) - list->tail = replacement; - - node = replacement; - - NEXT: - node_prev = node; - node = node->next; - } -} - -/* Perform macro expansion on 'list', placing the resulting tokens - * into a new list which is initialized with a first token of type - * 'head_token_type'. Then begin lexing from the resulting list, - * (return to the current lexing source when this list is exhausted). - * - * See the documentation of _glcpp_parser_expand_token_list for a description - * of the "mode" parameter. - */ -static void -_glcpp_parser_expand_and_lex_from (glcpp_parser_t *parser, - int head_token_type, - token_list_t *list, - expansion_mode_t mode) -{ - token_list_t *expanded; - token_t *token; - - expanded = _token_list_create (parser); - token = _token_create_ival (parser, head_token_type, head_token_type); - _token_list_append (expanded, token); - _glcpp_parser_expand_token_list (parser, list, mode); - _token_list_append_list (expanded, list); - glcpp_parser_lex_from (parser, expanded); -} - -static void -_glcpp_parser_apply_pastes (glcpp_parser_t *parser, token_list_t *list) -{ - token_node_t *node; - - node = list->head; - while (node) - { - token_node_t *next_non_space; - - /* Look ahead for a PASTE token, skipping space. */ - next_non_space = node->next; - while (next_non_space && next_non_space->token->type == SPACE) - next_non_space = next_non_space->next; - - if (next_non_space == NULL) - break; - - if (next_non_space->token->type != PASTE) { - node = next_non_space; - continue; - } - - /* Now find the next non-space token after the PASTE. */ - next_non_space = next_non_space->next; - while (next_non_space && next_non_space->token->type == SPACE) - next_non_space = next_non_space->next; - - if (next_non_space == NULL) { - yyerror (&node->token->location, parser, "'##' cannot appear at either end of a macro expansion\n"); - return; - } - - node->token = _token_paste (parser, node->token, next_non_space->token); - node->next = next_non_space->next; - if (next_non_space == list->tail) - list->tail = node; - } - - list->non_space_tail = list->tail; -} - -/* This is a helper function that's essentially part of the - * implementation of _glcpp_parser_expand_node. It shouldn't be called - * except for by that function. - * - * Returns NULL if node is a simple token with no expansion, (that is, - * although 'node' corresponds to an identifier defined as a - * function-like macro, it is not followed with a parenthesized - * argument list). - * - * Compute the complete expansion of node (which is a function-like - * macro) and subsequent nodes which are arguments. - * - * Returns the token list that results from the expansion and sets - * *last to the last node in the list that was consumed by the - * expansion. Specifically, *last will be set as follows: as the - * token of the closing right parenthesis. - * - * See the documentation of _glcpp_parser_expand_token_list for a description - * of the "mode" parameter. - */ -static token_list_t * -_glcpp_parser_expand_function (glcpp_parser_t *parser, - token_node_t *node, - token_node_t **last, - expansion_mode_t mode) -{ - macro_t *macro; - const char *identifier; - argument_list_t *arguments; - function_status_t status; - token_list_t *substituted; - int parameter_index; - - identifier = node->token->value.str; - - macro = hash_table_find (parser->defines, identifier); - - assert (macro->is_function); - - arguments = _argument_list_create (parser); - status = _arguments_parse (arguments, node, last); - - switch (status) { - case FUNCTION_STATUS_SUCCESS: - break; - case FUNCTION_NOT_A_FUNCTION: - return NULL; - case FUNCTION_UNBALANCED_PARENTHESES: - glcpp_error (&node->token->location, parser, "Macro %s call has unbalanced parentheses\n", identifier); - return NULL; - } - - /* Replace a macro defined as empty with a SPACE token. */ - if (macro->replacements == NULL) { - ralloc_free (arguments); - return _token_list_create_with_one_space (parser); - } - - if (! ((_argument_list_length (arguments) == - _string_list_length (macro->parameters)) || - (_string_list_length (macro->parameters) == 0 && - _argument_list_length (arguments) == 1 && - arguments->head->argument->head == NULL))) - { - glcpp_error (&node->token->location, parser, - "Error: macro %s invoked with %d arguments (expected %d)\n", - identifier, - _argument_list_length (arguments), - _string_list_length (macro->parameters)); - return NULL; - } - - /* Perform argument substitution on the replacement list. */ - substituted = _token_list_create (arguments); - - for (node = macro->replacements->head; node; node = node->next) - { - if (node->token->type == IDENTIFIER && - _string_list_contains (macro->parameters, - node->token->value.str, - ¶meter_index)) - { - token_list_t *argument; - argument = _argument_list_member_at (arguments, - parameter_index); - /* Before substituting, we expand the argument - * tokens, or append a placeholder token for - * an empty argument. */ - if (argument->head) { - token_list_t *expanded_argument; - expanded_argument = _token_list_copy (parser, - argument); - _glcpp_parser_expand_token_list (parser, - expanded_argument, - mode); - _token_list_append_list (substituted, - expanded_argument); - } else { - token_t *new_token; - - new_token = _token_create_ival (substituted, - PLACEHOLDER, - PLACEHOLDER); - _token_list_append (substituted, new_token); - } - } else { - _token_list_append (substituted, node->token); - } - } - - /* After argument substitution, and before further expansion - * below, implement token pasting. */ - - _token_list_trim_trailing_space (substituted); - - _glcpp_parser_apply_pastes (parser, substituted); - - return substituted; -} - -/* Compute the complete expansion of node, (and subsequent nodes after - * 'node' in the case that 'node' is a function-like macro and - * subsequent nodes are arguments). - * - * Returns NULL if node is a simple token with no expansion. - * - * Otherwise, returns the token list that results from the expansion - * and sets *last to the last node in the list that was consumed by - * the expansion. Specifically, *last will be set as follows: - * - * As 'node' in the case of object-like macro expansion. - * - * As the token of the closing right parenthesis in the case of - * function-like macro expansion. - * - * See the documentation of _glcpp_parser_expand_token_list for a description - * of the "mode" parameter. - */ -static token_list_t * -_glcpp_parser_expand_node (glcpp_parser_t *parser, - token_node_t *node, - token_node_t **last, - expansion_mode_t mode) -{ - token_t *token = node->token; - const char *identifier; - macro_t *macro; - - /* We only expand identifiers */ - if (token->type != IDENTIFIER) { - return NULL; - } - - *last = node; - identifier = token->value.str; - - /* Special handling for __LINE__ and __FILE__, (not through - * the hash table). */ - if (strcmp(identifier, "__LINE__") == 0) - return _token_list_create_with_one_integer (parser, node->token->location.first_line); - - if (strcmp(identifier, "__FILE__") == 0) - return _token_list_create_with_one_integer (parser, node->token->location.source); - - /* Look up this identifier in the hash table. */ - macro = hash_table_find (parser->defines, identifier); - - /* Not a macro, so no expansion needed. */ - if (macro == NULL) - return NULL; - - /* Finally, don't expand this macro if we're already actively - * expanding it, (to avoid infinite recursion). */ - if (_parser_active_list_contains (parser, identifier)) { - /* We change the token type here from IDENTIFIER to - * OTHER to prevent any future expansion of this - * unexpanded token. */ - char *str; - token_list_t *expansion; - token_t *final; - - str = ralloc_strdup (parser, token->value.str); - final = _token_create_str (parser, OTHER, str); - expansion = _token_list_create (parser); - _token_list_append (expansion, final); - return expansion; - } - - if (! macro->is_function) - { - token_list_t *replacement; - - /* Replace a macro defined as empty with a SPACE token. */ - if (macro->replacements == NULL) - return _token_list_create_with_one_space (parser); - - replacement = _token_list_copy (parser, macro->replacements); - _glcpp_parser_apply_pastes (parser, replacement); - return replacement; - } - - return _glcpp_parser_expand_function (parser, node, last, mode); -} - -/* Push a new identifier onto the parser's active list. - * - * Here, 'marker' is the token node that appears in the list after the - * expansion of 'identifier'. That is, when the list iterator begins - * examining 'marker', then it is time to pop this node from the - * active stack. - */ -static void -_parser_active_list_push (glcpp_parser_t *parser, - const char *identifier, - token_node_t *marker) -{ - active_list_t *node; - - node = ralloc (parser->active, active_list_t); - node->identifier = ralloc_strdup (node, identifier); - node->marker = marker; - node->next = parser->active; - - parser->active = node; -} - -static void -_parser_active_list_pop (glcpp_parser_t *parser) -{ - active_list_t *node = parser->active; - - if (node == NULL) { - parser->active = NULL; - return; - } - - node = parser->active->next; - ralloc_free (parser->active); - - parser->active = node; -} - -static int -_parser_active_list_contains (glcpp_parser_t *parser, const char *identifier) -{ - active_list_t *node; - - if (parser->active == NULL) - return 0; - - for (node = parser->active; node; node = node->next) - if (strcmp (node->identifier, identifier) == 0) - return 1; - - return 0; -} - -/* Walk over the token list replacing nodes with their expansion. - * Whenever nodes are expanded the walking will walk over the new - * nodes, continuing to expand as necessary. The results are placed in - * 'list' itself. - * - * The "mode" argument controls the handling of any DEFINED tokens that - * result from expansion as follows: - * - * EXPANSION_MODE_IGNORE_DEFINED: Any resulting DEFINED tokens will be - * left in the final list, unevaluated. This is the correct mode - * for expanding any list in any context other than a - * preprocessor conditional, (#if or #elif). - * - * EXPANSION_MODE_EVALUATE_DEFINED: Any resulting DEFINED tokens will be - * evaluated to 0 or 1 tokens depending on whether the following - * token is the name of a defined macro. If the DEFINED token is - * not followed by an (optionally parenthesized) identifier, then - * an error will be generated. This the correct mode for - * expanding any list in the context of a preprocessor - * conditional, (#if or #elif). - */ -static void -_glcpp_parser_expand_token_list (glcpp_parser_t *parser, - token_list_t *list, - expansion_mode_t mode) -{ - token_node_t *node_prev; - token_node_t *node, *last = NULL; - token_list_t *expansion; - active_list_t *active_initial = parser->active; - - if (list == NULL) - return; - - _token_list_trim_trailing_space (list); - - node_prev = NULL; - node = list->head; - - if (mode == EXPANSION_MODE_EVALUATE_DEFINED) - _glcpp_parser_evaluate_defined_in_list (parser, list); - - while (node) { - - while (parser->active && parser->active->marker == node) - _parser_active_list_pop (parser); - - expansion = _glcpp_parser_expand_node (parser, node, &last, mode); - if (expansion) { - token_node_t *n; - - if (mode == EXPANSION_MODE_EVALUATE_DEFINED) { - _glcpp_parser_evaluate_defined_in_list (parser, - expansion); - } - - for (n = node; n != last->next; n = n->next) - while (parser->active && - parser->active->marker == n) - { - _parser_active_list_pop (parser); - } - - _parser_active_list_push (parser, - node->token->value.str, - last->next); - - /* Splice expansion into list, supporting a - * simple deletion if the expansion is - * empty. */ - if (expansion->head) { - if (node_prev) - node_prev->next = expansion->head; - else - list->head = expansion->head; - expansion->tail->next = last->next; - if (last == list->tail) - list->tail = expansion->tail; - } else { - if (node_prev) - node_prev->next = last->next; - else - list->head = last->next; - if (last == list->tail) - list->tail = NULL; - } - } else { - node_prev = node; - } - node = node_prev ? node_prev->next : list->head; - } - - /* Remove any lingering effects of this invocation on the - * active list. That is, pop until the list looks like it did - * at the beginning of this function. */ - while (parser->active && parser->active != active_initial) - _parser_active_list_pop (parser); - - list->non_space_tail = list->tail; -} - -void -_glcpp_parser_print_expanded_token_list (glcpp_parser_t *parser, - token_list_t *list) -{ - if (list == NULL) - return; - - _glcpp_parser_expand_token_list (parser, list, EXPANSION_MODE_IGNORE_DEFINED); - - _token_list_trim_trailing_space (list); - - _token_list_print (parser, list); -} - -static void -_check_for_reserved_macro_name (glcpp_parser_t *parser, YYLTYPE *loc, - const char *identifier) -{ - /* Section 3.3 (Preprocessor) of the GLSL 1.30 spec (and later) and - * the GLSL ES spec (all versions) say: - * - * "All macro names containing two consecutive underscores ( __ ) - * are reserved for future use as predefined macro names. All - * macro names prefixed with "GL_" ("GL" followed by a single - * underscore) are also reserved." - * - * The intention is that names containing __ are reserved for internal - * use by the implementation, and names prefixed with GL_ are reserved - * for use by Khronos. Since every extension adds a name prefixed - * with GL_ (i.e., the name of the extension), that should be an - * error. Names simply containing __ are dangerous to use, but should - * be allowed. - * - * A future version of the GLSL specification will clarify this. - */ - if (strstr(identifier, "__")) { - glcpp_warning(loc, parser, - "Macro names containing \"__\" are reserved " - "for use by the implementation.\n"); - } - if (strncmp(identifier, "GL_", 3) == 0) { - glcpp_error (loc, parser, "Macro names starting with \"GL_\" are reserved.\n"); - } -} - -static int -_macro_equal (macro_t *a, macro_t *b) -{ - if (a->is_function != b->is_function) - return 0; - - if (a->is_function) { - if (! _string_list_equal (a->parameters, b->parameters)) - return 0; - } - - return _token_list_equal_ignoring_space (a->replacements, - b->replacements); -} - -void -_define_object_macro (glcpp_parser_t *parser, - YYLTYPE *loc, - const char *identifier, - token_list_t *replacements) -{ - macro_t *macro, *previous; - - /* We define pre-defined macros before we've started parsing the - * actual file. So if there's no location defined yet, that's what - * were doing and we don't want to generate an error for using the - * reserved names. */ - if (loc != NULL) - _check_for_reserved_macro_name(parser, loc, identifier); - - macro = ralloc (parser, macro_t); - - macro->is_function = 0; - macro->parameters = NULL; - macro->identifier = ralloc_strdup (macro, identifier); - macro->replacements = replacements; - ralloc_steal (macro, replacements); - - previous = hash_table_find (parser->defines, identifier); - if (previous) { - if (_macro_equal (macro, previous)) { - ralloc_free (macro); - return; - } - glcpp_error (loc, parser, "Redefinition of macro %s\n", - identifier); - } - - hash_table_insert (parser->defines, macro, identifier); -} - -void -_define_function_macro (glcpp_parser_t *parser, - YYLTYPE *loc, - const char *identifier, - string_list_t *parameters, - token_list_t *replacements) -{ - macro_t *macro, *previous; - const char *dup; - - _check_for_reserved_macro_name(parser, loc, identifier); - - /* Check for any duplicate parameter names. */ - if ((dup = _string_list_has_duplicate (parameters)) != NULL) { - glcpp_error (loc, parser, "Duplicate macro parameter \"%s\"", - dup); - } - - macro = ralloc (parser, macro_t); - ralloc_steal (macro, parameters); - ralloc_steal (macro, replacements); - - macro->is_function = 1; - macro->parameters = parameters; - macro->identifier = ralloc_strdup (macro, identifier); - macro->replacements = replacements; - previous = hash_table_find (parser->defines, identifier); - if (previous) { - if (_macro_equal (macro, previous)) { - ralloc_free (macro); - return; - } - glcpp_error (loc, parser, "Redefinition of macro %s\n", - identifier); - } - - hash_table_insert (parser->defines, macro, identifier); -} - -static int -glcpp_parser_lex (YYSTYPE *yylval, YYLTYPE *yylloc, glcpp_parser_t *parser) -{ - token_node_t *node; - int ret; - - if (parser->lex_from_list == NULL) { - ret = glcpp_lex (yylval, yylloc, parser->scanner); - - /* XXX: This ugly block of code exists for the sole - * purpose of converting a NEWLINE token into a SPACE - * token, but only in the case where we have seen a - * function-like macro name, but have not yet seen its - * closing parenthesis. - * - * There's perhaps a more compact way to do this with - * mid-rule actions in the grammar. - * - * I'm definitely not pleased with the complexity of - * this code here. - */ - if (parser->newline_as_space) - { - if (ret == '(') { - parser->paren_count++; - } else if (ret == ')') { - parser->paren_count--; - if (parser->paren_count == 0) - parser->newline_as_space = 0; - } else if (ret == NEWLINE) { - ret = SPACE; - } else if (ret != SPACE) { - if (parser->paren_count == 0) - parser->newline_as_space = 0; - } - } - else if (parser->in_control_line) - { - if (ret == NEWLINE) - parser->in_control_line = 0; - } - else if (ret == DEFINE_TOKEN || - ret == UNDEF || ret == IF || - ret == IFDEF || ret == IFNDEF || - ret == ELIF || ret == ELSE || - ret == ENDIF || ret == HASH_TOKEN) - { - parser->in_control_line = 1; - } - else if (ret == IDENTIFIER) - { - macro_t *macro; - macro = hash_table_find (parser->defines, - yylval->str); - if (macro && macro->is_function) { - parser->newline_as_space = 1; - parser->paren_count = 0; - } - } - - return ret; - } - - node = parser->lex_from_node; - - if (node == NULL) { - ralloc_free (parser->lex_from_list); - parser->lex_from_list = NULL; - return NEWLINE; - } - - *yylval = node->token->value; - ret = node->token->type; - - parser->lex_from_node = node->next; - - return ret; -} - -static void -glcpp_parser_lex_from (glcpp_parser_t *parser, token_list_t *list) -{ - token_node_t *node; - - assert (parser->lex_from_list == NULL); - - /* Copy list, eliminating any space tokens. */ - parser->lex_from_list = _token_list_create (parser); - - for (node = list->head; node; node = node->next) { - if (node->token->type == SPACE) - continue; - _token_list_append (parser->lex_from_list, node->token); - } - - ralloc_free (list); - - parser->lex_from_node = parser->lex_from_list->head; - - /* It's possible the list consisted of nothing but whitespace. */ - if (parser->lex_from_node == NULL) { - ralloc_free (parser->lex_from_list); - parser->lex_from_list = NULL; - } -} - -static void -_glcpp_parser_skip_stack_push_if (glcpp_parser_t *parser, YYLTYPE *loc, - int condition) -{ - skip_type_t current = SKIP_NO_SKIP; - skip_node_t *node; - - if (parser->skip_stack) - current = parser->skip_stack->type; - - node = ralloc (parser, skip_node_t); - node->loc = *loc; - - if (current == SKIP_NO_SKIP) { - if (condition) - node->type = SKIP_NO_SKIP; - else - node->type = SKIP_TO_ELSE; - } else { - node->type = SKIP_TO_ENDIF; - } - - node->has_else = false; - node->next = parser->skip_stack; - parser->skip_stack = node; -} - -static void -_glcpp_parser_skip_stack_change_if (glcpp_parser_t *parser, YYLTYPE *loc, - const char *type, int condition) -{ - if (parser->skip_stack == NULL) { - glcpp_error (loc, parser, "#%s without #if\n", type); - return; - } - - if (parser->skip_stack->type == SKIP_TO_ELSE) { - if (condition) - parser->skip_stack->type = SKIP_NO_SKIP; - } else { - parser->skip_stack->type = SKIP_TO_ENDIF; - } -} - -static void -_glcpp_parser_skip_stack_pop (glcpp_parser_t *parser, YYLTYPE *loc) -{ - skip_node_t *node; - - if (parser->skip_stack == NULL) { - glcpp_error (loc, parser, "#endif without #if\n"); - return; - } - - node = parser->skip_stack; - parser->skip_stack = node->next; - ralloc_free (node); -} - -static void -_glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t version, - const char *es_identifier, - bool explicitly_set) -{ - const struct gl_extensions *extensions = parser->extensions; - - if (parser->version_resolved) - return; - - parser->version_resolved = true; - - add_builtin_define (parser, "__VERSION__", version); - - parser->is_gles = (version == 100) || - (es_identifier && - (strcmp(es_identifier, "es") == 0)); - - /* Add pre-defined macros. */ - if (parser->is_gles) { - add_builtin_define(parser, "GL_ES", 1); - add_builtin_define(parser, "GL_EXT_separate_shader_objects", 1); - - if (extensions != NULL) { - if (extensions->OES_EGL_image_external) - add_builtin_define(parser, "GL_OES_EGL_image_external", 1); - if (extensions->OES_standard_derivatives) - add_builtin_define(parser, "GL_OES_standard_derivatives", 1); - } - } else { - add_builtin_define(parser, "GL_ARB_draw_buffers", 1); - add_builtin_define(parser, "GL_ARB_separate_shader_objects", 1); - add_builtin_define(parser, "GL_ARB_texture_rectangle", 1); - add_builtin_define(parser, "GL_AMD_shader_trinary_minmax", 1); - - - if (extensions != NULL) { - if (extensions->EXT_texture_array) - add_builtin_define(parser, "GL_EXT_texture_array", 1); - - if (extensions->ARB_arrays_of_arrays) - add_builtin_define(parser, "GL_ARB_arrays_of_arrays", 1); - - if (extensions->ARB_fragment_coord_conventions) - add_builtin_define(parser, "GL_ARB_fragment_coord_conventions", - 1); - - if (extensions->ARB_fragment_layer_viewport) - add_builtin_define(parser, "GL_ARB_fragment_layer_viewport", 1); - - if (extensions->ARB_explicit_attrib_location) - add_builtin_define(parser, "GL_ARB_explicit_attrib_location", 1); - - if (extensions->ARB_explicit_uniform_location) - add_builtin_define(parser, "GL_ARB_explicit_uniform_location", 1); - - if (extensions->ARB_shader_texture_lod) - add_builtin_define(parser, "GL_ARB_shader_texture_lod", 1); - - if (extensions->ARB_draw_instanced) - add_builtin_define(parser, "GL_ARB_draw_instanced", 1); - - if (extensions->EXT_draw_instanced) - add_builtin_define(parser, "GL_EXT_draw_instanced", 1); - - if (extensions->ARB_conservative_depth) { - add_builtin_define(parser, "GL_AMD_conservative_depth", 1); - add_builtin_define(parser, "GL_ARB_conservative_depth", 1); - } - - if (extensions->ARB_shader_bit_encoding) - add_builtin_define(parser, "GL_ARB_shader_bit_encoding", 1); - - if (extensions->ARB_uniform_buffer_object) - add_builtin_define(parser, "GL_ARB_uniform_buffer_object", 1); - - if (extensions->ARB_texture_cube_map_array) - add_builtin_define(parser, "GL_ARB_texture_cube_map_array", 1); - - if (extensions->ARB_shading_language_packing) - add_builtin_define(parser, "GL_ARB_shading_language_packing", 1); - - if (extensions->ARB_texture_multisample) - add_builtin_define(parser, "GL_ARB_texture_multisample", 1); - - if (extensions->ARB_texture_query_levels) - add_builtin_define(parser, "GL_ARB_texture_query_levels", 1); - - if (extensions->ARB_texture_query_lod) - add_builtin_define(parser, "GL_ARB_texture_query_lod", 1); - - if (extensions->ARB_gpu_shader5) - add_builtin_define(parser, "GL_ARB_gpu_shader5", 1); - - if (extensions->AMD_vertex_shader_layer) - add_builtin_define(parser, "GL_AMD_vertex_shader_layer", 1); - - if (extensions->AMD_vertex_shader_viewport_index) - add_builtin_define(parser, "GL_AMD_vertex_shader_viewport_index", 1); - - if (extensions->ARB_shading_language_420pack) - add_builtin_define(parser, "GL_ARB_shading_language_420pack", 1); - - if (extensions->ARB_sample_shading) - add_builtin_define(parser, "GL_ARB_sample_shading", 1); - - if (extensions->ARB_texture_gather) - add_builtin_define(parser, "GL_ARB_texture_gather", 1); - - if (extensions->ARB_shader_atomic_counters) - add_builtin_define(parser, "GL_ARB_shader_atomic_counters", 1); - - if (extensions->ARB_viewport_array) - add_builtin_define(parser, "GL_ARB_viewport_array", 1); - - if (extensions->ARB_compute_shader) - add_builtin_define(parser, "GL_ARB_compute_shader", 1); - - if (extensions->ARB_shader_image_load_store) - add_builtin_define(parser, "GL_ARB_shader_image_load_store", 1); - - if (extensions->ARB_derivative_control) - add_builtin_define(parser, "GL_ARB_derivative_control", 1); - } - } - - if (extensions != NULL) { - if (extensions->EXT_shader_integer_mix) - add_builtin_define(parser, "GL_EXT_shader_integer_mix", 1); - } - - if (version >= 150) - add_builtin_define(parser, "GL_core_profile", 1); - - /* Currently, all ES2/ES3 implementations support highp in the - * fragment shader, so we always define this macro in ES2/ES3. - * If we ever get a driver that doesn't support highp, we'll - * need to add a flag to the gl_context and check that here. - */ - if (version >= 130 || parser->is_gles) - add_builtin_define (parser, "GL_FRAGMENT_PRECISION_HIGH", 1); - - if (explicitly_set) { - ralloc_asprintf_rewrite_tail (&parser->output, &parser->output_length, - "#version %" PRIiMAX "%s%s", version, - es_identifier ? " " : "", - es_identifier ? es_identifier : ""); - } -} - -/* GLSL version if no version is explicitly specified. */ -#define IMPLICIT_GLSL_VERSION 110 -#define IMPLICIT_GLSL_ES_VERSION 100 - -/* GLSL ES version if no version is explicitly specified. */ -#define IMPLICIT_GLSL_ES_VERSION 100 - -void -glcpp_parser_resolve_implicit_version(glcpp_parser_t *parser) -{ - int language_version = parser->api == API_OPENGLES2 ? - IMPLICIT_GLSL_ES_VERSION : - IMPLICIT_GLSL_VERSION; - - _glcpp_parser_handle_version_declaration(parser, language_version, - NULL, false); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp.h b/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp.h deleted file mode 100644 index 12c32883d..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp.h +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef GLCPP_H -#define GLCPP_H - -#include -#include - -#include "main/mtypes.h" - -#include "util/ralloc.h" - -#include "program/hash_table.h" - -#define yyscan_t void* - -/* Some data types used for parser values. */ - -typedef struct expression_value { - intmax_t value; - char *undefined_macro; -} expression_value_t; - - -typedef struct string_node { - const char *str; - struct string_node *next; -} string_node_t; - -typedef struct string_list { - string_node_t *head; - string_node_t *tail; -} string_list_t; - -typedef struct token token_t; -typedef struct token_list token_list_t; - -typedef union YYSTYPE -{ - // Could be int, but results in some bugs with parsing of #version directives - // in Apple LLVM Compiler 4.2 when building for 32 bit. - intmax_t ival; - expression_value_t expression_value; - char *str; - string_list_t *string_list; - token_t *token; - token_list_t *token_list; -} YYSTYPE; - -# define YYSTYPE_IS_TRIVIAL 1 -# define YYSTYPE_IS_DECLARED 1 - -typedef struct YYLTYPE { - int first_line; - int first_column; - int last_line; - int last_column; - unsigned source; -} YYLTYPE; -# define YYLTYPE_IS_DECLARED 1 -# define YYLTYPE_IS_TRIVIAL 1 - -# define YYLLOC_DEFAULT(Current, Rhs, N) \ -do { \ - if (N) \ - { \ - (Current).first_line = YYRHSLOC(Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC(Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC(Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC(Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC(Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC(Rhs, 0).last_column; \ - } \ - (Current).source = 0; \ -} while (0) - -struct token { - int type; - YYSTYPE value; - YYLTYPE location; -}; - -typedef struct token_node { - token_t *token; - struct token_node *next; -} token_node_t; - -struct token_list { - token_node_t *head; - token_node_t *tail; - token_node_t *non_space_tail; -}; - -typedef struct argument_node { - token_list_t *argument; - struct argument_node *next; -} argument_node_t; - -typedef struct argument_list { - argument_node_t *head; - argument_node_t *tail; -} argument_list_t; - -typedef struct glcpp_parser glcpp_parser_t; - -typedef enum { - TOKEN_CLASS_IDENTIFIER, - TOKEN_CLASS_IDENTIFIER_FINALIZED, - TOKEN_CLASS_FUNC_MACRO, - TOKEN_CLASS_OBJ_MACRO -} token_class_t; - -token_class_t -glcpp_parser_classify_token (glcpp_parser_t *parser, - const char *identifier, - int *parameter_index); - -typedef struct { - int is_function; - string_list_t *parameters; - const char *identifier; - token_list_t *replacements; -} macro_t; - -typedef struct expansion_node { - macro_t *macro; - token_node_t *replacements; - struct expansion_node *next; -} expansion_node_t; - -typedef enum skip_type { - SKIP_NO_SKIP, - SKIP_TO_ELSE, - SKIP_TO_ENDIF -} skip_type_t; - -typedef struct skip_node { - skip_type_t type; - bool has_else; - YYLTYPE loc; /* location of the initial #if/#elif/... */ - struct skip_node *next; -} skip_node_t; - -typedef struct active_list { - const char *identifier; - token_node_t *marker; - struct active_list *next; -} active_list_t; - -struct glcpp_parser { - yyscan_t scanner; - struct hash_table *defines; - active_list_t *active; - int lexing_directive; - int space_tokens; - int last_token_was_newline; - int last_token_was_space; - int first_non_space_token_this_line; - int newline_as_space; - int in_control_line; - int paren_count; - int commented_newlines; - skip_node_t *skip_stack; - int skipping; - token_list_t *lex_from_list; - token_node_t *lex_from_node; - char *output; - char *info_log; - size_t output_length; - size_t info_log_length; - int error; - const struct gl_extensions *extensions; - gl_api api; - bool version_resolved; - bool has_new_line_number; - int new_line_number; - bool has_new_source_number; - int new_source_number; - bool is_gles; -}; - -struct gl_extensions; - -glcpp_parser_t * -glcpp_parser_create (const struct gl_extensions *extensions, gl_api api); - -int -glcpp_parser_parse (glcpp_parser_t *parser); - -void -glcpp_parser_destroy (glcpp_parser_t *parser); - -void -glcpp_parser_resolve_implicit_version(glcpp_parser_t *parser); - -int -glcpp_preprocess(void *ralloc_ctx, const char **shader, char **info_log, - const struct gl_extensions *extensions, struct gl_context *g_ctx); - -/* Functions for writing to the info log */ - -void -glcpp_error (YYLTYPE *locp, glcpp_parser_t *parser, const char *fmt, ...); - -void -glcpp_warning (YYLTYPE *locp, glcpp_parser_t *parser, const char *fmt, ...); - -/* Generated by glcpp-lex.l to glcpp-lex.c */ - -int -glcpp_lex_init_extra (glcpp_parser_t *parser, yyscan_t* scanner); - -void -glcpp_lex_set_source_string(glcpp_parser_t *parser, const char *shader); - -int -glcpp_lex (YYSTYPE *lvalp, YYLTYPE *llocp, yyscan_t scanner); - -int -glcpp_lex_destroy (yyscan_t scanner); - -/* Generated by glcpp-parse.y to glcpp-parse.c */ - -int -yyparse (glcpp_parser_t *parser); - -#endif diff --git a/3rdparty/glsl-optimizer/src/glsl/glcpp/pp.c b/3rdparty/glsl-optimizer/src/glsl/glcpp/pp.c deleted file mode 100644 index a54bcbe16..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glcpp/pp.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include -#include -#include -#include "glcpp.h" -#include "main/core.h" /* for isblank() on MSVC */ - -void -glcpp_error (YYLTYPE *locp, glcpp_parser_t *parser, const char *fmt, ...) -{ - va_list ap; - - parser->error = 1; - ralloc_asprintf_rewrite_tail(&parser->info_log, - &parser->info_log_length, - "%u:%u(%u): " - "preprocessor error: ", - locp->source, - locp->first_line, - locp->first_column); - va_start(ap, fmt); - ralloc_vasprintf_rewrite_tail(&parser->info_log, - &parser->info_log_length, - fmt, ap); - va_end(ap); - ralloc_asprintf_rewrite_tail(&parser->info_log, - &parser->info_log_length, "\n"); -} - -void -glcpp_warning (YYLTYPE *locp, glcpp_parser_t *parser, const char *fmt, ...) -{ - va_list ap; - - ralloc_asprintf_rewrite_tail(&parser->info_log, - &parser->info_log_length, - "%u:%u(%u): " - "preprocessor warning: ", - locp->source, - locp->first_line, - locp->first_column); - va_start(ap, fmt); - ralloc_vasprintf_rewrite_tail(&parser->info_log, - &parser->info_log_length, - fmt, ap); - va_end(ap); - ralloc_asprintf_rewrite_tail(&parser->info_log, - &parser->info_log_length, "\n"); -} - -/* Given str, (that's expected to start with a newline terminator of some - * sort), return a pointer to the first character in str after the newline. - * - * A newline terminator can be any of the following sequences: - * - * "\r\n" - * "\n\r" - * "\n" - * "\r" - * - * And the longest such sequence will be skipped. - */ -static const char * -skip_newline (const char *str) -{ - const char *ret = str; - - if (ret == NULL) - return ret; - - if (*ret == '\0') - return ret; - - if (*ret == '\r') { - ret++; - if (*ret && *ret == '\n') - ret++; - } else if (*ret == '\n') { - ret++; - if (*ret && *ret == '\r') - ret++; - } - - return ret; -} - -/* Remove any line continuation characters in the shader, (whether in - * preprocessing directives or in GLSL code). - */ -static char * -remove_line_continuations(glcpp_parser_t *ctx, const char *shader) -{ - char *clean = ralloc_strdup(ctx, ""); - const char *backslash, *newline, *search_start; - const char *cr, *lf; - char newline_separator[3]; - int collapsed_newlines = 0; - - search_start = shader; - - /* Determine what flavor of newlines this shader is using. GLSL - * provides for 4 different possible ways to separate lines, (using - * one or two characters): - * - * "\n" (line-feed, like Linux, Unix, and new Mac OS) - * "\r" (carriage-return, like old Mac files) - * "\r\n" (carriage-return + line-feed, like DOS files) - * "\n\r" (line-feed + carriage-return, like nothing, really) - * - * This code explicitly supports a shader that uses a mixture of - * newline terminators and will properly handle line continuation - * backslashes followed by any of the above. - * - * But, since we must also insert additional newlines in the output - * (for any collapsed lines) we attempt to maintain consistency by - * examining the first encountered newline terminator, and using the - * same terminator for any newlines we insert. - */ - cr = strchr(search_start, '\r'); - lf = strchr(search_start, '\n'); - - newline_separator[0] = '\n'; - newline_separator[1] = '\0'; - newline_separator[2] = '\0'; - - if (cr == NULL) { - /* Nothing to do. */ - } else if (lf == NULL) { - newline_separator[0] = '\r'; - } else if (lf == cr + 1) { - newline_separator[0] = '\r'; - newline_separator[1] = '\n'; - } else if (cr == lf + 1) { - newline_separator[0] = '\n'; - newline_separator[1] = '\r'; - } - - while (true) { - backslash = strchr(search_start, '\\'); - - /* If we have previously collapsed any line-continuations, - * then we want to insert additional newlines at the next - * occurrence of a newline character to avoid changing any - * line numbers. - */ - if (collapsed_newlines) { - cr = strchr (search_start, '\r'); - lf = strchr (search_start, '\n'); - if (cr && lf) - newline = cr < lf ? cr : lf; - else if (cr) - newline = cr; - else - newline = lf; - if (newline && - (backslash == NULL || newline < backslash)) - { - ralloc_strncat(&clean, shader, - newline - shader + 1); - while (collapsed_newlines) { - ralloc_strcat(&clean, newline_separator); - collapsed_newlines--; - } - shader = skip_newline (newline); - search_start = shader; - } - } - - search_start = backslash + 1; - - if (backslash == NULL) - break; - - /* At each line continuation, (backslash followed by a - * newline), copy all preceding text to the output, then - * advance the shader pointer to the character after the - * newline. - */ - if (backslash[1] == '\r' || backslash[1] == '\n') - { - collapsed_newlines++; - ralloc_strncat(&clean, shader, backslash - shader); - shader = skip_newline (backslash + 1); - search_start = shader; - } - } - - ralloc_strcat(&clean, shader); - - return clean; -} - -int -glcpp_preprocess(void *ralloc_ctx, const char **shader, char **info_log, - const struct gl_extensions *extensions, struct gl_context *gl_ctx) -{ - int errors; - glcpp_parser_t *parser = glcpp_parser_create (extensions, gl_ctx->API); - - if (! gl_ctx->Const.DisableGLSLLineContinuations) - *shader = remove_line_continuations(parser, *shader); - - glcpp_lex_set_source_string (parser, *shader); - - glcpp_parser_parse (parser); - - if (parser->skip_stack) - glcpp_error (&parser->skip_stack->loc, parser, "Unterminated #if\n"); - - glcpp_parser_resolve_implicit_version(parser); - - ralloc_strcat(info_log, parser->info_log); - - ralloc_steal(ralloc_ctx, parser->output); - *shader = parser->output; - - errors = parser->error; - glcpp_parser_destroy (parser); - return errors; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.cpp b/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.cpp deleted file mode 100644 index 99e2c3828..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.cpp +++ /dev/null @@ -1,4358 +0,0 @@ -#line 2 "src/glsl/glsl_lexer.cpp" - -#line 4 "src/glsl/glsl_lexer.cpp" - -#define YY_INT_ALIGNED short int - -/* A lexical scanner generated by flex */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 6 -#define YY_FLEX_SUBMINOR_VERSION 4 -#if YY_FLEX_SUBMINOR_VERSION > 0 -#define FLEX_BETA -#endif - -#ifdef yy_create_buffer -#define _mesa_glsl_lexer__create_buffer_ALREADY_DEFINED -#else -#define yy_create_buffer _mesa_glsl_lexer__create_buffer -#endif - -#ifdef yy_delete_buffer -#define _mesa_glsl_lexer__delete_buffer_ALREADY_DEFINED -#else -#define yy_delete_buffer _mesa_glsl_lexer__delete_buffer -#endif - -#ifdef yy_scan_buffer -#define _mesa_glsl_lexer__scan_buffer_ALREADY_DEFINED -#else -#define yy_scan_buffer _mesa_glsl_lexer__scan_buffer -#endif - -#ifdef yy_scan_string -#define _mesa_glsl_lexer__scan_string_ALREADY_DEFINED -#else -#define yy_scan_string _mesa_glsl_lexer__scan_string -#endif - -#ifdef yy_scan_bytes -#define _mesa_glsl_lexer__scan_bytes_ALREADY_DEFINED -#else -#define yy_scan_bytes _mesa_glsl_lexer__scan_bytes -#endif - -#ifdef yy_init_buffer -#define _mesa_glsl_lexer__init_buffer_ALREADY_DEFINED -#else -#define yy_init_buffer _mesa_glsl_lexer__init_buffer -#endif - -#ifdef yy_flush_buffer -#define _mesa_glsl_lexer__flush_buffer_ALREADY_DEFINED -#else -#define yy_flush_buffer _mesa_glsl_lexer__flush_buffer -#endif - -#ifdef yy_load_buffer_state -#define _mesa_glsl_lexer__load_buffer_state_ALREADY_DEFINED -#else -#define yy_load_buffer_state _mesa_glsl_lexer__load_buffer_state -#endif - -#ifdef yy_switch_to_buffer -#define _mesa_glsl_lexer__switch_to_buffer_ALREADY_DEFINED -#else -#define yy_switch_to_buffer _mesa_glsl_lexer__switch_to_buffer -#endif - -#ifdef yypush_buffer_state -#define _mesa_glsl_lexer_push_buffer_state_ALREADY_DEFINED -#else -#define yypush_buffer_state _mesa_glsl_lexer_push_buffer_state -#endif - -#ifdef yypop_buffer_state -#define _mesa_glsl_lexer_pop_buffer_state_ALREADY_DEFINED -#else -#define yypop_buffer_state _mesa_glsl_lexer_pop_buffer_state -#endif - -#ifdef yyensure_buffer_stack -#define _mesa_glsl_lexer_ensure_buffer_stack_ALREADY_DEFINED -#else -#define yyensure_buffer_stack _mesa_glsl_lexer_ensure_buffer_stack -#endif - -#ifdef yylex -#define _mesa_glsl_lexer_lex_ALREADY_DEFINED -#else -#define yylex _mesa_glsl_lexer_lex -#endif - -#ifdef yyrestart -#define _mesa_glsl_lexer_restart_ALREADY_DEFINED -#else -#define yyrestart _mesa_glsl_lexer_restart -#endif - -#ifdef yylex_init -#define _mesa_glsl_lexer_lex_init_ALREADY_DEFINED -#else -#define yylex_init _mesa_glsl_lexer_lex_init -#endif - -#ifdef yylex_init_extra -#define _mesa_glsl_lexer_lex_init_extra_ALREADY_DEFINED -#else -#define yylex_init_extra _mesa_glsl_lexer_lex_init_extra -#endif - -#ifdef yylex_destroy -#define _mesa_glsl_lexer_lex_destroy_ALREADY_DEFINED -#else -#define yylex_destroy _mesa_glsl_lexer_lex_destroy -#endif - -#ifdef yyget_debug -#define _mesa_glsl_lexer_get_debug_ALREADY_DEFINED -#else -#define yyget_debug _mesa_glsl_lexer_get_debug -#endif - -#ifdef yyset_debug -#define _mesa_glsl_lexer_set_debug_ALREADY_DEFINED -#else -#define yyset_debug _mesa_glsl_lexer_set_debug -#endif - -#ifdef yyget_extra -#define _mesa_glsl_lexer_get_extra_ALREADY_DEFINED -#else -#define yyget_extra _mesa_glsl_lexer_get_extra -#endif - -#ifdef yyset_extra -#define _mesa_glsl_lexer_set_extra_ALREADY_DEFINED -#else -#define yyset_extra _mesa_glsl_lexer_set_extra -#endif - -#ifdef yyget_in -#define _mesa_glsl_lexer_get_in_ALREADY_DEFINED -#else -#define yyget_in _mesa_glsl_lexer_get_in -#endif - -#ifdef yyset_in -#define _mesa_glsl_lexer_set_in_ALREADY_DEFINED -#else -#define yyset_in _mesa_glsl_lexer_set_in -#endif - -#ifdef yyget_out -#define _mesa_glsl_lexer_get_out_ALREADY_DEFINED -#else -#define yyget_out _mesa_glsl_lexer_get_out -#endif - -#ifdef yyset_out -#define _mesa_glsl_lexer_set_out_ALREADY_DEFINED -#else -#define yyset_out _mesa_glsl_lexer_set_out -#endif - -#ifdef yyget_leng -#define _mesa_glsl_lexer_get_leng_ALREADY_DEFINED -#else -#define yyget_leng _mesa_glsl_lexer_get_leng -#endif - -#ifdef yyget_text -#define _mesa_glsl_lexer_get_text_ALREADY_DEFINED -#else -#define yyget_text _mesa_glsl_lexer_get_text -#endif - -#ifdef yyget_lineno -#define _mesa_glsl_lexer_get_lineno_ALREADY_DEFINED -#else -#define yyget_lineno _mesa_glsl_lexer_get_lineno -#endif - -#ifdef yyset_lineno -#define _mesa_glsl_lexer_set_lineno_ALREADY_DEFINED -#else -#define yyset_lineno _mesa_glsl_lexer_set_lineno -#endif - -#ifdef yyget_column -#define _mesa_glsl_lexer_get_column_ALREADY_DEFINED -#else -#define yyget_column _mesa_glsl_lexer_get_column -#endif - -#ifdef yyset_column -#define _mesa_glsl_lexer_set_column_ALREADY_DEFINED -#else -#define yyset_column _mesa_glsl_lexer_set_column -#endif - -#ifdef yywrap -#define _mesa_glsl_lexer_wrap_ALREADY_DEFINED -#else -#define yywrap _mesa_glsl_lexer_wrap -#endif - -#ifdef yyget_lval -#define _mesa_glsl_lexer_get_lval_ALREADY_DEFINED -#else -#define yyget_lval _mesa_glsl_lexer_get_lval -#endif - -#ifdef yyset_lval -#define _mesa_glsl_lexer_set_lval_ALREADY_DEFINED -#else -#define yyset_lval _mesa_glsl_lexer_set_lval -#endif - -#ifdef yyget_lloc -#define _mesa_glsl_lexer_get_lloc_ALREADY_DEFINED -#else -#define yyget_lloc _mesa_glsl_lexer_get_lloc -#endif - -#ifdef yyset_lloc -#define _mesa_glsl_lexer_set_lloc_ALREADY_DEFINED -#else -#define yyset_lloc _mesa_glsl_lexer_set_lloc -#endif - -#ifdef yyalloc -#define _mesa_glsl_lexer_alloc_ALREADY_DEFINED -#else -#define yyalloc _mesa_glsl_lexer_alloc -#endif - -#ifdef yyrealloc -#define _mesa_glsl_lexer_realloc_ALREADY_DEFINED -#else -#define yyrealloc _mesa_glsl_lexer_realloc -#endif - -#ifdef yyfree -#define _mesa_glsl_lexer_free_ALREADY_DEFINED -#else -#define yyfree _mesa_glsl_lexer_free -#endif - -/* First, we deal with platform-specific or compiler-specific issues. */ - -/* begin standard C headers. */ -#include -#include -#include -#include - -/* end standard C headers. */ - -/* flex integer type definitions */ - -#ifndef FLEXINT_H -#define FLEXINT_H - -/* C99 systems have . Non-C99 systems may or may not. */ - -#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - -/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, - * if you want the limit (max/min) macros for int types. - */ -#ifndef __STDC_LIMIT_MACROS -#define __STDC_LIMIT_MACROS 1 -#endif - -#include -typedef int8_t flex_int8_t; -typedef uint8_t flex_uint8_t; -typedef int16_t flex_int16_t; -typedef uint16_t flex_uint16_t; -typedef int32_t flex_int32_t; -typedef uint32_t flex_uint32_t; -#else -typedef signed char flex_int8_t; -typedef short int flex_int16_t; -typedef int flex_int32_t; -typedef unsigned char flex_uint8_t; -typedef unsigned short int flex_uint16_t; -typedef unsigned int flex_uint32_t; - -/* Limits of integral types. */ -#ifndef INT8_MIN -#define INT8_MIN (-128) -#endif -#ifndef INT16_MIN -#define INT16_MIN (-32767-1) -#endif -#ifndef INT32_MIN -#define INT32_MIN (-2147483647-1) -#endif -#ifndef INT8_MAX -#define INT8_MAX (127) -#endif -#ifndef INT16_MAX -#define INT16_MAX (32767) -#endif -#ifndef INT32_MAX -#define INT32_MAX (2147483647) -#endif -#ifndef UINT8_MAX -#define UINT8_MAX (255U) -#endif -#ifndef UINT16_MAX -#define UINT16_MAX (65535U) -#endif -#ifndef UINT32_MAX -#define UINT32_MAX (4294967295U) -#endif - -#ifndef SIZE_MAX -#define SIZE_MAX (~(size_t)0) -#endif - -#endif /* ! C99 */ - -#endif /* ! FLEXINT_H */ - -/* begin standard C++ headers. */ - -/* TODO: this is always defined, so inline it */ -#define yyconst const - -#if defined(__GNUC__) && __GNUC__ >= 3 -#define yynoreturn __attribute__((__noreturn__)) -#else -#define yynoreturn -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an - * integer in range [0..255] for use as an array index. - */ -#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) - -/* An opaque pointer. */ -#ifndef YY_TYPEDEF_YY_SCANNER_T -#define YY_TYPEDEF_YY_SCANNER_T -typedef void* yyscan_t; -#endif - -/* For convenience, these vars (plus the bison vars far below) - are macros in the reentrant scanner. */ -#define yyin yyg->yyin_r -#define yyout yyg->yyout_r -#define yyextra yyg->yyextra_r -#define yyleng yyg->yyleng_r -#define yytext yyg->yytext_r -#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) -#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) -#define yy_flex_debug yyg->yy_flex_debug_r - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN yyg->yy_start = 1 + 2 * -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START ((yyg->yy_start - 1) / 2) -#define YYSTATE YY_START -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart( yyin , yyscanner ) -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else -#define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ -#endif - -/* The state buf must be large enough to hold one state per character in the main buffer. - */ -#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) - -#ifndef YY_TYPEDEF_YY_BUFFER_STATE -#define YY_TYPEDEF_YY_BUFFER_STATE -typedef struct yy_buffer_state *YY_BUFFER_STATE; -#endif - -#ifndef YY_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T -typedef size_t yy_size_t; -#endif - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - - #define YY_LESS_LINENO(n) - #define YY_LINENO_REWIND_TO(ptr) - -/* Return all but the first "n" matched characters back to the input stream. */ -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - *yy_cp = yyg->yy_hold_char; \ - YY_RESTORE_YY_MORE_OFFSET \ - yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) -#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) - -#ifndef YY_STRUCT_YY_BUFFER_STATE -#define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - int yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; - -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - - }; -#endif /* !YY_STRUCT_YY_BUFFER_STATE */ - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - * - * Returns the top of the stack, or NULL. - */ -#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ - ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ - : NULL) -/* Same as previous macro, but useful when we know that the buffer stack is not - * NULL or when we need an lvalue. For internal use only. - */ -#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] - -void yyrestart ( FILE *input_file , yyscan_t yyscanner ); -void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); -void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); -void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); -void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); -void yypop_buffer_state ( yyscan_t yyscanner ); - -static void yyensure_buffer_stack ( yyscan_t yyscanner ); -static void yy_load_buffer_state ( yyscan_t yyscanner ); -static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner ); -#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner) - -YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner ); - -void *yyalloc ( yy_size_t , yyscan_t yyscanner ); -void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); -void yyfree ( void * , yyscan_t yyscanner ); - -#define yy_new_buffer yy_create_buffer -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! YY_CURRENT_BUFFER ){ \ - yyensure_buffer_stack (yyscanner); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ - } -#define yy_set_bol(at_bol) \ - { \ - if ( ! YY_CURRENT_BUFFER ){\ - yyensure_buffer_stack (yyscanner); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ - } -#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) - -/* Begin user sect3 */ - -#define _mesa_glsl_lexer_wrap(yyscanner) (/*CONSTCOND*/1) -#define YY_SKIP_YYWRAP -typedef flex_uint8_t YY_CHAR; - -typedef int yy_state_type; - -#define yytext_ptr yytext_r - -static yy_state_type yy_get_previous_state ( yyscan_t yyscanner ); -static yy_state_type yy_try_NUL_trans ( yy_state_type current_state , yyscan_t yyscanner); -static int yy_get_next_buffer ( yyscan_t yyscanner ); -static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - yyg->yytext_ptr = yy_bp; \ - yyleng = (int) (yy_cp - yy_bp); \ - yyg->yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ - yyg->yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 248 -#define YY_END_OF_BUFFER 249 -/* This struct is not used in this scanner, - but its presence is necessary. */ -struct yy_trans_info - { - flex_int32_t yy_verify; - flex_int32_t yy_nxt; - }; -static const flex_int16_t yy_accept[1009] = - { 0, - 0, 0, 16, 16, 0, 0, 249, 247, 1, 22, - 247, 247, 247, 247, 247, 247, 247, 247, 176, 174, - 247, 247, 247, 246, 247, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 247, 1, 247, 21, 16, - 20, 21, 19, 17, 18, 14, 13, 1, 158, 167, - 159, 170, 164, 153, 166, 154, 173, 178, 165, 179, - 176, 0, 0, 181, 176, 0, 174, 174, 162, 155, - 157, 156, 163, 246, 171, 161, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 31, 246, - - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 35, 246, 246, 62, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 172, 160, 1, 0, 0, 2, 0, 0, 0, 0, - 16, 15, 19, 18, 0, 178, 177, 0, 179, 0, - 180, 175, 168, 169, 246, 184, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 34, - - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 27, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 63, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 0, 0, - 0, 0, 15, 0, 178, 0, 177, 0, 179, 180, - 175, 246, 246, 246, 25, 246, 246, 230, 223, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 33, - 187, 246, 246, 246, 246, 69, 246, 246, 192, 205, - - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 202, 226, 50, 51, 52, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 190, 182, 246, 246, 28, 246, 246, 246, - 246, 246, 246, 246, 47, 48, 49, 151, 246, 246, - 246, 0, 0, 0, 0, 0, 177, 246, 246, 246, - 29, 38, 39, 40, 246, 185, 246, 246, 24, 246, - 246, 246, 246, 213, 214, 215, 246, 183, 246, 206, - 26, 216, 217, 218, 228, 210, 211, 212, 246, 246, - - 246, 64, 208, 246, 246, 246, 41, 42, 43, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 243, 246, 246, 246, 246, 246, 246, 246, 246, 203, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 186, 246, 246, 225, 44, 45, 46, 246, 246, - 32, 246, 0, 0, 0, 0, 233, 246, 246, 246, - 246, 231, 246, 246, 246, 204, 199, 236, 246, 246, - 246, 246, 246, 246, 195, 246, 246, 246, 152, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 246, 246, - 246, 246, 209, 191, 246, 246, 197, 246, 246, 246, - - 37, 246, 244, 222, 70, 198, 150, 246, 234, 193, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 0, - 0, 0, 0, 246, 246, 246, 246, 246, 194, 36, - 246, 246, 246, 246, 246, 246, 107, 108, 109, 246, - 246, 246, 246, 246, 227, 246, 246, 246, 246, 106, - 246, 246, 246, 246, 246, 246, 246, 246, 188, 246, - 246, 246, 246, 246, 65, 246, 246, 66, 246, 246, - 0, 0, 0, 0, 0, 246, 246, 67, 144, 30, - 200, 118, 119, 120, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 196, 246, - - 246, 246, 147, 242, 146, 246, 246, 246, 246, 246, - 246, 246, 246, 189, 129, 130, 131, 246, 246, 207, - 246, 145, 246, 0, 0, 6, 0, 0, 0, 12, - 3, 246, 23, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 116, 246, 246, 246, 111, 201, 68, 246, - 246, 246, 246, 246, 224, 246, 232, 229, 237, 72, - 73, 74, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 148, 0, 0, - 0, 0, 0, 0, 0, 246, 246, 246, 127, 246, - 246, 122, 246, 246, 246, 246, 246, 246, 246, 246, - - 83, 84, 85, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 245, 246, 246, 138, - 246, 246, 133, 89, 90, 91, 246, 246, 4, 0, - 5, 0, 0, 0, 0, 0, 0, 149, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 110, 246, - 112, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 95, 246, 246, 246, 246, 75, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 0, 0, 0, 0, 246, 246, 246, 121, 123, - 246, 113, 246, 114, 246, 246, 246, 246, 246, 96, - - 246, 246, 86, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 132, 134, - 246, 246, 246, 97, 246, 246, 92, 0, 0, 0, - 124, 125, 246, 246, 246, 140, 246, 246, 141, 246, - 246, 246, 246, 246, 246, 246, 71, 246, 246, 246, - 246, 219, 246, 220, 235, 246, 246, 246, 135, 136, - 246, 246, 246, 246, 246, 246, 246, 246, 0, 0, - 0, 246, 246, 246, 246, 117, 115, 246, 246, 246, - 238, 240, 246, 76, 246, 77, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 239, 241, 246, - - 0, 0, 0, 0, 128, 126, 246, 246, 87, 88, - 246, 246, 246, 78, 246, 246, 246, 79, 246, 246, - 246, 139, 137, 93, 94, 246, 246, 0, 0, 0, - 0, 246, 246, 246, 246, 246, 246, 98, 246, 101, - 246, 246, 246, 246, 0, 0, 0, 0, 246, 246, - 99, 102, 246, 246, 246, 246, 80, 246, 100, 103, - 0, 0, 0, 7, 0, 0, 142, 143, 246, 246, - 246, 246, 105, 0, 0, 8, 0, 0, 246, 246, - 221, 246, 0, 0, 0, 81, 82, 246, 0, 0, - 0, 9, 246, 0, 0, 10, 104, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 11, 0 - } ; - -static const YY_CHAR yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 5, 1, 6, 1, 7, 8, 1, 9, - 10, 11, 12, 1, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 21, 21, 22, 22, 23, 1, 24, - 25, 26, 1, 1, 27, 28, 29, 30, 31, 32, - 33, 34, 34, 34, 34, 35, 36, 34, 37, 34, - 34, 38, 39, 40, 41, 34, 34, 42, 34, 34, - 1, 1, 1, 43, 44, 1, 45, 46, 47, 48, - - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 34, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 1, 70, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static const YY_CHAR yy_meta[71] = - { 0, - 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, - 3, 3, 1, 1, 1, 1, 4, 4, 4, 4, - 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 1, 5, 4, 4, 4, 4, 3, 3, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 1 - } ; - -static const flex_int16_t yy_base[1019] = - { 0, - 0, 69, 75, 145, 1378, 1377, 1379, 1382, 70, 1382, - 1353, 1352, 94, 1351, 91, 92, 90, 1350, 202, 256, - 89, 1349, 95, 0, 79, 68, 64, 79, 124, 76, - 131, 1314, 127, 141, 81, 88, 82, 1308, 136, 126, - 183, 177, 149, 168, 134, 180, 206, 251, 1382, 140, - 1382, 1356, 239, 1382, 0, 1382, 1382, 228, 1382, 1382, - 1382, 1382, 1382, 1382, 1382, 1382, 1382, 231, 1382, 233, - 137, 307, 273, 1382, 1382, 0, 0, 1382, 1345, 1382, - 1382, 1382, 1344, 0, 1382, 1382, 1305, 1310, 115, 1307, - 1316, 1315, 1301, 1304, 1316, 244, 1310, 1297, 1294, 1308, - - 1294, 1291, 1291, 1297, 126, 180, 1291, 1302, 1287, 1293, - 1297, 1298, 0, 1289, 1300, 254, 1299, 1294, 1274, 143, - 1278, 1292, 1282, 188, 1275, 271, 1288, 1290, 285, 1269, - 1277, 1274, 1263, 1272, 223, 252, 1277, 1272, 1275, 1263, - 1266, 246, 246, 226, 1276, 1263, 1276, 83, 1269, 1268, - 1382, 1382, 329, 334, 340, 1382, 1253, 1266, 1257, 1268, - 342, 0, 333, 0, 346, 1382, 329, 390, 1382, 353, - 397, 281, 1382, 1382, 1263, 0, 1258, 1253, 1257, 1267, - 1264, 328, 1247, 1247, 1259, 1250, 278, 1261, 1258, 1258, - 1256, 1253, 1244, 1251, 1237, 1235, 1248, 1233, 1250, 0, - - 1247, 1234, 1242, 1239, 1243, 1244, 1237, 1234, 1222, 1221, - 1235, 1238, 1225, 1234, 1221, 1228, 1218, 362, 1224, 1227, - 1217, 1225, 1213, 1217, 1208, 1223, 1222, 1212, 1219, 325, - 1202, 1221, 1204, 1202, 1213, 1202, 1197, 1195, 1197, 1208, - 1193, 1195, 1192, 1204, 1203, 1206, 1187, 326, 1196, 1191, - 1189, 1199, 1177, 402, 1196, 1198, 1186, 1178, 1177, 1181, - 1193, 1176, 0, 414, 421, 438, 1382, 445, 456, 1382, - 1382, 1171, 1182, 1181, 0, 1178, 405, 0, 0, 1171, - 1169, 1169, 1170, 1165, 1174, 1162, 1180, 1168, 408, 0, - 0, 1162, 1173, 1172, 1172, 0, 1156, 426, 0, 0, - - 1158, 450, 1166, 1167, 1157, 1151, 1150, 1151, 1150, 1150, - 461, 1145, 0, 0, 1141, 1140, 1139, 1141, 1142, 1147, - 1141, 1137, 1151, 1146, 1146, 1144, 1143, 1136, 1130, 1132, - 1131, 1134, 1134, 1126, 1129, 1124, 1133, 1138, 1125, 1122, - 1135, 1125, 0, 0, 1132, 1128, 0, 1119, 1119, 1125, - 1115, 1123, 464, 1120, 0, 0, 0, 0, 1109, 1122, - 1121, 1120, 1119, 1116, 1104, 473, 480, 1116, 1117, 1117, - 0, 0, 0, 0, 1103, 0, 1112, 1102, 0, 1101, - 1102, 1096, 1107, 0, 0, 0, 1097, 0, 1093, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1104, 486, - - 1103, 0, 0, 1101, 1097, 1093, 0, 0, 0, 1085, - 467, 489, 498, 1090, 1086, 1092, 1082, 1080, 1094, 1078, - 0, 1078, 1092, 1080, 1076, 1083, 1077, 1089, 1084, 0, - 1082, 1079, 1083, 1066, 1064, 1067, 1074, 1080, 1075, 1074, - 1061, 0, 1063, 1064, 0, 0, 0, 0, 1061, 1065, - 0, 1058, 1058, 1113, 1057, 1060, 0, 1068, 1047, 1057, - 1051, 0, 1044, 1044, 1058, 0, 1060, 0, 503, 1074, - 1073, 1072, 1037, 1036, 0, 1054, 1053, 1048, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1036, 1050, - 1036, 1033, 0, 0, 1039, 344, 0, 1035, 1043, 1042, - - 0, 1034, 1026, 0, 0, 0, 0, 1023, 0, 0, - 1022, 1034, 506, 1026, 1033, 1032, 1029, 1023, 1020, 1015, - 524, 1031, 1016, 1010, 1010, 1024, 1008, 1021, 0, 0, - 1013, 1038, 1037, 1036, 1001, 1000, 359, 500, 0, 1013, - 1016, 1014, 1002, 998, 0, 1011, 1008, 1007, 996, 0, - 995, 985, 1003, 988, 991, 530, 996, 999, 0, 1017, - 1016, 1015, 980, 979, 0, 994, 980, 0, 991, 983, - 985, 548, 554, 1035, 978, 982, 985, 0, 0, 0, - 0, 1006, 550, 0, 982, 985, 969, 977, 967, 988, - 977, 973, 974, 974, 973, 958, 563, 971, 0, 972, - - 960, 959, 0, 0, 0, 955, 985, 984, 983, 948, - 947, 943, 951, 0, 981, 551, 0, 957, 960, 0, - 566, 0, 937, 945, 600, 1382, 607, 0, 627, 594, - 1382, 945, 0, 941, 940, 961, 950, 948, 948, 935, - 950, 933, 966, 945, 946, 941, 962, 0, 0, 958, - 957, 956, 921, 920, 0, 920, 0, 0, 0, 365, - 623, 944, 931, 934, 916, 929, 916, 915, 936, 925, - 923, 923, 941, 940, 939, 904, 903, 0, 908, 649, - 655, 446, 925, 915, 903, 899, 900, 899, 932, 911, - 908, 929, 910, 906, 908, 891, 888, 902, 888, 887, - - 920, 570, 0, 896, 899, 891, 882, 890, 880, 901, - 890, 886, 888, 886, 886, 885, 0, 872, 871, 904, - 883, 880, 901, 900, 651, 0, 876, 879, 1382, 508, - 1382, 677, 0, 683, 894, 877, 859, 0, 876, 875, - 858, 855, 856, 855, 847, 855, 845, 851, 0, 845, - 0, 821, 820, 819, 840, 829, 827, 827, 810, 813, - 827, 810, 843, 822, 823, 820, 817, 566, 804, 819, - 818, 801, 797, 798, 797, 796, 793, 814, 803, 801, - 24, 526, 198, 173, 189, 199, 241, 254, 0, 0, - 326, 356, 335, 413, 468, 453, 488, 476, 491, 526, - - 507, 506, 533, 513, 518, 531, 553, 538, 537, 553, - 541, 546, 550, 560, 555, 546, 563, 571, 0, 0, - 573, 574, 575, 610, 591, 590, 613, 606, 603, 598, - 0, 0, 611, 615, 611, 0, 612, 613, 0, 614, - 638, 639, 627, 627, 631, 645, 0, 639, 649, 641, - 649, 672, 653, 0, 0, 652, 669, 670, 0, 0, - 672, 673, 674, 675, 660, 659, 662, 663, 723, 724, - 674, 660, 661, 685, 686, 0, 0, 664, 666, 674, - 0, 0, 675, 698, 672, 700, 695, 689, 676, 698, - 696, 689, 678, 679, 680, 681, 689, 0, 0, 690, - - 750, 751, 752, 686, 0, 0, 708, 709, 0, 0, - 713, 714, 709, 0, 710, 695, 719, 0, 697, 707, - 730, 0, 0, 0, 0, 723, 724, 712, 769, 722, - 724, 715, 716, 708, 709, 733, 734, 0, 733, 743, - 717, 753, 717, 718, 722, 738, 787, 789, 724, 726, - 0, 0, 745, 746, 736, 744, 0, 760, 0, 0, - 755, 799, 800, 1382, 803, 802, 0, 0, 747, 748, - 742, 768, 0, 753, 813, 1382, 814, 767, 752, 753, - 0, 772, 768, 772, 822, 0, 0, 767, 782, 827, - 828, 1382, 765, 775, 832, 1382, 0, 772, 834, 837, - - 838, 839, 788, 789, 845, 846, 1382, 1382, 884, 889, - 892, 895, 846, 847, 898, 902, 905, 907 - } ; - -static const flex_int16_t yy_def[1019] = - { 0, - 1008, 1, 1009, 1009, 1010, 1010, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1011, 1008, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1008, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1008, 1012, 1008, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1013, 1008, 1014, - 19, 1008, 1008, 1008, 1008, 1015, 20, 1008, 1008, 1008, - 1008, 1008, 1008, 1011, 1008, 1008, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1016, 1008, 1012, 1008, 1008, 1014, 1008, 1008, 1008, - 1008, 1015, 1008, 1008, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1008, 1008, - 1008, 1008, 1016, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1008, 1008, 1008, 1008, 1008, 1008, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1008, 1008, 1008, 1008, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1008, - 1008, 1008, 1008, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1008, 1008, 1008, 1008, 1008, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1008, 1008, 1008, 1008, 1017, 1008, 1008, - 1008, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1008, 1008, - 1008, 1017, 1008, 1008, 1008, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1008, 1008, - 1008, 1008, 1018, 1008, 1008, 1008, 1008, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1018, 1008, 1008, 1008, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1008, 1008, 1008, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1008, 1008, - 1008, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - - 1008, 1008, 1008, 1008, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1008, 1008, 1008, - 1008, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1011, 1008, 1008, 1008, 1008, 1011, 1011, - 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, - 1008, 1008, 1008, 1008, 1008, 1008, 1011, 1011, 1011, 1011, - 1011, 1011, 1011, 1008, 1008, 1008, 1008, 1008, 1011, 1011, - 1011, 1011, 1008, 1008, 1008, 1011, 1011, 1011, 1008, 1008, - 1008, 1008, 1011, 1008, 1008, 1008, 1011, 1008, 1008, 1008, - - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 0, 1008, 1008, - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008 - } ; - -static const flex_int16_t yy_nxt[1453] = - { 0, - 8, 9, 10, 9, 11, 8, 12, 13, 8, 8, - 14, 15, 16, 17, 18, 19, 20, 20, 20, 20, - 20, 20, 8, 21, 22, 23, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 25, 24, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 24, 24, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 24, 24, 24, 46, - 47, 58, 827, 58, 48, 49, 50, 51, 50, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 52, - 49, 53, 53, 53, 53, 53, 53, 54, 49, 49, - - 49, 61, 64, 85, 66, 68, 68, 68, 68, 68, - 68, 68, 79, 80, 87, 65, 67, 49, 62, 82, - 83, 86, 90, 93, 91, 119, 123, 94, 92, 88, - 89, 101, 121, 102, 95, 255, 122, 96, 256, 120, - 124, 161, 103, 161, 49, 49, 50, 51, 50, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 52, - 49, 53, 53, 53, 53, 53, 53, 54, 49, 49, - 49, 110, 97, 177, 129, 104, 98, 178, 1008, 111, - 126, 196, 99, 105, 130, 149, 106, 49, 100, 107, - 113, 112, 197, 114, 150, 108, 127, 115, 116, 128, - - 216, 142, 117, 1008, 151, 118, 143, 153, 217, 58, - 144, 154, 146, 145, 49, 70, 147, 71, 71, 71, - 71, 71, 71, 72, 198, 138, 148, 131, 139, 58, - 828, 58, 73, 74, 132, 133, 829, 140, 199, 134, - 221, 830, 75, 76, 141, 135, 136, 222, 137, 152, - 73, 74, 155, 156, 163, 163, 163, 163, 163, 163, - 163, 165, 166, 168, 169, 75, 831, 237, 76, 70, - 250, 77, 77, 77, 77, 77, 77, 77, 251, 165, - 166, 168, 169, 238, 170, 170, 73, 74, 171, 171, - 171, 171, 171, 171, 171, 185, 78, 239, 248, 157, - - 186, 187, 246, 247, 73, 74, 158, 249, 832, 208, - 159, 240, 209, 210, 833, 160, 211, 224, 212, 78, - 70, 271, 72, 72, 72, 72, 72, 72, 72, 229, - 153, 225, 58, 226, 154, 155, 156, 73, 74, 284, - 285, 155, 156, 161, 271, 161, 230, 231, 163, 163, - 163, 163, 163, 163, 163, 73, 74, 264, 264, 266, - 267, 265, 265, 265, 265, 265, 265, 265, 171, 171, - 171, 171, 171, 171, 171, 348, 278, 266, 267, 315, - 316, 317, 157, 329, 349, 587, 834, 330, 157, 158, - 279, 707, 550, 159, 835, 158, 551, 588, 160, 159, - - 836, 268, 268, 708, 160, 269, 269, 269, 269, 269, - 269, 269, 171, 171, 171, 171, 171, 171, 171, 355, - 356, 357, 372, 373, 374, 384, 385, 386, 270, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 392, 393, 394, 270, 625, 626, 366, - 366, 837, 166, 367, 367, 367, 367, 367, 367, 367, - 269, 269, 269, 269, 269, 269, 269, 396, 397, 398, - 166, 269, 269, 269, 269, 269, 269, 269, 407, 408, - 409, 446, 447, 448, 480, 481, 482, 169, 367, 367, - 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, - - 367, 367, 470, 471, 472, 169, 483, 484, 485, 730, - 731, 267, 838, 473, 474, 486, 487, 488, 839, 532, - 533, 534, 560, 561, 562, 521, 589, 730, 731, 267, - 535, 536, 840, 563, 564, 590, 841, 591, 592, 572, - 573, 573, 573, 573, 573, 573, 607, 608, 609, 625, - 626, 842, 843, 844, 845, 625, 626, 610, 611, 846, - 612, 847, 848, 627, 627, 627, 627, 627, 627, 629, - 629, 629, 629, 629, 629, 629, 635, 668, 849, 650, - 651, 652, 673, 674, 675, 636, 669, 637, 670, 628, - 653, 654, 813, 676, 677, 630, 754, 850, 851, 852, - - 853, 625, 626, 854, 814, 755, 855, 756, 625, 626, - 856, 857, 858, 859, 628, 680, 681, 681, 681, 681, - 681, 681, 627, 627, 627, 627, 627, 627, 625, 626, - 860, 861, 683, 862, 863, 864, 865, 866, 867, 868, - 869, 684, 629, 629, 629, 629, 629, 629, 629, 709, - 730, 731, 685, 870, 871, 872, 730, 731, 710, 873, - 711, 712, 874, 875, 732, 732, 732, 732, 732, 732, - 734, 734, 734, 734, 734, 734, 734, 777, 730, 731, - 876, 877, 878, 879, 730, 731, 778, 880, 779, 881, - 733, 882, 732, 732, 732, 732, 732, 732, 734, 734, - - 734, 734, 734, 734, 734, 883, 884, 885, 886, 887, - 888, 889, 890, 891, 892, 733, 893, 894, 895, 896, - 897, 898, 899, 900, 901, 902, 904, 905, 906, 907, - 908, 909, 903, 910, 911, 912, 913, 914, 915, 916, - 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, - 927, 901, 902, 929, 931, 932, 933, 934, 935, 903, - 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, - 929, 946, 948, 949, 950, 951, 952, 953, 954, 947, - 955, 956, 957, 958, 959, 960, 961, 962, 963, 967, - 965, 968, 969, 970, 971, 972, 964, 966, 973, 974, - - 975, 963, 928, 977, 965, 979, 980, 981, 976, 964, - 930, 966, 982, 983, 975, 977, 984, 986, 987, 988, - 989, 990, 976, 991, 985, 993, 994, 930, 995, 991, - 997, 992, 998, 995, 999, 1000, 996, 992, 1000, 1002, - 1002, 996, 1001, 1004, 1005, 1001, 1006, 1006, 68, 167, - 826, 825, 824, 823, 1007, 1007, 822, 821, 820, 819, - 978, 818, 817, 816, 815, 812, 811, 810, 809, 808, - 807, 806, 978, 805, 804, 803, 802, 801, 800, 799, - 798, 797, 1003, 1003, 55, 55, 55, 55, 55, 56, - 56, 56, 56, 56, 84, 84, 84, 164, 164, 164, - - 172, 172, 263, 796, 263, 263, 263, 682, 682, 782, - 782, 795, 794, 793, 792, 791, 790, 789, 788, 787, - 786, 785, 784, 783, 781, 780, 776, 775, 774, 773, - 772, 771, 770, 769, 768, 767, 766, 765, 764, 763, - 762, 761, 760, 759, 758, 757, 753, 752, 751, 750, - 749, 748, 747, 746, 745, 744, 743, 742, 741, 740, - 739, 738, 737, 736, 735, 729, 728, 727, 726, 725, - 724, 723, 722, 721, 720, 719, 718, 717, 716, 715, - 714, 713, 706, 705, 704, 703, 702, 701, 700, 699, - 698, 697, 696, 695, 694, 693, 692, 691, 690, 689, - - 688, 687, 686, 679, 678, 672, 671, 667, 666, 665, - 664, 663, 662, 661, 660, 659, 658, 657, 656, 655, - 649, 648, 647, 646, 645, 644, 643, 642, 641, 640, - 639, 638, 634, 633, 632, 631, 630, 624, 623, 622, - 621, 620, 619, 618, 617, 616, 615, 614, 613, 606, - 605, 604, 603, 602, 601, 600, 599, 598, 597, 596, - 595, 594, 593, 586, 585, 584, 583, 582, 581, 580, - 579, 578, 577, 576, 575, 574, 571, 570, 569, 568, - 567, 566, 565, 559, 558, 557, 556, 555, 554, 553, - 552, 549, 548, 547, 546, 545, 544, 543, 542, 541, - - 540, 539, 538, 537, 531, 530, 529, 528, 527, 526, - 525, 524, 523, 522, 521, 520, 519, 518, 517, 516, - 515, 514, 513, 512, 511, 510, 509, 508, 507, 506, - 505, 504, 503, 502, 501, 500, 499, 498, 497, 496, - 495, 494, 493, 492, 491, 490, 489, 479, 478, 477, - 476, 475, 469, 468, 467, 466, 465, 464, 463, 462, - 461, 460, 459, 458, 457, 456, 455, 454, 453, 452, - 451, 450, 449, 445, 444, 443, 442, 441, 440, 439, - 438, 437, 436, 435, 434, 433, 432, 431, 430, 429, - 428, 427, 426, 425, 424, 423, 422, 421, 420, 419, - - 418, 417, 416, 415, 414, 413, 412, 411, 410, 406, - 405, 404, 403, 402, 401, 400, 399, 395, 391, 390, - 389, 388, 387, 383, 382, 381, 380, 379, 378, 377, - 376, 375, 371, 370, 369, 368, 365, 364, 363, 362, - 361, 360, 359, 358, 354, 353, 352, 351, 350, 347, - 346, 345, 344, 343, 342, 341, 340, 339, 338, 337, - 336, 335, 334, 333, 332, 331, 328, 327, 326, 325, - 324, 323, 322, 321, 320, 319, 318, 314, 313, 312, - 311, 310, 309, 308, 307, 306, 305, 304, 303, 302, - 301, 300, 299, 298, 297, 296, 295, 294, 293, 292, - - 291, 290, 289, 288, 287, 286, 283, 282, 281, 280, - 277, 276, 275, 274, 273, 272, 262, 261, 260, 259, - 258, 257, 254, 253, 252, 245, 244, 243, 242, 241, - 236, 235, 234, 233, 232, 228, 227, 223, 220, 219, - 218, 215, 214, 213, 207, 206, 205, 204, 203, 202, - 201, 200, 195, 194, 193, 192, 191, 190, 189, 188, - 184, 183, 182, 181, 180, 179, 176, 175, 174, 173, - 162, 125, 109, 81, 69, 63, 60, 59, 1008, 57, - 57, 7, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1008 - } ; - -static const flex_int16_t yy_chk[1453] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 9, 781, 9, 2, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - - 3, 13, 15, 25, 16, 17, 17, 17, 17, 17, - 17, 17, 21, 21, 26, 15, 16, 3, 13, 23, - 23, 25, 27, 28, 27, 35, 37, 28, 27, 26, - 26, 30, 36, 30, 28, 148, 36, 28, 148, 35, - 37, 50, 30, 50, 3, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 33, 29, 89, 40, 31, 29, 89, 71, 33, - 39, 105, 29, 31, 40, 45, 31, 4, 29, 31, - 34, 33, 105, 34, 45, 31, 39, 34, 34, 39, - - 120, 43, 34, 71, 46, 34, 43, 47, 120, 47, - 43, 47, 44, 43, 4, 19, 44, 19, 19, 19, - 19, 19, 19, 19, 106, 42, 44, 41, 42, 58, - 783, 58, 19, 19, 41, 41, 784, 42, 106, 41, - 124, 785, 19, 19, 42, 41, 41, 124, 41, 46, - 19, 19, 48, 48, 53, 53, 53, 53, 53, 53, - 53, 68, 68, 70, 70, 19, 786, 135, 19, 20, - 144, 20, 20, 20, 20, 20, 20, 20, 144, 68, - 68, 70, 70, 135, 73, 73, 20, 20, 73, 73, - 73, 73, 73, 73, 73, 96, 20, 136, 143, 48, - - 96, 96, 142, 142, 20, 20, 48, 143, 787, 116, - 48, 136, 116, 116, 788, 48, 116, 126, 116, 20, - 72, 172, 72, 72, 72, 72, 72, 72, 72, 129, - 153, 126, 153, 126, 153, 154, 154, 72, 72, 187, - 187, 155, 155, 161, 172, 161, 129, 129, 163, 163, - 163, 163, 163, 163, 163, 72, 72, 165, 165, 167, - 167, 165, 165, 165, 165, 165, 165, 165, 170, 170, - 170, 170, 170, 170, 170, 248, 182, 167, 167, 218, - 218, 218, 154, 230, 248, 537, 791, 230, 155, 154, - 182, 660, 496, 154, 792, 155, 496, 537, 154, 155, - - 793, 168, 168, 660, 155, 168, 168, 168, 168, 168, - 168, 168, 171, 171, 171, 171, 171, 171, 171, 254, - 254, 254, 277, 277, 277, 289, 289, 289, 171, 264, - 264, 264, 264, 264, 264, 264, 265, 265, 265, 265, - 265, 265, 265, 298, 298, 298, 171, 682, 682, 266, - 266, 794, 265, 266, 266, 266, 266, 266, 266, 266, - 268, 268, 268, 268, 268, 268, 268, 302, 302, 302, - 265, 269, 269, 269, 269, 269, 269, 269, 311, 311, - 311, 353, 353, 353, 411, 411, 411, 269, 366, 366, - 366, 366, 366, 366, 366, 367, 367, 367, 367, 367, - - 367, 367, 400, 400, 400, 269, 412, 412, 412, 730, - 730, 367, 795, 400, 400, 413, 413, 413, 796, 469, - 469, 469, 513, 513, 513, 521, 538, 782, 782, 367, - 469, 469, 797, 513, 513, 538, 798, 538, 538, 521, - 521, 521, 521, 521, 521, 521, 556, 556, 556, 572, - 572, 799, 800, 801, 802, 573, 573, 556, 556, 803, - 556, 804, 805, 572, 572, 572, 572, 572, 572, 573, - 573, 573, 573, 573, 573, 573, 583, 616, 806, 597, - 597, 597, 621, 621, 621, 583, 616, 583, 616, 572, - 597, 597, 768, 621, 621, 630, 702, 807, 808, 809, - - 810, 625, 625, 811, 768, 702, 812, 702, 627, 627, - 813, 814, 815, 816, 572, 625, 625, 625, 625, 625, - 625, 625, 627, 627, 627, 627, 627, 627, 629, 629, - 817, 818, 630, 821, 822, 823, 824, 825, 826, 827, - 828, 630, 629, 629, 629, 629, 629, 629, 629, 661, - 680, 680, 630, 829, 830, 833, 681, 681, 661, 834, - 661, 661, 835, 837, 680, 680, 680, 680, 680, 680, - 681, 681, 681, 681, 681, 681, 681, 725, 732, 732, - 838, 840, 841, 842, 734, 734, 725, 843, 725, 844, - 680, 845, 732, 732, 732, 732, 732, 732, 734, 734, - - 734, 734, 734, 734, 734, 846, 848, 849, 850, 851, - 852, 853, 856, 857, 858, 680, 861, 862, 863, 864, - 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, - 875, 878, 870, 879, 880, 883, 884, 885, 886, 887, - 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, - 900, 901, 902, 903, 904, 907, 908, 911, 912, 902, - 913, 915, 916, 917, 919, 920, 921, 926, 927, 928, - 929, 930, 931, 932, 933, 934, 935, 936, 937, 930, - 939, 940, 941, 942, 943, 944, 945, 946, 947, 949, - 948, 950, 953, 954, 955, 956, 947, 948, 958, 961, - - 962, 963, 901, 966, 965, 969, 970, 971, 962, 963, - 903, 965, 972, 974, 975, 977, 978, 979, 980, 982, - 983, 984, 975, 985, 978, 988, 989, 929, 990, 991, - 993, 985, 994, 995, 998, 999, 990, 991, 1000, 1001, - 1002, 995, 999, 1003, 1004, 1000, 1005, 1006, 1013, 1014, - 780, 779, 778, 777, 1005, 1006, 776, 775, 774, 773, - 966, 772, 771, 770, 769, 767, 766, 765, 764, 763, - 762, 761, 977, 760, 759, 758, 757, 756, 755, 754, - 753, 752, 1001, 1002, 1009, 1009, 1009, 1009, 1009, 1010, - 1010, 1010, 1010, 1010, 1011, 1011, 1011, 1012, 1012, 1012, - - 1015, 1015, 1016, 750, 1016, 1016, 1016, 1017, 1017, 1018, - 1018, 748, 747, 746, 745, 744, 743, 742, 741, 740, - 739, 737, 736, 735, 728, 727, 724, 723, 722, 721, - 720, 719, 718, 716, 715, 714, 713, 712, 711, 710, - 709, 708, 707, 706, 705, 704, 701, 700, 699, 698, - 697, 696, 695, 694, 693, 692, 691, 690, 689, 688, - 687, 686, 685, 684, 683, 679, 677, 676, 675, 674, - 673, 672, 671, 670, 669, 668, 667, 666, 665, 664, - 663, 662, 656, 654, 653, 652, 651, 650, 647, 646, - 645, 644, 643, 642, 641, 640, 639, 638, 637, 636, - - 635, 634, 632, 624, 623, 619, 618, 615, 613, 612, - 611, 610, 609, 608, 607, 606, 602, 601, 600, 598, - 596, 595, 594, 593, 592, 591, 590, 589, 588, 587, - 586, 585, 582, 577, 576, 575, 574, 571, 570, 569, - 567, 566, 564, 563, 562, 561, 560, 558, 557, 555, - 554, 553, 552, 551, 549, 548, 547, 546, 544, 543, - 542, 541, 540, 536, 535, 534, 533, 532, 531, 528, - 527, 526, 525, 524, 523, 522, 520, 519, 518, 517, - 516, 515, 514, 512, 511, 508, 503, 502, 500, 499, - 498, 495, 492, 491, 490, 489, 478, 477, 476, 474, - - 473, 472, 471, 470, 467, 465, 464, 463, 461, 460, - 459, 458, 456, 455, 454, 453, 452, 450, 449, 444, - 443, 441, 440, 439, 438, 437, 436, 435, 434, 433, - 432, 431, 429, 428, 427, 426, 425, 424, 423, 422, - 420, 419, 418, 417, 416, 415, 414, 410, 406, 405, - 404, 401, 399, 389, 387, 383, 382, 381, 380, 378, - 377, 375, 370, 369, 368, 365, 364, 363, 362, 361, - 360, 359, 354, 352, 351, 350, 349, 348, 346, 345, - 342, 341, 340, 339, 338, 337, 336, 335, 334, 333, - 332, 331, 330, 329, 328, 327, 326, 325, 324, 323, - - 322, 321, 320, 319, 318, 317, 316, 315, 312, 310, - 309, 308, 307, 306, 305, 304, 303, 301, 297, 295, - 294, 293, 292, 288, 287, 286, 285, 284, 283, 282, - 281, 280, 276, 274, 273, 272, 262, 261, 260, 259, - 258, 257, 256, 255, 253, 252, 251, 250, 249, 247, - 246, 245, 244, 243, 242, 241, 240, 239, 238, 237, - 236, 235, 234, 233, 232, 231, 229, 228, 227, 226, - 225, 224, 223, 222, 221, 220, 219, 217, 216, 215, - 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, - 204, 203, 202, 201, 199, 198, 197, 196, 195, 194, - - 193, 192, 191, 190, 189, 188, 186, 185, 184, 183, - 181, 180, 179, 178, 177, 175, 160, 159, 158, 157, - 150, 149, 147, 146, 145, 141, 140, 139, 138, 137, - 134, 133, 132, 131, 130, 128, 127, 125, 123, 122, - 121, 119, 118, 117, 115, 114, 112, 111, 110, 109, - 108, 107, 104, 103, 102, 101, 100, 99, 98, 97, - 95, 94, 93, 92, 91, 90, 88, 87, 83, 79, - 52, 38, 32, 22, 18, 14, 12, 11, 7, 6, - 5, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1008 - } ; - -/* The intent behind this definition is that it'll catch - * any uses of REJECT which flex missed. - */ -#define REJECT reject_used_but_not_detected -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET -#line 1 "src/glsl/glsl_lexer.ll" -#line 2 "src/glsl/glsl_lexer.ll" -/* - * Copyright © 2008, 2009 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#include -#include -#include "strtod.h" -#include "ast.h" -#include "glsl_parser_extras.h" -#include "glsl_parser.h" - -#if defined(_MSC_VER) -# pragma warning(disable: 4065) // warning C4065: switch statement contains 'default' but no 'case' labels -# pragma warning(disable: 4244) // warning C4244: '=' : conversion from 'double' to 'float', possible loss of data -# pragma warning(disable: 4267) // warning C4267: '=' : conversion from 'size_t' to 'int', possible loss of data -#endif // defined(_MSC_VER) - -static int classify_identifier(struct _mesa_glsl_parse_state *, const char *); - -#ifdef _MSC_VER -#define YY_NO_UNISTD_H -#endif - -#define YY_USER_ACTION \ - do { \ - yylloc->source = 0; \ - yylloc->first_column = yycolumn + 1; \ - yylloc->first_line = yylloc->last_line = yylineno + 1; \ - yycolumn += yyleng; \ - yylloc->last_column = yycolumn + 1; \ - } while(0); - -#define YY_USER_INIT yylineno = 0; yycolumn = 0; - -/* A macro for handling reserved words and keywords across language versions. - * - * Certain words start out as identifiers, become reserved words in - * later language revisions, and finally become language keywords. - * This may happen at different times in desktop GLSL and GLSL ES. - * - * For example, consider the following lexer rule: - * samplerBuffer KEYWORD(130, 0, 140, 0, SAMPLERBUFFER) - * - * This means that "samplerBuffer" will be treated as: - * - a keyword (SAMPLERBUFFER token) ...in GLSL >= 1.40 - * - a reserved word - error ...in GLSL >= 1.30 - * - an identifier ...in GLSL < 1.30 or GLSL ES - */ -#define KEYWORD(reserved_glsl, reserved_glsl_es, \ - allowed_glsl, allowed_glsl_es, token) \ - KEYWORD_WITH_ALT(reserved_glsl, reserved_glsl_es, \ - allowed_glsl, allowed_glsl_es, false, token) - -/** - * Like the KEYWORD macro, but the word is also treated as a keyword - * if the given boolean expression is true. - */ -#define KEYWORD_WITH_ALT(reserved_glsl, reserved_glsl_es, \ - allowed_glsl, allowed_glsl_es, \ - alt_expr, token) \ - do { \ - if (yyextra->is_version(allowed_glsl, allowed_glsl_es) \ - || (alt_expr)) { \ - return token; \ - } else if (yyextra->is_version(reserved_glsl, \ - reserved_glsl_es)) { \ - _mesa_glsl_error(yylloc, yyextra, \ - "illegal use of reserved word `%s'", yytext); \ - return ERROR_TOK; \ - } else { \ - void *mem_ctx = yyextra; \ - yylval->identifier = ralloc_strdup(mem_ctx, yytext); \ - return classify_identifier(yyextra, yytext); \ - } \ - } while (0) - -/** - * A macro for handling keywords that have been present in GLSL since - * its origin, but were changed into reserved words in GLSL 3.00 ES. - */ -#define DEPRECATED_ES_KEYWORD(token) \ - do { \ - if (yyextra->is_version(0, 300)) { \ - _mesa_glsl_error(yylloc, yyextra, \ - "illegal use of reserved word `%s'", yytext); \ - return ERROR_TOK; \ - } else { \ - return token; \ - } \ - } while (0) - -static int -literal_integer(char *text, int len, struct _mesa_glsl_parse_state *state, - YYSTYPE *lval, YYLTYPE *lloc, int base) -{ - bool is_uint = (text[len - 1] == 'u' || - text[len - 1] == 'U'); - const char *digits = text; - - /* Skip "0x" */ - if (base == 16) - digits += 2; - -#ifdef _MSC_VER - unsigned __int64 value = _strtoui64(digits, NULL, base); -#else - unsigned long long value = strtoull(digits, NULL, base); -#endif - - lval->n = (int)value; - - if (value > UINT_MAX) { - /* Note that signed 0xffffffff is valid, not out of range! */ - if (state->is_version(130, 300)) { - _mesa_glsl_error(lloc, state, - "literal value `%s' out of range", text); - } else { - _mesa_glsl_warning(lloc, state, - "literal value `%s' out of range", text); - } - } else if (base == 10 && !is_uint && (unsigned)value > (unsigned)INT_MAX + 1) { - /* Tries to catch unintentionally providing a negative value. - * Note that -2147483648 is parsed as -(2147483648), so we don't - * want to warn for INT_MAX. - */ - _mesa_glsl_warning(lloc, state, - "signed literal value `%s' is interpreted as %d", - text, lval->n); - } - return is_uint ? UINTCONSTANT : INTCONSTANT; -} - -#define LITERAL_INTEGER(base) \ - literal_integer(yytext, yyleng, yyextra, yylval, yylloc, base) - -#line 1466 "src/glsl/glsl_lexer.cpp" -#line 165 "src/glsl/glsl_lexer.ll" - /* Note: When adding any start conditions to this list, you must also - * update the "Internal compiler error" catch-all rule near the end of - * this file. */ - -#line 1472 "src/glsl/glsl_lexer.cpp" - -#define INITIAL 0 -#define PP 1 -#define PRAGMA 2 - -#define YY_EXTRA_TYPE struct _mesa_glsl_parse_state * - -/* Holds the entire state of the reentrant scanner. */ -struct yyguts_t - { - - /* User-defined. Not touched by flex. */ - YY_EXTRA_TYPE yyextra_r; - - /* The rest are the same as the globals declared in the non-reentrant scanner. */ - FILE *yyin_r, *yyout_r; - size_t yy_buffer_stack_top; /**< index of top of stack. */ - size_t yy_buffer_stack_max; /**< capacity of stack. */ - YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ - char yy_hold_char; - int yy_n_chars; - int yyleng_r; - char *yy_c_buf_p; - int yy_init; - int yy_start; - int yy_did_buffer_switch_on_eof; - int yy_start_stack_ptr; - int yy_start_stack_depth; - int *yy_start_stack; - yy_state_type yy_last_accepting_state; - char* yy_last_accepting_cpos; - - int yylineno_r; - int yy_flex_debug_r; - - char *yytext_r; - int yy_more_flag; - int yy_more_len; - - YYSTYPE * yylval_r; - - YYLTYPE * yylloc_r; - - }; /* end struct yyguts_t */ - -static int yy_init_globals ( yyscan_t yyscanner ); - - /* This must go here because YYSTYPE and YYLTYPE are included - * from bison output in section 1.*/ - # define yylval yyg->yylval_r - - # define yylloc yyg->yylloc_r - -int yylex_init (yyscan_t* scanner); - -int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); - -/* Accessor methods to globals. - These are made visible to non-reentrant scanners for convenience. */ - -int yylex_destroy ( yyscan_t yyscanner ); - -int yyget_debug ( yyscan_t yyscanner ); - -void yyset_debug ( int debug_flag , yyscan_t yyscanner ); - -YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); - -void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); - -FILE *yyget_in ( yyscan_t yyscanner ); - -void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); - -FILE *yyget_out ( yyscan_t yyscanner ); - -void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); - - int yyget_leng ( yyscan_t yyscanner ); - -char *yyget_text ( yyscan_t yyscanner ); - -int yyget_lineno ( yyscan_t yyscanner ); - -void yyset_lineno ( int _line_number , yyscan_t yyscanner ); - -int yyget_column ( yyscan_t yyscanner ); - -void yyset_column ( int _column_no , yyscan_t yyscanner ); - -YYSTYPE * yyget_lval ( yyscan_t yyscanner ); - -void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner ); - - YYLTYPE *yyget_lloc ( yyscan_t yyscanner ); - - void yyset_lloc ( YYLTYPE * yylloc_param , yyscan_t yyscanner ); - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap ( yyscan_t yyscanner ); -#else -extern int yywrap ( yyscan_t yyscanner ); -#endif -#endif - -#ifndef YY_NO_UNPUT - -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen ( const char * , yyscan_t yyscanner); -#endif - -#ifndef YY_NO_INPUT -#ifdef __cplusplus -static int yyinput ( yyscan_t yyscanner ); -#else -static int input ( yyscan_t yyscanner ); -#endif - -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else -#define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ -#endif - -/* Copy whatever the last rule matched to the standard output. */ -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ - { \ - int c = '*'; \ - int n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else \ - { \ - errno=0; \ - while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(yyin); \ - } \ - }\ -\ - -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) -#endif - -/* end tables serialization structures and prototypes */ - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL_IS_OURS 1 - -extern int yylex \ - (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner); - -#define YY_DECL int yylex \ - (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner) -#endif /* !YY_DECL */ - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK /*LINTED*/break; -#endif - -#define YY_RULE_SETUP \ - if ( yyleng > 0 ) \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ - (yytext[yyleng - 1] == '\n'); \ - YY_USER_ACTION - -/** The main scanner function which does all the work. - */ -YY_DECL -{ - yy_state_type yy_current_state; - char *yy_cp, *yy_bp; - int yy_act; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - yylval = yylval_param; - - yylloc = yylloc_param; - - if ( !yyg->yy_init ) - { - yyg->yy_init = 1; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! yyg->yy_start ) - yyg->yy_start = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! YY_CURRENT_BUFFER ) { - yyensure_buffer_stack (yyscanner); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); - } - - yy_load_buffer_state( yyscanner ); - } - - { -#line 177 "src/glsl/glsl_lexer.ll" - - -#line 1752 "src/glsl/glsl_lexer.cpp" - - while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ - { - yy_cp = yyg->yy_c_buf_p; - - /* Support of yytext. */ - *yy_cp = yyg->yy_hold_char; - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = yyg->yy_start; - yy_current_state += YY_AT_BOL(); -yy_match: - do - { - YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; - if ( yy_accept[yy_current_state] ) - { - yyg->yy_last_accepting_state = yy_current_state; - yyg->yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1009 ) - yy_c = yy_meta[yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - ++yy_cp; - } - while ( yy_current_state != 1008 ); - yy_cp = yyg->yy_last_accepting_cpos; - yy_current_state = yyg->yy_last_accepting_state; - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - - YY_DO_BEFORE_ACTION; - -do_action: /* This label is used only to access EOF actions. */ - - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = yyg->yy_hold_char; - yy_cp = yyg->yy_last_accepting_cpos; - yy_current_state = yyg->yy_last_accepting_state; - goto yy_find_action; - -case 1: -YY_RULE_SETUP -#line 179 "src/glsl/glsl_lexer.ll" -; - YY_BREAK -/* Preprocessor tokens. */ -case 2: -*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ -yyg->yy_c_buf_p = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 182 "src/glsl/glsl_lexer.ll" -; - YY_BREAK -case 3: -YY_RULE_SETUP -#line 183 "src/glsl/glsl_lexer.ll" -{ BEGIN PP; return VERSION_TOK; } - YY_BREAK -case 4: -YY_RULE_SETUP -#line 184 "src/glsl/glsl_lexer.ll" -{ BEGIN PP; return EXTENSION; } - YY_BREAK -case 5: -*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ -yyg->yy_c_buf_p = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 185 "src/glsl/glsl_lexer.ll" -{ - /* Eat characters until the first digit is - * encountered - */ - char *ptr = yytext; - while (!isdigit(*ptr)) - ptr++; - - /* Subtract one from the line number because - * yylineno is zero-based instead of - * one-based. - */ - yylineno = strtol(ptr, &ptr, 0) - 1; - yylloc->source = strtol(ptr, NULL, 0); - } - YY_BREAK -case 6: -*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ -yyg->yy_c_buf_p = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 200 "src/glsl/glsl_lexer.ll" -{ - /* Eat characters until the first digit is - * encountered - */ - char *ptr = yytext; - while (!isdigit(*ptr)) - ptr++; - - /* Subtract one from the line number because - * yylineno is zero-based instead of - * one-based. - */ - yylineno = strtol(ptr, &ptr, 0) - 1; - } - YY_BREAK -case 7: -YY_RULE_SETUP -#line 214 "src/glsl/glsl_lexer.ll" -{ - BEGIN PP; - return PRAGMA_DEBUG_ON; - } - YY_BREAK -case 8: -YY_RULE_SETUP -#line 218 "src/glsl/glsl_lexer.ll" -{ - BEGIN PP; - return PRAGMA_DEBUG_OFF; - } - YY_BREAK -case 9: -YY_RULE_SETUP -#line 222 "src/glsl/glsl_lexer.ll" -{ - BEGIN PP; - return PRAGMA_OPTIMIZE_ON; - } - YY_BREAK -case 10: -YY_RULE_SETUP -#line 226 "src/glsl/glsl_lexer.ll" -{ - BEGIN PP; - return PRAGMA_OPTIMIZE_OFF; - } - YY_BREAK -case 11: -YY_RULE_SETUP -#line 230 "src/glsl/glsl_lexer.ll" -{ - BEGIN PP; - return PRAGMA_INVARIANT_ALL; - } - YY_BREAK -case 12: -YY_RULE_SETUP -#line 234 "src/glsl/glsl_lexer.ll" -{ BEGIN PRAGMA; } - YY_BREAK -case 13: -/* rule 13 can match eol */ -YY_RULE_SETUP -#line 236 "src/glsl/glsl_lexer.ll" -{ BEGIN 0; yylineno++; yycolumn = 0; } - YY_BREAK -case 14: -YY_RULE_SETUP -#line 237 "src/glsl/glsl_lexer.ll" -{ } - YY_BREAK -case 15: -YY_RULE_SETUP -#line 239 "src/glsl/glsl_lexer.ll" -{ } - YY_BREAK -case 16: -YY_RULE_SETUP -#line 240 "src/glsl/glsl_lexer.ll" -{ } - YY_BREAK -case 17: -YY_RULE_SETUP -#line 241 "src/glsl/glsl_lexer.ll" -return COLON; - YY_BREAK -case 18: -YY_RULE_SETUP -#line 242 "src/glsl/glsl_lexer.ll" -{ - void *mem_ctx = yyextra; - yylval->identifier = ralloc_strdup(mem_ctx, yytext); - return IDENTIFIER; - } - YY_BREAK -case 19: -YY_RULE_SETUP -#line 247 "src/glsl/glsl_lexer.ll" -{ - yylval->n = strtol(yytext, NULL, 10); - return INTCONSTANT; - } - YY_BREAK -case 20: -/* rule 20 can match eol */ -YY_RULE_SETUP -#line 251 "src/glsl/glsl_lexer.ll" -{ BEGIN 0; yylineno++; yycolumn = 0; return EOL; } - YY_BREAK -case 21: -YY_RULE_SETUP -#line 252 "src/glsl/glsl_lexer.ll" -{ return yytext[0]; } - YY_BREAK -case 22: -/* rule 22 can match eol */ -YY_RULE_SETUP -#line 254 "src/glsl/glsl_lexer.ll" -{ yylineno++; yycolumn = 0; } - YY_BREAK -case 23: -YY_RULE_SETUP -#line 256 "src/glsl/glsl_lexer.ll" -DEPRECATED_ES_KEYWORD(ATTRIBUTE); - YY_BREAK -case 24: -YY_RULE_SETUP -#line 257 "src/glsl/glsl_lexer.ll" -return CONST_TOK; - YY_BREAK -case 25: -YY_RULE_SETUP -#line 258 "src/glsl/glsl_lexer.ll" -return BOOL_TOK; - YY_BREAK -case 26: -YY_RULE_SETUP -#line 259 "src/glsl/glsl_lexer.ll" -return FLOAT_TOK; - YY_BREAK -case 27: -YY_RULE_SETUP -#line 260 "src/glsl/glsl_lexer.ll" -return INT_TOK; - YY_BREAK -case 28: -YY_RULE_SETUP -#line 261 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, UINT_TOK); - YY_BREAK -case 29: -YY_RULE_SETUP -#line 263 "src/glsl/glsl_lexer.ll" -return BREAK; - YY_BREAK -case 30: -YY_RULE_SETUP -#line 264 "src/glsl/glsl_lexer.ll" -return CONTINUE; - YY_BREAK -case 31: -YY_RULE_SETUP -#line 265 "src/glsl/glsl_lexer.ll" -return DO; - YY_BREAK -case 32: -YY_RULE_SETUP -#line 266 "src/glsl/glsl_lexer.ll" -return WHILE; - YY_BREAK -case 33: -YY_RULE_SETUP -#line 267 "src/glsl/glsl_lexer.ll" -return ELSE; - YY_BREAK -case 34: -YY_RULE_SETUP -#line 268 "src/glsl/glsl_lexer.ll" -return FOR; - YY_BREAK -case 35: -YY_RULE_SETUP -#line 269 "src/glsl/glsl_lexer.ll" -return IF; - YY_BREAK -case 36: -YY_RULE_SETUP -#line 270 "src/glsl/glsl_lexer.ll" -return DISCARD; - YY_BREAK -case 37: -YY_RULE_SETUP -#line 271 "src/glsl/glsl_lexer.ll" -return RETURN; - YY_BREAK -case 38: -YY_RULE_SETUP -#line 273 "src/glsl/glsl_lexer.ll" -return BVEC2; - YY_BREAK -case 39: -YY_RULE_SETUP -#line 274 "src/glsl/glsl_lexer.ll" -return BVEC3; - YY_BREAK -case 40: -YY_RULE_SETUP -#line 275 "src/glsl/glsl_lexer.ll" -return BVEC4; - YY_BREAK -case 41: -YY_RULE_SETUP -#line 276 "src/glsl/glsl_lexer.ll" -return IVEC2; - YY_BREAK -case 42: -YY_RULE_SETUP -#line 277 "src/glsl/glsl_lexer.ll" -return IVEC3; - YY_BREAK -case 43: -YY_RULE_SETUP -#line 278 "src/glsl/glsl_lexer.ll" -return IVEC4; - YY_BREAK -case 44: -YY_RULE_SETUP -#line 279 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, UVEC2); - YY_BREAK -case 45: -YY_RULE_SETUP -#line 280 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, UVEC3); - YY_BREAK -case 46: -YY_RULE_SETUP -#line 281 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, UVEC4); - YY_BREAK -case 47: -YY_RULE_SETUP -#line 282 "src/glsl/glsl_lexer.ll" -return VEC2; - YY_BREAK -case 48: -YY_RULE_SETUP -#line 283 "src/glsl/glsl_lexer.ll" -return VEC3; - YY_BREAK -case 49: -YY_RULE_SETUP -#line 284 "src/glsl/glsl_lexer.ll" -return VEC4; - YY_BREAK -case 50: -YY_RULE_SETUP -#line 285 "src/glsl/glsl_lexer.ll" -return MAT2X2; - YY_BREAK -case 51: -YY_RULE_SETUP -#line 286 "src/glsl/glsl_lexer.ll" -return MAT3X3; - YY_BREAK -case 52: -YY_RULE_SETUP -#line 287 "src/glsl/glsl_lexer.ll" -return MAT4X4; - YY_BREAK -case 53: -YY_RULE_SETUP -#line 288 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 300, 120, 300, MAT2X2); - YY_BREAK -case 54: -YY_RULE_SETUP -#line 289 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 300, 120, 300, MAT2X3); - YY_BREAK -case 55: -YY_RULE_SETUP -#line 290 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 300, 120, 300, MAT2X4); - YY_BREAK -case 56: -YY_RULE_SETUP -#line 291 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 300, 120, 300, MAT3X2); - YY_BREAK -case 57: -YY_RULE_SETUP -#line 292 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 300, 120, 300, MAT3X3); - YY_BREAK -case 58: -YY_RULE_SETUP -#line 293 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 300, 120, 300, MAT3X4); - YY_BREAK -case 59: -YY_RULE_SETUP -#line 294 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 300, 120, 300, MAT4X2); - YY_BREAK -case 60: -YY_RULE_SETUP -#line 295 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 300, 120, 300, MAT4X3); - YY_BREAK -case 61: -YY_RULE_SETUP -#line 296 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 300, 120, 300, MAT4X4); - YY_BREAK -case 62: -YY_RULE_SETUP -#line 298 "src/glsl/glsl_lexer.ll" -return IN_TOK; - YY_BREAK -case 63: -YY_RULE_SETUP -#line 299 "src/glsl/glsl_lexer.ll" -return OUT_TOK; - YY_BREAK -case 64: -YY_RULE_SETUP -#line 300 "src/glsl/glsl_lexer.ll" -return INOUT_TOK; - YY_BREAK -case 65: -YY_RULE_SETUP -#line 301 "src/glsl/glsl_lexer.ll" -return UNIFORM; - YY_BREAK -case 66: -YY_RULE_SETUP -#line 302 "src/glsl/glsl_lexer.ll" -DEPRECATED_ES_KEYWORD(VARYING); - YY_BREAK -case 67: -YY_RULE_SETUP -#line 303 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 300, 120, 300, CENTROID); - YY_BREAK -case 68: -YY_RULE_SETUP -#line 304 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 100, 120, 100, INVARIANT); - YY_BREAK -case 69: -YY_RULE_SETUP -#line 305 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 100, 130, 300, FLAT); - YY_BREAK -case 70: -YY_RULE_SETUP -#line 306 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, SMOOTH); - YY_BREAK -case 71: -YY_RULE_SETUP -#line 307 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 0, NOPERSPECTIVE); - YY_BREAK -case 72: -YY_RULE_SETUP -#line 309 "src/glsl/glsl_lexer.ll" -DEPRECATED_ES_KEYWORD(SAMPLER1D); - YY_BREAK -case 73: -YY_RULE_SETUP -#line 310 "src/glsl/glsl_lexer.ll" -return SAMPLER2D; - YY_BREAK -case 74: -YY_RULE_SETUP -#line 311 "src/glsl/glsl_lexer.ll" -return SAMPLER3D; - YY_BREAK -case 75: -YY_RULE_SETUP -#line 312 "src/glsl/glsl_lexer.ll" -return SAMPLERCUBE; - YY_BREAK -case 76: -YY_RULE_SETUP -#line 313 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 0, SAMPLER1DARRAY); - YY_BREAK -case 77: -YY_RULE_SETUP -#line 314 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, SAMPLER2DARRAY); - YY_BREAK -case 78: -YY_RULE_SETUP -#line 315 "src/glsl/glsl_lexer.ll" -DEPRECATED_ES_KEYWORD(SAMPLER1DSHADOW); - YY_BREAK -case 79: -YY_RULE_SETUP -#line 316 "src/glsl/glsl_lexer.ll" -return SAMPLER2DSHADOW; - YY_BREAK -case 80: -YY_RULE_SETUP -#line 317 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, SAMPLERCUBESHADOW); - YY_BREAK -case 81: -YY_RULE_SETUP -#line 318 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 0, SAMPLER1DARRAYSHADOW); - YY_BREAK -case 82: -YY_RULE_SETUP -#line 319 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, SAMPLER2DARRAYSHADOW); - YY_BREAK -case 83: -YY_RULE_SETUP -#line 320 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 0, ISAMPLER1D); - YY_BREAK -case 84: -YY_RULE_SETUP -#line 321 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, ISAMPLER2D); - YY_BREAK -case 85: -YY_RULE_SETUP -#line 322 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, ISAMPLER3D); - YY_BREAK -case 86: -YY_RULE_SETUP -#line 323 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, ISAMPLERCUBE); - YY_BREAK -case 87: -YY_RULE_SETUP -#line 324 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 0, ISAMPLER1DARRAY); - YY_BREAK -case 88: -YY_RULE_SETUP -#line 325 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, ISAMPLER2DARRAY); - YY_BREAK -case 89: -YY_RULE_SETUP -#line 326 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 0, USAMPLER1D); - YY_BREAK -case 90: -YY_RULE_SETUP -#line 327 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, USAMPLER2D); - YY_BREAK -case 91: -YY_RULE_SETUP -#line 328 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, USAMPLER3D); - YY_BREAK -case 92: -YY_RULE_SETUP -#line 329 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, USAMPLERCUBE); - YY_BREAK -case 93: -YY_RULE_SETUP -#line 330 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 0, USAMPLER1DARRAY); - YY_BREAK -case 94: -YY_RULE_SETUP -#line 331 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, USAMPLER2DARRAY); - YY_BREAK -/* additional keywords in ARB_texture_multisample, included in GLSL 1.50 */ -/* these are reserved but not defined in GLSL 3.00 */ -case 95: -YY_RULE_SETUP -#line 335 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, SAMPLER2DMS); - YY_BREAK -case 96: -YY_RULE_SETUP -#line 336 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, ISAMPLER2DMS); - YY_BREAK -case 97: -YY_RULE_SETUP -#line 337 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, USAMPLER2DMS); - YY_BREAK -case 98: -YY_RULE_SETUP -#line 338 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, SAMPLER2DMSARRAY); - YY_BREAK -case 99: -YY_RULE_SETUP -#line 339 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, ISAMPLER2DMSARRAY); - YY_BREAK -case 100: -YY_RULE_SETUP -#line 340 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, USAMPLER2DMSARRAY); - YY_BREAK -/* keywords available with ARB_texture_cube_map_array_enable extension on desktop GLSL */ -case 101: -YY_RULE_SETUP -#line 343 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_texture_cube_map_array_enable, SAMPLERCUBEARRAY); - YY_BREAK -case 102: -YY_RULE_SETUP -#line 344 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_texture_cube_map_array_enable, ISAMPLERCUBEARRAY); - YY_BREAK -case 103: -YY_RULE_SETUP -#line 345 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_texture_cube_map_array_enable, USAMPLERCUBEARRAY); - YY_BREAK -case 104: -YY_RULE_SETUP -#line 346 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_texture_cube_map_array_enable, SAMPLERCUBEARRAYSHADOW); - YY_BREAK -case 105: -YY_RULE_SETUP -#line 348 "src/glsl/glsl_lexer.ll" -{ - if (yyextra->OES_EGL_image_external_enable) - return SAMPLEREXTERNALOES; - else - return IDENTIFIER; - } - YY_BREAK -/* keywords available with ARB_gpu_shader5 */ -case 106: -YY_RULE_SETUP -#line 356 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_gpu_shader5_enable, PRECISE); - YY_BREAK -/* keywords available with ARB_shader_image_load_store */ -case 107: -YY_RULE_SETUP -#line 359 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE1D); - YY_BREAK -case 108: -YY_RULE_SETUP -#line 360 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2D); - YY_BREAK -case 109: -YY_RULE_SETUP -#line 361 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE3D); - YY_BREAK -case 110: -YY_RULE_SETUP -#line 362 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DRECT); - YY_BREAK -case 111: -YY_RULE_SETUP -#line 363 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGECUBE); - YY_BREAK -case 112: -YY_RULE_SETUP -#line 364 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGEBUFFER); - YY_BREAK -case 113: -YY_RULE_SETUP -#line 365 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE1DARRAY); - YY_BREAK -case 114: -YY_RULE_SETUP -#line 366 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DARRAY); - YY_BREAK -case 115: -YY_RULE_SETUP -#line 367 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGECUBEARRAY); - YY_BREAK -case 116: -YY_RULE_SETUP -#line 368 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DMS); - YY_BREAK -case 117: -YY_RULE_SETUP -#line 369 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DMSARRAY); - YY_BREAK -case 118: -YY_RULE_SETUP -#line 370 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE1D); - YY_BREAK -case 119: -YY_RULE_SETUP -#line 371 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2D); - YY_BREAK -case 120: -YY_RULE_SETUP -#line 372 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE3D); - YY_BREAK -case 121: -YY_RULE_SETUP -#line 373 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DRECT); - YY_BREAK -case 122: -YY_RULE_SETUP -#line 374 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGECUBE); - YY_BREAK -case 123: -YY_RULE_SETUP -#line 375 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGEBUFFER); - YY_BREAK -case 124: -YY_RULE_SETUP -#line 376 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE1DARRAY); - YY_BREAK -case 125: -YY_RULE_SETUP -#line 377 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DARRAY); - YY_BREAK -case 126: -YY_RULE_SETUP -#line 378 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGECUBEARRAY); - YY_BREAK -case 127: -YY_RULE_SETUP -#line 379 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DMS); - YY_BREAK -case 128: -YY_RULE_SETUP -#line 380 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DMSARRAY); - YY_BREAK -case 129: -YY_RULE_SETUP -#line 381 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE1D); - YY_BREAK -case 130: -YY_RULE_SETUP -#line 382 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2D); - YY_BREAK -case 131: -YY_RULE_SETUP -#line 383 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE3D); - YY_BREAK -case 132: -YY_RULE_SETUP -#line 384 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DRECT); - YY_BREAK -case 133: -YY_RULE_SETUP -#line 385 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGECUBE); - YY_BREAK -case 134: -YY_RULE_SETUP -#line 386 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGEBUFFER); - YY_BREAK -case 135: -YY_RULE_SETUP -#line 387 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE1DARRAY); - YY_BREAK -case 136: -YY_RULE_SETUP -#line 388 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DARRAY); - YY_BREAK -case 137: -YY_RULE_SETUP -#line 389 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGECUBEARRAY); - YY_BREAK -case 138: -YY_RULE_SETUP -#line 390 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DMS); - YY_BREAK -case 139: -YY_RULE_SETUP -#line 391 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DMSARRAY); - YY_BREAK -case 140: -YY_RULE_SETUP -#line 392 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 0, 0, IMAGE1DSHADOW); - YY_BREAK -case 141: -YY_RULE_SETUP -#line 393 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 0, 0, IMAGE2DSHADOW); - YY_BREAK -case 142: -YY_RULE_SETUP -#line 394 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 0, 0, IMAGE1DARRAYSHADOW); - YY_BREAK -case 143: -YY_RULE_SETUP -#line 395 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 0, 0, IMAGE2DARRAYSHADOW); - YY_BREAK -case 144: -YY_RULE_SETUP -#line 397 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, COHERENT); - YY_BREAK -case 145: -YY_RULE_SETUP -#line 398 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(110, 100, 420, 0, yyextra->ARB_shader_image_load_store_enable, VOLATILE); - YY_BREAK -case 146: -YY_RULE_SETUP -#line 399 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, RESTRICT); - YY_BREAK -case 147: -YY_RULE_SETUP -#line 400 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, READONLY); - YY_BREAK -case 148: -YY_RULE_SETUP -#line 401 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, WRITEONLY); - YY_BREAK -case 149: -YY_RULE_SETUP -#line 403 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_atomic_counters_enable, ATOMIC_UINT); - YY_BREAK -case 150: -YY_RULE_SETUP -#line 405 "src/glsl/glsl_lexer.ll" -return STRUCT; - YY_BREAK -case 151: -YY_RULE_SETUP -#line 406 "src/glsl/glsl_lexer.ll" -return VOID_TOK; - YY_BREAK -case 152: -YY_RULE_SETUP -#line 408 "src/glsl/glsl_lexer.ll" -{ - if ((yyextra->is_version(140, 300)) - || yyextra->AMD_conservative_depth_enable - || yyextra->ARB_conservative_depth_enable - || yyextra->ARB_explicit_attrib_location_enable - || yyextra->ARB_explicit_uniform_location_enable - || yyextra->has_separate_shader_objects() - || yyextra->ARB_uniform_buffer_object_enable - || yyextra->ARB_fragment_coord_conventions_enable - || yyextra->ARB_shading_language_420pack_enable - || yyextra->ARB_compute_shader_enable) { - return LAYOUT_TOK; - } else { - void *mem_ctx = yyextra; - yylval->identifier = ralloc_strdup(mem_ctx, yytext); - return classify_identifier(yyextra, yytext); - } - } - YY_BREAK -case 153: -YY_RULE_SETUP -#line 427 "src/glsl/glsl_lexer.ll" -return INC_OP; - YY_BREAK -case 154: -YY_RULE_SETUP -#line 428 "src/glsl/glsl_lexer.ll" -return DEC_OP; - YY_BREAK -case 155: -YY_RULE_SETUP -#line 429 "src/glsl/glsl_lexer.ll" -return LE_OP; - YY_BREAK -case 156: -YY_RULE_SETUP -#line 430 "src/glsl/glsl_lexer.ll" -return GE_OP; - YY_BREAK -case 157: -YY_RULE_SETUP -#line 431 "src/glsl/glsl_lexer.ll" -return EQ_OP; - YY_BREAK -case 158: -YY_RULE_SETUP -#line 432 "src/glsl/glsl_lexer.ll" -return NE_OP; - YY_BREAK -case 159: -YY_RULE_SETUP -#line 433 "src/glsl/glsl_lexer.ll" -return AND_OP; - YY_BREAK -case 160: -YY_RULE_SETUP -#line 434 "src/glsl/glsl_lexer.ll" -return OR_OP; - YY_BREAK -case 161: -YY_RULE_SETUP -#line 435 "src/glsl/glsl_lexer.ll" -return XOR_OP; - YY_BREAK -case 162: -YY_RULE_SETUP -#line 436 "src/glsl/glsl_lexer.ll" -return LEFT_OP; - YY_BREAK -case 163: -YY_RULE_SETUP -#line 437 "src/glsl/glsl_lexer.ll" -return RIGHT_OP; - YY_BREAK -case 164: -YY_RULE_SETUP -#line 439 "src/glsl/glsl_lexer.ll" -return MUL_ASSIGN; - YY_BREAK -case 165: -YY_RULE_SETUP -#line 440 "src/glsl/glsl_lexer.ll" -return DIV_ASSIGN; - YY_BREAK -case 166: -YY_RULE_SETUP -#line 441 "src/glsl/glsl_lexer.ll" -return ADD_ASSIGN; - YY_BREAK -case 167: -YY_RULE_SETUP -#line 442 "src/glsl/glsl_lexer.ll" -return MOD_ASSIGN; - YY_BREAK -case 168: -YY_RULE_SETUP -#line 443 "src/glsl/glsl_lexer.ll" -return LEFT_ASSIGN; - YY_BREAK -case 169: -YY_RULE_SETUP -#line 444 "src/glsl/glsl_lexer.ll" -return RIGHT_ASSIGN; - YY_BREAK -case 170: -YY_RULE_SETUP -#line 445 "src/glsl/glsl_lexer.ll" -return AND_ASSIGN; - YY_BREAK -case 171: -YY_RULE_SETUP -#line 446 "src/glsl/glsl_lexer.ll" -return XOR_ASSIGN; - YY_BREAK -case 172: -YY_RULE_SETUP -#line 447 "src/glsl/glsl_lexer.ll" -return OR_ASSIGN; - YY_BREAK -case 173: -YY_RULE_SETUP -#line 448 "src/glsl/glsl_lexer.ll" -return SUB_ASSIGN; - YY_BREAK -case 174: -YY_RULE_SETUP -#line 450 "src/glsl/glsl_lexer.ll" -{ - return LITERAL_INTEGER(10); - } - YY_BREAK -case 175: -YY_RULE_SETUP -#line 453 "src/glsl/glsl_lexer.ll" -{ - return LITERAL_INTEGER(16); - } - YY_BREAK -case 176: -YY_RULE_SETUP -#line 456 "src/glsl/glsl_lexer.ll" -{ - return LITERAL_INTEGER(8); - } - YY_BREAK -case 177: -YY_RULE_SETUP -#line 460 "src/glsl/glsl_lexer.ll" -{ - yylval->real = glsl_strtof(yytext, NULL); - return FLOATCONSTANT; - } - YY_BREAK -case 178: -YY_RULE_SETUP -#line 464 "src/glsl/glsl_lexer.ll" -{ - yylval->real = glsl_strtof(yytext, NULL); - return FLOATCONSTANT; - } - YY_BREAK -case 179: -YY_RULE_SETUP -#line 468 "src/glsl/glsl_lexer.ll" -{ - yylval->real = glsl_strtof(yytext, NULL); - return FLOATCONSTANT; - } - YY_BREAK -case 180: -YY_RULE_SETUP -#line 472 "src/glsl/glsl_lexer.ll" -{ - yylval->real = glsl_strtof(yytext, NULL); - return FLOATCONSTANT; - } - YY_BREAK -case 181: -YY_RULE_SETUP -#line 476 "src/glsl/glsl_lexer.ll" -{ - yylval->real = glsl_strtof(yytext, NULL); - return FLOATCONSTANT; - } - YY_BREAK -case 182: -YY_RULE_SETUP -#line 481 "src/glsl/glsl_lexer.ll" -{ - yylval->n = 1; - return BOOLCONSTANT; - } - YY_BREAK -case 183: -YY_RULE_SETUP -#line 485 "src/glsl/glsl_lexer.ll" -{ - yylval->n = 0; - return BOOLCONSTANT; - } - YY_BREAK -/* Reserved words in GLSL 1.10. */ -case 184: -YY_RULE_SETUP -#line 492 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, ASM); - YY_BREAK -case 185: -YY_RULE_SETUP -#line 493 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, CLASS); - YY_BREAK -case 186: -YY_RULE_SETUP -#line 494 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, UNION); - YY_BREAK -case 187: -YY_RULE_SETUP -#line 495 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, ENUM); - YY_BREAK -case 188: -YY_RULE_SETUP -#line 496 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, TYPEDEF); - YY_BREAK -case 189: -YY_RULE_SETUP -#line 497 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, TEMPLATE); - YY_BREAK -case 190: -YY_RULE_SETUP -#line 498 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, THIS); - YY_BREAK -case 191: -YY_RULE_SETUP -#line 499 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(110, 100, 140, 300, yyextra->ARB_uniform_buffer_object_enable, PACKED_TOK); - YY_BREAK -case 192: -YY_RULE_SETUP -#line 500 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, GOTO); - YY_BREAK -case 193: -YY_RULE_SETUP -#line 501 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 130, 300, SWITCH); - YY_BREAK -case 194: -YY_RULE_SETUP -#line 502 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 130, 300, DEFAULT); - YY_BREAK -case 195: -YY_RULE_SETUP -#line 503 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, INLINE_TOK); - YY_BREAK -case 196: -YY_RULE_SETUP -#line 504 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, NOINLINE); - YY_BREAK -case 197: -YY_RULE_SETUP -#line 505 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, PUBLIC_TOK); - YY_BREAK -case 198: -YY_RULE_SETUP -#line 506 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, STATIC); - YY_BREAK -case 199: -YY_RULE_SETUP -#line 507 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, EXTERN); - YY_BREAK -case 200: -YY_RULE_SETUP -#line 508 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, EXTERNAL); - YY_BREAK -case 201: -YY_RULE_SETUP -#line 509 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, INTERFACE); - YY_BREAK -case 202: -YY_RULE_SETUP -#line 510 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, LONG_TOK); - YY_BREAK -case 203: -YY_RULE_SETUP -#line 511 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, SHORT_TOK); - YY_BREAK -case 204: -YY_RULE_SETUP -#line 512 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 400, 0, DOUBLE_TOK); - YY_BREAK -case 205: -YY_RULE_SETUP -#line 513 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, HALF); - YY_BREAK -case 206: -YY_RULE_SETUP -#line 514 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, FIXED_TOK); - YY_BREAK -case 207: -YY_RULE_SETUP -#line 515 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, UNSIGNED); - YY_BREAK -case 208: -YY_RULE_SETUP -#line 516 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, INPUT_TOK); - YY_BREAK -case 209: -YY_RULE_SETUP -#line 517 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, OUTPUT); - YY_BREAK -case 210: -YY_RULE_SETUP -#line 518 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, HVEC2); - YY_BREAK -case 211: -YY_RULE_SETUP -#line 519 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, HVEC3); - YY_BREAK -case 212: -YY_RULE_SETUP -#line 520 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, HVEC4); - YY_BREAK -case 213: -YY_RULE_SETUP -#line 521 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 400, 0, DVEC2); - YY_BREAK -case 214: -YY_RULE_SETUP -#line 522 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 400, 0, DVEC3); - YY_BREAK -case 215: -YY_RULE_SETUP -#line 523 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 400, 0, DVEC4); - YY_BREAK -case 216: -YY_RULE_SETUP -#line 524 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, FVEC2); - YY_BREAK -case 217: -YY_RULE_SETUP -#line 525 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, FVEC3); - YY_BREAK -case 218: -YY_RULE_SETUP -#line 526 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, FVEC4); - YY_BREAK -case 219: -YY_RULE_SETUP -#line 527 "src/glsl/glsl_lexer.ll" -DEPRECATED_ES_KEYWORD(SAMPLER2DRECT); - YY_BREAK -case 220: -YY_RULE_SETUP -#line 528 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, SAMPLER3DRECT); - YY_BREAK -case 221: -YY_RULE_SETUP -#line 529 "src/glsl/glsl_lexer.ll" -DEPRECATED_ES_KEYWORD(SAMPLER2DRECTSHADOW); - YY_BREAK -case 222: -YY_RULE_SETUP -#line 530 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, SIZEOF); - YY_BREAK -case 223: -YY_RULE_SETUP -#line 531 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, CAST); - YY_BREAK -case 224: -YY_RULE_SETUP -#line 532 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, NAMESPACE); - YY_BREAK -case 225: -YY_RULE_SETUP -#line 533 "src/glsl/glsl_lexer.ll" -KEYWORD(110, 100, 0, 0, USING); - YY_BREAK -/* Additional reserved words in GLSL 1.20. */ -case 226: -YY_RULE_SETUP -#line 536 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 100, 130, 100, LOWP); - YY_BREAK -case 227: -YY_RULE_SETUP -#line 537 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 100, 130, 100, MEDIUMP); - YY_BREAK -case 228: -YY_RULE_SETUP -#line 538 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 100, 130, 100, HIGHP); - YY_BREAK -case 229: -YY_RULE_SETUP -#line 539 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 100, 130, 100, PRECISION); - YY_BREAK -/* Additional reserved words in GLSL 1.30. */ -case 230: -YY_RULE_SETUP -#line 542 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, CASE); - YY_BREAK -case 231: -YY_RULE_SETUP -#line 543 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 0, 0, COMMON); - YY_BREAK -case 232: -YY_RULE_SETUP -#line 544 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 0, 0, PARTITION); - YY_BREAK -case 233: -YY_RULE_SETUP -#line 545 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 0, 0, ACTIVE); - YY_BREAK -case 234: -YY_RULE_SETUP -#line 546 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 100, 0, 0, SUPERP); - YY_BREAK -case 235: -YY_RULE_SETUP -#line 547 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 140, 0, SAMPLERBUFFER); - YY_BREAK -case 236: -YY_RULE_SETUP -#line 548 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 0, 0, FILTER); - YY_BREAK -case 237: -YY_RULE_SETUP -#line 549 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(130, 0, 140, 0, yyextra->ARB_uniform_buffer_object_enable && !yyextra->es_shader, ROW_MAJOR); - YY_BREAK -/* Additional reserved words in GLSL 1.40 */ -case 238: -YY_RULE_SETUP -#line 552 "src/glsl/glsl_lexer.ll" -KEYWORD(140, 300, 140, 0, ISAMPLER2DRECT); - YY_BREAK -case 239: -YY_RULE_SETUP -#line 553 "src/glsl/glsl_lexer.ll" -KEYWORD(140, 300, 140, 0, USAMPLER2DRECT); - YY_BREAK -case 240: -YY_RULE_SETUP -#line 554 "src/glsl/glsl_lexer.ll" -KEYWORD(140, 300, 140, 0, ISAMPLERBUFFER); - YY_BREAK -case 241: -YY_RULE_SETUP -#line 555 "src/glsl/glsl_lexer.ll" -KEYWORD(140, 300, 140, 0, USAMPLERBUFFER); - YY_BREAK -/* Additional reserved words in GLSL ES 3.00 */ -case 242: -YY_RULE_SETUP -#line 558 "src/glsl/glsl_lexer.ll" -KEYWORD(0, 300, 0, 0, RESOURCE); - YY_BREAK -case 243: -YY_RULE_SETUP -#line 559 "src/glsl/glsl_lexer.ll" -KEYWORD(0, 300, 0, 0, PATCH); - YY_BREAK -case 244: -YY_RULE_SETUP -#line 560 "src/glsl/glsl_lexer.ll" -KEYWORD_WITH_ALT(400, 300, 400, 0, yyextra->ARB_gpu_shader5_enable, SAMPLE); - YY_BREAK -case 245: -YY_RULE_SETUP -#line 561 "src/glsl/glsl_lexer.ll" -KEYWORD(0, 300, 0, 0, SUBROUTINE); - YY_BREAK -case 246: -YY_RULE_SETUP -#line 564 "src/glsl/glsl_lexer.ll" -{ - struct _mesa_glsl_parse_state *state = yyextra; - void *ctx = state; - yylval->identifier = ralloc_strdup(ctx, yytext); - return classify_identifier(state, yytext); - } - YY_BREAK -case 247: -YY_RULE_SETUP -#line 571 "src/glsl/glsl_lexer.ll" -{ return yytext[0]; } - YY_BREAK -case 248: -YY_RULE_SETUP -#line 573 "src/glsl/glsl_lexer.ll" -YY_FATAL_ERROR( "flex scanner jammed" ); - YY_BREAK -#line 3172 "src/glsl/glsl_lexer.cpp" -case YY_STATE_EOF(INITIAL): -case YY_STATE_EOF(PP): -case YY_STATE_EOF(PRAGMA): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = yyg->yy_hold_char; - YY_RESTORE_YY_MORE_OFFSET - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between YY_CURRENT_BUFFER and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( yyscanner ); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); - - yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++yyg->yy_c_buf_p; - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = yyg->yy_last_accepting_cpos; - yy_current_state = yyg->yy_last_accepting_state; - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer( yyscanner ) ) - { - case EOB_ACT_END_OF_FILE: - { - yyg->yy_did_buffer_switch_on_eof = 0; - - if ( yywrap( yyscanner ) ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! yyg->yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - yyg->yy_c_buf_p = - yyg->yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( yyscanner ); - - yy_cp = yyg->yy_c_buf_p; - yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - yyg->yy_c_buf_p = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; - - yy_current_state = yy_get_previous_state( yyscanner ); - - yy_cp = yyg->yy_c_buf_p; - yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of user's declarations */ -} /* end of yylex */ - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ -static int yy_get_next_buffer (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - char *source = yyg->yytext_ptr; - int number_to_move, i; - int ret_val; - - if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1); - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; - - else - { - int num_to_read = - YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; - - int yy_c_buf_p_offset = - (int) (yyg->yy_c_buf_p - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - yyrealloc( (void *) b->yy_ch_buf, - (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = NULL; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - - number_to_move - 1; - - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), - yyg->yy_n_chars, num_to_read ); - - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; - } - - if ( yyg->yy_n_chars == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin , yyscanner); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( - (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner ); - if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - /* "- 2" to take care of EOB's */ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); - } - - yyg->yy_n_chars += number_to_move; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; - - return ret_val; -} - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - - static yy_state_type yy_get_previous_state (yyscan_t yyscanner) -{ - yy_state_type yy_current_state; - char *yy_cp; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - yy_current_state = yyg->yy_start; - yy_current_state += YY_AT_BOL(); - - for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) - { - YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - yyg->yy_last_accepting_state = yy_current_state; - yyg->yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1009 ) - yy_c = yy_meta[yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - } - - return yy_current_state; -} - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) -{ - int yy_is_jam; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ - char *yy_cp = yyg->yy_c_buf_p; - - YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - yyg->yy_last_accepting_state = yy_current_state; - yyg->yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1009 ) - yy_c = yy_meta[yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1008); - - (void)yyg; - return yy_is_jam ? 0 : yy_current_state; -} - -#ifndef YY_NO_UNPUT - -#endif - -#ifndef YY_NO_INPUT -#ifdef __cplusplus - static int yyinput (yyscan_t yyscanner) -#else - static int input (yyscan_t yyscanner) -#endif - -{ - int c; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - *yyg->yy_c_buf_p = yyg->yy_hold_char; - - if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) - /* This was really a NUL. */ - *yyg->yy_c_buf_p = '\0'; - - else - { /* need more input */ - int offset = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr); - ++yyg->yy_c_buf_p; - - switch ( yy_get_next_buffer( yyscanner ) ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - yyrestart( yyin , yyscanner); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: - { - if ( yywrap( yyscanner ) ) - return 0; - - if ( ! yyg->yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(yyscanner); -#else - return input(yyscanner); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - yyg->yy_c_buf_p = yyg->yytext_ptr + offset; - break; - } - } - } - - c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ - *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ - yyg->yy_hold_char = *++yyg->yy_c_buf_p; - - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); - - return c; -} -#endif /* ifndef YY_NO_INPUT */ - -/** Immediately switch to a different input stream. - * @param input_file A readable stream. - * @param yyscanner The scanner object. - * @note This function does not reset the start condition to @c INITIAL . - */ - void yyrestart (FILE * input_file , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - if ( ! YY_CURRENT_BUFFER ){ - yyensure_buffer_stack (yyscanner); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); - } - - yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner); - yy_load_buffer_state( yyscanner ); -} - -/** Switch to a different input buffer. - * @param new_buffer The new input buffer. - * @param yyscanner The scanner object. - */ - void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - /* TODO. We should be able to replace this entire function body - * with - * yypop_buffer_state(); - * yypush_buffer_state(new_buffer); - */ - yyensure_buffer_stack (yyscanner); - if ( YY_CURRENT_BUFFER == new_buffer ) - return; - - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *yyg->yy_c_buf_p = yyg->yy_hold_char; - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; - } - - YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state( yyscanner ); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - yyg->yy_did_buffer_switch_on_eof = 1; -} - -static void yy_load_buffer_state (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - yyg->yy_hold_char = *yyg->yy_c_buf_p; -} - -/** Allocate and initialize an input buffer state. - * @param file A readable stream. - * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. - * @param yyscanner The scanner object. - * @return the allocated buffer state. - */ - YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) -{ - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer( b, file , yyscanner); - - return b; -} - -/** Destroy the buffer. - * @param b a buffer created with yy_create_buffer() - * @param yyscanner The scanner object. - */ - void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - if ( ! b ) - return; - - if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ - YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yyfree( (void *) b->yy_ch_buf , yyscanner ); - - yyfree( (void *) b , yyscanner ); -} - -/* Initializes or reinitializes a buffer. - * This function is sometimes called more than once on the same buffer, - * such as during a yyrestart() or at EOF. - */ - static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) - -{ - int oerrno = errno; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - yy_flush_buffer( b , yyscanner); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - - /* If b is the current buffer, then yy_init_buffer was _probably_ - * called from yyrestart() or through yy_get_next_buffer. - * In that case, we don't want to reset the lineno or column. - */ - if (b != YY_CURRENT_BUFFER){ - b->yy_bs_lineno = 1; - b->yy_bs_column = 0; - } - - b->yy_is_interactive = 0; - - errno = oerrno; -} - -/** Discard all buffered characters. On the next scan, YY_INPUT will be called. - * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. - * @param yyscanner The scanner object. - */ - void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - if ( ! b ) - return; - - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == YY_CURRENT_BUFFER ) - yy_load_buffer_state( yyscanner ); -} - -/** Pushes the new state onto the stack. The new state becomes - * the current state. This function will allocate the stack - * if necessary. - * @param new_buffer The new state. - * @param yyscanner The scanner object. - */ -void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - if (new_buffer == NULL) - return; - - yyensure_buffer_stack(yyscanner); - - /* This block is copied from yy_switch_to_buffer. */ - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *yyg->yy_c_buf_p = yyg->yy_hold_char; - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; - } - - /* Only push if top exists. Otherwise, replace top. */ - if (YY_CURRENT_BUFFER) - yyg->yy_buffer_stack_top++; - YY_CURRENT_BUFFER_LVALUE = new_buffer; - - /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( yyscanner ); - yyg->yy_did_buffer_switch_on_eof = 1; -} - -/** Removes and deletes the top of the stack, if present. - * The next element becomes the new top. - * @param yyscanner The scanner object. - */ -void yypop_buffer_state (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - if (!YY_CURRENT_BUFFER) - return; - - yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner); - YY_CURRENT_BUFFER_LVALUE = NULL; - if (yyg->yy_buffer_stack_top > 0) - --yyg->yy_buffer_stack_top; - - if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( yyscanner ); - yyg->yy_did_buffer_switch_on_eof = 1; - } -} - -/* Allocates the stack if it does not exist. - * Guarantees space for at least one push. - */ -static void yyensure_buffer_stack (yyscan_t yyscanner) -{ - yy_size_t num_to_alloc; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - if (!yyg->yy_buffer_stack) { - - /* First allocation is just for 2 elements, since we don't know if this - * scanner will even need a stack. We use 2 instead of 1 to avoid an - * immediate realloc on the next call. - */ - num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ - yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc - (num_to_alloc * sizeof(struct yy_buffer_state*) - , yyscanner); - if ( ! yyg->yy_buffer_stack ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - - memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - - yyg->yy_buffer_stack_max = num_to_alloc; - yyg->yy_buffer_stack_top = 0; - return; - } - - if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ - - /* Increase the buffer to prepare for a possible push. */ - yy_size_t grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = yyg->yy_buffer_stack_max + grow_size; - yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc - (yyg->yy_buffer_stack, - num_to_alloc * sizeof(struct yy_buffer_state*) - , yyscanner); - if ( ! yyg->yy_buffer_stack ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - - /* zero only the new slots.*/ - memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); - yyg->yy_buffer_stack_max = num_to_alloc; - } -} - -/** Setup the input buffer state to scan directly from a user-specified character buffer. - * @param base the character buffer - * @param size the size in bytes of the character buffer - * @param yyscanner The scanner object. - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) -{ - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return NULL; - - b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = NULL; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer( b , yyscanner ); - - return b; -} - -/** Setup the input buffer state to scan a string. The next call to yylex() will - * scan from a @e copy of @a str. - * @param yystr a NUL-terminated string to scan - * @param yyscanner The scanner object. - * @return the newly allocated buffer state object. - * @note If you want to scan bytes that may contain NUL values, then use - * yy_scan_bytes() instead. - */ -YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner) -{ - - return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner); -} - -/** Setup the input buffer state to scan the given bytes. The next call to yylex() will - * scan from a @e copy of @a bytes. - * @param yybytes the byte buffer to scan - * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. - * @param yyscanner The scanner object. - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner) -{ - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = (yy_size_t) (_yybytes_len + 2); - buf = (char *) yyalloc( n , yyscanner ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < _yybytes_len; ++i ) - buf[i] = yybytes[i]; - - buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer( buf, n , yyscanner); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; -} - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); -} - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - yytext[yyleng] = yyg->yy_hold_char; \ - yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ - yyg->yy_hold_char = *yyg->yy_c_buf_p; \ - *yyg->yy_c_buf_p = '\0'; \ - yyleng = yyless_macro_arg; \ - } \ - while ( 0 ) - -/* Accessor methods (get/set functions) to struct members. */ - -/** Get the user-defined data for this scanner. - * @param yyscanner The scanner object. - */ -YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yyextra; -} - -/** Get the current line number. - * @param yyscanner The scanner object. - */ -int yyget_lineno (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - if (! YY_CURRENT_BUFFER) - return 0; - - return yylineno; -} - -/** Get the current column number. - * @param yyscanner The scanner object. - */ -int yyget_column (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - if (! YY_CURRENT_BUFFER) - return 0; - - return yycolumn; -} - -/** Get the input stream. - * @param yyscanner The scanner object. - */ -FILE *yyget_in (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yyin; -} - -/** Get the output stream. - * @param yyscanner The scanner object. - */ -FILE *yyget_out (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yyout; -} - -/** Get the length of the current token. - * @param yyscanner The scanner object. - */ -int yyget_leng (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yyleng; -} - -/** Get the current token. - * @param yyscanner The scanner object. - */ - -char *yyget_text (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yytext; -} - -/** Set the user-defined data. This data is never touched by the scanner. - * @param user_defined The data to be associated with this scanner. - * @param yyscanner The scanner object. - */ -void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyextra = user_defined ; -} - -/** Set the current line number. - * @param _line_number line number - * @param yyscanner The scanner object. - */ -void yyset_lineno (int _line_number , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - /* lineno is only valid if an input buffer exists. */ - if (! YY_CURRENT_BUFFER ) - YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); - - yylineno = _line_number; -} - -/** Set the current column. - * @param _column_no column number - * @param yyscanner The scanner object. - */ -void yyset_column (int _column_no , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - /* column is only valid if an input buffer exists. */ - if (! YY_CURRENT_BUFFER ) - YY_FATAL_ERROR( "yyset_column called with no buffer" ); - - yycolumn = _column_no; -} - -/** Set the input stream. This does not discard the current - * input buffer. - * @param _in_str A readable stream. - * @param yyscanner The scanner object. - * @see yy_switch_to_buffer - */ -void yyset_in (FILE * _in_str , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyin = _in_str ; -} - -void yyset_out (FILE * _out_str , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyout = _out_str ; -} - -int yyget_debug (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yy_flex_debug; -} - -void yyset_debug (int _bdebug , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yy_flex_debug = _bdebug ; -} - -/* Accessor methods for yylval and yylloc */ - -YYSTYPE * yyget_lval (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yylval; -} - -void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yylval = yylval_param; -} - -YYLTYPE *yyget_lloc (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yylloc; -} - -void yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yylloc = yylloc_param; -} - -/* User-visible API */ - -/* yylex_init is special because it creates the scanner itself, so it is - * the ONLY reentrant function that doesn't take the scanner as the last argument. - * That's why we explicitly handle the declaration, instead of using our macros. - */ -int yylex_init(yyscan_t* ptr_yy_globals) -{ - if (ptr_yy_globals == NULL){ - errno = EINVAL; - return 1; - } - - *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); - - if (*ptr_yy_globals == NULL){ - errno = ENOMEM; - return 1; - } - - /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ - memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); - - return yy_init_globals ( *ptr_yy_globals ); -} - -/* yylex_init_extra has the same functionality as yylex_init, but follows the - * convention of taking the scanner as the last argument. Note however, that - * this is a *pointer* to a scanner, as it will be allocated by this call (and - * is the reason, too, why this function also must handle its own declaration). - * The user defined value in the first argument will be available to yyalloc in - * the yyextra field. - */ -int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals ) -{ - struct yyguts_t dummy_yyguts; - - yyset_extra (yy_user_defined, &dummy_yyguts); - - if (ptr_yy_globals == NULL){ - errno = EINVAL; - return 1; - } - - *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); - - if (*ptr_yy_globals == NULL){ - errno = ENOMEM; - return 1; - } - - /* By setting to 0xAA, we expose bugs in - yy_init_globals. Leave at 0x00 for releases. */ - memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); - - yyset_extra (yy_user_defined, *ptr_yy_globals); - - return yy_init_globals ( *ptr_yy_globals ); -} - -static int yy_init_globals (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - /* Initialization is the same as for the non-reentrant scanner. - * This function is called from yylex_destroy(), so don't allocate here. - */ - - yyg->yy_buffer_stack = NULL; - yyg->yy_buffer_stack_top = 0; - yyg->yy_buffer_stack_max = 0; - yyg->yy_c_buf_p = NULL; - yyg->yy_init = 0; - yyg->yy_start = 0; - - yyg->yy_start_stack_ptr = 0; - yyg->yy_start_stack_depth = 0; - yyg->yy_start_stack = NULL; - -/* Defined in main.c */ -#ifdef YY_STDINIT - yyin = stdin; - yyout = stdout; -#else - yyin = NULL; - yyout = NULL; -#endif - - /* For future reference: Set errno on error, since we are called by - * yylex_init() - */ - return 0; -} - -/* yylex_destroy is for both reentrant and non-reentrant scanners. */ -int yylex_destroy (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - /* Pop the buffer stack, destroying each element. */ - while(YY_CURRENT_BUFFER){ - yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner ); - YY_CURRENT_BUFFER_LVALUE = NULL; - yypop_buffer_state(yyscanner); - } - - /* Destroy the stack itself. */ - yyfree(yyg->yy_buffer_stack , yyscanner); - yyg->yy_buffer_stack = NULL; - - /* Destroy the start condition stack. */ - yyfree( yyg->yy_start_stack , yyscanner ); - yyg->yy_start_stack = NULL; - - /* Reset the globals. This is important in a non-reentrant scanner so the next time - * yylex() is called, initialization will occur. */ - yy_init_globals( yyscanner); - - /* Destroy the main struct (reentrant only). */ - yyfree ( yyscanner , yyscanner ); - yyscanner = NULL; - return 0; -} - -/* - * Internal utility routines. - */ - -#ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - - int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; -} -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (const char * s , yyscan_t yyscanner) -{ - int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; -} -#endif - -void *yyalloc (yy_size_t size , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - return malloc(size); -} - -void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return realloc(ptr, size); -} - -void yyfree (void * ptr , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ -} - -#define YYTABLES_NAME "yytables" - -#line 573 "src/glsl/glsl_lexer.ll" - - -int -classify_identifier(struct _mesa_glsl_parse_state *state, const char *name) -{ - if (state->symbols->get_variable(name) || state->symbols->get_function(name)) - return IDENTIFIER; - else if (state->symbols->get_type(name)) - return TYPE_IDENTIFIER; - else - return NEW_IDENTIFIER; -} - -void -_mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state, const char *string) -{ - yylex_init_extra(state, & state->scanner); - yy_scan_string(string, state->scanner); -} - -void -_mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state) -{ - yylex_destroy(state->scanner); -} - diff --git a/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.ll b/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.ll deleted file mode 100644 index bc01ca367..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.ll +++ /dev/null @@ -1,596 +0,0 @@ -%{ -/* - * Copyright © 2008, 2009 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#include -#include -#include "strtod.h" -#include "ast.h" -#include "glsl_parser_extras.h" -#include "glsl_parser.h" - -#if defined(_MSC_VER) -# pragma warning(disable: 4065) // warning C4065: switch statement contains 'default' but no 'case' labels -# pragma warning(disable: 4244) // warning C4244: '=' : conversion from 'double' to 'float', possible loss of data -# pragma warning(disable: 4267) // warning C4267: '=' : conversion from 'size_t' to 'int', possible loss of data -#endif // defined(_MSC_VER) - -static int classify_identifier(struct _mesa_glsl_parse_state *, const char *); - -#ifdef _MSC_VER -#define YY_NO_UNISTD_H -#endif - -#define YY_USER_ACTION \ - do { \ - yylloc->source = 0; \ - yylloc->first_column = yycolumn + 1; \ - yylloc->first_line = yylloc->last_line = yylineno + 1; \ - yycolumn += yyleng; \ - yylloc->last_column = yycolumn + 1; \ - } while(0); - -#define YY_USER_INIT yylineno = 0; yycolumn = 0; - -/* A macro for handling reserved words and keywords across language versions. - * - * Certain words start out as identifiers, become reserved words in - * later language revisions, and finally become language keywords. - * This may happen at different times in desktop GLSL and GLSL ES. - * - * For example, consider the following lexer rule: - * samplerBuffer KEYWORD(130, 0, 140, 0, SAMPLERBUFFER) - * - * This means that "samplerBuffer" will be treated as: - * - a keyword (SAMPLERBUFFER token) ...in GLSL >= 1.40 - * - a reserved word - error ...in GLSL >= 1.30 - * - an identifier ...in GLSL < 1.30 or GLSL ES - */ -#define KEYWORD(reserved_glsl, reserved_glsl_es, \ - allowed_glsl, allowed_glsl_es, token) \ - KEYWORD_WITH_ALT(reserved_glsl, reserved_glsl_es, \ - allowed_glsl, allowed_glsl_es, false, token) - -/** - * Like the KEYWORD macro, but the word is also treated as a keyword - * if the given boolean expression is true. - */ -#define KEYWORD_WITH_ALT(reserved_glsl, reserved_glsl_es, \ - allowed_glsl, allowed_glsl_es, \ - alt_expr, token) \ - do { \ - if (yyextra->is_version(allowed_glsl, allowed_glsl_es) \ - || (alt_expr)) { \ - return token; \ - } else if (yyextra->is_version(reserved_glsl, \ - reserved_glsl_es)) { \ - _mesa_glsl_error(yylloc, yyextra, \ - "illegal use of reserved word `%s'", yytext); \ - return ERROR_TOK; \ - } else { \ - void *mem_ctx = yyextra; \ - yylval->identifier = ralloc_strdup(mem_ctx, yytext); \ - return classify_identifier(yyextra, yytext); \ - } \ - } while (0) - -/** - * A macro for handling keywords that have been present in GLSL since - * its origin, but were changed into reserved words in GLSL 3.00 ES. - */ -#define DEPRECATED_ES_KEYWORD(token) \ - do { \ - if (yyextra->is_version(0, 300)) { \ - _mesa_glsl_error(yylloc, yyextra, \ - "illegal use of reserved word `%s'", yytext); \ - return ERROR_TOK; \ - } else { \ - return token; \ - } \ - } while (0) - -static int -literal_integer(char *text, int len, struct _mesa_glsl_parse_state *state, - YYSTYPE *lval, YYLTYPE *lloc, int base) -{ - bool is_uint = (text[len - 1] == 'u' || - text[len - 1] == 'U'); - const char *digits = text; - - /* Skip "0x" */ - if (base == 16) - digits += 2; - -#ifdef _MSC_VER - unsigned __int64 value = _strtoui64(digits, NULL, base); -#else - unsigned long long value = strtoull(digits, NULL, base); -#endif - - lval->n = (int)value; - - if (value > UINT_MAX) { - /* Note that signed 0xffffffff is valid, not out of range! */ - if (state->is_version(130, 300)) { - _mesa_glsl_error(lloc, state, - "literal value `%s' out of range", text); - } else { - _mesa_glsl_warning(lloc, state, - "literal value `%s' out of range", text); - } - } else if (base == 10 && !is_uint && (unsigned)value > (unsigned)INT_MAX + 1) { - /* Tries to catch unintentionally providing a negative value. - * Note that -2147483648 is parsed as -(2147483648), so we don't - * want to warn for INT_MAX. - */ - _mesa_glsl_warning(lloc, state, - "signed literal value `%s' is interpreted as %d", - text, lval->n); - } - return is_uint ? UINTCONSTANT : INTCONSTANT; -} - -#define LITERAL_INTEGER(base) \ - literal_integer(yytext, yyleng, yyextra, yylval, yylloc, base) - -%} - -%option bison-bridge bison-locations reentrant noyywrap -%option nounput noyy_top_state -%option never-interactive -%option prefix="_mesa_glsl_lexer_" -%option extra-type="struct _mesa_glsl_parse_state *" -%option warn nodefault - - /* Note: When adding any start conditions to this list, you must also - * update the "Internal compiler error" catch-all rule near the end of - * this file. */ -%x PP PRAGMA - -DEC_INT [1-9][0-9]* -HEX_INT 0[xX][0-9a-fA-F]+ -OCT_INT 0[0-7]* -INT_T ({DEC_INT}|{HEX_INT}|{OCT_INT}) -SPC [ \t]* -SPCP [ \t]+ -HASH ^{SPC}#{SPC} -%% - -[ \r\t]+ ; - - /* Preprocessor tokens. */ -^[ \t]*#[ \t]*$ ; -^[ \t]*#[ \t]*version { BEGIN PP; return VERSION_TOK; } -^[ \t]*#[ \t]*extension { BEGIN PP; return EXTENSION; } -{HASH}line{SPCP}{INT_T}{SPCP}{INT_T}{SPC}$ { - /* Eat characters until the first digit is - * encountered - */ - char *ptr = yytext; - while (!isdigit(*ptr)) - ptr++; - - /* Subtract one from the line number because - * yylineno is zero-based instead of - * one-based. - */ - yylineno = strtol(ptr, &ptr, 0) - 1; - yylloc->source = strtol(ptr, NULL, 0); - } -{HASH}line{SPCP}{INT_T}{SPC}$ { - /* Eat characters until the first digit is - * encountered - */ - char *ptr = yytext; - while (!isdigit(*ptr)) - ptr++; - - /* Subtract one from the line number because - * yylineno is zero-based instead of - * one-based. - */ - yylineno = strtol(ptr, &ptr, 0) - 1; - } -^{SPC}#{SPC}pragma{SPCP}debug{SPC}\({SPC}on{SPC}\) { - BEGIN PP; - return PRAGMA_DEBUG_ON; - } -^{SPC}#{SPC}pragma{SPCP}debug{SPC}\({SPC}off{SPC}\) { - BEGIN PP; - return PRAGMA_DEBUG_OFF; - } -^{SPC}#{SPC}pragma{SPCP}optimize{SPC}\({SPC}on{SPC}\) { - BEGIN PP; - return PRAGMA_OPTIMIZE_ON; - } -^{SPC}#{SPC}pragma{SPCP}optimize{SPC}\({SPC}off{SPC}\) { - BEGIN PP; - return PRAGMA_OPTIMIZE_OFF; - } -^{SPC}#{SPC}pragma{SPCP}STDGL{SPCP}invariant{SPC}\({SPC}all{SPC}\) { - BEGIN PP; - return PRAGMA_INVARIANT_ALL; - } -^{SPC}#{SPC}pragma{SPCP} { BEGIN PRAGMA; } - -\n { BEGIN 0; yylineno++; yycolumn = 0; } -. { } - -\/\/[^\n]* { } -[ \t\r]* { } -: return COLON; -[_a-zA-Z][_a-zA-Z0-9]* { - void *mem_ctx = yyextra; - yylval->identifier = ralloc_strdup(mem_ctx, yytext); - return IDENTIFIER; - } -[1-9][0-9]* { - yylval->n = strtol(yytext, NULL, 10); - return INTCONSTANT; - } -\n { BEGIN 0; yylineno++; yycolumn = 0; return EOL; } -. { return yytext[0]; } - -\n { yylineno++; yycolumn = 0; } - -attribute DEPRECATED_ES_KEYWORD(ATTRIBUTE); -const return CONST_TOK; -bool return BOOL_TOK; -float return FLOAT_TOK; -int return INT_TOK; -uint KEYWORD(130, 300, 130, 300, UINT_TOK); - -break return BREAK; -continue return CONTINUE; -do return DO; -while return WHILE; -else return ELSE; -for return FOR; -if return IF; -discard return DISCARD; -return return RETURN; - -bvec2 return BVEC2; -bvec3 return BVEC3; -bvec4 return BVEC4; -ivec2 return IVEC2; -ivec3 return IVEC3; -ivec4 return IVEC4; -uvec2 KEYWORD(130, 300, 130, 300, UVEC2); -uvec3 KEYWORD(130, 300, 130, 300, UVEC3); -uvec4 KEYWORD(130, 300, 130, 300, UVEC4); -vec2 return VEC2; -vec3 return VEC3; -vec4 return VEC4; -mat2 return MAT2X2; -mat3 return MAT3X3; -mat4 return MAT4X4; -mat2x2 KEYWORD(120, 300, 120, 300, MAT2X2); -mat2x3 KEYWORD(120, 300, 120, 300, MAT2X3); -mat2x4 KEYWORD(120, 300, 120, 300, MAT2X4); -mat3x2 KEYWORD(120, 300, 120, 300, MAT3X2); -mat3x3 KEYWORD(120, 300, 120, 300, MAT3X3); -mat3x4 KEYWORD(120, 300, 120, 300, MAT3X4); -mat4x2 KEYWORD(120, 300, 120, 300, MAT4X2); -mat4x3 KEYWORD(120, 300, 120, 300, MAT4X3); -mat4x4 KEYWORD(120, 300, 120, 300, MAT4X4); - -in return IN_TOK; -out return OUT_TOK; -inout return INOUT_TOK; -uniform return UNIFORM; -varying DEPRECATED_ES_KEYWORD(VARYING); -centroid KEYWORD(120, 300, 120, 300, CENTROID); -invariant KEYWORD(120, 100, 120, 100, INVARIANT); -flat KEYWORD(130, 100, 130, 300, FLAT); -smooth KEYWORD(130, 300, 130, 300, SMOOTH); -noperspective KEYWORD(130, 300, 130, 0, NOPERSPECTIVE); - -sampler1D DEPRECATED_ES_KEYWORD(SAMPLER1D); -sampler2D return SAMPLER2D; -sampler3D return SAMPLER3D; -samplerCube return SAMPLERCUBE; -sampler1DArray KEYWORD(130, 300, 130, 0, SAMPLER1DARRAY); -sampler2DArray KEYWORD(130, 300, 130, 300, SAMPLER2DARRAY); -sampler1DShadow DEPRECATED_ES_KEYWORD(SAMPLER1DSHADOW); -sampler2DShadow return SAMPLER2DSHADOW; -samplerCubeShadow KEYWORD(130, 300, 130, 300, SAMPLERCUBESHADOW); -sampler1DArrayShadow KEYWORD(130, 300, 130, 0, SAMPLER1DARRAYSHADOW); -sampler2DArrayShadow KEYWORD(130, 300, 130, 300, SAMPLER2DARRAYSHADOW); -isampler1D KEYWORD(130, 300, 130, 0, ISAMPLER1D); -isampler2D KEYWORD(130, 300, 130, 300, ISAMPLER2D); -isampler3D KEYWORD(130, 300, 130, 300, ISAMPLER3D); -isamplerCube KEYWORD(130, 300, 130, 300, ISAMPLERCUBE); -isampler1DArray KEYWORD(130, 300, 130, 0, ISAMPLER1DARRAY); -isampler2DArray KEYWORD(130, 300, 130, 300, ISAMPLER2DARRAY); -usampler1D KEYWORD(130, 300, 130, 0, USAMPLER1D); -usampler2D KEYWORD(130, 300, 130, 300, USAMPLER2D); -usampler3D KEYWORD(130, 300, 130, 300, USAMPLER3D); -usamplerCube KEYWORD(130, 300, 130, 300, USAMPLERCUBE); -usampler1DArray KEYWORD(130, 300, 130, 0, USAMPLER1DARRAY); -usampler2DArray KEYWORD(130, 300, 130, 300, USAMPLER2DARRAY); - - /* additional keywords in ARB_texture_multisample, included in GLSL 1.50 */ - /* these are reserved but not defined in GLSL 3.00 */ -sampler2DMS KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, SAMPLER2DMS); -isampler2DMS KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, ISAMPLER2DMS); -usampler2DMS KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, USAMPLER2DMS); -sampler2DMSArray KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, SAMPLER2DMSARRAY); -isampler2DMSArray KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, ISAMPLER2DMSARRAY); -usampler2DMSArray KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, USAMPLER2DMSARRAY); - - /* keywords available with ARB_texture_cube_map_array_enable extension on desktop GLSL */ -samplerCubeArray KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_texture_cube_map_array_enable, SAMPLERCUBEARRAY); -isamplerCubeArray KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_texture_cube_map_array_enable, ISAMPLERCUBEARRAY); -usamplerCubeArray KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_texture_cube_map_array_enable, USAMPLERCUBEARRAY); -samplerCubeArrayShadow KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_texture_cube_map_array_enable, SAMPLERCUBEARRAYSHADOW); - -samplerExternalOES { - if (yyextra->OES_EGL_image_external_enable) - return SAMPLEREXTERNALOES; - else - return IDENTIFIER; - } - - /* keywords available with ARB_gpu_shader5 */ -precise KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_gpu_shader5_enable, PRECISE); - - /* keywords available with ARB_shader_image_load_store */ -image1D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE1D); -image2D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2D); -image3D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE3D); -image2DRect KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DRECT); -imageCube KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGECUBE); -imageBuffer KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGEBUFFER); -image1DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE1DARRAY); -image2DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DARRAY); -imageCubeArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGECUBEARRAY); -image2DMS KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DMS); -image2DMSArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DMSARRAY); -iimage1D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE1D); -iimage2D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2D); -iimage3D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE3D); -iimage2DRect KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DRECT); -iimageCube KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGECUBE); -iimageBuffer KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGEBUFFER); -iimage1DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE1DARRAY); -iimage2DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DARRAY); -iimageCubeArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGECUBEARRAY); -iimage2DMS KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DMS); -iimage2DMSArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DMSARRAY); -uimage1D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE1D); -uimage2D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2D); -uimage3D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE3D); -uimage2DRect KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DRECT); -uimageCube KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGECUBE); -uimageBuffer KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGEBUFFER); -uimage1DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE1DARRAY); -uimage2DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DARRAY); -uimageCubeArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGECUBEARRAY); -uimage2DMS KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DMS); -uimage2DMSArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DMSARRAY); -image1DShadow KEYWORD(130, 300, 0, 0, IMAGE1DSHADOW); -image2DShadow KEYWORD(130, 300, 0, 0, IMAGE2DSHADOW); -image1DArrayShadow KEYWORD(130, 300, 0, 0, IMAGE1DARRAYSHADOW); -image2DArrayShadow KEYWORD(130, 300, 0, 0, IMAGE2DARRAYSHADOW); - -coherent KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, COHERENT); -volatile KEYWORD_WITH_ALT(110, 100, 420, 0, yyextra->ARB_shader_image_load_store_enable, VOLATILE); -restrict KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, RESTRICT); -readonly KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, READONLY); -writeonly KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, WRITEONLY); - -atomic_uint KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_atomic_counters_enable, ATOMIC_UINT); - -struct return STRUCT; -void return VOID_TOK; - -layout { - if ((yyextra->is_version(140, 300)) - || yyextra->AMD_conservative_depth_enable - || yyextra->ARB_conservative_depth_enable - || yyextra->ARB_explicit_attrib_location_enable - || yyextra->ARB_explicit_uniform_location_enable - || yyextra->has_separate_shader_objects() - || yyextra->ARB_uniform_buffer_object_enable - || yyextra->ARB_fragment_coord_conventions_enable - || yyextra->ARB_shading_language_420pack_enable - || yyextra->ARB_compute_shader_enable) { - return LAYOUT_TOK; - } else { - void *mem_ctx = yyextra; - yylval->identifier = ralloc_strdup(mem_ctx, yytext); - return classify_identifier(yyextra, yytext); - } - } - -\+\+ return INC_OP; --- return DEC_OP; -\<= return LE_OP; ->= return GE_OP; -== return EQ_OP; -!= return NE_OP; -&& return AND_OP; -\|\| return OR_OP; -"^^" return XOR_OP; -"<<" return LEFT_OP; -">>" return RIGHT_OP; - -\*= return MUL_ASSIGN; -\/= return DIV_ASSIGN; -\+= return ADD_ASSIGN; -\%= return MOD_ASSIGN; -\<\<= return LEFT_ASSIGN; ->>= return RIGHT_ASSIGN; -&= return AND_ASSIGN; -"^=" return XOR_ASSIGN; -\|= return OR_ASSIGN; --= return SUB_ASSIGN; - -[1-9][0-9]*[uU]? { - return LITERAL_INTEGER(10); - } -0[xX][0-9a-fA-F]+[uU]? { - return LITERAL_INTEGER(16); - } -0[0-7]*[uU]? { - return LITERAL_INTEGER(8); - } - -[0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fF]? { - yylval->real = glsl_strtof(yytext, NULL); - return FLOATCONSTANT; - } -\.[0-9]+([eE][+-]?[0-9]+)?[fF]? { - yylval->real = glsl_strtof(yytext, NULL); - return FLOATCONSTANT; - } -[0-9]+\.([eE][+-]?[0-9]+)?[fF]? { - yylval->real = glsl_strtof(yytext, NULL); - return FLOATCONSTANT; - } -[0-9]+[eE][+-]?[0-9]+[fF]? { - yylval->real = glsl_strtof(yytext, NULL); - return FLOATCONSTANT; - } -[0-9]+[fF] { - yylval->real = glsl_strtof(yytext, NULL); - return FLOATCONSTANT; - } - -true { - yylval->n = 1; - return BOOLCONSTANT; - } -false { - yylval->n = 0; - return BOOLCONSTANT; - } - - - /* Reserved words in GLSL 1.10. */ -asm KEYWORD(110, 100, 0, 0, ASM); -class KEYWORD(110, 100, 0, 0, CLASS); -union KEYWORD(110, 100, 0, 0, UNION); -enum KEYWORD(110, 100, 0, 0, ENUM); -typedef KEYWORD(110, 100, 0, 0, TYPEDEF); -template KEYWORD(110, 100, 0, 0, TEMPLATE); -this KEYWORD(110, 100, 0, 0, THIS); -packed KEYWORD_WITH_ALT(110, 100, 140, 300, yyextra->ARB_uniform_buffer_object_enable, PACKED_TOK); -goto KEYWORD(110, 100, 0, 0, GOTO); -switch KEYWORD(110, 100, 130, 300, SWITCH); -default KEYWORD(110, 100, 130, 300, DEFAULT); -inline KEYWORD(110, 100, 0, 0, INLINE_TOK); -noinline KEYWORD(110, 100, 0, 0, NOINLINE); -public KEYWORD(110, 100, 0, 0, PUBLIC_TOK); -static KEYWORD(110, 100, 0, 0, STATIC); -extern KEYWORD(110, 100, 0, 0, EXTERN); -external KEYWORD(110, 100, 0, 0, EXTERNAL); -interface KEYWORD(110, 100, 0, 0, INTERFACE); -long KEYWORD(110, 100, 0, 0, LONG_TOK); -short KEYWORD(110, 100, 0, 0, SHORT_TOK); -double KEYWORD(110, 100, 400, 0, DOUBLE_TOK); -half KEYWORD(110, 100, 0, 0, HALF); -fixed KEYWORD(110, 100, 0, 0, FIXED_TOK); -unsigned KEYWORD(110, 100, 0, 0, UNSIGNED); -input KEYWORD(110, 100, 0, 0, INPUT_TOK); -output KEYWORD(110, 100, 0, 0, OUTPUT); -hvec2 KEYWORD(110, 100, 0, 0, HVEC2); -hvec3 KEYWORD(110, 100, 0, 0, HVEC3); -hvec4 KEYWORD(110, 100, 0, 0, HVEC4); -dvec2 KEYWORD(110, 100, 400, 0, DVEC2); -dvec3 KEYWORD(110, 100, 400, 0, DVEC3); -dvec4 KEYWORD(110, 100, 400, 0, DVEC4); -fvec2 KEYWORD(110, 100, 0, 0, FVEC2); -fvec3 KEYWORD(110, 100, 0, 0, FVEC3); -fvec4 KEYWORD(110, 100, 0, 0, FVEC4); -sampler2DRect DEPRECATED_ES_KEYWORD(SAMPLER2DRECT); -sampler3DRect KEYWORD(110, 100, 0, 0, SAMPLER3DRECT); -sampler2DRectShadow DEPRECATED_ES_KEYWORD(SAMPLER2DRECTSHADOW); -sizeof KEYWORD(110, 100, 0, 0, SIZEOF); -cast KEYWORD(110, 100, 0, 0, CAST); -namespace KEYWORD(110, 100, 0, 0, NAMESPACE); -using KEYWORD(110, 100, 0, 0, USING); - - /* Additional reserved words in GLSL 1.20. */ -lowp KEYWORD(120, 100, 130, 100, LOWP); -mediump KEYWORD(120, 100, 130, 100, MEDIUMP); -highp KEYWORD(120, 100, 130, 100, HIGHP); -precision KEYWORD(120, 100, 130, 100, PRECISION); - - /* Additional reserved words in GLSL 1.30. */ -case KEYWORD(130, 300, 130, 300, CASE); -common KEYWORD(130, 300, 0, 0, COMMON); -partition KEYWORD(130, 300, 0, 0, PARTITION); -active KEYWORD(130, 300, 0, 0, ACTIVE); -superp KEYWORD(130, 100, 0, 0, SUPERP); -samplerBuffer KEYWORD(130, 300, 140, 0, SAMPLERBUFFER); -filter KEYWORD(130, 300, 0, 0, FILTER); -row_major KEYWORD_WITH_ALT(130, 0, 140, 0, yyextra->ARB_uniform_buffer_object_enable && !yyextra->es_shader, ROW_MAJOR); - - /* Additional reserved words in GLSL 1.40 */ -isampler2DRect KEYWORD(140, 300, 140, 0, ISAMPLER2DRECT); -usampler2DRect KEYWORD(140, 300, 140, 0, USAMPLER2DRECT); -isamplerBuffer KEYWORD(140, 300, 140, 0, ISAMPLERBUFFER); -usamplerBuffer KEYWORD(140, 300, 140, 0, USAMPLERBUFFER); - - /* Additional reserved words in GLSL ES 3.00 */ -resource KEYWORD(0, 300, 0, 0, RESOURCE); -patch KEYWORD(0, 300, 0, 0, PATCH); -sample KEYWORD_WITH_ALT(400, 300, 400, 0, yyextra->ARB_gpu_shader5_enable, SAMPLE); -subroutine KEYWORD(0, 300, 0, 0, SUBROUTINE); - - -[_a-zA-Z][_a-zA-Z0-9]* { - struct _mesa_glsl_parse_state *state = yyextra; - void *ctx = state; - yylval->identifier = ralloc_strdup(ctx, yytext); - return classify_identifier(state, yytext); - } - -. { return yytext[0]; } - -%% - -int -classify_identifier(struct _mesa_glsl_parse_state *state, const char *name) -{ - if (state->symbols->get_variable(name) || state->symbols->get_function(name)) - return IDENTIFIER; - else if (state->symbols->get_type(name)) - return TYPE_IDENTIFIER; - else - return NEW_IDENTIFIER; -} - -void -_mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state, const char *string) -{ - yylex_init_extra(state, & state->scanner); - yy_scan_string(string, state->scanner); -} - -void -_mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state) -{ - yylex_destroy(state->scanner); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/glsl_optimizer.cpp b/3rdparty/glsl-optimizer/src/glsl/glsl_optimizer.cpp deleted file mode 100644 index dde202896..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glsl_optimizer.cpp +++ /dev/null @@ -1,831 +0,0 @@ -#include "glsl_optimizer.h" -#include "ast.h" -#include "glsl_parser_extras.h" -#include "glsl_parser.h" -#include "ir_optimization.h" -#include "ir_print_metal_visitor.h" -#include "ir_print_glsl_visitor.h" -#include "ir_print_visitor.h" -#include "ir_stats.h" -#include "loop_analysis.h" -#include "program.h" -#include "linker.h" -#include "standalone_scaffolding.h" - - -extern "C" struct gl_shader * -_mesa_new_shader(struct gl_context *ctx, GLuint name, GLenum type); - -static void DeleteShader(struct gl_context *ctx, struct gl_shader *shader) -{ - ralloc_free(shader); -} - - -static void -initialize_mesa_context(struct gl_context *ctx, glslopt_target api) -{ - gl_api mesaAPI; - switch(api) - { - default: - case kGlslTargetOpenGL: - mesaAPI = API_OPENGL_COMPAT; - break; - case kGlslTargetOpenGLES20: - mesaAPI = API_OPENGLES2; - break; - case kGlslTargetOpenGLES30: - mesaAPI = API_OPENGL_CORE; - break; - case kGlslTargetMetal: - mesaAPI = API_OPENGL_CORE; - break; - } - initialize_context_to_defaults (ctx, mesaAPI); - - switch(api) - { - default: - case kGlslTargetOpenGL: - ctx->Const.GLSLVersion = 150; - break; - case kGlslTargetOpenGLES20: - ctx->Extensions.OES_standard_derivatives = true; - ctx->Extensions.EXT_shadow_samplers = true; - ctx->Extensions.EXT_frag_depth = true; - ctx->Extensions.EXT_shader_framebuffer_fetch = true; - break; - case kGlslTargetOpenGLES30: - ctx->Extensions.ARB_ES3_compatibility = true; - ctx->Extensions.EXT_shader_framebuffer_fetch = true; - break; - case kGlslTargetMetal: - ctx->Const.GLSLVersion = 150; - ctx->Extensions.ARB_ES3_compatibility = true; - ctx->Extensions.EXT_shader_framebuffer_fetch = true; - break; - } - - - // allow high amount of texcoords - ctx->Const.MaxTextureCoordUnits = 16; - - ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 16; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = 16; - ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits = 16; - - // For GLES2.0 this would be 1, but we do support GL_EXT_draw_buffers - ctx->Const.MaxDrawBuffers = 8; - - ctx->Driver.NewShader = _mesa_new_shader; - ctx->Driver.DeleteShader = DeleteShader; -} - - -struct glslopt_ctx { - glslopt_ctx (glslopt_target target) { - this->target = target; - mem_ctx = ralloc_context (NULL); - initialize_mesa_context (&mesa_ctx, target); - } - ~glslopt_ctx() { - ralloc_free (mem_ctx); - } - struct gl_context mesa_ctx; - void* mem_ctx; - glslopt_target target; -}; - -glslopt_ctx* glslopt_initialize (glslopt_target target) -{ - return new glslopt_ctx(target); -} - -void glslopt_cleanup (glslopt_ctx* ctx) -{ - delete ctx; - _mesa_destroy_shader_compiler(); -} - -void glslopt_set_max_unroll_iterations (glslopt_ctx* ctx, unsigned iterations) -{ - for (int i = 0; i < MESA_SHADER_STAGES; ++i) - ctx->mesa_ctx.Const.ShaderCompilerOptions[i].MaxUnrollIterations = iterations; -} - -struct glslopt_shader_var -{ - const char* name; - glslopt_basic_type type; - glslopt_precision prec; - int vectorSize; - int matrixSize; - int arraySize; - int location; -}; - -struct glslopt_shader -{ - static void* operator new(size_t size, void *ctx) - { - void *node; - node = ralloc_size(ctx, size); - assert(node != NULL); - return node; - } - static void operator delete(void *node) - { - ralloc_free(node); - } - - glslopt_shader () - : rawOutput(0) - , optimizedOutput(0) - , status(false) - , uniformCount(0) - , uniformsSize(0) - , inputCount(0) - , textureCount(0) - , statsMath(0) - , statsTex(0) - , statsFlow(0) - { - infoLog = "Shader not compiled yet"; - - whole_program = rzalloc (NULL, struct gl_shader_program); - assert(whole_program != NULL); - whole_program->InfoLog = ralloc_strdup(whole_program, ""); - - whole_program->Shaders = reralloc(whole_program, whole_program->Shaders, struct gl_shader *, whole_program->NumShaders + 1); - assert(whole_program->Shaders != NULL); - - shader = rzalloc(whole_program, gl_shader); - whole_program->Shaders[whole_program->NumShaders] = shader; - whole_program->NumShaders++; - - whole_program->LinkStatus = true; - } - - ~glslopt_shader() - { - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) - ralloc_free(whole_program->_LinkedShaders[i]); - for(GLuint i =0;i< whole_program->NumShaders;i++) - ralloc_free(whole_program->Shaders[i]); - ralloc_free(whole_program->Shaders); - ralloc_free(whole_program->InfoLog); - ralloc_free(whole_program); - ralloc_free(rawOutput); - ralloc_free(optimizedOutput); - } - - struct gl_shader_program* whole_program; - struct gl_shader* shader; - - static const int kMaxShaderUniforms = 1024; - static const int kMaxShaderInputs = 128; - static const int kMaxShaderTextures = 128; - glslopt_shader_var uniforms[kMaxShaderUniforms]; - glslopt_shader_var inputs[kMaxShaderInputs]; - glslopt_shader_var textures[kMaxShaderInputs]; - int uniformCount, uniformsSize; - int inputCount; - int textureCount; - int statsMath, statsTex, statsFlow; - - char* rawOutput; - char* optimizedOutput; - const char* infoLog; - bool status; -}; - -static inline void debug_print_ir (const char* name, exec_list* ir, _mesa_glsl_parse_state* state, void* memctx) -{ - #if 0 - printf("**** %s:\n", name); -// _mesa_print_ir (ir, state); - char* foobar = _mesa_print_ir_glsl(ir, state, ralloc_strdup(memctx, ""), kPrintGlslFragment); - printf("%s\n", foobar); - validate_ir_tree(ir); - #endif -} - - -struct precision_ctx -{ - exec_list* root_ir; - bool res; -}; - - -static void propagate_precision_deref(ir_instruction *ir, void *data) -{ - // variable deref with undefined precision: take from variable itself - ir_dereference_variable* der = ir->as_dereference_variable(); - if (der && der->get_precision() == glsl_precision_undefined && der->var->data.precision != glsl_precision_undefined) - { - der->set_precision ((glsl_precision)der->var->data.precision); - ((precision_ctx*)data)->res = true; - } - - // array deref with undefined precision: take from array itself - ir_dereference_array* der_arr = ir->as_dereference_array(); - if (der_arr && der_arr->get_precision() == glsl_precision_undefined && der_arr->array->get_precision() != glsl_precision_undefined) - { - der_arr->set_precision (der_arr->array->get_precision()); - ((precision_ctx*)data)->res = true; - } - - // swizzle with undefined precision: take from swizzle argument - ir_swizzle* swz = ir->as_swizzle(); - if (swz && swz->get_precision() == glsl_precision_undefined && swz->val->get_precision() != glsl_precision_undefined) - { - swz->set_precision (swz->val->get_precision()); - ((precision_ctx*)data)->res = true; - } - -} - -static void propagate_precision_expr(ir_instruction *ir, void *data) -{ - ir_expression* expr = ir->as_expression(); - if (!expr) - return; - if (expr->get_precision() != glsl_precision_undefined) - return; - - glsl_precision prec_params_max = glsl_precision_undefined; - for (int i = 0; i < (int)expr->get_num_operands(); ++i) - { - ir_rvalue* op = expr->operands[i]; - if (op && op->get_precision() != glsl_precision_undefined) - prec_params_max = higher_precision (prec_params_max, op->get_precision()); - } - if (expr->get_precision() != prec_params_max) - { - expr->set_precision (prec_params_max); - ((precision_ctx*)data)->res = true; - } - -} - -static void propagate_precision_texture(ir_instruction *ir, void *data) -{ - ir_texture* tex = ir->as_texture(); - if (!tex) - return; - - glsl_precision sampler_prec = tex->sampler->get_precision(); - if (tex->get_precision() == sampler_prec || sampler_prec == glsl_precision_undefined) - return; - - // set precision of ir_texture node to that of the sampler itself - tex->set_precision(sampler_prec); - ((precision_ctx*)data)->res = true; -} - -static void propagate_precision_texture_metal(ir_instruction* ir, void* data) -{ - // There are no precision specifiers in Metal - ir_texture* tex = ir->as_texture(); - if (tex) - tex->set_precision(glsl_precision_undefined); -} - -struct undefined_ass_ctx -{ - ir_variable* var; - bool res; -}; - -static void has_only_undefined_precision_assignments(ir_instruction *ir, void *data) -{ - ir_assignment* ass = ir->as_assignment(); - if (!ass) - return; - undefined_ass_ctx* ctx = (undefined_ass_ctx*)data; - if (ass->whole_variable_written() != ctx->var) - return; - glsl_precision prec = ass->rhs->get_precision(); - if (prec == glsl_precision_undefined) - return; - ctx->res = false; -} - - -static void propagate_precision_assign(ir_instruction *ir, void *data) -{ - ir_assignment* ass = ir->as_assignment(); - if (!ass || !ass->lhs || !ass->rhs) - return; - - glsl_precision lp = ass->lhs->get_precision(); - glsl_precision rp = ass->rhs->get_precision(); - - // for assignments with LHS having undefined precision, take it from RHS - if (rp != glsl_precision_undefined) - { - ir_variable* lhs_var = ass->lhs->variable_referenced(); - if (lp == glsl_precision_undefined) - { - if (lhs_var) - lhs_var->data.precision = rp; - ass->lhs->set_precision (rp); - ((precision_ctx*)data)->res = true; - } - return; - } - - // for assignments where LHS has precision, but RHS is a temporary variable - // with undefined precision that's only assigned from other undefined precision - // sources -> make the RHS variable take LHS precision - if (lp != glsl_precision_undefined && rp == glsl_precision_undefined) - { - ir_dereference* deref = ass->rhs->as_dereference(); - if (deref) - { - ir_variable* rhs_var = deref->variable_referenced(); - if (rhs_var && rhs_var->data.mode == ir_var_temporary && rhs_var->data.precision == glsl_precision_undefined) - { - undefined_ass_ctx ctx; - ctx.var = rhs_var; - // find if we only assign to it from undefined precision sources - ctx.res = true; - exec_list* root_ir = ((precision_ctx*)data)->root_ir; - foreach_in_list(ir_instruction, inst, root_ir) - { - visit_tree (ir, has_only_undefined_precision_assignments, &ctx); - } - if (ctx.res) - { - rhs_var->data.precision = lp; - ass->rhs->set_precision(lp); - ((precision_ctx*)data)->res = true; - } - } - } - return; - } -} - - -static void propagate_precision_call(ir_instruction *ir, void *data) -{ - ir_call* call = ir->as_call(); - if (!call) - return; - if (!call->return_deref) - return; - if (call->return_deref->get_precision() == glsl_precision_undefined /*&& call->callee->precision == glsl_precision_undefined*/) - { - glsl_precision prec_params_max = glsl_precision_undefined; - foreach_two_lists(formal_node, &call->callee->parameters, - actual_node, &call->actual_parameters) { - ir_variable* sig_param = (ir_variable*)formal_node; - ir_rvalue* param = (ir_rvalue*)actual_node; - - glsl_precision p = (glsl_precision)sig_param->data.precision; - if (p == glsl_precision_undefined) - p = param->get_precision(); - - prec_params_max = higher_precision (prec_params_max, p); - } - if (call->return_deref->get_precision() != prec_params_max) - { - call->return_deref->set_precision (prec_params_max); - ((precision_ctx*)data)->res = true; - } - } -} - -static bool propagate_precision(exec_list* list, bool metal_target) -{ - bool anyProgress = false; - precision_ctx ctx; - - do { - ctx.res = false; - ctx.root_ir = list; - foreach_in_list(ir_instruction, ir, list) - { - if (metal_target) - visit_tree (ir, propagate_precision_texture_metal, &ctx); - else - visit_tree (ir, propagate_precision_texture, &ctx); - - visit_tree (ir, propagate_precision_deref, &ctx); - bool hadProgress = ctx.res; - ctx.res = false; - visit_tree (ir, propagate_precision_assign, &ctx); - if (ctx.res) - { - // assignment precision propagation might have added precision - // to some variables; need to propagate dereference precision right - // after that too. - visit_tree (ir, propagate_precision_deref, &ctx); - } - ctx.res |= hadProgress; - visit_tree (ir, propagate_precision_call, &ctx); - visit_tree (ir, propagate_precision_expr, &ctx); - } - anyProgress |= ctx.res; - } while (ctx.res); - anyProgress |= ctx.res; - - // for globals that have undefined precision, set it to highp - if (metal_target) - { - foreach_in_list(ir_instruction, ir, list) - { - ir_variable* var = ir->as_variable(); - if (var) - { - if (var->data.precision == glsl_precision_undefined) - { - var->data.precision = glsl_precision_high; - anyProgress = true; - } - } - } - } - - return anyProgress; -} - - -static void do_optimization_passes(exec_list* ir, bool linked, _mesa_glsl_parse_state* state, void* mem_ctx) -{ - bool progress; - // FIXME: Shouldn't need to bound the number of passes - int passes = 0, - kMaximumPasses = 1000; - do { - progress = false; - ++passes; - bool progress2; - debug_print_ir ("Initial", ir, state, mem_ctx); - if (linked) { - progress2 = do_function_inlining(ir); progress |= progress2; if (progress2) debug_print_ir ("After inlining", ir, state, mem_ctx); - progress2 = do_dead_functions(ir); progress |= progress2; if (progress2) debug_print_ir ("After dead functions", ir, state, mem_ctx); - progress2 = do_structure_splitting(ir); progress |= progress2; if (progress2) debug_print_ir ("After struct splitting", ir, state, mem_ctx); - } - progress2 = do_if_simplification(ir); progress |= progress2; if (progress2) debug_print_ir ("After if simpl", ir, state, mem_ctx); - progress2 = opt_flatten_nested_if_blocks(ir); progress |= progress2; if (progress2) debug_print_ir ("After if flatten", ir, state, mem_ctx); - progress2 = propagate_precision (ir, state->metal_target); progress |= progress2; if (progress2) debug_print_ir ("After prec propagation", ir, state, mem_ctx); - progress2 = do_copy_propagation(ir); progress |= progress2; if (progress2) debug_print_ir ("After copy propagation", ir, state, mem_ctx); - progress2 = do_copy_propagation_elements(ir); progress |= progress2; if (progress2) debug_print_ir ("After copy propagation elems", ir, state, mem_ctx); - - if (linked) - { - progress2 = do_vectorize(ir); progress |= progress2; if (progress2) debug_print_ir ("After vectorize", ir, state, mem_ctx); - } - if (linked) { - progress2 = do_dead_code(ir,false); progress |= progress2; if (progress2) debug_print_ir ("After dead code", ir, state, mem_ctx); - } else { - progress2 = do_dead_code_unlinked(ir); progress |= progress2; if (progress2) debug_print_ir ("After dead code unlinked", ir, state, mem_ctx); - } - progress2 = do_dead_code_local(ir); progress |= progress2; if (progress2) debug_print_ir ("After dead code local", ir, state, mem_ctx); - progress2 = propagate_precision (ir, state->metal_target); progress |= progress2; if (progress2) debug_print_ir ("After prec propagation", ir, state, mem_ctx); - progress2 = do_tree_grafting(ir); progress |= progress2; if (progress2) debug_print_ir ("After tree grafting", ir, state, mem_ctx); - progress2 = do_constant_propagation(ir); progress |= progress2; if (progress2) debug_print_ir ("After const propagation", ir, state, mem_ctx); - if (linked) { - progress2 = do_constant_variable(ir); progress |= progress2; if (progress2) debug_print_ir ("After const variable", ir, state, mem_ctx); - } else { - progress2 = do_constant_variable_unlinked(ir); progress |= progress2; if (progress2) debug_print_ir ("After const variable unlinked", ir, state, mem_ctx); - } - progress2 = do_constant_folding(ir); progress |= progress2; if (progress2) debug_print_ir ("After const folding", ir, state, mem_ctx); - progress2 = do_minmax_prune(ir); progress |= progress2; if (progress2) debug_print_ir ("After minmax prune", ir, state, mem_ctx); - progress2 = do_cse(ir); progress |= progress2; if (progress2) debug_print_ir ("After CSE", ir, state, mem_ctx); - progress2 = do_rebalance_tree(ir); progress |= progress2; if (progress2) debug_print_ir ("After rebalance tree", ir, state, mem_ctx); - progress2 = do_algebraic(ir, state->ctx->Const.NativeIntegers, &state->ctx->Const.ShaderCompilerOptions[state->stage]); progress |= progress2; if (progress2) debug_print_ir ("After algebraic", ir, state, mem_ctx); - progress2 = do_lower_jumps(ir); progress |= progress2; if (progress2) debug_print_ir ("After lower jumps", ir, state, mem_ctx); - progress2 = do_vec_index_to_swizzle(ir); progress |= progress2; if (progress2) debug_print_ir ("After vec index to swizzle", ir, state, mem_ctx); - progress2 = lower_vector_insert(ir, false); progress |= progress2; if (progress2) debug_print_ir ("After lower vector insert", ir, state, mem_ctx); - progress2 = do_swizzle_swizzle(ir); progress |= progress2; if (progress2) debug_print_ir ("After swizzle swizzle", ir, state, mem_ctx); - progress2 = do_noop_swizzle(ir); progress |= progress2; if (progress2) debug_print_ir ("After noop swizzle", ir, state, mem_ctx); - progress2 = optimize_split_arrays(ir, linked, state->metal_target && state->stage == MESA_SHADER_FRAGMENT); progress |= progress2; if (progress2) debug_print_ir ("After split arrays", ir, state, mem_ctx); - progress2 = optimize_redundant_jumps(ir); progress |= progress2; if (progress2) debug_print_ir ("After redundant jumps", ir, state, mem_ctx); - - // do loop stuff only when linked; otherwise causes duplicate loop induction variable - // problems (ast-in.txt test) - if (linked) - { - loop_state *ls = analyze_loop_variables(ir); - if (ls->loop_found) { - progress2 = set_loop_controls(ir, ls); progress |= progress2; if (progress2) debug_print_ir ("After set loop", ir, state, mem_ctx); - progress2 = unroll_loops(ir, ls, &state->ctx->Const.ShaderCompilerOptions[state->stage]); progress |= progress2; if (progress2) debug_print_ir ("After unroll", ir, state, mem_ctx); - } - delete ls; - } - } while (progress && passes < kMaximumPasses); - - if (!state->metal_target) - { - // GLSL/ES does not have saturate, so lower it - lower_instructions(ir, SAT_TO_CLAMP); - } -} - -static void glsl_type_to_optimizer_desc(const glsl_type* type, glsl_precision prec, glslopt_shader_var* out) -{ - out->arraySize = type->array_size(); - - // type; use element type when in array - if (type->is_array()) - type = type->element_type(); - - if (type->is_float()) - out->type = kGlslTypeFloat; - else if (type->is_integer()) - out->type = kGlslTypeInt; - else if (type->is_boolean()) - out->type = kGlslTypeBool; - else if (type->is_sampler()) - { - if (type->sampler_dimensionality == GLSL_SAMPLER_DIM_2D) - { - if (type->sampler_shadow) - out->type = kGlslTypeTex2DShadow; - else if (type->sampler_array) - out->type = kGlslTypeTex2DArray; - else - out->type = kGlslTypeTex2D; - } - else if (type->sampler_dimensionality == GLSL_SAMPLER_DIM_3D) - out->type = kGlslTypeTex3D; - else if (type->sampler_dimensionality == GLSL_SAMPLER_DIM_CUBE) - out->type = kGlslTypeTexCube; - else - out->type = kGlslTypeOther; - } - else - out->type = kGlslTypeOther; - - // sizes - out->vectorSize = type->vector_elements; - out->matrixSize = type->matrix_columns; - - // precision - switch (prec) - { - case glsl_precision_high: out->prec = kGlslPrecHigh; break; - case glsl_precision_medium: out->prec = kGlslPrecMedium; break; - case glsl_precision_low: out->prec = kGlslPrecLow; break; - default: out->prec = kGlslPrecHigh; break; - } -} - -static void find_shader_variables(glslopt_shader* sh, exec_list* ir) -{ - foreach_in_list(ir_instruction, node, ir) - { - ir_variable* const var = node->as_variable(); - if (var == NULL) - continue; - if (var->data.mode == ir_var_shader_in) - { - if (sh->inputCount >= glslopt_shader::kMaxShaderInputs) - continue; - - glslopt_shader_var& v = sh->inputs[sh->inputCount]; - v.name = ralloc_strdup(sh, var->name); - glsl_type_to_optimizer_desc(var->type, (glsl_precision)var->data.precision, &v); - v.location = var->data.explicit_location ? var->data.location : -1; - ++sh->inputCount; - } - if (var->data.mode == ir_var_uniform && !var->type->is_sampler()) - { - if (sh->uniformCount >= glslopt_shader::kMaxShaderUniforms) - continue; - - glslopt_shader_var& v = sh->uniforms[sh->uniformCount]; - v.name = ralloc_strdup(sh, var->name); - glsl_type_to_optimizer_desc(var->type, (glsl_precision)var->data.precision, &v); - v.location = var->data.explicit_location ? var->data.location : -1; - ++sh->uniformCount; - } - if (var->data.mode == ir_var_uniform && var->type->is_sampler()) - { - if (sh->textureCount >= glslopt_shader::kMaxShaderTextures) - continue; - - glslopt_shader_var& v = sh->textures[sh->textureCount]; - v.name = ralloc_strdup(sh, var->name); - glsl_type_to_optimizer_desc(var->type, (glsl_precision)var->data.precision, &v); - v.location = var->data.explicit_location ? var->data.location : -1; - ++sh->textureCount; - } - } -} - - -glslopt_shader* glslopt_optimize (glslopt_ctx* ctx, glslopt_shader_type type, const char* shaderSource, unsigned options) -{ - glslopt_shader* shader = new (ctx->mem_ctx) glslopt_shader (); - - PrintGlslMode printMode = kPrintGlslVertex; - switch (type) { - case kGlslOptShaderVertex: - shader->shader->Type = GL_VERTEX_SHADER; - shader->shader->Stage = MESA_SHADER_VERTEX; - printMode = kPrintGlslVertex; - break; - case kGlslOptShaderFragment: - shader->shader->Type = GL_FRAGMENT_SHADER; - shader->shader->Stage = MESA_SHADER_FRAGMENT; - printMode = kPrintGlslFragment; - break; - case kGlslOptShaderCompute: - shader->shader->Type = GL_COMPUTE_SHADER; - shader->shader->Stage = MESA_SHADER_COMPUTE; - printMode = kPrintGlslFragment; - break; - - } - if (!shader->shader->Type) - { - shader->infoLog = ralloc_asprintf (shader, "Unknown shader type %d", (int)type); - shader->status = false; - return shader; - } - - _mesa_glsl_parse_state* state = new (shader) _mesa_glsl_parse_state (&ctx->mesa_ctx, shader->shader->Stage, shader); - if (ctx->target == kGlslTargetMetal) - state->metal_target = true; - state->error = 0; - - if (!(options & kGlslOptionSkipPreprocessor)) - { - state->error = !!glcpp_preprocess (state, &shaderSource, &state->info_log, state->extensions, &ctx->mesa_ctx); - if (state->error) - { - shader->status = !state->error; - shader->infoLog = state->info_log; - return shader; - } - } - - _mesa_glsl_lexer_ctor (state, shaderSource); - _mesa_glsl_parse (state); - _mesa_glsl_lexer_dtor (state); - - exec_list* ir = new (shader) exec_list(); - shader->shader->ir = ir; - - if (!state->error && !state->translation_unit.is_empty()) - _mesa_ast_to_hir (ir, state); - - // Un-optimized output - if (!state->error) { - validate_ir_tree(ir); - if (ctx->target == kGlslTargetMetal) - shader->rawOutput = _mesa_print_ir_metal(ir, state, ralloc_strdup(shader, ""), printMode, &shader->uniformsSize); - else - shader->rawOutput = _mesa_print_ir_glsl(ir, state, ralloc_strdup(shader, ""), printMode); - } - - // Link built-in functions - shader->shader->symbols = state->symbols; - shader->shader->uses_builtin_functions = state->uses_builtin_functions; - - struct gl_shader* linked_shader = NULL; - - if (!state->error && !ir->is_empty() && !(options & kGlslOptionNotFullShader)) - { - linked_shader = link_intrastage_shaders(shader, - &ctx->mesa_ctx, - shader->whole_program, - shader->whole_program->Shaders, - shader->whole_program->NumShaders); - if (!linked_shader) - { - shader->status = false; - shader->infoLog = shader->whole_program->InfoLog; - return shader; - } - ir = linked_shader->ir; - - debug_print_ir ("==== After link ====", ir, state, shader); - } - - // Do optimization post-link - if (!state->error && !ir->is_empty()) - { - const bool linked = !(options & kGlslOptionNotFullShader); - do_optimization_passes(ir, linked, state, shader); - validate_ir_tree(ir); - } - - // Final optimized output - if (!state->error) - { - if (ctx->target == kGlslTargetMetal) - shader->optimizedOutput = _mesa_print_ir_metal(ir, state, ralloc_strdup(shader, ""), printMode, &shader->uniformsSize); - else - shader->optimizedOutput = _mesa_print_ir_glsl(ir, state, ralloc_strdup(shader, ""), printMode); - } - - shader->status = !state->error; - shader->infoLog = state->info_log; - - find_shader_variables (shader, ir); - if (!state->error) - calculate_shader_stats (ir, &shader->statsMath, &shader->statsTex, &shader->statsFlow); - - ralloc_free (ir); - ralloc_free (state); - - if (linked_shader) - ralloc_free(linked_shader); - - return shader; -} - -void glslopt_shader_delete (glslopt_shader* shader) -{ - delete shader; -} - -bool glslopt_get_status (glslopt_shader* shader) -{ - return shader->status; -} - -const char* glslopt_get_output (glslopt_shader* shader) -{ - return shader->optimizedOutput; -} - -const char* glslopt_get_raw_output (glslopt_shader* shader) -{ - return shader->rawOutput; -} - -const char* glslopt_get_log (glslopt_shader* shader) -{ - return shader->infoLog; -} - -int glslopt_shader_get_input_count (glslopt_shader* shader) -{ - return shader->inputCount; -} - -int glslopt_shader_get_uniform_count (glslopt_shader* shader) -{ - return shader->uniformCount; -} - -int glslopt_shader_get_uniform_total_size (glslopt_shader* shader) -{ - return shader->uniformsSize; -} - -int glslopt_shader_get_texture_count (glslopt_shader* shader) -{ - return shader->textureCount; -} - -void glslopt_shader_get_input_desc (glslopt_shader* shader, int index, const char** outName, glslopt_basic_type* outType, glslopt_precision* outPrec, int* outVecSize, int* outMatSize, int* outArraySize, int* outLocation) -{ - const glslopt_shader_var& v = shader->inputs[index]; - *outName = v.name; - *outType = v.type; - *outPrec = v.prec; - *outVecSize = v.vectorSize; - *outMatSize = v.matrixSize; - *outArraySize = v.arraySize; - *outLocation = v.location; -} - -void glslopt_shader_get_uniform_desc (glslopt_shader* shader, int index, const char** outName, glslopt_basic_type* outType, glslopt_precision* outPrec, int* outVecSize, int* outMatSize, int* outArraySize, int* outLocation) -{ - const glslopt_shader_var& v = shader->uniforms[index]; - *outName = v.name; - *outType = v.type; - *outPrec = v.prec; - *outVecSize = v.vectorSize; - *outMatSize = v.matrixSize; - *outArraySize = v.arraySize; - *outLocation = v.location; -} - -void glslopt_shader_get_texture_desc (glslopt_shader* shader, int index, const char** outName, glslopt_basic_type* outType, glslopt_precision* outPrec, int* outVecSize, int* outMatSize, int* outArraySize, int* outLocation) -{ - const glslopt_shader_var& v = shader->textures[index]; - *outName = v.name; - *outType = v.type; - *outPrec = v.prec; - *outVecSize = v.vectorSize; - *outMatSize = v.matrixSize; - *outArraySize = v.arraySize; - *outLocation = v.location; -} - -void glslopt_shader_get_stats (glslopt_shader* shader, int* approxMath, int* approxTex, int* approxFlow) -{ - *approxMath = shader->statsMath; - *approxTex = shader->statsTex; - *approxFlow = shader->statsFlow; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/glsl_optimizer.h b/3rdparty/glsl-optimizer/src/glsl/glsl_optimizer.h deleted file mode 100644 index 668351e00..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glsl_optimizer.h +++ /dev/null @@ -1,92 +0,0 @@ -#pragma once -#ifndef GLSL_OPTIMIZER_H -#define GLSL_OPTIMIZER_H - -/* - Main GLSL optimizer interface. - See ../../README.md for more instructions. - - General usage: - - ctx = glslopt_initialize(); - for (lots of shaders) { - shader = glslopt_optimize (ctx, shaderType, shaderSource, options); - if (glslopt_get_status (shader)) { - newSource = glslopt_get_output (shader); - } else { - errorLog = glslopt_get_log (shader); - } - glslopt_shader_delete (shader); - } - glslopt_cleanup (ctx); -*/ - -struct glslopt_shader; -struct glslopt_ctx; - -enum glslopt_shader_type { - kGlslOptShaderVertex = 0, - kGlslOptShaderFragment, - kGlslOptShaderCompute, -}; - -// Options flags for glsl_optimize -enum glslopt_options { - kGlslOptionSkipPreprocessor = (1<<0), // Skip preprocessing shader source. Saves some time if you know you don't need it. - kGlslOptionNotFullShader = (1<<1), // Passed shader is not the full shader source. This makes some optimizations weaker. -}; - -// Optimizer target language -enum glslopt_target { - kGlslTargetOpenGL = 0, - kGlslTargetOpenGLES20 = 1, - kGlslTargetOpenGLES30 = 2, - kGlslTargetMetal = 3, -}; - -// Type info -enum glslopt_basic_type { - kGlslTypeFloat = 0, - kGlslTypeInt, - kGlslTypeBool, - kGlslTypeTex2D, - kGlslTypeTex3D, - kGlslTypeTexCube, - kGlslTypeTex2DShadow, - kGlslTypeTex2DArray, - kGlslTypeOther, - kGlslTypeCount -}; -enum glslopt_precision { - kGlslPrecHigh = 0, - kGlslPrecMedium, - kGlslPrecLow, - kGlslPrecCount -}; - -glslopt_ctx* glslopt_initialize (glslopt_target target); -void glslopt_cleanup (glslopt_ctx* ctx); - -void glslopt_set_max_unroll_iterations (glslopt_ctx* ctx, unsigned iterations); - -glslopt_shader* glslopt_optimize (glslopt_ctx* ctx, glslopt_shader_type type, const char* shaderSource, unsigned options); -bool glslopt_get_status (glslopt_shader* shader); -const char* glslopt_get_output (glslopt_shader* shader); -const char* glslopt_get_raw_output (glslopt_shader* shader); -const char* glslopt_get_log (glslopt_shader* shader); -void glslopt_shader_delete (glslopt_shader* shader); - -int glslopt_shader_get_input_count (glslopt_shader* shader); -void glslopt_shader_get_input_desc (glslopt_shader* shader, int index, const char** outName, glslopt_basic_type* outType, glslopt_precision* outPrec, int* outVecSize, int* outMatSize, int* outArraySize, int* outLocation); -int glslopt_shader_get_uniform_count (glslopt_shader* shader); -int glslopt_shader_get_uniform_total_size (glslopt_shader* shader); -void glslopt_shader_get_uniform_desc (glslopt_shader* shader, int index, const char** outName, glslopt_basic_type* outType, glslopt_precision* outPrec, int* outVecSize, int* outMatSize, int* outArraySize, int* outLocation); -int glslopt_shader_get_texture_count (glslopt_shader* shader); -void glslopt_shader_get_texture_desc (glslopt_shader* shader, int index, const char** outName, glslopt_basic_type* outType, glslopt_precision* outPrec, int* outVecSize, int* outMatSize, int* outArraySize, int* outLocation); - -// Get *very* approximate shader stats: -// Number of math, texture and flow control instructions. -void glslopt_shader_get_stats (glslopt_shader* shader, int* approxMath, int* approxTex, int* approxFlow); - - -#endif /* GLSL_OPTIMIZER_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/glsl_parser.cpp b/3rdparty/glsl-optimizer/src/glsl/glsl_parser.cpp deleted file mode 100644 index 9e4ae96b4..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glsl_parser.cpp +++ /dev/null @@ -1,6892 +0,0 @@ -/* A Bison parser, made by GNU Bison 3.5.1. */ - -/* Bison implementation for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, - Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Undocumented macros, especially those whose name start with YY_, - are private implementation details. Do not rely on them. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "3.5.1" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 1 - -/* Push parsers. */ -#define YYPUSH 0 - -/* Pull parsers. */ -#define YYPULL 1 - - -/* Substitute the variable and function names. */ -#define yyparse _mesa_glsl_parse -#define yylex _mesa_glsl_lex -#define yyerror _mesa_glsl_error -#define yydebug _mesa_glsl_debug -#define yynerrs _mesa_glsl_nerrs - -/* First part of user prologue. */ -#line 1 "src/glsl/glsl_parser.yy" - -/* - * Copyright © 2008, 2009 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#include -#include -#include -#ifndef _MSC_VER -#include -#endif -#include - -#include "ast.h" -#include "glsl_parser_extras.h" -#include "glsl_types.h" -#include "main/context.h" - -#if defined(_MSC_VER) -# pragma warning(disable: 4065) // warning C4065: switch statement contains 'default' but no 'case' labels -# pragma warning(disable: 4244) // warning C4244: '=' : conversion from 'double' to 'float', possible loss of data -#endif // defined(_MSC_VER) - -#undef yyerror - -static void yyerror(YYLTYPE *loc, _mesa_glsl_parse_state *st, const char *msg) -{ - _mesa_glsl_error(loc, st, "%s", msg); -} - -static int -_mesa_glsl_lex(YYSTYPE *val, YYLTYPE *loc, _mesa_glsl_parse_state *state) -{ - return _mesa_glsl_lexer_lex(val, loc, state->scanner); -} - -static bool match_layout_qualifier(const char *s1, const char *s2, - _mesa_glsl_parse_state *state) -{ - /* From the GLSL 1.50 spec, section 4.3.8 (Layout Qualifiers): - * - * "The tokens in any layout-qualifier-id-list ... are not case - * sensitive, unless explicitly noted otherwise." - * - * The text "unless explicitly noted otherwise" appears to be - * vacuous--no desktop GLSL spec (up through GLSL 4.40) notes - * otherwise. - * - * However, the GLSL ES 3.00 spec says, in section 4.3.8 (Layout - * Qualifiers): - * - * "As for other identifiers, they are case sensitive." - * - * So we need to do a case-sensitive or a case-insensitive match, - * depending on whether we are compiling for GLSL ES. - */ - if (state->es_shader) - return strcmp(s1, s2); - else - return strcasecmp(s1, s2); -} - -#line 156 "src/glsl/glsl_parser.cpp" - -# ifndef YY_CAST -# ifdef __cplusplus -# define YY_CAST(Type, Val) static_cast (Val) -# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) -# else -# define YY_CAST(Type, Val) ((Type) (Val)) -# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) -# endif -# endif -# ifndef YY_NULLPTR -# if defined __cplusplus -# if 201103L <= __cplusplus -# define YY_NULLPTR nullptr -# else -# define YY_NULLPTR 0 -# endif -# else -# define YY_NULLPTR ((void*)0) -# endif -# endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 1 -#endif - -/* Use api.header.include to #include this header - instead of duplicating it here. */ -#ifndef YY__MESA_GLSL_SRC_GLSL_GLSL_PARSER_H_INCLUDED -# define YY__MESA_GLSL_SRC_GLSL_GLSL_PARSER_H_INCLUDED -/* Debug traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int _mesa_glsl_debug; -#endif - -/* Token type. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - enum yytokentype - { - ATTRIBUTE = 258, - CONST_TOK = 259, - BOOL_TOK = 260, - FLOAT_TOK = 261, - INT_TOK = 262, - UINT_TOK = 263, - BREAK = 264, - CONTINUE = 265, - DO = 266, - ELSE = 267, - FOR = 268, - IF = 269, - DISCARD = 270, - RETURN = 271, - SWITCH = 272, - CASE = 273, - DEFAULT = 274, - BVEC2 = 275, - BVEC3 = 276, - BVEC4 = 277, - IVEC2 = 278, - IVEC3 = 279, - IVEC4 = 280, - UVEC2 = 281, - UVEC3 = 282, - UVEC4 = 283, - VEC2 = 284, - VEC3 = 285, - VEC4 = 286, - CENTROID = 287, - IN_TOK = 288, - OUT_TOK = 289, - INOUT_TOK = 290, - UNIFORM = 291, - VARYING = 292, - SAMPLE = 293, - NOPERSPECTIVE = 294, - FLAT = 295, - SMOOTH = 296, - MAT2X2 = 297, - MAT2X3 = 298, - MAT2X4 = 299, - MAT3X2 = 300, - MAT3X3 = 301, - MAT3X4 = 302, - MAT4X2 = 303, - MAT4X3 = 304, - MAT4X4 = 305, - SAMPLER1D = 306, - SAMPLER2D = 307, - SAMPLER3D = 308, - SAMPLERCUBE = 309, - SAMPLER1DSHADOW = 310, - SAMPLER2DSHADOW = 311, - SAMPLERCUBESHADOW = 312, - SAMPLER1DARRAY = 313, - SAMPLER2DARRAY = 314, - SAMPLER1DARRAYSHADOW = 315, - SAMPLER2DARRAYSHADOW = 316, - SAMPLERCUBEARRAY = 317, - SAMPLERCUBEARRAYSHADOW = 318, - ISAMPLER1D = 319, - ISAMPLER2D = 320, - ISAMPLER3D = 321, - ISAMPLERCUBE = 322, - ISAMPLER1DARRAY = 323, - ISAMPLER2DARRAY = 324, - ISAMPLERCUBEARRAY = 325, - USAMPLER1D = 326, - USAMPLER2D = 327, - USAMPLER3D = 328, - USAMPLERCUBE = 329, - USAMPLER1DARRAY = 330, - USAMPLER2DARRAY = 331, - USAMPLERCUBEARRAY = 332, - SAMPLER2DRECT = 333, - ISAMPLER2DRECT = 334, - USAMPLER2DRECT = 335, - SAMPLER2DRECTSHADOW = 336, - SAMPLERBUFFER = 337, - ISAMPLERBUFFER = 338, - USAMPLERBUFFER = 339, - SAMPLER2DMS = 340, - ISAMPLER2DMS = 341, - USAMPLER2DMS = 342, - SAMPLER2DMSARRAY = 343, - ISAMPLER2DMSARRAY = 344, - USAMPLER2DMSARRAY = 345, - SAMPLEREXTERNALOES = 346, - IMAGE1D = 347, - IMAGE2D = 348, - IMAGE3D = 349, - IMAGE2DRECT = 350, - IMAGECUBE = 351, - IMAGEBUFFER = 352, - IMAGE1DARRAY = 353, - IMAGE2DARRAY = 354, - IMAGECUBEARRAY = 355, - IMAGE2DMS = 356, - IMAGE2DMSARRAY = 357, - IIMAGE1D = 358, - IIMAGE2D = 359, - IIMAGE3D = 360, - IIMAGE2DRECT = 361, - IIMAGECUBE = 362, - IIMAGEBUFFER = 363, - IIMAGE1DARRAY = 364, - IIMAGE2DARRAY = 365, - IIMAGECUBEARRAY = 366, - IIMAGE2DMS = 367, - IIMAGE2DMSARRAY = 368, - UIMAGE1D = 369, - UIMAGE2D = 370, - UIMAGE3D = 371, - UIMAGE2DRECT = 372, - UIMAGECUBE = 373, - UIMAGEBUFFER = 374, - UIMAGE1DARRAY = 375, - UIMAGE2DARRAY = 376, - UIMAGECUBEARRAY = 377, - UIMAGE2DMS = 378, - UIMAGE2DMSARRAY = 379, - IMAGE1DSHADOW = 380, - IMAGE2DSHADOW = 381, - IMAGE1DARRAYSHADOW = 382, - IMAGE2DARRAYSHADOW = 383, - COHERENT = 384, - VOLATILE = 385, - RESTRICT = 386, - READONLY = 387, - WRITEONLY = 388, - ATOMIC_UINT = 389, - STRUCT = 390, - VOID_TOK = 391, - WHILE = 392, - IDENTIFIER = 393, - TYPE_IDENTIFIER = 394, - NEW_IDENTIFIER = 395, - FLOATCONSTANT = 396, - INTCONSTANT = 397, - UINTCONSTANT = 398, - BOOLCONSTANT = 399, - FIELD_SELECTION = 400, - LEFT_OP = 401, - RIGHT_OP = 402, - INC_OP = 403, - DEC_OP = 404, - LE_OP = 405, - GE_OP = 406, - EQ_OP = 407, - NE_OP = 408, - AND_OP = 409, - OR_OP = 410, - XOR_OP = 411, - MUL_ASSIGN = 412, - DIV_ASSIGN = 413, - ADD_ASSIGN = 414, - MOD_ASSIGN = 415, - LEFT_ASSIGN = 416, - RIGHT_ASSIGN = 417, - AND_ASSIGN = 418, - XOR_ASSIGN = 419, - OR_ASSIGN = 420, - SUB_ASSIGN = 421, - INVARIANT = 422, - PRECISE = 423, - LOWP = 424, - MEDIUMP = 425, - HIGHP = 426, - SUPERP = 427, - PRECISION = 428, - VERSION_TOK = 429, - EXTENSION = 430, - LINE = 431, - COLON = 432, - EOL = 433, - INTERFACE = 434, - OUTPUT = 435, - PRAGMA_DEBUG_ON = 436, - PRAGMA_DEBUG_OFF = 437, - PRAGMA_OPTIMIZE_ON = 438, - PRAGMA_OPTIMIZE_OFF = 439, - PRAGMA_INVARIANT_ALL = 440, - LAYOUT_TOK = 441, - ASM = 442, - CLASS = 443, - UNION = 444, - ENUM = 445, - TYPEDEF = 446, - TEMPLATE = 447, - THIS = 448, - PACKED_TOK = 449, - GOTO = 450, - INLINE_TOK = 451, - NOINLINE = 452, - PUBLIC_TOK = 453, - STATIC = 454, - EXTERN = 455, - EXTERNAL = 456, - LONG_TOK = 457, - SHORT_TOK = 458, - DOUBLE_TOK = 459, - HALF = 460, - FIXED_TOK = 461, - UNSIGNED = 462, - INPUT_TOK = 463, - HVEC2 = 464, - HVEC3 = 465, - HVEC4 = 466, - DVEC2 = 467, - DVEC3 = 468, - DVEC4 = 469, - FVEC2 = 470, - FVEC3 = 471, - FVEC4 = 472, - SAMPLER3DRECT = 473, - SIZEOF = 474, - CAST = 475, - NAMESPACE = 476, - USING = 477, - RESOURCE = 478, - PATCH = 479, - SUBROUTINE = 480, - ERROR_TOK = 481, - COMMON = 482, - PARTITION = 483, - ACTIVE = 484, - FILTER = 485, - ROW_MAJOR = 486, - THEN = 487 - }; -#endif - -/* Value type. */ -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -union YYSTYPE -{ -#line 99 "src/glsl/glsl_parser.yy" - - int n; - float real; - const char *identifier; - - struct ast_type_qualifier type_qualifier; - - ast_node *node; - ast_type_specifier *type_specifier; - ast_array_specifier *array_specifier; - ast_fully_specified_type *fully_specified_type; - ast_function *function; - ast_parameter_declarator *parameter_declarator; - ast_function_definition *function_definition; - ast_compound_statement *compound_statement; - ast_expression *expression; - ast_declarator_list *declarator_list; - ast_struct_specifier *struct_specifier; - ast_declaration *declaration; - ast_switch_body *switch_body; - ast_case_label *case_label; - ast_case_label_list *case_label_list; - ast_case_statement *case_statement; - ast_case_statement_list *case_statement_list; - ast_interface_block *interface_block; - - struct { - ast_node *cond; - ast_expression *rest; - } for_rest_statement; - - struct { - ast_node *then_statement; - ast_node *else_statement; - } selection_rest_statement; - -#line 478 "src/glsl/glsl_parser.cpp" - -}; -typedef union YYSTYPE YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define YYSTYPE_IS_DECLARED 1 -#endif - -/* Location type. */ -#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED -typedef struct YYLTYPE YYLTYPE; -struct YYLTYPE -{ - int first_line; - int first_column; - int last_line; - int last_column; -}; -# define YYLTYPE_IS_DECLARED 1 -# define YYLTYPE_IS_TRIVIAL 1 -#endif - - - -int _mesa_glsl_parse (struct _mesa_glsl_parse_state *state); - -#endif /* !YY__MESA_GLSL_SRC_GLSL_GLSL_PARSER_H_INCLUDED */ - - - -#ifdef short -# undef short -#endif - -/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure - and (if available) are included - so that the code can choose integer types of a good width. */ - -#ifndef __PTRDIFF_MAX__ -# include /* INFRINGES ON USER NAME SPACE */ -# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_STDINT_H -# endif -#endif - -/* Narrow types that promote to a signed type and that can represent a - signed or unsigned integer of at least N bits. In tables they can - save space and decrease cache pressure. Promoting to a signed type - helps avoid bugs in integer arithmetic. */ - -#ifdef __INT_LEAST8_MAX__ -typedef __INT_LEAST8_TYPE__ yytype_int8; -#elif defined YY_STDINT_H -typedef int_least8_t yytype_int8; -#else -typedef signed char yytype_int8; -#endif - -#ifdef __INT_LEAST16_MAX__ -typedef __INT_LEAST16_TYPE__ yytype_int16; -#elif defined YY_STDINT_H -typedef int_least16_t yytype_int16; -#else -typedef short yytype_int16; -#endif - -#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ -typedef __UINT_LEAST8_TYPE__ yytype_uint8; -#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ - && UINT_LEAST8_MAX <= INT_MAX) -typedef uint_least8_t yytype_uint8; -#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX -typedef unsigned char yytype_uint8; -#else -typedef short yytype_uint8; -#endif - -#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ -typedef __UINT_LEAST16_TYPE__ yytype_uint16; -#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ - && UINT_LEAST16_MAX <= INT_MAX) -typedef uint_least16_t yytype_uint16; -#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX -typedef unsigned short yytype_uint16; -#else -typedef int yytype_uint16; -#endif - -#ifndef YYPTRDIFF_T -# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ -# define YYPTRDIFF_T __PTRDIFF_TYPE__ -# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ -# elif defined PTRDIFF_MAX -# ifndef ptrdiff_t -# include /* INFRINGES ON USER NAME SPACE */ -# endif -# define YYPTRDIFF_T ptrdiff_t -# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX -# else -# define YYPTRDIFF_T long -# define YYPTRDIFF_MAXIMUM LONG_MAX -# endif -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned -# endif -#endif - -#define YYSIZE_MAXIMUM \ - YY_CAST (YYPTRDIFF_T, \ - (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ - ? YYPTRDIFF_MAXIMUM \ - : YY_CAST (YYSIZE_T, -1))) - -#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) - -/* Stored state numbers (used for stacks). */ -typedef yytype_int16 yy_state_t; - -/* State numbers in computations. */ -typedef int yy_state_fast_t; - -#ifndef YY_ -# if defined YYENABLE_NLS && YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(Msgid) dgettext ("bison-runtime", Msgid) -# endif -# endif -# ifndef YY_ -# define YY_(Msgid) Msgid -# endif -#endif - -#ifndef YY_ATTRIBUTE_PURE -# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) -# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) -# else -# define YY_ATTRIBUTE_PURE -# endif -#endif - -#ifndef YY_ATTRIBUTE_UNUSED -# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) -# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) -# else -# define YY_ATTRIBUTE_UNUSED -# endif -#endif - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(E) ((void) (E)) -#else -# define YYUSE(E) /* empty */ -#endif - -#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ -/* Suppress an incorrect diagnostic about yylval being uninitialized. */ -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ - _Pragma ("GCC diagnostic push") \ - _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ - _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") -# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ - _Pragma ("GCC diagnostic pop") -#else -# define YY_INITIAL_VALUE(Value) Value -#endif -#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_END -#endif -#ifndef YY_INITIAL_VALUE -# define YY_INITIAL_VALUE(Value) /* Nothing. */ -#endif - -#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ -# define YY_IGNORE_USELESS_CAST_BEGIN \ - _Pragma ("GCC diagnostic push") \ - _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") -# define YY_IGNORE_USELESS_CAST_END \ - _Pragma ("GCC diagnostic pop") -#endif -#ifndef YY_IGNORE_USELESS_CAST_BEGIN -# define YY_IGNORE_USELESS_CAST_BEGIN -# define YY_IGNORE_USELESS_CAST_END -#endif - - -#define YY_ASSERT(E) ((void) (0 && (E))) - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS -# include /* INFRINGES ON USER NAME SPACE */ - /* Use EXIT_SUCCESS as a witness for stdlib.h. */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's 'empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -# endif -# if (defined __cplusplus && ! defined EXIT_SUCCESS \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined EXIT_SUCCESS -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \ - && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yy_state_t yyss_alloc; - YYSTYPE yyvs_alloc; - YYLTYPE yyls_alloc; -}; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE) \ - + YYSIZEOF (YYLTYPE)) \ - + 2 * YYSTACK_GAP_MAXIMUM) - -# define YYCOPY_NEEDED 1 - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYPTRDIFF_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / YYSIZEOF (*yyptr); \ - } \ - while (0) - -#endif - -#if defined YYCOPY_NEEDED && YYCOPY_NEEDED -/* Copy COUNT objects from SRC to DST. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(Dst, Src, Count) \ - __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) -# else -# define YYCOPY(Dst, Src, Count) \ - do \ - { \ - YYPTRDIFF_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (Dst)[yyi] = (Src)[yyi]; \ - } \ - while (0) -# endif -# endif -#endif /* !YYCOPY_NEEDED */ - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 5 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 5440 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 257 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 108 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 386 -/* YYNSTATES -- Number of states. */ -#define YYNSTATES 540 - -#define YYUNDEFTOK 2 -#define YYMAXUTOK 487 - - -/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM - as returned by yylex, with out-of-bounds checking. */ -#define YYTRANSLATE(YYX) \ - (0 <= (YYX) && (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM - as returned by yylex. */ -static const yytype_int16 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 241, 2, 2, 2, 245, 248, 2, - 233, 234, 243, 239, 238, 240, 237, 244, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 252, 254, - 246, 253, 247, 251, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 235, 2, 236, 249, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 255, 250, 256, 242, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232 -}; - -#if YYDEBUG - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ -static const yytype_int16 yyrline[] = -{ - 0, 303, 303, 302, 314, 316, 323, 333, 334, 335, - 336, 337, 350, 352, 356, 357, 358, 362, 371, 379, - 387, 398, 399, 403, 410, 417, 424, 431, 438, 445, - 446, 452, 456, 463, 469, 478, 482, 486, 487, 496, - 497, 501, 502, 506, 512, 524, 528, 534, 542, 553, - 554, 558, 559, 563, 569, 581, 593, 594, 600, 606, - 616, 617, 618, 619, 623, 624, 630, 636, 645, 646, - 652, 661, 662, 668, 677, 678, 684, 690, 696, 705, - 706, 712, 721, 722, 731, 732, 741, 742, 751, 752, - 761, 762, 771, 772, 781, 782, 791, 792, 801, 802, - 803, 804, 805, 806, 807, 808, 809, 810, 811, 815, - 819, 835, 839, 844, 848, 853, 860, 864, 865, 869, - 874, 882, 896, 906, 920, 925, 939, 943, 951, 959, - 971, 984, 990, 996, 1006, 1011, 1012, 1022, 1032, 1042, - 1056, 1063, 1073, 1083, 1093, 1103, 1115, 1130, 1137, 1148, - 1155, 1156, 1166, 1167, 1171, 1357, 1497, 1523, 1529, 1538, - 1544, 1550, 1560, 1566, 1571, 1572, 1573, 1574, 1575, 1594, - 1602, 1614, 1638, 1655, 1671, 1691, 1705, 1711, 1719, 1725, - 1731, 1737, 1743, 1749, 1770, 1776, 1781, 1786, 1792, 1797, - 1805, 1811, 1817, 1831, 1846, 1847, 1855, 1861, 1867, 1876, - 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, - 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, - 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, - 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, - 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, - 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, - 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, - 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, - 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, - 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, - 1980, 1985, 1990, 1998, 2005, 2014, 2019, 2027, 2046, 2051, - 2059, 2065, 2074, 2075, 2079, 2086, 2093, 2100, 2106, 2107, - 2111, 2112, 2113, 2114, 2115, 2116, 2120, 2127, 2126, 2140, - 2141, 2145, 2151, 2160, 2170, 2182, 2188, 2197, 2206, 2211, - 2219, 2223, 2241, 2249, 2254, 2262, 2267, 2275, 2283, 2291, - 2299, 2307, 2315, 2323, 2330, 2337, 2347, 2348, 2352, 2354, - 2360, 2365, 2374, 2380, 2386, 2392, 2398, 2407, 2408, 2409, - 2410, 2414, 2428, 2432, 2455, 2560, 2566, 2572, 2582, 2586, - 2592, 2601, 2606, 2614, 2638, 2646, 2654 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || 1 -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "ATTRIBUTE", "CONST_TOK", "BOOL_TOK", - "FLOAT_TOK", "INT_TOK", "UINT_TOK", "BREAK", "CONTINUE", "DO", "ELSE", - "FOR", "IF", "DISCARD", "RETURN", "SWITCH", "CASE", "DEFAULT", "BVEC2", - "BVEC3", "BVEC4", "IVEC2", "IVEC3", "IVEC4", "UVEC2", "UVEC3", "UVEC4", - "VEC2", "VEC3", "VEC4", "CENTROID", "IN_TOK", "OUT_TOK", "INOUT_TOK", - "UNIFORM", "VARYING", "SAMPLE", "NOPERSPECTIVE", "FLAT", "SMOOTH", - "MAT2X2", "MAT2X3", "MAT2X4", "MAT3X2", "MAT3X3", "MAT3X4", "MAT4X2", - "MAT4X3", "MAT4X4", "SAMPLER1D", "SAMPLER2D", "SAMPLER3D", "SAMPLERCUBE", - "SAMPLER1DSHADOW", "SAMPLER2DSHADOW", "SAMPLERCUBESHADOW", - "SAMPLER1DARRAY", "SAMPLER2DARRAY", "SAMPLER1DARRAYSHADOW", - "SAMPLER2DARRAYSHADOW", "SAMPLERCUBEARRAY", "SAMPLERCUBEARRAYSHADOW", - "ISAMPLER1D", "ISAMPLER2D", "ISAMPLER3D", "ISAMPLERCUBE", - "ISAMPLER1DARRAY", "ISAMPLER2DARRAY", "ISAMPLERCUBEARRAY", "USAMPLER1D", - "USAMPLER2D", "USAMPLER3D", "USAMPLERCUBE", "USAMPLER1DARRAY", - "USAMPLER2DARRAY", "USAMPLERCUBEARRAY", "SAMPLER2DRECT", - "ISAMPLER2DRECT", "USAMPLER2DRECT", "SAMPLER2DRECTSHADOW", - "SAMPLERBUFFER", "ISAMPLERBUFFER", "USAMPLERBUFFER", "SAMPLER2DMS", - "ISAMPLER2DMS", "USAMPLER2DMS", "SAMPLER2DMSARRAY", "ISAMPLER2DMSARRAY", - "USAMPLER2DMSARRAY", "SAMPLEREXTERNALOES", "IMAGE1D", "IMAGE2D", - "IMAGE3D", "IMAGE2DRECT", "IMAGECUBE", "IMAGEBUFFER", "IMAGE1DARRAY", - "IMAGE2DARRAY", "IMAGECUBEARRAY", "IMAGE2DMS", "IMAGE2DMSARRAY", - "IIMAGE1D", "IIMAGE2D", "IIMAGE3D", "IIMAGE2DRECT", "IIMAGECUBE", - "IIMAGEBUFFER", "IIMAGE1DARRAY", "IIMAGE2DARRAY", "IIMAGECUBEARRAY", - "IIMAGE2DMS", "IIMAGE2DMSARRAY", "UIMAGE1D", "UIMAGE2D", "UIMAGE3D", - "UIMAGE2DRECT", "UIMAGECUBE", "UIMAGEBUFFER", "UIMAGE1DARRAY", - "UIMAGE2DARRAY", "UIMAGECUBEARRAY", "UIMAGE2DMS", "UIMAGE2DMSARRAY", - "IMAGE1DSHADOW", "IMAGE2DSHADOW", "IMAGE1DARRAYSHADOW", - "IMAGE2DARRAYSHADOW", "COHERENT", "VOLATILE", "RESTRICT", "READONLY", - "WRITEONLY", "ATOMIC_UINT", "STRUCT", "VOID_TOK", "WHILE", "IDENTIFIER", - "TYPE_IDENTIFIER", "NEW_IDENTIFIER", "FLOATCONSTANT", "INTCONSTANT", - "UINTCONSTANT", "BOOLCONSTANT", "FIELD_SELECTION", "LEFT_OP", "RIGHT_OP", - "INC_OP", "DEC_OP", "LE_OP", "GE_OP", "EQ_OP", "NE_OP", "AND_OP", - "OR_OP", "XOR_OP", "MUL_ASSIGN", "DIV_ASSIGN", "ADD_ASSIGN", - "MOD_ASSIGN", "LEFT_ASSIGN", "RIGHT_ASSIGN", "AND_ASSIGN", "XOR_ASSIGN", - "OR_ASSIGN", "SUB_ASSIGN", "INVARIANT", "PRECISE", "LOWP", "MEDIUMP", - "HIGHP", "SUPERP", "PRECISION", "VERSION_TOK", "EXTENSION", "LINE", - "COLON", "EOL", "INTERFACE", "OUTPUT", "PRAGMA_DEBUG_ON", - "PRAGMA_DEBUG_OFF", "PRAGMA_OPTIMIZE_ON", "PRAGMA_OPTIMIZE_OFF", - "PRAGMA_INVARIANT_ALL", "LAYOUT_TOK", "ASM", "CLASS", "UNION", "ENUM", - "TYPEDEF", "TEMPLATE", "THIS", "PACKED_TOK", "GOTO", "INLINE_TOK", - "NOINLINE", "PUBLIC_TOK", "STATIC", "EXTERN", "EXTERNAL", "LONG_TOK", - "SHORT_TOK", "DOUBLE_TOK", "HALF", "FIXED_TOK", "UNSIGNED", "INPUT_TOK", - "HVEC2", "HVEC3", "HVEC4", "DVEC2", "DVEC3", "DVEC4", "FVEC2", "FVEC3", - "FVEC4", "SAMPLER3DRECT", "SIZEOF", "CAST", "NAMESPACE", "USING", - "RESOURCE", "PATCH", "SUBROUTINE", "ERROR_TOK", "COMMON", "PARTITION", - "ACTIVE", "FILTER", "ROW_MAJOR", "THEN", "'('", "')'", "'['", "']'", - "'.'", "','", "'+'", "'-'", "'!'", "'~'", "'*'", "'/'", "'%'", "'<'", - "'>'", "'&'", "'^'", "'|'", "'?'", "':'", "'='", "';'", "'{'", "'}'", - "$accept", "translation_unit", "$@1", "version_statement", - "pragma_statement", "extension_statement_list", "any_identifier", - "extension_statement", "external_declaration_list", - "variable_identifier", "primary_expression", "postfix_expression", - "integer_expression", "function_call", "function_call_or_method", - "function_call_generic", "function_call_header_no_parameters", - "function_call_header_with_parameters", "function_call_header", - "function_identifier", "method_call_generic", - "method_call_header_no_parameters", "method_call_header_with_parameters", - "method_call_header", "unary_expression", "unary_operator", - "multiplicative_expression", "additive_expression", "shift_expression", - "relational_expression", "equality_expression", "and_expression", - "exclusive_or_expression", "inclusive_or_expression", - "logical_and_expression", "logical_xor_expression", - "logical_or_expression", "conditional_expression", - "assignment_expression", "assignment_operator", "expression", - "constant_expression", "declaration", "function_prototype", - "function_declarator", "function_header_with_parameters", - "function_header", "parameter_declarator", "parameter_declaration", - "parameter_qualifier", "parameter_direction_qualifier", - "parameter_type_specifier", "init_declarator_list", "single_declaration", - "fully_specified_type", "layout_qualifier", "layout_qualifier_id_list", - "integer_constant", "layout_qualifier_id", - "interface_block_layout_qualifier", "interpolation_qualifier", - "type_qualifier", "auxiliary_storage_qualifier", "storage_qualifier", - "array_specifier", "type_specifier", "type_specifier_nonarray", - "basic_type_specifier_nonarray", "precision_qualifier", - "struct_specifier", "struct_declaration_list", "struct_declaration", - "struct_declarator_list", "struct_declarator", "initializer", - "initializer_list", "declaration_statement", "statement", - "simple_statement", "compound_statement", "$@2", - "statement_no_new_scope", "compound_statement_no_new_scope", - "statement_list", "expression_statement", "selection_statement", - "selection_rest_statement", "condition", "switch_statement", - "switch_body", "case_label", "case_label_list", "case_statement", - "case_statement_list", "iteration_statement", "for_init_statement", - "conditionopt", "for_rest_statement", "jump_statement", - "external_declaration", "function_definition", "interface_block", - "basic_interface_block", "interface_qualifier", "instance_name_opt", - "member_list", "member_declaration", "layout_defaults", YY_NULLPTR -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[NUM] -- (External) token number corresponding to the - (internal) symbol number NUM (which must be that of a token). */ -static const yytype_int16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 40, 41, 91, 93, 46, 44, 43, - 45, 33, 126, 42, 47, 37, 60, 62, 38, 94, - 124, 63, 58, 61, 59, 123, 125 -}; -# endif - -#define YYPACT_NINF (-414) - -#define yypact_value_is_default(Yyn) \ - ((Yyn) == YYPACT_NINF) - -#define YYTABLE_NINF (-378) - -#define yytable_value_is_error(Yyn) \ - 0 - - /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -static const yytype_int16 yypact[] = -{ - -129, -92, 53, -414, -103, -414, -57, -414, -414, -414, - -414, -58, -54, 4836, -414, -414, -51, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -17, -12, -414, 13, - -414, -414, -414, -414, -414, -414, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -414, -414, -414, -414, - -414, -414, -414, -414, -119, -414, -414, 266, 266, -414, - -414, -414, 15, -33, -14, -8, -3, 10, -37, -414, - 4652, -414, -196, -26, -27, 30, -199, -414, 54, 314, - 5129, 5301, 5129, 5129, -414, -15, -414, 5129, -414, -414, - -414, -414, -414, 82, -414, -54, 5007, -31, -414, -414, - -414, -414, -414, 5129, 5129, -414, 5129, -414, -414, -414, - 5301, -414, -414, -414, -414, -414, -107, -414, -414, -414, - 525, -414, -414, 36, 36, -414, -414, -414, 36, -414, - 5301, 36, 36, -54, -414, 3, 11, -197, 12, -123, - -116, -114, -414, -414, -414, -414, -414, -414, 3625, -5, - -414, -23, 68, -54, 1273, -414, 5007, -16, -414, -414, - -2, -143, -414, -414, 0, 1, 2007, 16, 20, 2, - 3184, 24, 28, -414, -414, -414, -414, -414, 4027, 4027, - 4027, -414, -414, -414, -414, -414, 6, -414, 32, -414, - -105, -414, -414, -414, 14, -122, 4228, 34, 222, 4027, - -18, -73, 26, -104, 27, 23, 25, 22, 119, 121, - -126, -414, -414, -160, -414, 21, 5149, 46, -414, -414, - -414, -414, 779, -414, -414, -414, -414, -414, -414, -414, - -414, -414, -414, -54, -414, -414, -193, 2961, -186, -414, - -414, -414, -414, -414, -414, -414, 47, -414, 3826, 5007, - -414, -15, -155, -414, -414, -414, 1510, -414, 60, -414, - -107, -414, -414, 147, 2500, 4027, -414, -414, -146, 4027, - 3424, -414, -414, -121, -414, 2007, -414, -414, 4027, 54, - -414, -414, 4027, 51, -414, -414, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -414, 4027, -414, 4027, - 4027, 4027, 4027, 4027, 4027, 4027, 4027, 4027, 4027, 4027, - 4027, 4027, 4027, 4027, 4027, 4027, 4027, 4027, 4027, 4027, - -414, -414, -414, -15, 2961, -174, 2961, -414, -414, 2961, - -414, -414, 50, -54, 38, 5007, -5, -54, -414, -414, - -414, -414, -414, -414, 55, -414, -414, 3424, -88, -414, - -87, 52, -54, 58, -414, 1033, 59, 52, -414, 63, - -414, 74, -76, 4429, -414, -414, -414, -414, -414, -18, - -18, -73, -73, 26, 26, 26, 26, -104, -104, 27, - 23, 25, 22, 119, 121, -156, -414, -5, -414, 2961, - -414, -176, -414, -414, -145, 157, -414, -414, 4027, -414, - 56, 77, 2007, 64, 61, 2260, -414, -414, -414, -414, - -414, 4027, 79, -414, 4027, -414, 2738, -414, -414, -15, - 66, -69, 4027, 2260, 303, -414, -6, -414, 2961, -414, - -414, -414, -414, -414, -414, -414, -5, -414, 67, 52, - -414, 2007, 4027, 70, -414, -414, 1754, 2007, -4, -414, - -414, -414, -117, -414, -414, -414, -414, -414, 2007, -414 -}; - - /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE does not specify something else to do. Zero - means the default is an error. */ -static const yytype_int16 yydefact[] = -{ - 4, 0, 0, 12, 0, 1, 2, 14, 15, 16, - 5, 0, 0, 0, 13, 6, 0, 179, 178, 203, - 200, 201, 202, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 204, 205, 206, 176, 181, 182, 183, 184, - 180, 177, 161, 160, 159, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 228, 229, 231, 232, - 234, 235, 236, 237, 238, 240, 241, 242, 243, 245, - 246, 247, 248, 250, 251, 252, 254, 255, 256, 257, - 259, 227, 244, 253, 233, 239, 249, 258, 260, 261, - 262, 263, 264, 265, 230, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 185, 186, - 187, 188, 189, 299, 0, 199, 198, 162, 163, 302, - 301, 300, 0, 0, 0, 0, 0, 0, 0, 369, - 3, 368, 0, 0, 118, 126, 0, 135, 140, 167, - 166, 0, 164, 165, 147, 194, 196, 168, 197, 18, - 367, 115, 372, 0, 370, 0, 0, 0, 181, 182, - 184, 21, 22, 162, 163, 145, 167, 170, 146, 169, - 0, 7, 8, 9, 10, 11, 0, 20, 19, 112, - 0, 371, 116, 126, 126, 131, 132, 133, 126, 119, - 0, 126, 126, 0, 113, 14, 16, 141, 0, 181, - 182, 184, 172, 373, 171, 148, 173, 174, 0, 195, - 175, 0, 0, 0, 0, 305, 0, 0, 158, 157, - 154, 0, 150, 156, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 26, 24, 25, 27, 48, 0, 0, - 0, 60, 61, 62, 63, 335, 327, 331, 23, 29, - 56, 31, 36, 37, 0, 0, 42, 0, 64, 0, - 68, 71, 74, 79, 82, 84, 86, 88, 90, 92, - 94, 96, 109, 0, 317, 0, 167, 147, 320, 333, - 319, 318, 0, 321, 322, 323, 324, 325, 120, 127, - 128, 124, 125, 134, 129, 130, 136, 0, 142, 121, - 385, 386, 384, 190, 64, 111, 0, 46, 0, 0, - 17, 310, 0, 308, 304, 306, 0, 114, 0, 149, - 0, 363, 362, 0, 0, 0, 366, 364, 0, 0, - 0, 57, 58, 0, 326, 0, 33, 34, 0, 0, - 40, 39, 0, 199, 43, 45, 99, 100, 102, 101, - 104, 105, 106, 107, 108, 103, 98, 0, 59, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 336, 332, 334, 122, 0, 137, 0, 312, 144, 0, - 191, 192, 0, 0, 0, 381, 311, 0, 307, 303, - 152, 153, 155, 151, 0, 357, 356, 359, 0, 365, - 0, 340, 0, 0, 28, 0, 0, 35, 32, 0, - 38, 0, 0, 52, 44, 97, 65, 66, 67, 69, - 70, 72, 73, 77, 78, 75, 76, 80, 81, 83, - 85, 87, 89, 91, 93, 0, 110, 123, 139, 0, - 315, 0, 143, 193, 0, 378, 382, 309, 0, 358, - 0, 0, 0, 0, 0, 0, 328, 30, 55, 50, - 49, 0, 199, 53, 0, 138, 0, 313, 383, 379, - 0, 0, 360, 0, 339, 337, 0, 342, 0, 330, - 353, 329, 54, 95, 314, 316, 380, 374, 0, 361, - 355, 0, 0, 0, 343, 347, 0, 351, 0, 341, - 354, 338, 0, 346, 349, 348, 350, 344, 352, 345 -}; - - /* YYPGOTO[NTERM-NUM]. */ -static const yytype_int16 yypgoto[] = -{ - -414, -414, -414, -414, -414, -414, -1, 174, -414, -128, - -414, -414, -414, -414, -414, -414, -414, -414, -414, -414, - -414, -414, -414, -414, -19, -414, -169, -142, -170, -162, - -67, -66, -68, -65, -64, -63, -414, -206, -228, -414, - -244, 7, -9, 5, -414, -414, -414, -414, 125, -52, - -414, -414, -414, -414, -168, -11, -414, -414, 17, -414, - -414, -86, -414, -414, -212, -13, -414, -414, -101, -414, - 93, -207, -77, -79, -381, -414, 45, -245, -413, -414, - -414, -163, 189, -10, 48, -414, -414, -84, -414, -414, - -167, -414, -172, -414, -414, -414, -414, -414, -414, 240, - -414, -414, -152, -414, -414, -24, -414, -414 -}; - - /* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 2, 13, 3, 149, 6, 331, 14, 150, 268, - 269, 270, 436, 271, 272, 273, 274, 275, 276, 277, - 440, 441, 442, 443, 278, 279, 280, 281, 282, 283, - 284, 285, 286, 287, 288, 289, 290, 291, 292, 377, - 293, 326, 294, 295, 153, 154, 155, 311, 209, 210, - 211, 312, 156, 157, 158, 186, 241, 422, 242, 243, - 160, 161, 162, 163, 229, 327, 165, 166, 167, 168, - 234, 235, 332, 333, 408, 471, 298, 299, 300, 301, - 355, 510, 511, 302, 303, 304, 505, 433, 305, 507, - 525, 526, 527, 528, 306, 427, 480, 481, 307, 169, - 170, 171, 172, 173, 500, 414, 415, 174 -}; - - /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule whose - number is the opposite. If YYTABLE_NINF, syntax error. */ -static const yytype_int16 yytable[] = -{ - 164, 343, 159, 11, 151, 318, 348, 223, 233, 185, - 188, 16, 522, 523, 522, 523, 353, -375, 152, 7, - 8, 9, 325, 468, -376, 470, -377, 335, 472, 397, - 218, 7, 8, 9, 204, 7, 8, 9, 228, 213, - 204, 190, 228, 356, 357, 1, 386, 387, 364, 328, - 4, 187, 189, 5, 212, 214, 317, 402, 199, 200, - 404, 328, 496, 205, 206, 207, 233, 409, 233, 205, - 206, 207, 509, 222, 224, 10, 226, 227, 399, 469, - 497, 230, 399, 417, 7, 8, 9, 238, 495, 407, - 509, 339, 399, 417, 400, 340, 494, 187, 189, 418, - 222, 428, 212, 212, 405, 430, 431, 212, 429, 498, - 212, 212, 361, 434, 437, 515, 362, 399, 12, 416, - 15, 399, 325, -375, 239, 398, 175, 529, -376, 335, - 358, 320, 359, 177, 444, 539, 176, 164, 321, 159, - 322, 151, 388, 389, 223, 191, 482, 483, 225, 445, - 399, 399, 309, -377, 465, 152, 310, 217, 490, 314, - 315, 413, 491, 164, 192, 518, 382, 383, 233, 399, - 193, 466, 384, 385, 232, 194, 407, 237, 407, 390, - 391, 407, 432, 431, 139, 140, 141, 297, 195, 296, - 402, 467, 215, 8, 216, 240, 196, 313, 208, 139, - 140, 141, 420, 421, 208, 139, 140, 141, 202, 324, - 222, 203, 316, 449, 450, 493, 453, 454, 455, 456, - 228, 164, 231, 164, 236, 379, 380, 381, 457, 458, - 328, 439, 329, 297, 501, 296, -21, 504, 337, 351, - 352, 407, 451, 452, -22, 319, 330, 413, 360, 344, - 524, 338, 537, 345, 341, 342, 346, 349, 519, 432, - 378, 350, 354, 512, -117, -47, 513, 365, 407, 17, - 18, 392, 394, 395, 393, 199, 531, 396, 532, -46, - 407, 534, 536, 410, 424, -41, 473, 516, 478, 297, - 399, 296, 485, 536, 475, 487, 488, 499, 35, 178, - 179, 38, 180, 40, 41, 42, 43, 44, 489, 324, - 502, 503, 403, -51, 508, 521, 164, 17, 18, 506, - 517, 530, 533, 164, 197, 459, 461, 460, 308, 336, - 462, 297, 463, 296, 464, 412, 474, 297, 477, 240, - 520, 201, 297, 479, 296, 435, 35, 219, 220, 38, - 221, 40, 41, 42, 43, 44, 538, 423, 438, 535, - 446, 447, 448, 324, 324, 324, 324, 324, 324, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 425, - 198, 476, 426, 0, 0, 128, 129, 130, 131, 132, - 0, 0, 164, 0, 181, 0, 182, 0, 0, 0, - 0, 0, 0, 0, 297, 0, 0, 0, 0, 0, - 0, 0, 297, 0, 296, 0, 0, 0, 0, 0, - 0, 484, 0, 183, 184, 139, 140, 141, 0, 0, - 0, 0, 0, 128, 129, 130, 131, 132, 0, 0, - 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, - 0, 296, 297, 0, 296, 376, 0, 0, 0, 0, - 0, 183, 184, 139, 140, 141, 0, 0, 0, 0, - 297, 0, 296, 0, 0, 0, 0, 0, 0, 0, - 148, 0, 0, 0, 0, 0, 0, 0, 297, 0, - 296, 0, 0, 297, 297, 296, 296, 0, 0, 0, - 0, 0, 0, 0, 0, 297, 0, 296, 17, 18, - 19, 20, 21, 22, 244, 245, 246, 0, 247, 248, - 249, 250, 251, 0, 0, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 0, 0, 0, 0, 128, 129, 130, 131, 132, 133, - 134, 135, 252, 181, 136, 182, 253, 254, 255, 256, - 257, 0, 0, 258, 259, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 137, 138, 139, 140, 141, 0, 142, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 0, 261, 262, 263, 264, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, - 266, 267, 17, 18, 19, 20, 21, 22, 244, 245, - 246, 0, 247, 248, 249, 250, 251, 0, 0, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 0, 0, 0, 0, 128, 129, - 130, 131, 132, 133, 134, 135, 252, 181, 136, 182, - 253, 254, 255, 256, 257, 0, 0, 258, 259, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 137, 138, 139, 140, - 141, 0, 142, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 260, 0, 0, 0, 0, 0, 261, 262, - 263, 264, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 265, 266, 401, 17, 18, 19, 20, - 21, 22, 244, 245, 246, 0, 247, 248, 249, 250, - 251, 0, 0, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 0, 0, - 0, 0, 128, 129, 130, 131, 132, 133, 134, 135, - 252, 181, 136, 182, 253, 254, 255, 256, 257, 0, - 0, 258, 259, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 137, 138, 139, 140, 141, 0, 142, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 260, 0, 0, 0, - 0, 0, 261, 262, 263, 264, 17, 18, 19, 20, - 21, 22, 0, 0, 0, 0, 0, 265, 266, 486, - 0, 0, 0, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 178, 179, 38, 180, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 0, 0, - 0, 0, 128, 129, 130, 131, 132, 133, 134, 135, - 0, 0, 136, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 183, 184, 139, 140, 141, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 17, 18, 19, 20, 21, 22, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 334, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 178, 179, 38, 180, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 0, 0, 0, 0, 128, - 129, 130, 131, 132, 133, 134, 135, 0, 0, 136, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 183, 184, 139, - 140, 141, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 148, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, - 20, 21, 22, 244, 245, 246, 419, 247, 248, 249, - 250, 251, 522, 523, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 0, - 0, 0, 0, 128, 129, 130, 131, 132, 133, 134, - 135, 252, 181, 136, 182, 253, 254, 255, 256, 257, - 0, 0, 258, 259, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 137, 138, 139, 140, 141, 0, 142, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, - 0, 0, 0, 261, 262, 263, 264, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 265, 266, - 17, 18, 19, 20, 21, 22, 244, 245, 246, 0, - 247, 248, 249, 250, 251, 0, 0, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 0, 0, 0, 0, 128, 129, 130, 131, - 132, 133, 134, 135, 252, 181, 136, 182, 253, 254, - 255, 256, 257, 0, 0, 258, 259, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 137, 138, 139, 140, 141, 0, - 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 0, 261, 262, 263, 264, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 265, 266, 17, 18, 19, 20, 21, 22, 244, - 245, 246, 0, 247, 248, 249, 250, 251, 0, 0, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 0, 0, 0, 0, 128, - 129, 130, 131, 132, 133, 134, 135, 252, 181, 136, - 182, 253, 254, 255, 256, 257, 0, 0, 258, 259, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 137, 138, 139, - 140, 141, 0, 142, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 148, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 0, 261, - 262, 263, 264, 17, 18, 19, 20, 21, 22, 0, - 0, 0, 0, 0, 265, 200, 0, 0, 0, 0, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 0, 0, 0, 0, 128, - 129, 130, 131, 132, 133, 134, 135, 0, 181, 136, - 182, 253, 254, 255, 256, 257, 0, 0, 258, 259, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 137, 138, 139, - 140, 141, 0, 142, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 148, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 0, 261, - 262, 263, 264, 19, 20, 21, 22, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 133, 134, 135, 0, 181, 136, 182, 253, - 254, 255, 256, 257, 0, 0, 258, 259, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, - 0, 260, 0, 0, 0, 0, 0, 261, 262, 263, - 264, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 406, 514, 0, 0, 0, 0, 0, - 0, 0, 0, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 133, 134, 135, 0, 181, - 136, 182, 253, 254, 255, 256, 257, 0, 0, 258, - 259, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, - 20, 21, 22, 0, 260, 0, 0, 0, 0, 0, - 261, 262, 263, 264, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 406, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 133, 134, - 135, 0, 181, 136, 182, 253, 254, 255, 256, 257, - 0, 0, 258, 259, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, - 0, 0, 0, 261, 262, 263, 264, 17, 18, 19, - 20, 21, 22, 0, 0, 0, 0, 0, 347, 0, - 0, 0, 0, 0, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 178, 179, 38, - 180, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 0, - 0, 0, 0, 128, 129, 130, 131, 132, 133, 134, - 135, 0, 181, 136, 182, 253, 254, 255, 256, 257, - 0, 0, 258, 259, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 183, 184, 139, 140, 141, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 260, 0, 0, - 0, 0, 0, 261, 262, 263, 264, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, - 134, 135, 0, 181, 136, 182, 253, 254, 255, 256, - 257, 0, 0, 258, 259, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 260, 0, - 0, 323, 0, 0, 261, 262, 263, 264, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 133, 134, 135, 0, 181, 136, 182, 253, 254, 255, - 256, 257, 0, 0, 258, 259, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 260, - 0, 0, 411, 0, 0, 261, 262, 263, 264, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 133, 134, 135, 0, 181, 136, 182, 253, 254, - 255, 256, 257, 0, 0, 258, 259, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 260, 0, 0, 0, 0, 0, 261, 262, 263, 264, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 133, 134, 363, 0, 181, 136, 182, 253, - 254, 255, 256, 257, 0, 0, 258, 259, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 260, 0, 0, 0, 0, 0, 261, 262, 263, - 264, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 133, 134, 492, 0, 181, 136, 182, - 253, 254, 255, 256, 257, 0, 0, 258, 259, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, - 22, 0, 260, 0, 0, 0, 0, 0, 261, 262, - 263, 264, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 0, 0, 0, - 0, 128, 129, 130, 131, 132, 133, 134, 135, 0, - 0, 136, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, - 138, 139, 140, 141, 0, 142, 0, 12, 0, 0, - 0, 0, 0, 143, 144, 145, 146, 147, 148, 17, - 18, 19, 20, 21, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 0, 0, 0, 0, 128, 129, 130, 131, 132, - 133, 134, 135, 0, 0, 136, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 137, 138, 139, 140, 141, 0, 142, - 17, 18, 19, 20, 21, 22, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 0, 0, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 178, 179, 38, 180, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 17, 18, 0, 0, 128, 129, 130, 131, - 132, 133, 134, 135, 0, 0, 136, 0, 0, 0, - 0, 0, 17, 18, 0, 0, 0, 0, 0, 0, - 0, 35, 178, 179, 38, 180, 40, 41, 42, 43, - 44, 0, 0, 0, 183, 184, 139, 140, 141, 0, - 0, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 0, 0, 148, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, - 130, 131, 132, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, - 130, 131, 132, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 183, 184, 139, 140, - 141, 0, 0, 0, 0, 0, 19, 20, 21, 22, - 0, 0, 0, 0, 0, 148, 183, 184, 139, 140, - 141, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 0, 0, 148, 0, 0, 0, 0, - 0, 0, 0, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 133, 134, 135, 0, 0, - 136 -}; - -static const yytype_int16 yycheck[] = -{ - 13, 246, 13, 4, 13, 217, 250, 159, 176, 137, - 138, 12, 18, 19, 18, 19, 260, 140, 13, 138, - 139, 140, 228, 404, 140, 406, 140, 234, 409, 155, - 158, 138, 139, 140, 4, 138, 139, 140, 235, 238, - 4, 142, 235, 148, 149, 174, 150, 151, 276, 235, - 142, 137, 138, 0, 155, 254, 253, 302, 254, 255, - 253, 235, 238, 33, 34, 35, 234, 253, 236, 33, - 34, 35, 485, 159, 160, 178, 162, 163, 238, 253, - 256, 167, 238, 238, 138, 139, 140, 194, 469, 317, - 503, 234, 238, 238, 254, 238, 252, 183, 184, 254, - 186, 345, 203, 204, 316, 349, 350, 208, 254, 254, - 211, 212, 234, 234, 358, 496, 238, 238, 175, 331, - 178, 238, 328, 140, 231, 251, 177, 508, 140, 336, - 235, 254, 237, 134, 362, 252, 255, 150, 254, 150, - 254, 150, 246, 247, 296, 178, 234, 234, 161, 377, - 238, 238, 204, 140, 398, 150, 208, 158, 234, 211, - 212, 329, 238, 176, 178, 234, 239, 240, 336, 238, - 178, 399, 146, 147, 175, 178, 404, 190, 406, 152, - 153, 409, 350, 427, 169, 170, 171, 200, 178, 200, - 435, 403, 138, 139, 140, 196, 233, 210, 168, 169, - 170, 171, 142, 143, 168, 169, 170, 171, 234, 228, - 296, 238, 213, 382, 383, 443, 386, 387, 388, 389, - 235, 234, 140, 236, 255, 243, 244, 245, 390, 391, - 235, 359, 255, 246, 478, 246, 233, 482, 254, 258, - 259, 469, 384, 385, 233, 233, 178, 415, 234, 233, - 256, 253, 256, 233, 254, 254, 254, 233, 502, 427, - 279, 233, 256, 491, 234, 233, 494, 233, 496, 3, - 4, 248, 250, 154, 249, 254, 521, 156, 522, 233, - 508, 526, 527, 236, 137, 234, 236, 499, 233, 302, - 238, 302, 234, 538, 256, 236, 233, 140, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 234, 328, - 254, 234, 313, 234, 253, 12, 329, 3, 4, 255, - 254, 254, 252, 336, 150, 392, 394, 393, 203, 236, - 395, 344, 396, 344, 397, 328, 413, 350, 417, 340, - 503, 152, 355, 427, 355, 355, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 528, 340, 359, 526, - 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, - 389, 390, 391, 392, 393, 394, 395, 396, 397, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 344, - 150, 415, 344, -1, -1, 129, 130, 131, 132, 133, - -1, -1, 415, -1, 138, -1, 140, -1, -1, -1, - -1, -1, -1, -1, 427, -1, -1, -1, -1, -1, - -1, -1, 435, -1, 435, -1, -1, -1, -1, -1, - -1, 432, -1, 167, 168, 169, 170, 171, -1, -1, - -1, -1, -1, 129, 130, 131, 132, 133, -1, -1, - -1, -1, 186, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 482, - -1, 482, 485, -1, 485, 253, -1, -1, -1, -1, - -1, 167, 168, 169, 170, 171, -1, -1, -1, -1, - 503, -1, 503, -1, -1, -1, -1, -1, -1, -1, - 186, -1, -1, -1, -1, -1, -1, -1, 521, -1, - 521, -1, -1, 526, 527, 526, 527, -1, -1, -1, - -1, -1, -1, -1, -1, 538, -1, 538, 3, 4, - 5, 6, 7, 8, 9, 10, 11, -1, 13, 14, - 15, 16, 17, -1, -1, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - -1, -1, -1, -1, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, -1, -1, 148, 149, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 167, 168, 169, 170, 171, -1, 173, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 186, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 233, -1, - -1, -1, -1, -1, 239, 240, 241, 242, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 254, - 255, 256, 3, 4, 5, 6, 7, 8, 9, 10, - 11, -1, 13, 14, 15, 16, 17, -1, -1, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, -1, -1, -1, -1, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, -1, -1, 148, 149, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 167, 168, 169, 170, - 171, -1, 173, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 186, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 233, -1, -1, -1, -1, -1, 239, 240, - 241, 242, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 254, 255, 256, 3, 4, 5, 6, - 7, 8, 9, 10, 11, -1, 13, 14, 15, 16, - 17, -1, -1, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, -1, -1, - -1, -1, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, -1, - -1, 148, 149, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 167, 168, 169, 170, 171, -1, 173, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 186, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 233, -1, -1, -1, - -1, -1, 239, 240, 241, 242, 3, 4, 5, 6, - 7, 8, -1, -1, -1, -1, -1, 254, 255, 256, - -1, -1, -1, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, -1, -1, - -1, -1, 129, 130, 131, 132, 133, 134, 135, 136, - -1, -1, 139, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 167, 168, 169, 170, 171, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 186, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3, 4, 5, 6, 7, 8, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, -1, -1, -1, -1, 129, - 130, 131, 132, 133, 134, 135, 136, -1, -1, 139, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 167, 168, 169, - 170, 171, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 186, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 256, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, -1, - -1, -1, -1, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - -1, -1, 148, 149, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 167, 168, 169, 170, 171, -1, 173, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 186, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 233, -1, -1, - -1, -1, -1, 239, 240, 241, 242, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 254, 255, - 3, 4, 5, 6, 7, 8, 9, 10, 11, -1, - 13, 14, 15, 16, 17, -1, -1, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, -1, -1, -1, -1, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, -1, -1, 148, 149, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 167, 168, 169, 170, 171, -1, - 173, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 186, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 233, -1, -1, -1, -1, -1, 239, 240, 241, 242, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 254, 255, 3, 4, 5, 6, 7, 8, 9, - 10, 11, -1, 13, 14, 15, 16, 17, -1, -1, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, -1, -1, -1, -1, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, -1, -1, 148, 149, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 167, 168, 169, - 170, 171, -1, 173, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 186, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 233, -1, -1, -1, -1, -1, 239, - 240, 241, 242, 3, 4, 5, 6, 7, 8, -1, - -1, -1, -1, -1, 254, 255, -1, -1, -1, -1, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, -1, -1, -1, -1, 129, - 130, 131, 132, 133, 134, 135, 136, -1, 138, 139, - 140, 141, 142, 143, 144, 145, -1, -1, 148, 149, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 167, 168, 169, - 170, 171, -1, 173, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 186, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 233, -1, -1, -1, -1, -1, 239, - 240, 241, 242, 5, 6, 7, 8, -1, -1, -1, - -1, -1, -1, -1, 254, -1, -1, -1, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 134, 135, 136, -1, 138, 139, 140, 141, - 142, 143, 144, 145, -1, -1, 148, 149, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 5, 6, 7, 8, - -1, 233, -1, -1, -1, -1, -1, 239, 240, 241, - 242, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 255, 256, -1, -1, -1, -1, -1, - -1, -1, -1, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 134, 135, 136, -1, 138, - 139, 140, 141, 142, 143, 144, 145, -1, -1, 148, - 149, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, - 6, 7, 8, -1, 233, -1, -1, -1, -1, -1, - 239, 240, 241, 242, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 255, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 134, 135, - 136, -1, 138, 139, 140, 141, 142, 143, 144, 145, - -1, -1, 148, 149, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 233, -1, -1, - -1, -1, -1, 239, 240, 241, 242, 3, 4, 5, - 6, 7, 8, -1, -1, -1, -1, -1, 254, -1, - -1, -1, -1, -1, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, -1, - -1, -1, -1, 129, 130, 131, 132, 133, 134, 135, - 136, -1, 138, 139, 140, 141, 142, 143, 144, 145, - -1, -1, 148, 149, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 167, 168, 169, 170, 171, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 186, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 5, 6, 7, 8, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 233, -1, -1, - -1, -1, -1, 239, 240, 241, 242, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 134, - 135, 136, -1, 138, 139, 140, 141, 142, 143, 144, - 145, -1, -1, 148, 149, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 5, 6, 7, 8, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 233, -1, - -1, 236, -1, -1, 239, 240, 241, 242, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 134, 135, 136, -1, 138, 139, 140, 141, 142, 143, - 144, 145, -1, -1, 148, 149, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 5, 6, 7, 8, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 233, - -1, -1, 236, -1, -1, 239, 240, 241, 242, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 134, 135, 136, -1, 138, 139, 140, 141, 142, - 143, 144, 145, -1, -1, 148, 149, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 5, 6, 7, 8, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 233, -1, -1, -1, -1, -1, 239, 240, 241, 242, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 134, 135, 136, -1, 138, 139, 140, 141, - 142, 143, 144, 145, -1, -1, 148, 149, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 5, 6, 7, 8, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 233, -1, -1, -1, -1, -1, 239, 240, 241, - 242, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 134, 135, 136, -1, 138, 139, 140, - 141, 142, 143, 144, 145, -1, -1, 148, 149, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 3, 4, 5, 6, 7, - 8, -1, 233, -1, -1, -1, -1, -1, 239, 240, - 241, 242, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, -1, -1, -1, - -1, 129, 130, 131, 132, 133, 134, 135, 136, -1, - -1, 139, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 167, - 168, 169, 170, 171, -1, 173, -1, 175, -1, -1, - -1, -1, -1, 181, 182, 183, 184, 185, 186, 3, - 4, 5, 6, 7, 8, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, -1, -1, -1, -1, 129, 130, 131, 132, 133, - 134, 135, 136, -1, -1, 139, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 167, 168, 169, 170, 171, -1, 173, - 3, 4, 5, 6, 7, 8, -1, 181, 182, 183, - 184, 185, 186, -1, -1, -1, -1, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 3, 4, -1, -1, 129, 130, 131, 132, - 133, 134, 135, 136, -1, -1, 139, -1, -1, -1, - -1, -1, 3, 4, -1, -1, -1, -1, -1, -1, - -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, -1, -1, -1, 167, 168, 169, 170, 171, -1, - -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, -1, -1, 186, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 129, 130, - 131, 132, 133, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 129, 130, - 131, 132, 133, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 167, 168, 169, 170, - 171, -1, -1, -1, -1, -1, 5, 6, 7, 8, - -1, -1, -1, -1, -1, 186, 167, 168, 169, 170, - 171, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, -1, -1, 186, -1, -1, -1, -1, - -1, -1, -1, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 134, 135, 136, -1, -1, - 139 -}; - - /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_int16 yystos[] = -{ - 0, 174, 258, 260, 142, 0, 262, 138, 139, 140, - 178, 263, 175, 259, 264, 178, 263, 3, 4, 5, - 6, 7, 8, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 129, 130, - 131, 132, 133, 134, 135, 136, 139, 167, 168, 169, - 170, 171, 173, 181, 182, 183, 184, 185, 186, 261, - 265, 299, 300, 301, 302, 303, 309, 310, 311, 312, - 317, 318, 319, 320, 322, 323, 324, 325, 326, 356, - 357, 358, 359, 360, 364, 177, 255, 263, 33, 34, - 36, 138, 140, 167, 168, 266, 312, 318, 266, 318, - 325, 178, 178, 178, 178, 178, 233, 264, 356, 254, - 255, 339, 234, 238, 4, 33, 34, 35, 168, 305, - 306, 307, 325, 238, 254, 138, 140, 263, 266, 33, - 34, 36, 318, 359, 318, 322, 318, 318, 235, 321, - 318, 140, 263, 311, 327, 328, 255, 322, 194, 231, - 263, 313, 315, 316, 9, 10, 11, 13, 14, 15, - 16, 17, 137, 141, 142, 143, 144, 145, 148, 149, - 233, 239, 240, 241, 242, 254, 255, 256, 266, 267, - 268, 270, 271, 272, 273, 274, 275, 276, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 297, 299, 300, 312, 322, 333, 334, - 335, 336, 340, 341, 342, 345, 351, 355, 305, 306, - 306, 304, 308, 322, 306, 306, 263, 253, 321, 233, - 254, 254, 254, 236, 281, 294, 298, 322, 235, 255, - 178, 263, 329, 330, 256, 328, 327, 254, 253, 234, - 238, 254, 254, 334, 233, 233, 254, 254, 297, 233, - 233, 281, 281, 297, 256, 337, 148, 149, 235, 237, - 234, 234, 238, 136, 295, 233, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 253, 296, 281, 243, - 244, 245, 239, 240, 146, 147, 150, 151, 246, 247, - 152, 153, 248, 249, 250, 154, 156, 155, 251, 238, - 254, 256, 334, 263, 253, 321, 255, 295, 331, 253, - 236, 236, 298, 311, 362, 363, 321, 238, 254, 256, - 142, 143, 314, 315, 137, 333, 341, 352, 297, 254, - 297, 297, 311, 344, 234, 340, 269, 297, 263, 266, - 277, 278, 279, 280, 295, 295, 281, 281, 281, 283, - 283, 284, 284, 285, 285, 285, 285, 286, 286, 287, - 288, 289, 290, 291, 292, 297, 295, 321, 331, 253, - 331, 332, 331, 236, 329, 256, 362, 330, 233, 344, - 353, 354, 234, 234, 263, 234, 256, 236, 233, 234, - 234, 238, 136, 295, 252, 331, 238, 256, 254, 140, - 361, 297, 254, 234, 334, 343, 255, 346, 253, 335, - 338, 339, 295, 295, 256, 331, 321, 254, 234, 297, - 338, 12, 18, 19, 256, 347, 348, 349, 350, 331, - 254, 334, 297, 252, 334, 347, 334, 256, 349, 252 -}; - - /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_int16 yyr1[] = -{ - 0, 257, 259, 258, 260, 260, 260, 261, 261, 261, - 261, 261, 262, 262, 263, 263, 263, 264, 265, 265, - 265, 266, 266, 267, 267, 267, 267, 267, 267, 268, - 268, 268, 268, 268, 268, 269, 270, 271, 271, 272, - 272, 273, 273, 274, 274, 275, 276, 276, 276, 277, - 277, 278, 278, 279, 279, 280, 281, 281, 281, 281, - 282, 282, 282, 282, 283, 283, 283, 283, 284, 284, - 284, 285, 285, 285, 286, 286, 286, 286, 286, 287, - 287, 287, 288, 288, 289, 289, 290, 290, 291, 291, - 292, 292, 293, 293, 294, 294, 295, 295, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, 296, 297, - 297, 298, 299, 299, 299, 299, 300, 301, 301, 302, - 302, 303, 304, 304, 305, 305, 306, 306, 306, 306, - 306, 307, 307, 307, 308, 309, 309, 309, 309, 309, - 310, 310, 310, 310, 310, 310, 310, 311, 311, 312, - 313, 313, 314, 314, 315, 315, 315, 316, 316, 317, - 317, 317, 318, 318, 318, 318, 318, 318, 318, 318, - 318, 318, 318, 318, 318, 318, 319, 319, 320, 320, - 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, - 321, 321, 321, 321, 322, 322, 323, 323, 323, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, - 325, 325, 325, 326, 326, 327, 327, 328, 329, 329, - 330, 330, 331, 331, 331, 332, 332, 333, 334, 334, - 335, 335, 335, 335, 335, 335, 336, 337, 336, 338, - 338, 339, 339, 340, 340, 341, 341, 342, 343, 343, - 344, 344, 345, 346, 346, 347, 347, 348, 348, 349, - 349, 350, 350, 351, 351, 351, 352, 352, 353, 353, - 354, 354, 355, 355, 355, 355, 355, 356, 356, 356, - 356, 357, 358, 358, 359, 360, 360, 360, 361, 361, - 361, 362, 362, 363, 364, 364, 364 -}; - - /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ -static const yytype_int8 yyr2[] = -{ - 0, 2, 0, 4, 0, 3, 4, 2, 2, 2, - 2, 2, 0, 2, 1, 1, 1, 5, 1, 2, - 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 4, 1, 3, 2, 2, 1, 1, 1, 3, 2, - 2, 2, 1, 2, 3, 2, 1, 1, 1, 2, - 2, 2, 1, 2, 3, 2, 1, 2, 2, 2, - 1, 1, 1, 1, 1, 3, 3, 3, 1, 3, - 3, 1, 3, 3, 1, 3, 3, 3, 3, 1, - 3, 3, 1, 3, 1, 3, 1, 3, 1, 3, - 1, 3, 1, 3, 1, 5, 1, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 1, 2, 2, 4, 1, 2, 1, 1, 2, - 3, 3, 2, 3, 2, 2, 0, 2, 2, 2, - 2, 1, 1, 1, 1, 1, 3, 4, 6, 5, - 1, 2, 3, 5, 4, 2, 2, 1, 2, 4, - 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 3, 3, 4, 1, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 5, 4, 1, 2, 3, 1, 3, - 1, 2, 1, 3, 4, 1, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 0, 4, 1, - 1, 2, 3, 1, 2, 1, 2, 5, 3, 1, - 1, 4, 5, 2, 3, 3, 2, 1, 2, 2, - 2, 1, 2, 5, 7, 6, 1, 1, 1, 0, - 2, 3, 2, 2, 2, 3, 2, 1, 1, 1, - 1, 2, 1, 2, 7, 1, 1, 1, 0, 1, - 2, 1, 2, 3, 3, 3, 3 -}; - - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ - do \ - if (yychar == YYEMPTY) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - YYPOPSTACK (yylen); \ - yystate = *yyssp; \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (&yylloc, state, YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ - while (0) - -/* Error token number */ -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (N) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (0) -#endif - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) - - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (0) - - -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ - -#ifndef YY_LOCATION_PRINT -# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL - -/* Print *YYLOCP on YYO. Private, do not rely on its existence. */ - -YY_ATTRIBUTE_UNUSED -static int -yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp) -{ - int res = 0; - int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0; - if (0 <= yylocp->first_line) - { - res += YYFPRINTF (yyo, "%d", yylocp->first_line); - if (0 <= yylocp->first_column) - res += YYFPRINTF (yyo, ".%d", yylocp->first_column); - } - if (0 <= yylocp->last_line) - { - if (yylocp->first_line < yylocp->last_line) - { - res += YYFPRINTF (yyo, "-%d", yylocp->last_line); - if (0 <= end_col) - res += YYFPRINTF (yyo, ".%d", end_col); - } - else if (0 <= end_col && yylocp->first_column < end_col) - res += YYFPRINTF (yyo, "-%d", end_col); - } - return res; - } - -# define YY_LOCATION_PRINT(File, Loc) \ - yy_location_print_ (File, &(Loc)) - -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif - - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value, Location, state); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (0) - - -/*-----------------------------------. -| Print this symbol's value on YYO. | -`-----------------------------------*/ - -static void -yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, struct _mesa_glsl_parse_state *state) -{ - FILE *yyoutput = yyo; - YYUSE (yyoutput); - YYUSE (yylocationp); - YYUSE (state); - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyo, yytoknum[yytype], *yyvaluep); -# endif - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YYUSE (yytype); - YY_IGNORE_MAYBE_UNINITIALIZED_END -} - - -/*---------------------------. -| Print this symbol on YYO. | -`---------------------------*/ - -static void -yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, struct _mesa_glsl_parse_state *state) -{ - YYFPRINTF (yyo, "%s %s (", - yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); - - YY_LOCATION_PRINT (yyo, *yylocationp); - YYFPRINTF (yyo, ": "); - yy_symbol_value_print (yyo, yytype, yyvaluep, yylocationp, state); - YYFPRINTF (yyo, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -static void -yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) -{ - YYFPRINTF (stderr, "Stack now"); - for (; yybottom <= yytop; yybottom++) - { - int yybot = *yybottom; - YYFPRINTF (stderr, " %d", yybot); - } - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (0) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -static void -yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule, struct _mesa_glsl_parse_state *state) -{ - int yylno = yyrline[yyrule]; - int yynrhs = yyr2[yyrule]; - int yyi; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, - yystos[+yyssp[yyi + 1 - yynrhs]], - &yyvsp[(yyi + 1) - (yynrhs)] - , &(yylsp[(yyi + 1) - (yynrhs)]) , state); - YYFPRINTF (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyssp, yyvsp, yylsp, Rule, state); \ -} while (0) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S))) -# else -/* Return the length of YYSTR. */ -static YYPTRDIFF_T -yystrlen (const char *yystr) -{ - YYPTRDIFF_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -static char * -yystpcpy (char *yydest, const char *yysrc) -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYPTRDIFF_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYPTRDIFF_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - else - goto append; - - append: - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (yyres) - return yystpcpy (yyres, yystr) - yyres; - else - return yystrlen (yystr); -} -# endif - -/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message - about the unexpected token YYTOKEN for the state stack whose top is - YYSSP. - - Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is - not large enough to hold the message. In that case, also set - *YYMSG_ALLOC to the required number of bytes. Return 2 if the - required number of bytes is too large to store. */ -static int -yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg, - yy_state_t *yyssp, int yytoken) -{ - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - /* Internationalized format string. */ - const char *yyformat = YY_NULLPTR; - /* Arguments of yyformat: reported tokens (one for the "unexpected", - one per "expected"). */ - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - /* Actual size of YYARG. */ - int yycount = 0; - /* Cumulated lengths of YYARG. */ - YYPTRDIFF_T yysize = 0; - - /* There are many possibilities here to consider: - - If this state is a consistent state with a default action, then - the only way this function was invoked is if the default action - is an error action. In that case, don't check for expected - tokens because there are none. - - The only way there can be no lookahead present (in yychar) is if - this state is a consistent state with a default action. Thus, - detecting the absence of a lookahead is sufficient to determine - that there is no unexpected or expected token to report. In that - case, just report a simple "syntax error". - - Don't assume there isn't a lookahead just because this state is a - consistent state with a default action. There might have been a - previous inconsistent state, consistent state with a non-default - action, or user semantic action that manipulated yychar. - - Of course, the expected token list depends on states to have - correct lookahead information, and it depends on the parser not - to perform extra reductions after fetching a lookahead from the - scanner and before detecting a syntax error. Thus, state merging - (from LALR or IELR) and default reductions corrupt the expected - token list. However, the list is correct for canonical LR with - one exception: it will still contain any token that will not be - accepted due to an error action in a later state. - */ - if (yytoken != YYEMPTY) - { - int yyn = yypact[+*yyssp]; - YYPTRDIFF_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); - yysize = yysize0; - yyarg[yycount++] = yytname[yytoken]; - if (!yypact_value_is_default (yyn)) - { - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. In other words, skip the first -YYN actions for - this state because they are default actions. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yyx; - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR - && !yytable_value_is_error (yytable[yyx + yyn])) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - break; - } - yyarg[yycount++] = yytname[yyx]; - { - YYPTRDIFF_T yysize1 - = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); - if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) - yysize = yysize1; - else - return 2; - } - } - } - } - - switch (yycount) - { -# define YYCASE_(N, S) \ - case N: \ - yyformat = S; \ - break - default: /* Avoid compiler warnings. */ - YYCASE_(0, YY_("syntax error")); - YYCASE_(1, YY_("syntax error, unexpected %s")); - YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); - YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); - YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); - YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); -# undef YYCASE_ - } - - { - /* Don't count the "%s"s in the final size, but reserve room for - the terminator. */ - YYPTRDIFF_T yysize1 = yysize + (yystrlen (yyformat) - 2 * yycount) + 1; - if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) - yysize = yysize1; - else - return 2; - } - - if (*yymsg_alloc < yysize) - { - *yymsg_alloc = 2 * yysize; - if (! (yysize <= *yymsg_alloc - && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) - *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; - return 1; - } - - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - { - char *yyp = *yymsg; - int yyi = 0; - while ((*yyp = *yyformat) != '\0') - if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyformat += 2; - } - else - { - ++yyp; - ++yyformat; - } - } - return 0; -} -#endif /* YYERROR_VERBOSE */ - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp, struct _mesa_glsl_parse_state *state) -{ - YYUSE (yyvaluep); - YYUSE (yylocationp); - YYUSE (state); - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YYUSE (yytype); - YY_IGNORE_MAYBE_UNINITIALIZED_END -} - - - - -/*----------. -| yyparse. | -`----------*/ - -int -yyparse (struct _mesa_glsl_parse_state *state) -{ -/* The lookahead symbol. */ -int yychar; - - -/* The semantic value of the lookahead symbol. */ -/* Default value used for initialization, for pacifying older GCCs - or non-GCC compilers. */ -YY_INITIAL_VALUE (static YYSTYPE yyval_default;) -YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); - -/* Location data for the lookahead symbol. */ -static YYLTYPE yyloc_default -# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL - = { 1, 1, 1, 1 } -# endif -; -YYLTYPE yylloc = yyloc_default; - - /* Number of syntax errors so far. */ - int yynerrs; - - yy_state_fast_t yystate; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - - /* The stacks and their tools: - 'yyss': related to states. - 'yyvs': related to semantic values. - 'yyls': related to locations. - - Refer to the stacks through separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yy_state_t yyssa[YYINITDEPTH]; - yy_state_t *yyss; - yy_state_t *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs; - YYSTYPE *yyvsp; - - /* The location stack. */ - YYLTYPE yylsa[YYINITDEPTH]; - YYLTYPE *yyls; - YYLTYPE *yylsp; - - /* The locations where the error started and ended. */ - YYLTYPE yyerror_range[3]; - - YYPTRDIFF_T yystacksize; - - int yyn; - int yyresult; - /* Lookahead token as an internal (translated) token number. */ - int yytoken = 0; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - YYLTYPE yyloc; - -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf; -#endif - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N), yylsp -= (N)) - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; - - yyssp = yyss = yyssa; - yyvsp = yyvs = yyvsa; - yylsp = yyls = yylsa; - yystacksize = YYINITDEPTH; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - -/* User initialization code. */ -#line 88 "src/glsl/glsl_parser.yy" -{ - yylloc.first_line = 1; - yylloc.first_column = 1; - yylloc.last_line = 1; - yylloc.last_column = 1; - yylloc.source = 0; -} - -#line 3088 "src/glsl/glsl_parser.cpp" - - yylsp[0] = yylloc; - goto yysetstate; - - -/*------------------------------------------------------------. -| yynewstate -- push a new state, which is found in yystate. | -`------------------------------------------------------------*/ -yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - -/*--------------------------------------------------------------------. -| yysetstate -- set current state (the top of the stack) to yystate. | -`--------------------------------------------------------------------*/ -yysetstate: - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - YY_ASSERT (0 <= yystate && yystate < YYNSTATES); - YY_IGNORE_USELESS_CAST_BEGIN - *yyssp = YY_CAST (yy_state_t, yystate); - YY_IGNORE_USELESS_CAST_END - - if (yyss + yystacksize - 1 <= yyssp) -#if !defined yyoverflow && !defined YYSTACK_RELOCATE - goto yyexhaustedlab; -#else - { - /* Get the current used size of the three stacks, in elements. */ - YYPTRDIFF_T yysize = yyssp - yyss + 1; - -# if defined yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - yy_state_t *yyss1 = yyss; - YYSTYPE *yyvs1 = yyvs; - YYLTYPE *yyls1 = yyls; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * YYSIZEOF (*yyssp), - &yyvs1, yysize * YYSIZEOF (*yyvsp), - &yyls1, yysize * YYSIZEOF (*yylsp), - &yystacksize); - yyss = yyss1; - yyvs = yyvs1; - yyls = yyls1; - } -# else /* defined YYSTACK_RELOCATE */ - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yy_state_t *yyss1 = yyss; - union yyalloc *yyptr = - YY_CAST (union yyalloc *, - YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); - YYSTACK_RELOCATE (yyls_alloc, yyls); -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - yylsp = yyls + yysize - 1; - - YY_IGNORE_USELESS_CAST_BEGIN - YYDPRINTF ((stderr, "Stack size increased to %ld\n", - YY_CAST (long, yystacksize))); - YY_IGNORE_USELESS_CAST_END - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } -#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ - - if (yystate == YYFINAL) - YYACCEPT; - - goto yybackup; - - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - /* Do appropriate processing given the current state. Read a - lookahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to lookahead token. */ - yyn = yypact[yystate]; - if (yypact_value_is_default (yyn)) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = yylex (&yylval, &yylloc, state); - } - - if (yychar <= YYEOF) - { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yytable_value_is_error (yyn)) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the lookahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - yystate = yyn; - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - *++yylsp = yylloc; - - /* Discard the shifted token. */ - yychar = YYEMPTY; - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - '$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - /* Default location. */ - YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); - yyerror_range[1] = yyloc; - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 2: -#line 303 "src/glsl/glsl_parser.yy" - { - _mesa_glsl_initialize_types(state); - } -#line 3289 "src/glsl/glsl_parser.cpp" - break; - - case 3: -#line 307 "src/glsl/glsl_parser.yy" - { - delete state->symbols; - state->symbols = new(ralloc_parent(state)) glsl_symbol_table; - _mesa_glsl_initialize_types(state); - } -#line 3299 "src/glsl/glsl_parser.cpp" - break; - - case 5: -#line 317 "src/glsl/glsl_parser.yy" - { - state->process_version_directive(&(yylsp[-1]), (yyvsp[-1].n), NULL); - if (state->error) { - YYERROR; - } - } -#line 3310 "src/glsl/glsl_parser.cpp" - break; - - case 6: -#line 324 "src/glsl/glsl_parser.yy" - { - state->process_version_directive(&(yylsp[-2]), (yyvsp[-2].n), (yyvsp[-1].identifier)); - if (state->error) { - YYERROR; - } - } -#line 3321 "src/glsl/glsl_parser.cpp" - break; - - case 11: -#line 338 "src/glsl/glsl_parser.yy" - { - if (!state->is_version(120, 100)) { - _mesa_glsl_warning(& (yylsp[-1]), state, - "pragma `invariant(all)' not supported in %s " - "(GLSL ES 1.00 or GLSL 1.20 required)", - state->get_version_string()); - } else { - state->all_invariant = true; - } - } -#line 3336 "src/glsl/glsl_parser.cpp" - break; - - case 17: -#line 363 "src/glsl/glsl_parser.yy" - { - if (!_mesa_glsl_process_extension((yyvsp[-3].identifier), & (yylsp[-3]), (yyvsp[-1].identifier), & (yylsp[-1]), state)) { - YYERROR; - } - } -#line 3346 "src/glsl/glsl_parser.cpp" - break; - - case 18: -#line 372 "src/glsl/glsl_parser.yy" - { - /* FINISHME: The NULL test is required because pragmas are set to - * FINISHME: NULL. (See production rule for external_declaration.) - */ - if ((yyvsp[0].node) != NULL) - state->translation_unit.push_tail(& (yyvsp[0].node)->link); - } -#line 3358 "src/glsl/glsl_parser.cpp" - break; - - case 19: -#line 380 "src/glsl/glsl_parser.yy" - { - /* FINISHME: The NULL test is required because pragmas are set to - * FINISHME: NULL. (See production rule for external_declaration.) - */ - if ((yyvsp[0].node) != NULL) - state->translation_unit.push_tail(& (yyvsp[0].node)->link); - } -#line 3370 "src/glsl/glsl_parser.cpp" - break; - - case 20: -#line 387 "src/glsl/glsl_parser.yy" - { - if (!state->allow_extension_directive_midshader) { - _mesa_glsl_error(& (yylsp[0]), state, - "#extension directive is not allowed " - "in the middle of a shader"); - YYERROR; - } - } -#line 3383 "src/glsl/glsl_parser.cpp" - break; - - case 23: -#line 404 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression(ast_identifier, NULL, NULL, NULL); - (yyval.expression)->set_location((yylsp[0])); - (yyval.expression)->primary_expression.identifier = (yyvsp[0].identifier); - } -#line 3394 "src/glsl/glsl_parser.cpp" - break; - - case 24: -#line 411 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression(ast_int_constant, NULL, NULL, NULL); - (yyval.expression)->set_location((yylsp[0])); - (yyval.expression)->primary_expression.int_constant = (yyvsp[0].n); - } -#line 3405 "src/glsl/glsl_parser.cpp" - break; - - case 25: -#line 418 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression(ast_uint_constant, NULL, NULL, NULL); - (yyval.expression)->set_location((yylsp[0])); - (yyval.expression)->primary_expression.uint_constant = (yyvsp[0].n); - } -#line 3416 "src/glsl/glsl_parser.cpp" - break; - - case 26: -#line 425 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression(ast_float_constant, NULL, NULL, NULL); - (yyval.expression)->set_location((yylsp[0])); - (yyval.expression)->primary_expression.float_constant = (yyvsp[0].real); - } -#line 3427 "src/glsl/glsl_parser.cpp" - break; - - case 27: -#line 432 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression(ast_bool_constant, NULL, NULL, NULL); - (yyval.expression)->set_location((yylsp[0])); - (yyval.expression)->primary_expression.bool_constant = (yyvsp[0].n); - } -#line 3438 "src/glsl/glsl_parser.cpp" - break; - - case 28: -#line 439 "src/glsl/glsl_parser.yy" - { - (yyval.expression) = (yyvsp[-1].expression); - } -#line 3446 "src/glsl/glsl_parser.cpp" - break; - - case 30: -#line 447 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression(ast_array_index, (yyvsp[-3].expression), (yyvsp[-1].expression), NULL); - (yyval.expression)->set_location_range((yylsp[-3]), (yylsp[0])); - } -#line 3456 "src/glsl/glsl_parser.cpp" - break; - - case 31: -#line 453 "src/glsl/glsl_parser.yy" - { - (yyval.expression) = (yyvsp[0].expression); - } -#line 3464 "src/glsl/glsl_parser.cpp" - break; - - case 32: -#line 457 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression(ast_field_selection, (yyvsp[-2].expression), NULL, NULL); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - (yyval.expression)->primary_expression.identifier = (yyvsp[0].identifier); - } -#line 3475 "src/glsl/glsl_parser.cpp" - break; - - case 33: -#line 464 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression(ast_post_inc, (yyvsp[-1].expression), NULL, NULL); - (yyval.expression)->set_location_range((yylsp[-1]), (yylsp[0])); - } -#line 3485 "src/glsl/glsl_parser.cpp" - break; - - case 34: -#line 470 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression(ast_post_dec, (yyvsp[-1].expression), NULL, NULL); - (yyval.expression)->set_location_range((yylsp[-1]), (yylsp[0])); - } -#line 3495 "src/glsl/glsl_parser.cpp" - break; - - case 38: -#line 488 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression(ast_field_selection, (yyvsp[-2].expression), (yyvsp[0].expression), NULL); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3505 "src/glsl/glsl_parser.cpp" - break; - - case 43: -#line 507 "src/glsl/glsl_parser.yy" - { - (yyval.expression) = (yyvsp[-1].expression); - (yyval.expression)->set_location((yylsp[-1])); - (yyval.expression)->expressions.push_tail(& (yyvsp[0].expression)->link); - } -#line 3515 "src/glsl/glsl_parser.cpp" - break; - - case 44: -#line 513 "src/glsl/glsl_parser.yy" - { - (yyval.expression) = (yyvsp[-2].expression); - (yyval.expression)->set_location((yylsp[-2])); - (yyval.expression)->expressions.push_tail(& (yyvsp[0].expression)->link); - } -#line 3525 "src/glsl/glsl_parser.cpp" - break; - - case 46: -#line 529 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_function_expression((yyvsp[0].type_specifier)); - (yyval.expression)->set_location((yylsp[0])); - } -#line 3535 "src/glsl/glsl_parser.cpp" - break; - - case 47: -#line 535 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_expression *callee = new(ctx) ast_expression((yyvsp[0].identifier)); - callee->set_location((yylsp[0])); - (yyval.expression) = new(ctx) ast_function_expression(callee); - (yyval.expression)->set_location((yylsp[0])); - } -#line 3547 "src/glsl/glsl_parser.cpp" - break; - - case 48: -#line 543 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_expression *callee = new(ctx) ast_expression((yyvsp[0].identifier)); - callee->set_location((yylsp[0])); - (yyval.expression) = new(ctx) ast_function_expression(callee); - (yyval.expression)->set_location((yylsp[0])); - } -#line 3559 "src/glsl/glsl_parser.cpp" - break; - - case 53: -#line 564 "src/glsl/glsl_parser.yy" - { - (yyval.expression) = (yyvsp[-1].expression); - (yyval.expression)->set_location((yylsp[-1])); - (yyval.expression)->expressions.push_tail(& (yyvsp[0].expression)->link); - } -#line 3569 "src/glsl/glsl_parser.cpp" - break; - - case 54: -#line 570 "src/glsl/glsl_parser.yy" - { - (yyval.expression) = (yyvsp[-2].expression); - (yyval.expression)->set_location((yylsp[-2])); - (yyval.expression)->expressions.push_tail(& (yyvsp[0].expression)->link); - } -#line 3579 "src/glsl/glsl_parser.cpp" - break; - - case 55: -#line 582 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_expression *callee = new(ctx) ast_expression((yyvsp[-1].identifier)); - callee->set_location((yylsp[-1])); - (yyval.expression) = new(ctx) ast_function_expression(callee); - (yyval.expression)->set_location((yylsp[-1])); - } -#line 3591 "src/glsl/glsl_parser.cpp" - break; - - case 57: -#line 595 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression(ast_pre_inc, (yyvsp[0].expression), NULL, NULL); - (yyval.expression)->set_location((yylsp[-1])); - } -#line 3601 "src/glsl/glsl_parser.cpp" - break; - - case 58: -#line 601 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression(ast_pre_dec, (yyvsp[0].expression), NULL, NULL); - (yyval.expression)->set_location((yylsp[-1])); - } -#line 3611 "src/glsl/glsl_parser.cpp" - break; - - case 59: -#line 607 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression((yyvsp[-1].n), (yyvsp[0].expression), NULL, NULL); - (yyval.expression)->set_location_range((yylsp[-1]), (yylsp[0])); - } -#line 3621 "src/glsl/glsl_parser.cpp" - break; - - case 60: -#line 616 "src/glsl/glsl_parser.yy" - { (yyval.n) = ast_plus; } -#line 3627 "src/glsl/glsl_parser.cpp" - break; - - case 61: -#line 617 "src/glsl/glsl_parser.yy" - { (yyval.n) = ast_neg; } -#line 3633 "src/glsl/glsl_parser.cpp" - break; - - case 62: -#line 618 "src/glsl/glsl_parser.yy" - { (yyval.n) = ast_logic_not; } -#line 3639 "src/glsl/glsl_parser.cpp" - break; - - case 63: -#line 619 "src/glsl/glsl_parser.yy" - { (yyval.n) = ast_bit_not; } -#line 3645 "src/glsl/glsl_parser.cpp" - break; - - case 65: -#line 625 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_mul, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3655 "src/glsl/glsl_parser.cpp" - break; - - case 66: -#line 631 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_div, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3665 "src/glsl/glsl_parser.cpp" - break; - - case 67: -#line 637 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_mod, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3675 "src/glsl/glsl_parser.cpp" - break; - - case 69: -#line 647 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_add, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3685 "src/glsl/glsl_parser.cpp" - break; - - case 70: -#line 653 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_sub, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3695 "src/glsl/glsl_parser.cpp" - break; - - case 72: -#line 663 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_lshift, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3705 "src/glsl/glsl_parser.cpp" - break; - - case 73: -#line 669 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_rshift, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3715 "src/glsl/glsl_parser.cpp" - break; - - case 75: -#line 679 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_less, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3725 "src/glsl/glsl_parser.cpp" - break; - - case 76: -#line 685 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_greater, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3735 "src/glsl/glsl_parser.cpp" - break; - - case 77: -#line 691 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_lequal, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3745 "src/glsl/glsl_parser.cpp" - break; - - case 78: -#line 697 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_gequal, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3755 "src/glsl/glsl_parser.cpp" - break; - - case 80: -#line 707 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_equal, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3765 "src/glsl/glsl_parser.cpp" - break; - - case 81: -#line 713 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_nequal, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3775 "src/glsl/glsl_parser.cpp" - break; - - case 83: -#line 723 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_bit_and, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3785 "src/glsl/glsl_parser.cpp" - break; - - case 85: -#line 733 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_bit_xor, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3795 "src/glsl/glsl_parser.cpp" - break; - - case 87: -#line 743 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_bit_or, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3805 "src/glsl/glsl_parser.cpp" - break; - - case 89: -#line 753 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_logic_and, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3815 "src/glsl/glsl_parser.cpp" - break; - - case 91: -#line 763 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_logic_xor, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3825 "src/glsl/glsl_parser.cpp" - break; - - case 93: -#line 773 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression_bin(ast_logic_or, (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3835 "src/glsl/glsl_parser.cpp" - break; - - case 95: -#line 783 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression(ast_conditional, (yyvsp[-4].expression), (yyvsp[-2].expression), (yyvsp[0].expression)); - (yyval.expression)->set_location_range((yylsp[-4]), (yylsp[0])); - } -#line 3845 "src/glsl/glsl_parser.cpp" - break; - - case 97: -#line 793 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_expression((yyvsp[-1].n), (yyvsp[-2].expression), (yyvsp[0].expression), NULL); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 3855 "src/glsl/glsl_parser.cpp" - break; - - case 98: -#line 801 "src/glsl/glsl_parser.yy" - { (yyval.n) = ast_assign; } -#line 3861 "src/glsl/glsl_parser.cpp" - break; - - case 99: -#line 802 "src/glsl/glsl_parser.yy" - { (yyval.n) = ast_mul_assign; } -#line 3867 "src/glsl/glsl_parser.cpp" - break; - - case 100: -#line 803 "src/glsl/glsl_parser.yy" - { (yyval.n) = ast_div_assign; } -#line 3873 "src/glsl/glsl_parser.cpp" - break; - - case 101: -#line 804 "src/glsl/glsl_parser.yy" - { (yyval.n) = ast_mod_assign; } -#line 3879 "src/glsl/glsl_parser.cpp" - break; - - case 102: -#line 805 "src/glsl/glsl_parser.yy" - { (yyval.n) = ast_add_assign; } -#line 3885 "src/glsl/glsl_parser.cpp" - break; - - case 103: -#line 806 "src/glsl/glsl_parser.yy" - { (yyval.n) = ast_sub_assign; } -#line 3891 "src/glsl/glsl_parser.cpp" - break; - - case 104: -#line 807 "src/glsl/glsl_parser.yy" - { (yyval.n) = ast_ls_assign; } -#line 3897 "src/glsl/glsl_parser.cpp" - break; - - case 105: -#line 808 "src/glsl/glsl_parser.yy" - { (yyval.n) = ast_rs_assign; } -#line 3903 "src/glsl/glsl_parser.cpp" - break; - - case 106: -#line 809 "src/glsl/glsl_parser.yy" - { (yyval.n) = ast_and_assign; } -#line 3909 "src/glsl/glsl_parser.cpp" - break; - - case 107: -#line 810 "src/glsl/glsl_parser.yy" - { (yyval.n) = ast_xor_assign; } -#line 3915 "src/glsl/glsl_parser.cpp" - break; - - case 108: -#line 811 "src/glsl/glsl_parser.yy" - { (yyval.n) = ast_or_assign; } -#line 3921 "src/glsl/glsl_parser.cpp" - break; - - case 109: -#line 816 "src/glsl/glsl_parser.yy" - { - (yyval.expression) = (yyvsp[0].expression); - } -#line 3929 "src/glsl/glsl_parser.cpp" - break; - - case 110: -#line 820 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - if ((yyvsp[-2].expression)->oper != ast_sequence) { - (yyval.expression) = new(ctx) ast_expression(ast_sequence, NULL, NULL, NULL); - (yyval.expression)->set_location_range((yylsp[-2]), (yylsp[0])); - (yyval.expression)->expressions.push_tail(& (yyvsp[-2].expression)->link); - } else { - (yyval.expression) = (yyvsp[-2].expression); - } - - (yyval.expression)->expressions.push_tail(& (yyvsp[0].expression)->link); - } -#line 3946 "src/glsl/glsl_parser.cpp" - break; - - case 112: -#line 840 "src/glsl/glsl_parser.yy" - { - state->symbols->pop_scope(); - (yyval.node) = (yyvsp[-1].function); - } -#line 3955 "src/glsl/glsl_parser.cpp" - break; - - case 113: -#line 845 "src/glsl/glsl_parser.yy" - { - (yyval.node) = (yyvsp[-1].declarator_list); - } -#line 3963 "src/glsl/glsl_parser.cpp" - break; - - case 114: -#line 849 "src/glsl/glsl_parser.yy" - { - (yyvsp[-1].type_specifier)->default_precision = (yyvsp[-2].n); - (yyval.node) = (yyvsp[-1].type_specifier); - } -#line 3972 "src/glsl/glsl_parser.cpp" - break; - - case 115: -#line 854 "src/glsl/glsl_parser.yy" - { - (yyval.node) = (yyvsp[0].node); - } -#line 3980 "src/glsl/glsl_parser.cpp" - break; - - case 119: -#line 870 "src/glsl/glsl_parser.yy" - { - (yyval.function) = (yyvsp[-1].function); - (yyval.function)->parameters.push_tail(& (yyvsp[0].parameter_declarator)->link); - } -#line 3989 "src/glsl/glsl_parser.cpp" - break; - - case 120: -#line 875 "src/glsl/glsl_parser.yy" - { - (yyval.function) = (yyvsp[-2].function); - (yyval.function)->parameters.push_tail(& (yyvsp[0].parameter_declarator)->link); - } -#line 3998 "src/glsl/glsl_parser.cpp" - break; - - case 121: -#line 883 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.function) = new(ctx) ast_function(); - (yyval.function)->set_location((yylsp[-1])); - (yyval.function)->return_type = (yyvsp[-2].fully_specified_type); - (yyval.function)->identifier = (yyvsp[-1].identifier); - - state->symbols->add_function(new(state) ir_function((yyvsp[-1].identifier))); - state->symbols->push_scope(); - } -#line 4013 "src/glsl/glsl_parser.cpp" - break; - - case 122: -#line 897 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.parameter_declarator) = new(ctx) ast_parameter_declarator(); - (yyval.parameter_declarator)->set_location_range((yylsp[-1]), (yylsp[0])); - (yyval.parameter_declarator)->type = new(ctx) ast_fully_specified_type(); - (yyval.parameter_declarator)->type->set_location((yylsp[-1])); - (yyval.parameter_declarator)->type->specifier = (yyvsp[-1].type_specifier); - (yyval.parameter_declarator)->identifier = (yyvsp[0].identifier); - } -#line 4027 "src/glsl/glsl_parser.cpp" - break; - - case 123: -#line 907 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.parameter_declarator) = new(ctx) ast_parameter_declarator(); - (yyval.parameter_declarator)->set_location_range((yylsp[-2]), (yylsp[0])); - (yyval.parameter_declarator)->type = new(ctx) ast_fully_specified_type(); - (yyval.parameter_declarator)->type->set_location((yylsp[-2])); - (yyval.parameter_declarator)->type->specifier = (yyvsp[-2].type_specifier); - (yyval.parameter_declarator)->identifier = (yyvsp[-1].identifier); - (yyval.parameter_declarator)->array_specifier = (yyvsp[0].array_specifier); - } -#line 4042 "src/glsl/glsl_parser.cpp" - break; - - case 124: -#line 921 "src/glsl/glsl_parser.yy" - { - (yyval.parameter_declarator) = (yyvsp[0].parameter_declarator); - (yyval.parameter_declarator)->type->qualifier = (yyvsp[-1].type_qualifier); - } -#line 4051 "src/glsl/glsl_parser.cpp" - break; - - case 125: -#line 926 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.parameter_declarator) = new(ctx) ast_parameter_declarator(); - (yyval.parameter_declarator)->set_location((yylsp[0])); - (yyval.parameter_declarator)->type = new(ctx) ast_fully_specified_type(); - (yyval.parameter_declarator)->type->set_location_range((yylsp[-1]), (yylsp[0])); - (yyval.parameter_declarator)->type->qualifier = (yyvsp[-1].type_qualifier); - (yyval.parameter_declarator)->type->specifier = (yyvsp[0].type_specifier); - } -#line 4065 "src/glsl/glsl_parser.cpp" - break; - - case 126: -#line 939 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - } -#line 4074 "src/glsl/glsl_parser.cpp" - break; - - case 127: -#line 944 "src/glsl/glsl_parser.yy" - { - if ((yyvsp[0].type_qualifier).flags.q.constant) - _mesa_glsl_error(&(yylsp[-1]), state, "duplicate const qualifier"); - - (yyval.type_qualifier) = (yyvsp[0].type_qualifier); - (yyval.type_qualifier).flags.q.constant = 1; - } -#line 4086 "src/glsl/glsl_parser.cpp" - break; - - case 128: -#line 952 "src/glsl/glsl_parser.yy" - { - if ((yyvsp[0].type_qualifier).flags.q.precise) - _mesa_glsl_error(&(yylsp[-1]), state, "duplicate precise qualifier"); - - (yyval.type_qualifier) = (yyvsp[0].type_qualifier); - (yyval.type_qualifier).flags.q.precise = 1; - } -#line 4098 "src/glsl/glsl_parser.cpp" - break; - - case 129: -#line 960 "src/glsl/glsl_parser.yy" - { - if (((yyvsp[-1].type_qualifier).flags.q.in || (yyvsp[-1].type_qualifier).flags.q.out) && ((yyvsp[0].type_qualifier).flags.q.in || (yyvsp[0].type_qualifier).flags.q.out)) - _mesa_glsl_error(&(yylsp[-1]), state, "duplicate in/out/inout qualifier"); - - if (!state->ARB_shading_language_420pack_enable && (yyvsp[0].type_qualifier).flags.q.constant) - _mesa_glsl_error(&(yylsp[-1]), state, "in/out/inout must come after const " - "or precise"); - - (yyval.type_qualifier) = (yyvsp[-1].type_qualifier); - (yyval.type_qualifier).merge_qualifier(&(yylsp[-1]), state, (yyvsp[0].type_qualifier)); - } -#line 4114 "src/glsl/glsl_parser.cpp" - break; - - case 130: -#line 972 "src/glsl/glsl_parser.yy" - { - if ((yyvsp[0].type_qualifier).precision != ast_precision_none) - _mesa_glsl_error(&(yylsp[-1]), state, "duplicate precision qualifier"); - - if (!state->ARB_shading_language_420pack_enable && (yyvsp[0].type_qualifier).flags.i != 0) - _mesa_glsl_error(&(yylsp[-1]), state, "precision qualifiers must come last"); - - (yyval.type_qualifier) = (yyvsp[0].type_qualifier); - (yyval.type_qualifier).precision = (yyvsp[-1].n); - } -#line 4129 "src/glsl/glsl_parser.cpp" - break; - - case 131: -#line 985 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.in = 1; - } -#line 4139 "src/glsl/glsl_parser.cpp" - break; - - case 132: -#line 991 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.out = 1; - } -#line 4149 "src/glsl/glsl_parser.cpp" - break; - - case 133: -#line 997 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.in = 1; - (yyval.type_qualifier).flags.q.out = 1; - } -#line 4160 "src/glsl/glsl_parser.cpp" - break; - - case 136: -#line 1013 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration((yyvsp[0].identifier), NULL, NULL); - decl->set_location((yylsp[0])); - - (yyval.declarator_list) = (yyvsp[-2].declarator_list); - (yyval.declarator_list)->declarations.push_tail(&decl->link); - state->symbols->add_variable(new(state) ir_variable(NULL, (yyvsp[0].identifier), ir_var_auto, glsl_precision_undefined)); - } -#line 4174 "src/glsl/glsl_parser.cpp" - break; - - case 137: -#line 1023 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration((yyvsp[-1].identifier), (yyvsp[0].array_specifier), NULL); - decl->set_location_range((yylsp[-1]), (yylsp[0])); - - (yyval.declarator_list) = (yyvsp[-3].declarator_list); - (yyval.declarator_list)->declarations.push_tail(&decl->link); - state->symbols->add_variable(new(state) ir_variable(NULL, (yyvsp[-1].identifier), ir_var_auto, glsl_precision_undefined)); - } -#line 4188 "src/glsl/glsl_parser.cpp" - break; - - case 138: -#line 1033 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration((yyvsp[-3].identifier), (yyvsp[-2].array_specifier), (yyvsp[0].expression)); - decl->set_location_range((yylsp[-3]), (yylsp[-2])); - - (yyval.declarator_list) = (yyvsp[-5].declarator_list); - (yyval.declarator_list)->declarations.push_tail(&decl->link); - state->symbols->add_variable(new(state) ir_variable(NULL, (yyvsp[-3].identifier), ir_var_auto, glsl_precision_undefined)); - } -#line 4202 "src/glsl/glsl_parser.cpp" - break; - - case 139: -#line 1043 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration((yyvsp[-2].identifier), NULL, (yyvsp[0].expression)); - decl->set_location((yylsp[-2])); - - (yyval.declarator_list) = (yyvsp[-4].declarator_list); - (yyval.declarator_list)->declarations.push_tail(&decl->link); - state->symbols->add_variable(new(state) ir_variable(NULL, (yyvsp[-2].identifier), ir_var_auto, glsl_precision_undefined)); - } -#line 4216 "src/glsl/glsl_parser.cpp" - break; - - case 140: -#line 1057 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - /* Empty declaration list is valid. */ - (yyval.declarator_list) = new(ctx) ast_declarator_list((yyvsp[0].fully_specified_type)); - (yyval.declarator_list)->set_location((yylsp[0])); - } -#line 4227 "src/glsl/glsl_parser.cpp" - break; - - case 141: -#line 1064 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration((yyvsp[0].identifier), NULL, NULL); - decl->set_location((yylsp[0])); - - (yyval.declarator_list) = new(ctx) ast_declarator_list((yyvsp[-1].fully_specified_type)); - (yyval.declarator_list)->set_location_range((yylsp[-1]), (yylsp[0])); - (yyval.declarator_list)->declarations.push_tail(&decl->link); - } -#line 4241 "src/glsl/glsl_parser.cpp" - break; - - case 142: -#line 1074 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration((yyvsp[-1].identifier), (yyvsp[0].array_specifier), NULL); - decl->set_location_range((yylsp[-1]), (yylsp[0])); - - (yyval.declarator_list) = new(ctx) ast_declarator_list((yyvsp[-2].fully_specified_type)); - (yyval.declarator_list)->set_location_range((yylsp[-2]), (yylsp[0])); - (yyval.declarator_list)->declarations.push_tail(&decl->link); - } -#line 4255 "src/glsl/glsl_parser.cpp" - break; - - case 143: -#line 1084 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration((yyvsp[-3].identifier), (yyvsp[-2].array_specifier), (yyvsp[0].expression)); - decl->set_location_range((yylsp[-3]), (yylsp[-2])); - - (yyval.declarator_list) = new(ctx) ast_declarator_list((yyvsp[-4].fully_specified_type)); - (yyval.declarator_list)->set_location_range((yylsp[-4]), (yylsp[-2])); - (yyval.declarator_list)->declarations.push_tail(&decl->link); - } -#line 4269 "src/glsl/glsl_parser.cpp" - break; - - case 144: -#line 1094 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration((yyvsp[-2].identifier), NULL, (yyvsp[0].expression)); - decl->set_location((yylsp[-2])); - - (yyval.declarator_list) = new(ctx) ast_declarator_list((yyvsp[-3].fully_specified_type)); - (yyval.declarator_list)->set_location_range((yylsp[-3]), (yylsp[-2])); - (yyval.declarator_list)->declarations.push_tail(&decl->link); - } -#line 4283 "src/glsl/glsl_parser.cpp" - break; - - case 145: -#line 1104 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration((yyvsp[0].identifier), NULL, NULL); - decl->set_location((yylsp[0])); - - (yyval.declarator_list) = new(ctx) ast_declarator_list(NULL); - (yyval.declarator_list)->set_location_range((yylsp[-1]), (yylsp[0])); - (yyval.declarator_list)->invariant = true; - - (yyval.declarator_list)->declarations.push_tail(&decl->link); - } -#line 4299 "src/glsl/glsl_parser.cpp" - break; - - case 146: -#line 1116 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration((yyvsp[0].identifier), NULL, NULL); - decl->set_location((yylsp[0])); - - (yyval.declarator_list) = new(ctx) ast_declarator_list(NULL); - (yyval.declarator_list)->set_location_range((yylsp[-1]), (yylsp[0])); - (yyval.declarator_list)->precise = true; - - (yyval.declarator_list)->declarations.push_tail(&decl->link); - } -#line 4315 "src/glsl/glsl_parser.cpp" - break; - - case 147: -#line 1131 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.fully_specified_type) = new(ctx) ast_fully_specified_type(); - (yyval.fully_specified_type)->set_location((yylsp[0])); - (yyval.fully_specified_type)->specifier = (yyvsp[0].type_specifier); - } -#line 4326 "src/glsl/glsl_parser.cpp" - break; - - case 148: -#line 1138 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.fully_specified_type) = new(ctx) ast_fully_specified_type(); - (yyval.fully_specified_type)->set_location_range((yylsp[-1]), (yylsp[0])); - (yyval.fully_specified_type)->qualifier = (yyvsp[-1].type_qualifier); - (yyval.fully_specified_type)->specifier = (yyvsp[0].type_specifier); - } -#line 4338 "src/glsl/glsl_parser.cpp" - break; - - case 149: -#line 1149 "src/glsl/glsl_parser.yy" - { - (yyval.type_qualifier) = (yyvsp[-1].type_qualifier); - } -#line 4346 "src/glsl/glsl_parser.cpp" - break; - - case 151: -#line 1157 "src/glsl/glsl_parser.yy" - { - (yyval.type_qualifier) = (yyvsp[-2].type_qualifier); - if (!(yyval.type_qualifier).merge_qualifier(& (yylsp[0]), state, (yyvsp[0].type_qualifier))) { - YYERROR; - } - } -#line 4357 "src/glsl/glsl_parser.cpp" - break; - - case 152: -#line 1166 "src/glsl/glsl_parser.yy" - { (yyval.n) = (yyvsp[0].n); } -#line 4363 "src/glsl/glsl_parser.cpp" - break; - - case 153: -#line 1167 "src/glsl/glsl_parser.yy" - { (yyval.n) = (yyvsp[0].n); } -#line 4369 "src/glsl/glsl_parser.cpp" - break; - - case 154: -#line 1172 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - - /* Layout qualifiers for ARB_fragment_coord_conventions. */ - if (!(yyval.type_qualifier).flags.i && (state->ARB_fragment_coord_conventions_enable || - state->is_version(150, 0))) { - if (match_layout_qualifier((yyvsp[0].identifier), "origin_upper_left", state) == 0) { - (yyval.type_qualifier).flags.q.origin_upper_left = 1; - } else if (match_layout_qualifier((yyvsp[0].identifier), "pixel_center_integer", - state) == 0) { - (yyval.type_qualifier).flags.q.pixel_center_integer = 1; - } - - if ((yyval.type_qualifier).flags.i && state->ARB_fragment_coord_conventions_warn) { - _mesa_glsl_warning(& (yylsp[0]), state, - "GL_ARB_fragment_coord_conventions layout " - "identifier `%s' used", (yyvsp[0].identifier)); - } - } - - /* Layout qualifiers for AMD/ARB_conservative_depth. */ - if (!(yyval.type_qualifier).flags.i && - (state->AMD_conservative_depth_enable || - state->ARB_conservative_depth_enable)) { - if (match_layout_qualifier((yyvsp[0].identifier), "depth_any", state) == 0) { - (yyval.type_qualifier).flags.q.depth_any = 1; - } else if (match_layout_qualifier((yyvsp[0].identifier), "depth_greater", state) == 0) { - (yyval.type_qualifier).flags.q.depth_greater = 1; - } else if (match_layout_qualifier((yyvsp[0].identifier), "depth_less", state) == 0) { - (yyval.type_qualifier).flags.q.depth_less = 1; - } else if (match_layout_qualifier((yyvsp[0].identifier), "depth_unchanged", - state) == 0) { - (yyval.type_qualifier).flags.q.depth_unchanged = 1; - } - - if ((yyval.type_qualifier).flags.i && state->AMD_conservative_depth_warn) { - _mesa_glsl_warning(& (yylsp[0]), state, - "GL_AMD_conservative_depth " - "layout qualifier `%s' is used", (yyvsp[0].identifier)); - } - if ((yyval.type_qualifier).flags.i && state->ARB_conservative_depth_warn) { - _mesa_glsl_warning(& (yylsp[0]), state, - "GL_ARB_conservative_depth " - "layout qualifier `%s' is used", (yyvsp[0].identifier)); - } - } - - /* See also interface_block_layout_qualifier. */ - if (!(yyval.type_qualifier).flags.i && state->has_uniform_buffer_objects()) { - if (match_layout_qualifier((yyvsp[0].identifier), "std140", state) == 0) { - (yyval.type_qualifier).flags.q.std140 = 1; - } else if (match_layout_qualifier((yyvsp[0].identifier), "shared", state) == 0) { - (yyval.type_qualifier).flags.q.shared = 1; - } else if (match_layout_qualifier((yyvsp[0].identifier), "column_major", state) == 0) { - (yyval.type_qualifier).flags.q.column_major = 1; - /* "row_major" is a reserved word in GLSL 1.30+. Its token is parsed - * below in the interface_block_layout_qualifier rule. - * - * It is not a reserved word in GLSL ES 3.00, so it's handled here as - * an identifier. - * - * Also, this takes care of alternate capitalizations of - * "row_major" (which is necessary because layout qualifiers - * are case-insensitive in desktop GLSL). - */ - } else if (match_layout_qualifier((yyvsp[0].identifier), "row_major", state) == 0) { - (yyval.type_qualifier).flags.q.row_major = 1; - /* "packed" is a reserved word in GLSL, and its token is - * parsed below in the interface_block_layout_qualifier rule. - * However, we must take care of alternate capitalizations of - * "packed", because layout qualifiers are case-insensitive - * in desktop GLSL. - */ - } else if (match_layout_qualifier((yyvsp[0].identifier), "packed", state) == 0) { - (yyval.type_qualifier).flags.q.packed = 1; - } - - if ((yyval.type_qualifier).flags.i && state->ARB_uniform_buffer_object_warn) { - _mesa_glsl_warning(& (yylsp[0]), state, - "#version 140 / GL_ARB_uniform_buffer_object " - "layout qualifier `%s' is used", (yyvsp[0].identifier)); - } - } - - /* Layout qualifiers for GLSL 1.50 geometry shaders. */ - if (!(yyval.type_qualifier).flags.i) { - static const struct { - const char *s; - GLenum e; - } map[] = { - { "points", GL_POINTS }, - { "lines", GL_LINES }, - { "lines_adjacency", GL_LINES_ADJACENCY }, - { "line_strip", GL_LINE_STRIP }, - { "triangles", GL_TRIANGLES }, - { "triangles_adjacency", GL_TRIANGLES_ADJACENCY }, - { "triangle_strip", GL_TRIANGLE_STRIP }, - }; - for (unsigned i = 0; i < Elements(map); i++) { - if (match_layout_qualifier((yyvsp[0].identifier), map[i].s, state) == 0) { - (yyval.type_qualifier).flags.q.prim_type = 1; - (yyval.type_qualifier).prim_type = map[i].e; - break; - } - } - - if ((yyval.type_qualifier).flags.i && !state->is_version(150, 0)) { - _mesa_glsl_error(& (yylsp[0]), state, "#version 150 layout " - "qualifier `%s' used", (yyvsp[0].identifier)); - } - } - - /* Layout qualifiers for ARB_shader_image_load_store. */ - if (state->ARB_shader_image_load_store_enable || - state->is_version(420, 0)) { - if (!(yyval.type_qualifier).flags.i) { - static const struct { - const char *name; - GLenum format; - glsl_base_type base_type; - } map[] = { - { "rgba32f", GL_RGBA32F, GLSL_TYPE_FLOAT }, - { "rgba16f", GL_RGBA16F, GLSL_TYPE_FLOAT }, - { "rg32f", GL_RG32F, GLSL_TYPE_FLOAT }, - { "rg16f", GL_RG16F, GLSL_TYPE_FLOAT }, - { "r11f_g11f_b10f", GL_R11F_G11F_B10F, GLSL_TYPE_FLOAT }, - { "r32f", GL_R32F, GLSL_TYPE_FLOAT }, - { "r16f", GL_R16F, GLSL_TYPE_FLOAT }, - { "rgba32ui", GL_RGBA32UI, GLSL_TYPE_UINT }, - { "rgba16ui", GL_RGBA16UI, GLSL_TYPE_UINT }, - { "rgb10_a2ui", GL_RGB10_A2UI, GLSL_TYPE_UINT }, - { "rgba8ui", GL_RGBA8UI, GLSL_TYPE_UINT }, - { "rg32ui", GL_RG32UI, GLSL_TYPE_UINT }, - { "rg16ui", GL_RG16UI, GLSL_TYPE_UINT }, - { "rg8ui", GL_RG8UI, GLSL_TYPE_UINT }, - { "r32ui", GL_R32UI, GLSL_TYPE_UINT }, - { "r16ui", GL_R16UI, GLSL_TYPE_UINT }, - { "r8ui", GL_R8UI, GLSL_TYPE_UINT }, - { "rgba32i", GL_RGBA32I, GLSL_TYPE_INT }, - { "rgba16i", GL_RGBA16I, GLSL_TYPE_INT }, - { "rgba8i", GL_RGBA8I, GLSL_TYPE_INT }, - { "rg32i", GL_RG32I, GLSL_TYPE_INT }, - { "rg16i", GL_RG16I, GLSL_TYPE_INT }, - { "rg8i", GL_RG8I, GLSL_TYPE_INT }, - { "r32i", GL_R32I, GLSL_TYPE_INT }, - { "r16i", GL_R16I, GLSL_TYPE_INT }, - { "r8i", GL_R8I, GLSL_TYPE_INT }, - { "rgba16", GL_RGBA16, GLSL_TYPE_FLOAT }, - { "rgb10_a2", GL_RGB10_A2, GLSL_TYPE_FLOAT }, - { "rgba8", GL_RGBA8, GLSL_TYPE_FLOAT }, - { "rg16", GL_RG16, GLSL_TYPE_FLOAT }, - { "rg8", GL_RG8, GLSL_TYPE_FLOAT }, - { "r16", GL_R16, GLSL_TYPE_FLOAT }, - { "r8", GL_R8, GLSL_TYPE_FLOAT }, - { "rgba16_snorm", GL_RGBA16_SNORM, GLSL_TYPE_FLOAT }, - { "rgba8_snorm", GL_RGBA8_SNORM, GLSL_TYPE_FLOAT }, - { "rg16_snorm", GL_RG16_SNORM, GLSL_TYPE_FLOAT }, - { "rg8_snorm", GL_RG8_SNORM, GLSL_TYPE_FLOAT }, - { "r16_snorm", GL_R16_SNORM, GLSL_TYPE_FLOAT }, - { "r8_snorm", GL_R8_SNORM, GLSL_TYPE_FLOAT } - }; - - for (unsigned i = 0; i < Elements(map); i++) { - if (match_layout_qualifier((yyvsp[0].identifier), map[i].name, state) == 0) { - (yyval.type_qualifier).flags.q.explicit_image_format = 1; - (yyval.type_qualifier).image_format = map[i].format; - (yyval.type_qualifier).image_base_type = map[i].base_type; - break; - } - } - } - - if (!(yyval.type_qualifier).flags.i && - match_layout_qualifier((yyvsp[0].identifier), "early_fragment_tests", state) == 0) { - (yyval.type_qualifier).flags.q.early_fragment_tests = 1; - } - } - - if (!(yyval.type_qualifier).flags.i) { - _mesa_glsl_error(& (yylsp[0]), state, "unrecognized layout identifier " - "`%s'", (yyvsp[0].identifier)); - YYERROR; - } - } -#line 4559 "src/glsl/glsl_parser.cpp" - break; - - case 155: -#line 1358 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - - if (match_layout_qualifier("location", (yyvsp[-2].identifier), state) == 0) { - (yyval.type_qualifier).flags.q.explicit_location = 1; - - if ((yyval.type_qualifier).flags.q.attribute == 1 && - state->ARB_explicit_attrib_location_warn) { - _mesa_glsl_warning(& (yylsp[-2]), state, - "GL_ARB_explicit_attrib_location layout " - "identifier `%s' used", (yyvsp[-2].identifier)); - } - - if ((yyvsp[0].n) >= 0) { - (yyval.type_qualifier).location = (yyvsp[0].n); - } else { - _mesa_glsl_error(& (yylsp[0]), state, "invalid location %d specified", (yyvsp[0].n)); - YYERROR; - } - } - - if (match_layout_qualifier("index", (yyvsp[-2].identifier), state) == 0) { - (yyval.type_qualifier).flags.q.explicit_index = 1; - - if ((yyvsp[0].n) >= 0) { - (yyval.type_qualifier).index = (yyvsp[0].n); - } else { - _mesa_glsl_error(& (yylsp[0]), state, "invalid index %d specified", (yyvsp[0].n)); - YYERROR; - } - } - - if ((state->ARB_shading_language_420pack_enable || - state->ARB_shader_atomic_counters_enable) && - match_layout_qualifier("binding", (yyvsp[-2].identifier), state) == 0) { - (yyval.type_qualifier).flags.q.explicit_binding = 1; - (yyval.type_qualifier).binding = (yyvsp[0].n); - } - - if (state->ARB_shader_atomic_counters_enable && - match_layout_qualifier("offset", (yyvsp[-2].identifier), state) == 0) { - (yyval.type_qualifier).flags.q.explicit_offset = 1; - (yyval.type_qualifier).offset = (yyvsp[0].n); - } - - if (match_layout_qualifier("max_vertices", (yyvsp[-2].identifier), state) == 0) { - (yyval.type_qualifier).flags.q.max_vertices = 1; - - if ((yyvsp[0].n) < 0) { - _mesa_glsl_error(& (yylsp[0]), state, - "invalid max_vertices %d specified", (yyvsp[0].n)); - YYERROR; - } else { - (yyval.type_qualifier).max_vertices = (yyvsp[0].n); - if (!state->is_version(150, 0)) { - _mesa_glsl_error(& (yylsp[0]), state, - "#version 150 max_vertices qualifier " - "specified", (yyvsp[0].n)); - } - } - } - - if (state->stage == MESA_SHADER_GEOMETRY) { - if (match_layout_qualifier("stream", (yyvsp[-2].identifier), state) == 0 && - state->check_explicit_attrib_stream_allowed(& (yylsp[0]))) { - (yyval.type_qualifier).flags.q.stream = 1; - - if ((yyvsp[0].n) < 0) { - _mesa_glsl_error(& (yylsp[0]), state, - "invalid stream %d specified", (yyvsp[0].n)); - YYERROR; - } else { - (yyval.type_qualifier).flags.q.explicit_stream = 1; - (yyval.type_qualifier).stream = (yyvsp[0].n); - } - } - } - - static const char * const local_size_qualifiers[3] = { - "local_size_x", - "local_size_y", - "local_size_z", - }; - for (int i = 0; i < 3; i++) { - if (match_layout_qualifier(local_size_qualifiers[i], (yyvsp[-2].identifier), - state) == 0) { - if ((yyvsp[0].n) <= 0) { - _mesa_glsl_error(& (yylsp[0]), state, - "invalid %s of %d specified", - local_size_qualifiers[i], (yyvsp[0].n)); - YYERROR; - } else if (!state->is_version(430, 0) && - !state->ARB_compute_shader_enable) { - _mesa_glsl_error(& (yylsp[0]), state, - "%s qualifier requires GLSL 4.30 or " - "ARB_compute_shader", - local_size_qualifiers[i]); - YYERROR; - } else { - (yyval.type_qualifier).flags.q.local_size |= (1 << i); - (yyval.type_qualifier).local_size[i] = (yyvsp[0].n); - } - break; - } - } - - if (match_layout_qualifier("invocations", (yyvsp[-2].identifier), state) == 0) { - (yyval.type_qualifier).flags.q.invocations = 1; - - if ((yyvsp[0].n) <= 0) { - _mesa_glsl_error(& (yylsp[0]), state, - "invalid invocations %d specified", (yyvsp[0].n)); - YYERROR; - } else if ((yyvsp[0].n) > MAX_GEOMETRY_SHADER_INVOCATIONS) { - _mesa_glsl_error(& (yylsp[0]), state, - "invocations (%d) exceeds " - "GL_MAX_GEOMETRY_SHADER_INVOCATIONS", (yyvsp[0].n)); - YYERROR; - } else { - (yyval.type_qualifier).invocations = (yyvsp[0].n); - if (!state->is_version(400, 0) && - !state->ARB_gpu_shader5_enable) { - _mesa_glsl_error(& (yylsp[0]), state, - "GL_ARB_gpu_shader5 invocations " - "qualifier specified", (yyvsp[0].n)); - } - } - } - - /* If the identifier didn't match any known layout identifiers, - * emit an error. - */ - if (!(yyval.type_qualifier).flags.i) { - _mesa_glsl_error(& (yylsp[-2]), state, "unrecognized layout identifier " - "`%s'", (yyvsp[-2].identifier)); - YYERROR; - } - } -#line 4703 "src/glsl/glsl_parser.cpp" - break; - - case 156: -#line 1498 "src/glsl/glsl_parser.yy" - { - (yyval.type_qualifier) = (yyvsp[0].type_qualifier); - /* Layout qualifiers for ARB_uniform_buffer_object. */ - if ((yyval.type_qualifier).flags.q.uniform && !state->has_uniform_buffer_objects()) { - _mesa_glsl_error(& (yylsp[0]), state, - "#version 140 / GL_ARB_uniform_buffer_object " - "layout qualifier `%s' is used", (yyvsp[0].type_qualifier)); - } else if ((yyval.type_qualifier).flags.q.uniform && state->ARB_uniform_buffer_object_warn) { - _mesa_glsl_warning(& (yylsp[0]), state, - "#version 140 / GL_ARB_uniform_buffer_object " - "layout qualifier `%s' is used", (yyvsp[0].type_qualifier)); - } - } -#line 4721 "src/glsl/glsl_parser.cpp" - break; - - case 157: -#line 1524 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.row_major = 1; - } -#line 4731 "src/glsl/glsl_parser.cpp" - break; - - case 158: -#line 1530 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.packed = 1; - } -#line 4741 "src/glsl/glsl_parser.cpp" - break; - - case 159: -#line 1539 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.smooth = 1; - } -#line 4751 "src/glsl/glsl_parser.cpp" - break; - - case 160: -#line 1545 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.flat = 1; - } -#line 4761 "src/glsl/glsl_parser.cpp" - break; - - case 161: -#line 1551 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.noperspective = 1; - } -#line 4771 "src/glsl/glsl_parser.cpp" - break; - - case 162: -#line 1561 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.invariant = 1; - } -#line 4781 "src/glsl/glsl_parser.cpp" - break; - - case 163: -#line 1567 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).flags.q.precise = 1; - } -#line 4790 "src/glsl/glsl_parser.cpp" - break; - - case 168: -#line 1576 "src/glsl/glsl_parser.yy" - { - memset(&(yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).precision = (yyvsp[0].n); - } -#line 4800 "src/glsl/glsl_parser.cpp" - break; - - case 169: -#line 1595 "src/glsl/glsl_parser.yy" - { - if ((yyvsp[0].type_qualifier).flags.q.precise) - _mesa_glsl_error(&(yylsp[-1]), state, "duplicate \"precise\" qualifier"); - - (yyval.type_qualifier) = (yyvsp[0].type_qualifier); - (yyval.type_qualifier).flags.q.precise = 1; - } -#line 4812 "src/glsl/glsl_parser.cpp" - break; - - case 170: -#line 1603 "src/glsl/glsl_parser.yy" - { - if ((yyvsp[0].type_qualifier).flags.q.invariant) - _mesa_glsl_error(&(yylsp[-1]), state, "duplicate \"invariant\" qualifier"); - - if (!state->ARB_shading_language_420pack_enable && (yyvsp[0].type_qualifier).flags.q.precise) - _mesa_glsl_error(&(yylsp[-1]), state, - "\"invariant\" must come after \"precise\""); - - (yyval.type_qualifier) = (yyvsp[0].type_qualifier); - (yyval.type_qualifier).flags.q.invariant = 1; - } -#line 4828 "src/glsl/glsl_parser.cpp" - break; - - case 171: -#line 1615 "src/glsl/glsl_parser.yy" - { - /* Section 4.3 of the GLSL 1.40 specification states: - * "...qualified with one of these interpolation qualifiers" - * - * GLSL 1.30 claims to allow "one or more", but insists that: - * "These interpolation qualifiers may only precede the qualifiers in, - * centroid in, out, or centroid out in a declaration." - * - * ...which means that e.g. smooth can't precede smooth, so there can be - * only one after all, and the 1.40 text is a clarification, not a change. - */ - if ((yyvsp[0].type_qualifier).has_interpolation()) - _mesa_glsl_error(&(yylsp[-1]), state, "duplicate interpolation qualifier"); - - if (!state->ARB_shading_language_420pack_enable && - ((yyvsp[0].type_qualifier).flags.q.precise || (yyvsp[0].type_qualifier).flags.q.invariant)) { - _mesa_glsl_error(&(yylsp[-1]), state, "interpolation qualifiers must come " - "after \"precise\" or \"invariant\""); - } - - (yyval.type_qualifier) = (yyvsp[-1].type_qualifier); - (yyval.type_qualifier).merge_qualifier(&(yylsp[-1]), state, (yyvsp[0].type_qualifier)); - } -#line 4856 "src/glsl/glsl_parser.cpp" - break; - - case 172: -#line 1639 "src/glsl/glsl_parser.yy" - { - /* In the absence of ARB_shading_language_420pack, layout qualifiers may - * appear no later than auxiliary storage qualifiers. There is no - * particularly clear spec language mandating this, but in all examples - * the layout qualifier precedes the storage qualifier. - * - * We allow combinations of layout with interpolation, invariant or - * precise qualifiers since these are useful in ARB_separate_shader_objects. - * There is no clear spec guidance on this either. - */ - if (!state->ARB_shading_language_420pack_enable && (yyvsp[0].type_qualifier).has_layout()) - _mesa_glsl_error(&(yylsp[-1]), state, "duplicate layout(...) qualifiers"); - - (yyval.type_qualifier) = (yyvsp[-1].type_qualifier); - (yyval.type_qualifier).merge_qualifier(&(yylsp[-1]), state, (yyvsp[0].type_qualifier)); - } -#line 4877 "src/glsl/glsl_parser.cpp" - break; - - case 173: -#line 1656 "src/glsl/glsl_parser.yy" - { - if ((yyvsp[0].type_qualifier).has_auxiliary_storage()) { - _mesa_glsl_error(&(yylsp[-1]), state, - "duplicate auxiliary storage qualifier (centroid or sample)"); - } - - if (!state->ARB_shading_language_420pack_enable && - ((yyvsp[0].type_qualifier).flags.q.precise || (yyvsp[0].type_qualifier).flags.q.invariant || - (yyvsp[0].type_qualifier).has_interpolation() || (yyvsp[0].type_qualifier).has_layout())) { - _mesa_glsl_error(&(yylsp[-1]), state, "auxiliary storage qualifiers must come " - "just before storage qualifiers"); - } - (yyval.type_qualifier) = (yyvsp[-1].type_qualifier); - (yyval.type_qualifier).merge_qualifier(&(yylsp[-1]), state, (yyvsp[0].type_qualifier)); - } -#line 4897 "src/glsl/glsl_parser.cpp" - break; - - case 174: -#line 1672 "src/glsl/glsl_parser.yy" - { - /* Section 4.3 of the GLSL 1.20 specification states: - * "Variable declarations may have a storage qualifier specified..." - * 1.30 clarifies this to "may have one storage qualifier". - */ - if ((yyvsp[0].type_qualifier).has_storage()) - _mesa_glsl_error(&(yylsp[-1]), state, "duplicate storage qualifier"); - - if (!state->ARB_shading_language_420pack_enable && - ((yyvsp[0].type_qualifier).flags.q.precise || (yyvsp[0].type_qualifier).flags.q.invariant || (yyvsp[0].type_qualifier).has_interpolation() || - (yyvsp[0].type_qualifier).has_layout() || (yyvsp[0].type_qualifier).has_auxiliary_storage())) { - _mesa_glsl_error(&(yylsp[-1]), state, "storage qualifiers must come after " - "precise, invariant, interpolation, layout and auxiliary " - "storage qualifiers"); - } - - (yyval.type_qualifier) = (yyvsp[-1].type_qualifier); - (yyval.type_qualifier).merge_qualifier(&(yylsp[-1]), state, (yyvsp[0].type_qualifier)); - } -#line 4921 "src/glsl/glsl_parser.cpp" - break; - - case 175: -#line 1692 "src/glsl/glsl_parser.yy" - { - if ((yyvsp[0].type_qualifier).precision != ast_precision_none) - _mesa_glsl_error(&(yylsp[-1]), state, "duplicate precision qualifier"); - - if (!state->ARB_shading_language_420pack_enable && (yyvsp[0].type_qualifier).flags.i != 0) - _mesa_glsl_error(&(yylsp[-1]), state, "precision qualifiers must come last"); - - (yyval.type_qualifier) = (yyvsp[0].type_qualifier); - (yyval.type_qualifier).precision = (yyvsp[-1].n); - } -#line 4936 "src/glsl/glsl_parser.cpp" - break; - - case 176: -#line 1706 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.centroid = 1; - } -#line 4946 "src/glsl/glsl_parser.cpp" - break; - - case 177: -#line 1712 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).flags.q.sample = 1; - } -#line 4955 "src/glsl/glsl_parser.cpp" - break; - - case 178: -#line 1720 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.constant = 1; - } -#line 4965 "src/glsl/glsl_parser.cpp" - break; - - case 179: -#line 1726 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.attribute = 1; - } -#line 4975 "src/glsl/glsl_parser.cpp" - break; - - case 180: -#line 1732 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.varying = 1; - } -#line 4985 "src/glsl/glsl_parser.cpp" - break; - - case 181: -#line 1738 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.in = 1; - } -#line 4995 "src/glsl/glsl_parser.cpp" - break; - - case 182: -#line 1744 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.out = 1; - } -#line 5005 "src/glsl/glsl_parser.cpp" - break; - - case 183: -#line 1750 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.in = 1; - (yyval.type_qualifier).flags.q.out = 1; - - if (state->stage == MESA_SHADER_GEOMETRY && - state->has_explicit_attrib_stream()) { - /* Section 4.3.8.2 (Output Layout Qualifiers) of the GLSL 4.00 - * spec says: - * - * "If the block or variable is declared with the stream - * identifier, it is associated with the specified stream; - * otherwise, it is associated with the current default stream." - */ - (yyval.type_qualifier).flags.q.stream = 1; - (yyval.type_qualifier).flags.q.explicit_stream = 0; - (yyval.type_qualifier).stream = state->out_qualifier->stream; - } - } -#line 5030 "src/glsl/glsl_parser.cpp" - break; - - case 184: -#line 1771 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.uniform = 1; - } -#line 5040 "src/glsl/glsl_parser.cpp" - break; - - case 185: -#line 1777 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).flags.q.coherent = 1; - } -#line 5049 "src/glsl/glsl_parser.cpp" - break; - - case 186: -#line 1782 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).flags.q._volatile = 1; - } -#line 5058 "src/glsl/glsl_parser.cpp" - break; - - case 187: -#line 1787 "src/glsl/glsl_parser.yy" - { - STATIC_ASSERT(sizeof((yyval.type_qualifier).flags.q) <= sizeof((yyval.type_qualifier).flags.i)); - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).flags.q.restrict_flag = 1; - } -#line 5068 "src/glsl/glsl_parser.cpp" - break; - - case 188: -#line 1793 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).flags.q.read_only = 1; - } -#line 5077 "src/glsl/glsl_parser.cpp" - break; - - case 189: -#line 1798 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).flags.q.write_only = 1; - } -#line 5086 "src/glsl/glsl_parser.cpp" - break; - - case 190: -#line 1806 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.array_specifier) = new(ctx) ast_array_specifier((yylsp[-1])); - (yyval.array_specifier)->set_location_range((yylsp[-1]), (yylsp[0])); - } -#line 5096 "src/glsl/glsl_parser.cpp" - break; - - case 191: -#line 1812 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.array_specifier) = new(ctx) ast_array_specifier((yylsp[-2]), (yyvsp[-1].expression)); - (yyval.array_specifier)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 5106 "src/glsl/glsl_parser.cpp" - break; - - case 192: -#line 1818 "src/glsl/glsl_parser.yy" - { - (yyval.array_specifier) = (yyvsp[-2].array_specifier); - - if (!state->ARB_arrays_of_arrays_enable) { - _mesa_glsl_error(& (yylsp[-2]), state, - "GL_ARB_arrays_of_arrays " - "required for defining arrays of arrays"); - } else { - _mesa_glsl_error(& (yylsp[-2]), state, - "only the outermost array dimension can " - "be unsized"); - } - } -#line 5124 "src/glsl/glsl_parser.cpp" - break; - - case 193: -#line 1832 "src/glsl/glsl_parser.yy" - { - (yyval.array_specifier) = (yyvsp[-3].array_specifier); - - if (!state->ARB_arrays_of_arrays_enable) { - _mesa_glsl_error(& (yylsp[-3]), state, - "GL_ARB_arrays_of_arrays " - "required for defining arrays of arrays"); - } - - (yyval.array_specifier)->add_dimension((yyvsp[-1].expression)); - } -#line 5140 "src/glsl/glsl_parser.cpp" - break; - - case 195: -#line 1848 "src/glsl/glsl_parser.yy" - { - (yyval.type_specifier) = (yyvsp[-1].type_specifier); - (yyval.type_specifier)->array_specifier = (yyvsp[0].array_specifier); - } -#line 5149 "src/glsl/glsl_parser.cpp" - break; - - case 196: -#line 1856 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.type_specifier) = new(ctx) ast_type_specifier((yyvsp[0].identifier)); - (yyval.type_specifier)->set_location((yylsp[0])); - } -#line 5159 "src/glsl/glsl_parser.cpp" - break; - - case 197: -#line 1862 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.type_specifier) = new(ctx) ast_type_specifier((yyvsp[0].struct_specifier)); - (yyval.type_specifier)->set_location((yylsp[0])); - } -#line 5169 "src/glsl/glsl_parser.cpp" - break; - - case 198: -#line 1868 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.type_specifier) = new(ctx) ast_type_specifier((yyvsp[0].identifier)); - (yyval.type_specifier)->set_location((yylsp[0])); - } -#line 5179 "src/glsl/glsl_parser.cpp" - break; - - case 199: -#line 1876 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "void"; } -#line 5185 "src/glsl/glsl_parser.cpp" - break; - - case 200: -#line 1877 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "float"; } -#line 5191 "src/glsl/glsl_parser.cpp" - break; - - case 201: -#line 1878 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "int"; } -#line 5197 "src/glsl/glsl_parser.cpp" - break; - - case 202: -#line 1879 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "uint"; } -#line 5203 "src/glsl/glsl_parser.cpp" - break; - - case 203: -#line 1880 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "bool"; } -#line 5209 "src/glsl/glsl_parser.cpp" - break; - - case 204: -#line 1881 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "vec2"; } -#line 5215 "src/glsl/glsl_parser.cpp" - break; - - case 205: -#line 1882 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "vec3"; } -#line 5221 "src/glsl/glsl_parser.cpp" - break; - - case 206: -#line 1883 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "vec4"; } -#line 5227 "src/glsl/glsl_parser.cpp" - break; - - case 207: -#line 1884 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "bvec2"; } -#line 5233 "src/glsl/glsl_parser.cpp" - break; - - case 208: -#line 1885 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "bvec3"; } -#line 5239 "src/glsl/glsl_parser.cpp" - break; - - case 209: -#line 1886 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "bvec4"; } -#line 5245 "src/glsl/glsl_parser.cpp" - break; - - case 210: -#line 1887 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "ivec2"; } -#line 5251 "src/glsl/glsl_parser.cpp" - break; - - case 211: -#line 1888 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "ivec3"; } -#line 5257 "src/glsl/glsl_parser.cpp" - break; - - case 212: -#line 1889 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "ivec4"; } -#line 5263 "src/glsl/glsl_parser.cpp" - break; - - case 213: -#line 1890 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "uvec2"; } -#line 5269 "src/glsl/glsl_parser.cpp" - break; - - case 214: -#line 1891 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "uvec3"; } -#line 5275 "src/glsl/glsl_parser.cpp" - break; - - case 215: -#line 1892 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "uvec4"; } -#line 5281 "src/glsl/glsl_parser.cpp" - break; - - case 216: -#line 1893 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "mat2"; } -#line 5287 "src/glsl/glsl_parser.cpp" - break; - - case 217: -#line 1894 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "mat2x3"; } -#line 5293 "src/glsl/glsl_parser.cpp" - break; - - case 218: -#line 1895 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "mat2x4"; } -#line 5299 "src/glsl/glsl_parser.cpp" - break; - - case 219: -#line 1896 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "mat3x2"; } -#line 5305 "src/glsl/glsl_parser.cpp" - break; - - case 220: -#line 1897 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "mat3"; } -#line 5311 "src/glsl/glsl_parser.cpp" - break; - - case 221: -#line 1898 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "mat3x4"; } -#line 5317 "src/glsl/glsl_parser.cpp" - break; - - case 222: -#line 1899 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "mat4x2"; } -#line 5323 "src/glsl/glsl_parser.cpp" - break; - - case 223: -#line 1900 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "mat4x3"; } -#line 5329 "src/glsl/glsl_parser.cpp" - break; - - case 224: -#line 1901 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "mat4"; } -#line 5335 "src/glsl/glsl_parser.cpp" - break; - - case 225: -#line 1902 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "sampler1D"; } -#line 5341 "src/glsl/glsl_parser.cpp" - break; - - case 226: -#line 1903 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "sampler2D"; } -#line 5347 "src/glsl/glsl_parser.cpp" - break; - - case 227: -#line 1904 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "sampler2DRect"; } -#line 5353 "src/glsl/glsl_parser.cpp" - break; - - case 228: -#line 1905 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "sampler3D"; } -#line 5359 "src/glsl/glsl_parser.cpp" - break; - - case 229: -#line 1906 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "samplerCube"; } -#line 5365 "src/glsl/glsl_parser.cpp" - break; - - case 230: -#line 1907 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "samplerExternalOES"; } -#line 5371 "src/glsl/glsl_parser.cpp" - break; - - case 231: -#line 1908 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "sampler1DShadow"; } -#line 5377 "src/glsl/glsl_parser.cpp" - break; - - case 232: -#line 1909 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "sampler2DShadow"; } -#line 5383 "src/glsl/glsl_parser.cpp" - break; - - case 233: -#line 1910 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "sampler2DRectShadow"; } -#line 5389 "src/glsl/glsl_parser.cpp" - break; - - case 234: -#line 1911 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "samplerCubeShadow"; } -#line 5395 "src/glsl/glsl_parser.cpp" - break; - - case 235: -#line 1912 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "sampler1DArray"; } -#line 5401 "src/glsl/glsl_parser.cpp" - break; - - case 236: -#line 1913 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "sampler2DArray"; } -#line 5407 "src/glsl/glsl_parser.cpp" - break; - - case 237: -#line 1914 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "sampler1DArrayShadow"; } -#line 5413 "src/glsl/glsl_parser.cpp" - break; - - case 238: -#line 1915 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "sampler2DArrayShadow"; } -#line 5419 "src/glsl/glsl_parser.cpp" - break; - - case 239: -#line 1916 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "samplerBuffer"; } -#line 5425 "src/glsl/glsl_parser.cpp" - break; - - case 240: -#line 1917 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "samplerCubeArray"; } -#line 5431 "src/glsl/glsl_parser.cpp" - break; - - case 241: -#line 1918 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "samplerCubeArrayShadow"; } -#line 5437 "src/glsl/glsl_parser.cpp" - break; - - case 242: -#line 1919 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "isampler1D"; } -#line 5443 "src/glsl/glsl_parser.cpp" - break; - - case 243: -#line 1920 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "isampler2D"; } -#line 5449 "src/glsl/glsl_parser.cpp" - break; - - case 244: -#line 1921 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "isampler2DRect"; } -#line 5455 "src/glsl/glsl_parser.cpp" - break; - - case 245: -#line 1922 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "isampler3D"; } -#line 5461 "src/glsl/glsl_parser.cpp" - break; - - case 246: -#line 1923 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "isamplerCube"; } -#line 5467 "src/glsl/glsl_parser.cpp" - break; - - case 247: -#line 1924 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "isampler1DArray"; } -#line 5473 "src/glsl/glsl_parser.cpp" - break; - - case 248: -#line 1925 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "isampler2DArray"; } -#line 5479 "src/glsl/glsl_parser.cpp" - break; - - case 249: -#line 1926 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "isamplerBuffer"; } -#line 5485 "src/glsl/glsl_parser.cpp" - break; - - case 250: -#line 1927 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "isamplerCubeArray"; } -#line 5491 "src/glsl/glsl_parser.cpp" - break; - - case 251: -#line 1928 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "usampler1D"; } -#line 5497 "src/glsl/glsl_parser.cpp" - break; - - case 252: -#line 1929 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "usampler2D"; } -#line 5503 "src/glsl/glsl_parser.cpp" - break; - - case 253: -#line 1930 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "usampler2DRect"; } -#line 5509 "src/glsl/glsl_parser.cpp" - break; - - case 254: -#line 1931 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "usampler3D"; } -#line 5515 "src/glsl/glsl_parser.cpp" - break; - - case 255: -#line 1932 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "usamplerCube"; } -#line 5521 "src/glsl/glsl_parser.cpp" - break; - - case 256: -#line 1933 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "usampler1DArray"; } -#line 5527 "src/glsl/glsl_parser.cpp" - break; - - case 257: -#line 1934 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "usampler2DArray"; } -#line 5533 "src/glsl/glsl_parser.cpp" - break; - - case 258: -#line 1935 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "usamplerBuffer"; } -#line 5539 "src/glsl/glsl_parser.cpp" - break; - - case 259: -#line 1936 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "usamplerCubeArray"; } -#line 5545 "src/glsl/glsl_parser.cpp" - break; - - case 260: -#line 1937 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "sampler2DMS"; } -#line 5551 "src/glsl/glsl_parser.cpp" - break; - - case 261: -#line 1938 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "isampler2DMS"; } -#line 5557 "src/glsl/glsl_parser.cpp" - break; - - case 262: -#line 1939 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "usampler2DMS"; } -#line 5563 "src/glsl/glsl_parser.cpp" - break; - - case 263: -#line 1940 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "sampler2DMSArray"; } -#line 5569 "src/glsl/glsl_parser.cpp" - break; - - case 264: -#line 1941 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "isampler2DMSArray"; } -#line 5575 "src/glsl/glsl_parser.cpp" - break; - - case 265: -#line 1942 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "usampler2DMSArray"; } -#line 5581 "src/glsl/glsl_parser.cpp" - break; - - case 266: -#line 1943 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "image1D"; } -#line 5587 "src/glsl/glsl_parser.cpp" - break; - - case 267: -#line 1944 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "image2D"; } -#line 5593 "src/glsl/glsl_parser.cpp" - break; - - case 268: -#line 1945 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "image3D"; } -#line 5599 "src/glsl/glsl_parser.cpp" - break; - - case 269: -#line 1946 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "image2DRect"; } -#line 5605 "src/glsl/glsl_parser.cpp" - break; - - case 270: -#line 1947 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "imageCube"; } -#line 5611 "src/glsl/glsl_parser.cpp" - break; - - case 271: -#line 1948 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "imageBuffer"; } -#line 5617 "src/glsl/glsl_parser.cpp" - break; - - case 272: -#line 1949 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "image1DArray"; } -#line 5623 "src/glsl/glsl_parser.cpp" - break; - - case 273: -#line 1950 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "image2DArray"; } -#line 5629 "src/glsl/glsl_parser.cpp" - break; - - case 274: -#line 1951 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "imageCubeArray"; } -#line 5635 "src/glsl/glsl_parser.cpp" - break; - - case 275: -#line 1952 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "image2DMS"; } -#line 5641 "src/glsl/glsl_parser.cpp" - break; - - case 276: -#line 1953 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "image2DMSArray"; } -#line 5647 "src/glsl/glsl_parser.cpp" - break; - - case 277: -#line 1954 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "iimage1D"; } -#line 5653 "src/glsl/glsl_parser.cpp" - break; - - case 278: -#line 1955 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "iimage2D"; } -#line 5659 "src/glsl/glsl_parser.cpp" - break; - - case 279: -#line 1956 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "iimage3D"; } -#line 5665 "src/glsl/glsl_parser.cpp" - break; - - case 280: -#line 1957 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "iimage2DRect"; } -#line 5671 "src/glsl/glsl_parser.cpp" - break; - - case 281: -#line 1958 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "iimageCube"; } -#line 5677 "src/glsl/glsl_parser.cpp" - break; - - case 282: -#line 1959 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "iimageBuffer"; } -#line 5683 "src/glsl/glsl_parser.cpp" - break; - - case 283: -#line 1960 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "iimage1DArray"; } -#line 5689 "src/glsl/glsl_parser.cpp" - break; - - case 284: -#line 1961 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "iimage2DArray"; } -#line 5695 "src/glsl/glsl_parser.cpp" - break; - - case 285: -#line 1962 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "iimageCubeArray"; } -#line 5701 "src/glsl/glsl_parser.cpp" - break; - - case 286: -#line 1963 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "iimage2DMS"; } -#line 5707 "src/glsl/glsl_parser.cpp" - break; - - case 287: -#line 1964 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "iimage2DMSArray"; } -#line 5713 "src/glsl/glsl_parser.cpp" - break; - - case 288: -#line 1965 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "uimage1D"; } -#line 5719 "src/glsl/glsl_parser.cpp" - break; - - case 289: -#line 1966 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "uimage2D"; } -#line 5725 "src/glsl/glsl_parser.cpp" - break; - - case 290: -#line 1967 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "uimage3D"; } -#line 5731 "src/glsl/glsl_parser.cpp" - break; - - case 291: -#line 1968 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "uimage2DRect"; } -#line 5737 "src/glsl/glsl_parser.cpp" - break; - - case 292: -#line 1969 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "uimageCube"; } -#line 5743 "src/glsl/glsl_parser.cpp" - break; - - case 293: -#line 1970 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "uimageBuffer"; } -#line 5749 "src/glsl/glsl_parser.cpp" - break; - - case 294: -#line 1971 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "uimage1DArray"; } -#line 5755 "src/glsl/glsl_parser.cpp" - break; - - case 295: -#line 1972 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "uimage2DArray"; } -#line 5761 "src/glsl/glsl_parser.cpp" - break; - - case 296: -#line 1973 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "uimageCubeArray"; } -#line 5767 "src/glsl/glsl_parser.cpp" - break; - - case 297: -#line 1974 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "uimage2DMS"; } -#line 5773 "src/glsl/glsl_parser.cpp" - break; - - case 298: -#line 1975 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "uimage2DMSArray"; } -#line 5779 "src/glsl/glsl_parser.cpp" - break; - - case 299: -#line 1976 "src/glsl/glsl_parser.yy" - { (yyval.identifier) = "atomic_uint"; } -#line 5785 "src/glsl/glsl_parser.cpp" - break; - - case 300: -#line 1981 "src/glsl/glsl_parser.yy" - { - state->check_precision_qualifiers_allowed(&(yylsp[0])); - (yyval.n) = ast_precision_high; - } -#line 5794 "src/glsl/glsl_parser.cpp" - break; - - case 301: -#line 1986 "src/glsl/glsl_parser.yy" - { - state->check_precision_qualifiers_allowed(&(yylsp[0])); - (yyval.n) = ast_precision_medium; - } -#line 5803 "src/glsl/glsl_parser.cpp" - break; - - case 302: -#line 1991 "src/glsl/glsl_parser.yy" - { - state->check_precision_qualifiers_allowed(&(yylsp[0])); - (yyval.n) = ast_precision_low; - } -#line 5812 "src/glsl/glsl_parser.cpp" - break; - - case 303: -#line 1999 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.struct_specifier) = new(ctx) ast_struct_specifier((yyvsp[-3].identifier), (yyvsp[-1].declarator_list)); - (yyval.struct_specifier)->set_location_range((yylsp[-3]), (yylsp[0])); - state->symbols->add_type((yyvsp[-3].identifier), glsl_type::void_type); - } -#line 5823 "src/glsl/glsl_parser.cpp" - break; - - case 304: -#line 2006 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.struct_specifier) = new(ctx) ast_struct_specifier(NULL, (yyvsp[-1].declarator_list)); - (yyval.struct_specifier)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 5833 "src/glsl/glsl_parser.cpp" - break; - - case 305: -#line 2015 "src/glsl/glsl_parser.yy" - { - (yyval.declarator_list) = (yyvsp[0].declarator_list); - (yyvsp[0].declarator_list)->link.self_link(); - } -#line 5842 "src/glsl/glsl_parser.cpp" - break; - - case 306: -#line 2020 "src/glsl/glsl_parser.yy" - { - (yyval.declarator_list) = (yyvsp[-1].declarator_list); - (yyval.declarator_list)->link.insert_before(& (yyvsp[0].declarator_list)->link); - } -#line 5851 "src/glsl/glsl_parser.cpp" - break; - - case 307: -#line 2028 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_fully_specified_type *const type = (yyvsp[-2].fully_specified_type); - type->set_location((yylsp[-2])); - - if (type->qualifier.flags.i != 0) - _mesa_glsl_error(&(yylsp[-2]), state, - "only precision qualifiers may be applied to " - "structure members"); - - (yyval.declarator_list) = new(ctx) ast_declarator_list(type); - (yyval.declarator_list)->set_location((yylsp[-1])); - - (yyval.declarator_list)->declarations.push_degenerate_list_at_head(& (yyvsp[-1].declaration)->link); - } -#line 5871 "src/glsl/glsl_parser.cpp" - break; - - case 308: -#line 2047 "src/glsl/glsl_parser.yy" - { - (yyval.declaration) = (yyvsp[0].declaration); - (yyvsp[0].declaration)->link.self_link(); - } -#line 5880 "src/glsl/glsl_parser.cpp" - break; - - case 309: -#line 2052 "src/glsl/glsl_parser.yy" - { - (yyval.declaration) = (yyvsp[-2].declaration); - (yyval.declaration)->link.insert_before(& (yyvsp[0].declaration)->link); - } -#line 5889 "src/glsl/glsl_parser.cpp" - break; - - case 310: -#line 2060 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.declaration) = new(ctx) ast_declaration((yyvsp[0].identifier), NULL, NULL); - (yyval.declaration)->set_location((yylsp[0])); - } -#line 5899 "src/glsl/glsl_parser.cpp" - break; - - case 311: -#line 2066 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.declaration) = new(ctx) ast_declaration((yyvsp[-1].identifier), (yyvsp[0].array_specifier), NULL); - (yyval.declaration)->set_location_range((yylsp[-1]), (yylsp[0])); - } -#line 5909 "src/glsl/glsl_parser.cpp" - break; - - case 313: -#line 2076 "src/glsl/glsl_parser.yy" - { - (yyval.expression) = (yyvsp[-1].expression); - } -#line 5917 "src/glsl/glsl_parser.cpp" - break; - - case 314: -#line 2080 "src/glsl/glsl_parser.yy" - { - (yyval.expression) = (yyvsp[-2].expression); - } -#line 5925 "src/glsl/glsl_parser.cpp" - break; - - case 315: -#line 2087 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.expression) = new(ctx) ast_aggregate_initializer(); - (yyval.expression)->set_location((yylsp[0])); - (yyval.expression)->expressions.push_tail(& (yyvsp[0].expression)->link); - } -#line 5936 "src/glsl/glsl_parser.cpp" - break; - - case 316: -#line 2094 "src/glsl/glsl_parser.yy" - { - (yyvsp[-2].expression)->expressions.push_tail(& (yyvsp[0].expression)->link); - } -#line 5944 "src/glsl/glsl_parser.cpp" - break; - - case 318: -#line 2106 "src/glsl/glsl_parser.yy" - { (yyval.node) = (ast_node *) (yyvsp[0].compound_statement); } -#line 5950 "src/glsl/glsl_parser.cpp" - break; - - case 326: -#line 2121 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.compound_statement) = new(ctx) ast_compound_statement(true, NULL); - (yyval.compound_statement)->set_location_range((yylsp[-1]), (yylsp[0])); - } -#line 5960 "src/glsl/glsl_parser.cpp" - break; - - case 327: -#line 2127 "src/glsl/glsl_parser.yy" - { - state->symbols->push_scope(); - } -#line 5968 "src/glsl/glsl_parser.cpp" - break; - - case 328: -#line 2131 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.compound_statement) = new(ctx) ast_compound_statement(true, (yyvsp[-1].node)); - (yyval.compound_statement)->set_location_range((yylsp[-3]), (yylsp[0])); - state->symbols->pop_scope(); - } -#line 5979 "src/glsl/glsl_parser.cpp" - break; - - case 329: -#line 2140 "src/glsl/glsl_parser.yy" - { (yyval.node) = (ast_node *) (yyvsp[0].compound_statement); } -#line 5985 "src/glsl/glsl_parser.cpp" - break; - - case 331: -#line 2146 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.compound_statement) = new(ctx) ast_compound_statement(false, NULL); - (yyval.compound_statement)->set_location_range((yylsp[-1]), (yylsp[0])); - } -#line 5995 "src/glsl/glsl_parser.cpp" - break; - - case 332: -#line 2152 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.compound_statement) = new(ctx) ast_compound_statement(false, (yyvsp[-1].node)); - (yyval.compound_statement)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 6005 "src/glsl/glsl_parser.cpp" - break; - - case 333: -#line 2161 "src/glsl/glsl_parser.yy" - { - if ((yyvsp[0].node) == NULL) { - _mesa_glsl_error(& (yylsp[0]), state, " statement"); - assert((yyvsp[0].node) != NULL); - } - - (yyval.node) = (yyvsp[0].node); - (yyval.node)->link.self_link(); - } -#line 6019 "src/glsl/glsl_parser.cpp" - break; - - case 334: -#line 2171 "src/glsl/glsl_parser.yy" - { - if ((yyvsp[0].node) == NULL) { - _mesa_glsl_error(& (yylsp[0]), state, " statement"); - assert((yyvsp[0].node) != NULL); - } - (yyval.node) = (yyvsp[-1].node); - (yyval.node)->link.insert_before(& (yyvsp[0].node)->link); - } -#line 6032 "src/glsl/glsl_parser.cpp" - break; - - case 335: -#line 2183 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.node) = new(ctx) ast_expression_statement(NULL); - (yyval.node)->set_location((yylsp[0])); - } -#line 6042 "src/glsl/glsl_parser.cpp" - break; - - case 336: -#line 2189 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.node) = new(ctx) ast_expression_statement((yyvsp[-1].expression)); - (yyval.node)->set_location((yylsp[-1])); - } -#line 6052 "src/glsl/glsl_parser.cpp" - break; - - case 337: -#line 2198 "src/glsl/glsl_parser.yy" - { - (yyval.node) = new(state) ast_selection_statement((yyvsp[-2].expression), (yyvsp[0].selection_rest_statement).then_statement, - (yyvsp[0].selection_rest_statement).else_statement); - (yyval.node)->set_location_range((yylsp[-4]), (yylsp[0])); - } -#line 6062 "src/glsl/glsl_parser.cpp" - break; - - case 338: -#line 2207 "src/glsl/glsl_parser.yy" - { - (yyval.selection_rest_statement).then_statement = (yyvsp[-2].node); - (yyval.selection_rest_statement).else_statement = (yyvsp[0].node); - } -#line 6071 "src/glsl/glsl_parser.cpp" - break; - - case 339: -#line 2212 "src/glsl/glsl_parser.yy" - { - (yyval.selection_rest_statement).then_statement = (yyvsp[0].node); - (yyval.selection_rest_statement).else_statement = NULL; - } -#line 6080 "src/glsl/glsl_parser.cpp" - break; - - case 340: -#line 2220 "src/glsl/glsl_parser.yy" - { - (yyval.node) = (ast_node *) (yyvsp[0].expression); - } -#line 6088 "src/glsl/glsl_parser.cpp" - break; - - case 341: -#line 2224 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration((yyvsp[-2].identifier), NULL, (yyvsp[0].expression)); - ast_declarator_list *declarator = new(ctx) ast_declarator_list((yyvsp[-3].fully_specified_type)); - decl->set_location_range((yylsp[-2]), (yylsp[0])); - declarator->set_location((yylsp[-3])); - - declarator->declarations.push_tail(&decl->link); - (yyval.node) = declarator; - } -#line 6103 "src/glsl/glsl_parser.cpp" - break; - - case 342: -#line 2242 "src/glsl/glsl_parser.yy" - { - (yyval.node) = new(state) ast_switch_statement((yyvsp[-2].expression), (yyvsp[0].switch_body)); - (yyval.node)->set_location_range((yylsp[-4]), (yylsp[0])); - } -#line 6112 "src/glsl/glsl_parser.cpp" - break; - - case 343: -#line 2250 "src/glsl/glsl_parser.yy" - { - (yyval.switch_body) = new(state) ast_switch_body(NULL); - (yyval.switch_body)->set_location_range((yylsp[-1]), (yylsp[0])); - } -#line 6121 "src/glsl/glsl_parser.cpp" - break; - - case 344: -#line 2255 "src/glsl/glsl_parser.yy" - { - (yyval.switch_body) = new(state) ast_switch_body((yyvsp[-1].case_statement_list)); - (yyval.switch_body)->set_location_range((yylsp[-2]), (yylsp[0])); - } -#line 6130 "src/glsl/glsl_parser.cpp" - break; - - case 345: -#line 2263 "src/glsl/glsl_parser.yy" - { - (yyval.case_label) = new(state) ast_case_label((yyvsp[-1].expression)); - (yyval.case_label)->set_location((yylsp[-1])); - } -#line 6139 "src/glsl/glsl_parser.cpp" - break; - - case 346: -#line 2268 "src/glsl/glsl_parser.yy" - { - (yyval.case_label) = new(state) ast_case_label(NULL); - (yyval.case_label)->set_location((yylsp[0])); - } -#line 6148 "src/glsl/glsl_parser.cpp" - break; - - case 347: -#line 2276 "src/glsl/glsl_parser.yy" - { - ast_case_label_list *labels = new(state) ast_case_label_list(); - - labels->labels.push_tail(& (yyvsp[0].case_label)->link); - (yyval.case_label_list) = labels; - (yyval.case_label_list)->set_location((yylsp[0])); - } -#line 6160 "src/glsl/glsl_parser.cpp" - break; - - case 348: -#line 2284 "src/glsl/glsl_parser.yy" - { - (yyval.case_label_list) = (yyvsp[-1].case_label_list); - (yyval.case_label_list)->labels.push_tail(& (yyvsp[0].case_label)->link); - } -#line 6169 "src/glsl/glsl_parser.cpp" - break; - - case 349: -#line 2292 "src/glsl/glsl_parser.yy" - { - ast_case_statement *stmts = new(state) ast_case_statement((yyvsp[-1].case_label_list)); - stmts->set_location((yylsp[0])); - - stmts->stmts.push_tail(& (yyvsp[0].node)->link); - (yyval.case_statement) = stmts; - } -#line 6181 "src/glsl/glsl_parser.cpp" - break; - - case 350: -#line 2300 "src/glsl/glsl_parser.yy" - { - (yyval.case_statement) = (yyvsp[-1].case_statement); - (yyval.case_statement)->stmts.push_tail(& (yyvsp[0].node)->link); - } -#line 6190 "src/glsl/glsl_parser.cpp" - break; - - case 351: -#line 2308 "src/glsl/glsl_parser.yy" - { - ast_case_statement_list *cases= new(state) ast_case_statement_list(); - cases->set_location((yylsp[0])); - - cases->cases.push_tail(& (yyvsp[0].case_statement)->link); - (yyval.case_statement_list) = cases; - } -#line 6202 "src/glsl/glsl_parser.cpp" - break; - - case 352: -#line 2316 "src/glsl/glsl_parser.yy" - { - (yyval.case_statement_list) = (yyvsp[-1].case_statement_list); - (yyval.case_statement_list)->cases.push_tail(& (yyvsp[0].case_statement)->link); - } -#line 6211 "src/glsl/glsl_parser.cpp" - break; - - case 353: -#line 2324 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.node) = new(ctx) ast_iteration_statement(ast_iteration_statement::ast_while, - NULL, (yyvsp[-2].node), NULL, (yyvsp[0].node)); - (yyval.node)->set_location_range((yylsp[-4]), (yylsp[-1])); - } -#line 6222 "src/glsl/glsl_parser.cpp" - break; - - case 354: -#line 2331 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.node) = new(ctx) ast_iteration_statement(ast_iteration_statement::ast_do_while, - NULL, (yyvsp[-2].expression), NULL, (yyvsp[-5].node)); - (yyval.node)->set_location_range((yylsp[-6]), (yylsp[-1])); - } -#line 6233 "src/glsl/glsl_parser.cpp" - break; - - case 355: -#line 2338 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.node) = new(ctx) ast_iteration_statement(ast_iteration_statement::ast_for, - (yyvsp[-3].node), (yyvsp[-2].for_rest_statement).cond, (yyvsp[-2].for_rest_statement).rest, (yyvsp[0].node)); - (yyval.node)->set_location_range((yylsp[-5]), (yylsp[0])); - } -#line 6244 "src/glsl/glsl_parser.cpp" - break; - - case 359: -#line 2354 "src/glsl/glsl_parser.yy" - { - (yyval.node) = NULL; - } -#line 6252 "src/glsl/glsl_parser.cpp" - break; - - case 360: -#line 2361 "src/glsl/glsl_parser.yy" - { - (yyval.for_rest_statement).cond = (yyvsp[-1].node); - (yyval.for_rest_statement).rest = NULL; - } -#line 6261 "src/glsl/glsl_parser.cpp" - break; - - case 361: -#line 2366 "src/glsl/glsl_parser.yy" - { - (yyval.for_rest_statement).cond = (yyvsp[-2].node); - (yyval.for_rest_statement).rest = (yyvsp[0].expression); - } -#line 6270 "src/glsl/glsl_parser.cpp" - break; - - case 362: -#line 2375 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.node) = new(ctx) ast_jump_statement(ast_jump_statement::ast_continue, NULL); - (yyval.node)->set_location((yylsp[-1])); - } -#line 6280 "src/glsl/glsl_parser.cpp" - break; - - case 363: -#line 2381 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.node) = new(ctx) ast_jump_statement(ast_jump_statement::ast_break, NULL); - (yyval.node)->set_location((yylsp[-1])); - } -#line 6290 "src/glsl/glsl_parser.cpp" - break; - - case 364: -#line 2387 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.node) = new(ctx) ast_jump_statement(ast_jump_statement::ast_return, NULL); - (yyval.node)->set_location((yylsp[-1])); - } -#line 6300 "src/glsl/glsl_parser.cpp" - break; - - case 365: -#line 2393 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.node) = new(ctx) ast_jump_statement(ast_jump_statement::ast_return, (yyvsp[-1].expression)); - (yyval.node)->set_location_range((yylsp[-2]), (yylsp[-1])); - } -#line 6310 "src/glsl/glsl_parser.cpp" - break; - - case 366: -#line 2399 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.node) = new(ctx) ast_jump_statement(ast_jump_statement::ast_discard, NULL); - (yyval.node)->set_location((yylsp[-1])); - } -#line 6320 "src/glsl/glsl_parser.cpp" - break; - - case 367: -#line 2407 "src/glsl/glsl_parser.yy" - { (yyval.node) = (yyvsp[0].function_definition); } -#line 6326 "src/glsl/glsl_parser.cpp" - break; - - case 368: -#line 2408 "src/glsl/glsl_parser.yy" - { (yyval.node) = (yyvsp[0].node); } -#line 6332 "src/glsl/glsl_parser.cpp" - break; - - case 369: -#line 2409 "src/glsl/glsl_parser.yy" - { (yyval.node) = NULL; } -#line 6338 "src/glsl/glsl_parser.cpp" - break; - - case 370: -#line 2410 "src/glsl/glsl_parser.yy" - { (yyval.node) = (yyvsp[0].node); } -#line 6344 "src/glsl/glsl_parser.cpp" - break; - - case 371: -#line 2415 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - (yyval.function_definition) = new(ctx) ast_function_definition(); - (yyval.function_definition)->set_location_range((yylsp[-1]), (yylsp[0])); - (yyval.function_definition)->prototype = (yyvsp[-1].function); - (yyval.function_definition)->body = (yyvsp[0].compound_statement); - - state->symbols->pop_scope(); - } -#line 6358 "src/glsl/glsl_parser.cpp" - break; - - case 372: -#line 2429 "src/glsl/glsl_parser.yy" - { - (yyval.node) = (yyvsp[0].interface_block); - } -#line 6366 "src/glsl/glsl_parser.cpp" - break; - - case 373: -#line 2433 "src/glsl/glsl_parser.yy" - { - ast_interface_block *block = (yyvsp[0].interface_block); - if (!block->layout.merge_qualifier(& (yylsp[-1]), state, (yyvsp[-1].type_qualifier))) { - YYERROR; - } - - foreach_list_typed (ast_declarator_list, member, link, &block->declarations) { - ast_type_qualifier& qualifier = member->type->qualifier; - if (qualifier.flags.q.stream && qualifier.stream != block->layout.stream) { - _mesa_glsl_error(& (yylsp[-1]), state, - "stream layout qualifier on " - "interface block member does not match " - "the interface block (%d vs %d)", - qualifier.stream, block->layout.stream); - YYERROR; - } - } - (yyval.node) = block; - } -#line 6390 "src/glsl/glsl_parser.cpp" - break; - - case 374: -#line 2456 "src/glsl/glsl_parser.yy" - { - ast_interface_block *const block = (yyvsp[-1].interface_block); - - block->block_name = (yyvsp[-5].identifier); - block->declarations.push_degenerate_list_at_head(& (yyvsp[-3].declarator_list)->link); - - if ((yyvsp[-6].type_qualifier).flags.q.uniform) { - if (!state->has_uniform_buffer_objects()) { - _mesa_glsl_error(& (yylsp[-6]), state, - "#version 140 / GL_ARB_uniform_buffer_object " - "required for defining uniform blocks"); - } else if (state->ARB_uniform_buffer_object_warn) { - _mesa_glsl_warning(& (yylsp[-6]), state, - "#version 140 / GL_ARB_uniform_buffer_object " - "required for defining uniform blocks"); - } - } else { - if (state->es_shader || state->language_version < 150) { - _mesa_glsl_error(& (yylsp[-6]), state, - "#version 150 required for using " - "interface blocks"); - } - } - - /* From the GLSL 1.50.11 spec, section 4.3.7 ("Interface Blocks"): - * "It is illegal to have an input block in a vertex shader - * or an output block in a fragment shader" - */ - if ((state->stage == MESA_SHADER_VERTEX) && (yyvsp[-6].type_qualifier).flags.q.in) { - _mesa_glsl_error(& (yylsp[-6]), state, - "`in' interface block is not allowed for " - "a vertex shader"); - } else if ((state->stage == MESA_SHADER_FRAGMENT) && (yyvsp[-6].type_qualifier).flags.q.out) { - _mesa_glsl_error(& (yylsp[-6]), state, - "`out' interface block is not allowed for " - "a fragment shader"); - } - - /* Since block arrays require names, and both features are added in - * the same language versions, we don't have to explicitly - * version-check both things. - */ - if (block->instance_name != NULL) { - state->check_version(150, 300, & (yylsp[-6]), "interface blocks with " - "an instance name are not allowed"); - } - - uint64_t interface_type_mask; - struct ast_type_qualifier temp_type_qualifier; - - /* Get a bitmask containing only the in/out/uniform flags, allowing us - * to ignore other irrelevant flags like interpolation qualifiers. - */ - temp_type_qualifier.flags.i = 0; - temp_type_qualifier.flags.q.uniform = true; - temp_type_qualifier.flags.q.in = true; - temp_type_qualifier.flags.q.out = true; - interface_type_mask = temp_type_qualifier.flags.i; - - /* Get the block's interface qualifier. The interface_qualifier - * production rule guarantees that only one bit will be set (and - * it will be in/out/uniform). - */ - uint64_t block_interface_qualifier = (yyvsp[-6].type_qualifier).flags.i; - - block->layout.flags.i |= block_interface_qualifier; - - if (state->stage == MESA_SHADER_GEOMETRY && - state->has_explicit_attrib_stream()) { - /* Assign global layout's stream value. */ - block->layout.flags.q.stream = 1; - block->layout.flags.q.explicit_stream = 0; - block->layout.stream = state->out_qualifier->stream; - } - - foreach_list_typed (ast_declarator_list, member, link, &block->declarations) { - ast_type_qualifier& qualifier = member->type->qualifier; - if ((qualifier.flags.i & interface_type_mask) == 0) { - /* GLSLangSpec.1.50.11, 4.3.7 (Interface Blocks): - * "If no optional qualifier is used in a member declaration, the - * qualifier of the variable is just in, out, or uniform as declared - * by interface-qualifier." - */ - qualifier.flags.i |= block_interface_qualifier; - } else if ((qualifier.flags.i & interface_type_mask) != - block_interface_qualifier) { - /* GLSLangSpec.1.50.11, 4.3.7 (Interface Blocks): - * "If optional qualifiers are used, they can include interpolation - * and storage qualifiers and they must declare an input, output, - * or uniform variable consistent with the interface qualifier of - * the block." - */ - _mesa_glsl_error(& (yylsp[-6]), state, - "uniform/in/out qualifier on " - "interface block member does not match " - "the interface block"); - } - } - - (yyval.interface_block) = block; - } -#line 6496 "src/glsl/glsl_parser.cpp" - break; - - case 375: -#line 2561 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.in = 1; - } -#line 6506 "src/glsl/glsl_parser.cpp" - break; - - case 376: -#line 2567 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.out = 1; - } -#line 6516 "src/glsl/glsl_parser.cpp" - break; - - case 377: -#line 2573 "src/glsl/glsl_parser.yy" - { - memset(& (yyval.type_qualifier), 0, sizeof((yyval.type_qualifier))); - (yyval.type_qualifier).precision = ast_precision_none; - (yyval.type_qualifier).flags.q.uniform = 1; - } -#line 6526 "src/glsl/glsl_parser.cpp" - break; - - case 378: -#line 2582 "src/glsl/glsl_parser.yy" - { - (yyval.interface_block) = new(state) ast_interface_block(*state->default_uniform_qualifier, - NULL, NULL); - } -#line 6535 "src/glsl/glsl_parser.cpp" - break; - - case 379: -#line 2587 "src/glsl/glsl_parser.yy" - { - (yyval.interface_block) = new(state) ast_interface_block(*state->default_uniform_qualifier, - (yyvsp[0].identifier), NULL); - (yyval.interface_block)->set_location((yylsp[0])); - } -#line 6545 "src/glsl/glsl_parser.cpp" - break; - - case 380: -#line 2593 "src/glsl/glsl_parser.yy" - { - (yyval.interface_block) = new(state) ast_interface_block(*state->default_uniform_qualifier, - (yyvsp[-1].identifier), (yyvsp[0].array_specifier)); - (yyval.interface_block)->set_location_range((yylsp[-1]), (yylsp[0])); - } -#line 6555 "src/glsl/glsl_parser.cpp" - break; - - case 381: -#line 2602 "src/glsl/glsl_parser.yy" - { - (yyval.declarator_list) = (yyvsp[0].declarator_list); - (yyvsp[0].declarator_list)->link.self_link(); - } -#line 6564 "src/glsl/glsl_parser.cpp" - break; - - case 382: -#line 2607 "src/glsl/glsl_parser.yy" - { - (yyval.declarator_list) = (yyvsp[-1].declarator_list); - (yyvsp[0].declarator_list)->link.insert_before(& (yyval.declarator_list)->link); - } -#line 6573 "src/glsl/glsl_parser.cpp" - break; - - case 383: -#line 2615 "src/glsl/glsl_parser.yy" - { - void *ctx = state; - ast_fully_specified_type *type = (yyvsp[-2].fully_specified_type); - type->set_location((yylsp[-2])); - - if (type->qualifier.flags.q.attribute) { - _mesa_glsl_error(& (yylsp[-2]), state, - "keyword 'attribute' cannot be used with " - "interface block member"); - } else if (type->qualifier.flags.q.varying) { - _mesa_glsl_error(& (yylsp[-2]), state, - "keyword 'varying' cannot be used with " - "interface block member"); - } - - (yyval.declarator_list) = new(ctx) ast_declarator_list(type); - (yyval.declarator_list)->set_location((yylsp[-1])); - - (yyval.declarator_list)->declarations.push_degenerate_list_at_head(& (yyvsp[-1].declaration)->link); - } -#line 6598 "src/glsl/glsl_parser.cpp" - break; - - case 384: -#line 2639 "src/glsl/glsl_parser.yy" - { - if (!state->default_uniform_qualifier->merge_qualifier(& (yylsp[-2]), state, (yyvsp[-2].type_qualifier))) { - YYERROR; - } - (yyval.node) = NULL; - } -#line 6609 "src/glsl/glsl_parser.cpp" - break; - - case 385: -#line 2647 "src/glsl/glsl_parser.yy" - { - (yyval.node) = NULL; - if (!state->in_qualifier->merge_in_qualifier(& (yylsp[-2]), state, (yyvsp[-2].type_qualifier), (yyval.node))) { - YYERROR; - } - } -#line 6620 "src/glsl/glsl_parser.cpp" - break; - - case 386: -#line 2655 "src/glsl/glsl_parser.yy" - { - if (state->stage != MESA_SHADER_GEOMETRY) { - _mesa_glsl_error(& (yylsp[-2]), state, - "out layout qualifiers only valid in " - "geometry shaders"); - } else { - if ((yyvsp[-2].type_qualifier).flags.q.prim_type) { - /* Make sure this is a valid output primitive type. */ - switch ((yyvsp[-2].type_qualifier).prim_type) { - case GL_POINTS: - case GL_LINE_STRIP: - case GL_TRIANGLE_STRIP: - break; - default: - _mesa_glsl_error(&(yylsp[-2]), state, "invalid geometry shader output " - "primitive type"); - break; - } - } - if (!state->out_qualifier->merge_qualifier(& (yylsp[-2]), state, (yyvsp[-2].type_qualifier))) - YYERROR; - - /* Allow future assigments of global out's stream id value */ - state->out_qualifier->flags.q.explicit_stream = 0; - } - (yyval.node) = NULL; - } -#line 6652 "src/glsl/glsl_parser.cpp" - break; - - -#line 6656 "src/glsl/glsl_parser.cpp" - - default: break; - } - /* User semantic actions sometimes alter yychar, and that requires - that yytoken be updated with the new translation. We take the - approach of translating immediately before every use of yytoken. - One alternative is translating here after every semantic action, - but that translation would be missed if the semantic action invokes - YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or - if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an - incorrect destructor might then be invoked immediately. In the - case of YYERROR or YYBACKUP, subsequent parser actions might lead - to an incorrect destructor call or verbose syntax error message - before the lookahead is translated. */ - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp = yyval; - *++yylsp = yyloc; - - /* Now 'shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - { - const int yylhs = yyr1[yyn] - YYNTOKENS; - const int yyi = yypgoto[yylhs] + *yyssp; - yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp - ? yytable[yyi] - : yydefgoto[yylhs]); - } - - goto yynewstate; - - -/*--------------------------------------. -| yyerrlab -- here on detecting error. | -`--------------------------------------*/ -yyerrlab: - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); - - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (&yylloc, state, YY_("syntax error")); -#else -# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ - yyssp, yytoken) - { - char const *yymsgp = YY_("syntax error"); - int yysyntax_error_status; - yysyntax_error_status = YYSYNTAX_ERROR; - if (yysyntax_error_status == 0) - yymsgp = yymsg; - else if (yysyntax_error_status == 1) - { - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = YY_CAST (char *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc))); - if (!yymsg) - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - yysyntax_error_status = 2; - } - else - { - yysyntax_error_status = YYSYNTAX_ERROR; - yymsgp = yymsg; - } - } - yyerror (&yylloc, state, yymsgp); - if (yysyntax_error_status == 2) - goto yyexhaustedlab; - } -# undef YYSYNTAX_ERROR -#endif - } - - yyerror_range[1] = yylloc; - - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval, &yylloc, state); - yychar = YYEMPTY; - } - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - /* Pacify compilers when the user code never invokes YYERROR and the - label yyerrorlab therefore never appears in user code. */ - if (0) - YYERROR; - - /* Do not reclaim the symbols of the rule whose action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (!yypact_value_is_default (yyn)) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - yyerror_range[1] = *yylsp; - yydestruct ("Error: popping", - yystos[yystate], yyvsp, yylsp, state); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - - yyerror_range[2] = yylloc; - /* Using YYLLOC is tempting, but would change the location of - the lookahead. YYLOC is available though. */ - YYLLOC_DEFAULT (yyloc, yyerror_range, 2); - *++yylsp = yyloc; - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - - -#if !defined yyoverflow || YYERROR_VERBOSE -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (&yylloc, state, YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - - -/*-----------------------------------------------------. -| yyreturn -- parsing is finished, return the result. | -`-----------------------------------------------------*/ -yyreturn: - if (yychar != YYEMPTY) - { - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = YYTRANSLATE (yychar); - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval, &yylloc, state); - } - /* Do not reclaim the symbols of the rule whose action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[+*yyssp], yyvsp, yylsp, state); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - return yyresult; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/glsl_parser.h b/3rdparty/glsl-optimizer/src/glsl/glsl_parser.h deleted file mode 100644 index cdaae2d00..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glsl_parser.h +++ /dev/null @@ -1,352 +0,0 @@ -/* A Bison parser, made by GNU Bison 3.5.1. */ - -/* Bison interface for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, - Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* Undocumented macros, especially those whose name start with YY_, - are private implementation details. Do not rely on them. */ - -#ifndef YY__MESA_GLSL_SRC_GLSL_GLSL_PARSER_H_INCLUDED -# define YY__MESA_GLSL_SRC_GLSL_GLSL_PARSER_H_INCLUDED -/* Debug traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int _mesa_glsl_debug; -#endif - -/* Token type. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - enum yytokentype - { - ATTRIBUTE = 258, - CONST_TOK = 259, - BOOL_TOK = 260, - FLOAT_TOK = 261, - INT_TOK = 262, - UINT_TOK = 263, - BREAK = 264, - CONTINUE = 265, - DO = 266, - ELSE = 267, - FOR = 268, - IF = 269, - DISCARD = 270, - RETURN = 271, - SWITCH = 272, - CASE = 273, - DEFAULT = 274, - BVEC2 = 275, - BVEC3 = 276, - BVEC4 = 277, - IVEC2 = 278, - IVEC3 = 279, - IVEC4 = 280, - UVEC2 = 281, - UVEC3 = 282, - UVEC4 = 283, - VEC2 = 284, - VEC3 = 285, - VEC4 = 286, - CENTROID = 287, - IN_TOK = 288, - OUT_TOK = 289, - INOUT_TOK = 290, - UNIFORM = 291, - VARYING = 292, - SAMPLE = 293, - NOPERSPECTIVE = 294, - FLAT = 295, - SMOOTH = 296, - MAT2X2 = 297, - MAT2X3 = 298, - MAT2X4 = 299, - MAT3X2 = 300, - MAT3X3 = 301, - MAT3X4 = 302, - MAT4X2 = 303, - MAT4X3 = 304, - MAT4X4 = 305, - SAMPLER1D = 306, - SAMPLER2D = 307, - SAMPLER3D = 308, - SAMPLERCUBE = 309, - SAMPLER1DSHADOW = 310, - SAMPLER2DSHADOW = 311, - SAMPLERCUBESHADOW = 312, - SAMPLER1DARRAY = 313, - SAMPLER2DARRAY = 314, - SAMPLER1DARRAYSHADOW = 315, - SAMPLER2DARRAYSHADOW = 316, - SAMPLERCUBEARRAY = 317, - SAMPLERCUBEARRAYSHADOW = 318, - ISAMPLER1D = 319, - ISAMPLER2D = 320, - ISAMPLER3D = 321, - ISAMPLERCUBE = 322, - ISAMPLER1DARRAY = 323, - ISAMPLER2DARRAY = 324, - ISAMPLERCUBEARRAY = 325, - USAMPLER1D = 326, - USAMPLER2D = 327, - USAMPLER3D = 328, - USAMPLERCUBE = 329, - USAMPLER1DARRAY = 330, - USAMPLER2DARRAY = 331, - USAMPLERCUBEARRAY = 332, - SAMPLER2DRECT = 333, - ISAMPLER2DRECT = 334, - USAMPLER2DRECT = 335, - SAMPLER2DRECTSHADOW = 336, - SAMPLERBUFFER = 337, - ISAMPLERBUFFER = 338, - USAMPLERBUFFER = 339, - SAMPLER2DMS = 340, - ISAMPLER2DMS = 341, - USAMPLER2DMS = 342, - SAMPLER2DMSARRAY = 343, - ISAMPLER2DMSARRAY = 344, - USAMPLER2DMSARRAY = 345, - SAMPLEREXTERNALOES = 346, - IMAGE1D = 347, - IMAGE2D = 348, - IMAGE3D = 349, - IMAGE2DRECT = 350, - IMAGECUBE = 351, - IMAGEBUFFER = 352, - IMAGE1DARRAY = 353, - IMAGE2DARRAY = 354, - IMAGECUBEARRAY = 355, - IMAGE2DMS = 356, - IMAGE2DMSARRAY = 357, - IIMAGE1D = 358, - IIMAGE2D = 359, - IIMAGE3D = 360, - IIMAGE2DRECT = 361, - IIMAGECUBE = 362, - IIMAGEBUFFER = 363, - IIMAGE1DARRAY = 364, - IIMAGE2DARRAY = 365, - IIMAGECUBEARRAY = 366, - IIMAGE2DMS = 367, - IIMAGE2DMSARRAY = 368, - UIMAGE1D = 369, - UIMAGE2D = 370, - UIMAGE3D = 371, - UIMAGE2DRECT = 372, - UIMAGECUBE = 373, - UIMAGEBUFFER = 374, - UIMAGE1DARRAY = 375, - UIMAGE2DARRAY = 376, - UIMAGECUBEARRAY = 377, - UIMAGE2DMS = 378, - UIMAGE2DMSARRAY = 379, - IMAGE1DSHADOW = 380, - IMAGE2DSHADOW = 381, - IMAGE1DARRAYSHADOW = 382, - IMAGE2DARRAYSHADOW = 383, - COHERENT = 384, - VOLATILE = 385, - RESTRICT = 386, - READONLY = 387, - WRITEONLY = 388, - ATOMIC_UINT = 389, - STRUCT = 390, - VOID_TOK = 391, - WHILE = 392, - IDENTIFIER = 393, - TYPE_IDENTIFIER = 394, - NEW_IDENTIFIER = 395, - FLOATCONSTANT = 396, - INTCONSTANT = 397, - UINTCONSTANT = 398, - BOOLCONSTANT = 399, - FIELD_SELECTION = 400, - LEFT_OP = 401, - RIGHT_OP = 402, - INC_OP = 403, - DEC_OP = 404, - LE_OP = 405, - GE_OP = 406, - EQ_OP = 407, - NE_OP = 408, - AND_OP = 409, - OR_OP = 410, - XOR_OP = 411, - MUL_ASSIGN = 412, - DIV_ASSIGN = 413, - ADD_ASSIGN = 414, - MOD_ASSIGN = 415, - LEFT_ASSIGN = 416, - RIGHT_ASSIGN = 417, - AND_ASSIGN = 418, - XOR_ASSIGN = 419, - OR_ASSIGN = 420, - SUB_ASSIGN = 421, - INVARIANT = 422, - PRECISE = 423, - LOWP = 424, - MEDIUMP = 425, - HIGHP = 426, - SUPERP = 427, - PRECISION = 428, - VERSION_TOK = 429, - EXTENSION = 430, - LINE = 431, - COLON = 432, - EOL = 433, - INTERFACE = 434, - OUTPUT = 435, - PRAGMA_DEBUG_ON = 436, - PRAGMA_DEBUG_OFF = 437, - PRAGMA_OPTIMIZE_ON = 438, - PRAGMA_OPTIMIZE_OFF = 439, - PRAGMA_INVARIANT_ALL = 440, - LAYOUT_TOK = 441, - ASM = 442, - CLASS = 443, - UNION = 444, - ENUM = 445, - TYPEDEF = 446, - TEMPLATE = 447, - THIS = 448, - PACKED_TOK = 449, - GOTO = 450, - INLINE_TOK = 451, - NOINLINE = 452, - PUBLIC_TOK = 453, - STATIC = 454, - EXTERN = 455, - EXTERNAL = 456, - LONG_TOK = 457, - SHORT_TOK = 458, - DOUBLE_TOK = 459, - HALF = 460, - FIXED_TOK = 461, - UNSIGNED = 462, - INPUT_TOK = 463, - HVEC2 = 464, - HVEC3 = 465, - HVEC4 = 466, - DVEC2 = 467, - DVEC3 = 468, - DVEC4 = 469, - FVEC2 = 470, - FVEC3 = 471, - FVEC4 = 472, - SAMPLER3DRECT = 473, - SIZEOF = 474, - CAST = 475, - NAMESPACE = 476, - USING = 477, - RESOURCE = 478, - PATCH = 479, - SUBROUTINE = 480, - ERROR_TOK = 481, - COMMON = 482, - PARTITION = 483, - ACTIVE = 484, - FILTER = 485, - ROW_MAJOR = 486, - THEN = 487 - }; -#endif - -/* Value type. */ -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -union YYSTYPE -{ -#line 99 "src/glsl/glsl_parser.yy" - - int n; - float real; - const char *identifier; - - struct ast_type_qualifier type_qualifier; - - ast_node *node; - ast_type_specifier *type_specifier; - ast_array_specifier *array_specifier; - ast_fully_specified_type *fully_specified_type; - ast_function *function; - ast_parameter_declarator *parameter_declarator; - ast_function_definition *function_definition; - ast_compound_statement *compound_statement; - ast_expression *expression; - ast_declarator_list *declarator_list; - ast_struct_specifier *struct_specifier; - ast_declaration *declaration; - ast_switch_body *switch_body; - ast_case_label *case_label; - ast_case_label_list *case_label_list; - ast_case_statement *case_statement; - ast_case_statement_list *case_statement_list; - ast_interface_block *interface_block; - - struct { - ast_node *cond; - ast_expression *rest; - } for_rest_statement; - - struct { - ast_node *then_statement; - ast_node *else_statement; - } selection_rest_statement; - -#line 327 "src/glsl/glsl_parser.h" - -}; -typedef union YYSTYPE YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define YYSTYPE_IS_DECLARED 1 -#endif - -/* Location type. */ -#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED -typedef struct YYLTYPE YYLTYPE; -struct YYLTYPE -{ - int first_line; - int first_column; - int last_line; - int last_column; -}; -# define YYLTYPE_IS_DECLARED 1 -# define YYLTYPE_IS_TRIVIAL 1 -#endif - - - -int _mesa_glsl_parse (struct _mesa_glsl_parse_state *state); - -#endif /* !YY__MESA_GLSL_SRC_GLSL_GLSL_PARSER_H_INCLUDED */ diff --git a/3rdparty/glsl-optimizer/src/glsl/glsl_parser.yy b/3rdparty/glsl-optimizer/src/glsl/glsl_parser.yy deleted file mode 100644 index f8b85c1ef..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glsl_parser.yy +++ /dev/null @@ -1,2681 +0,0 @@ -%{ -/* - * Copyright © 2008, 2009 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#include -#include -#include -#ifndef _MSC_VER -#include -#endif -#include - -#include "ast.h" -#include "glsl_parser_extras.h" -#include "glsl_types.h" -#include "main/context.h" - -#if defined(_MSC_VER) -# pragma warning(disable: 4065) // warning C4065: switch statement contains 'default' but no 'case' labels -# pragma warning(disable: 4244) // warning C4244: '=' : conversion from 'double' to 'float', possible loss of data -#endif // defined(_MSC_VER) - -#undef yyerror - -static void yyerror(YYLTYPE *loc, _mesa_glsl_parse_state *st, const char *msg) -{ - _mesa_glsl_error(loc, st, "%s", msg); -} - -static int -_mesa_glsl_lex(YYSTYPE *val, YYLTYPE *loc, _mesa_glsl_parse_state *state) -{ - return _mesa_glsl_lexer_lex(val, loc, state->scanner); -} - -static bool match_layout_qualifier(const char *s1, const char *s2, - _mesa_glsl_parse_state *state) -{ - /* From the GLSL 1.50 spec, section 4.3.8 (Layout Qualifiers): - * - * "The tokens in any layout-qualifier-id-list ... are not case - * sensitive, unless explicitly noted otherwise." - * - * The text "unless explicitly noted otherwise" appears to be - * vacuous--no desktop GLSL spec (up through GLSL 4.40) notes - * otherwise. - * - * However, the GLSL ES 3.00 spec says, in section 4.3.8 (Layout - * Qualifiers): - * - * "As for other identifiers, they are case sensitive." - * - * So we need to do a case-sensitive or a case-insensitive match, - * depending on whether we are compiling for GLSL ES. - */ - if (state->es_shader) - return strcmp(s1, s2); - else - return strcasecmp(s1, s2); -} -%} - -%expect 0 - -%pure-parser -%error-verbose - -%locations -%initial-action { - @$.first_line = 1; - @$.first_column = 1; - @$.last_line = 1; - @$.last_column = 1; - @$.source = 0; -} - -%lex-param {struct _mesa_glsl_parse_state *state} -%parse-param {struct _mesa_glsl_parse_state *state} - -%union { - int n; - float real; - const char *identifier; - - struct ast_type_qualifier type_qualifier; - - ast_node *node; - ast_type_specifier *type_specifier; - ast_array_specifier *array_specifier; - ast_fully_specified_type *fully_specified_type; - ast_function *function; - ast_parameter_declarator *parameter_declarator; - ast_function_definition *function_definition; - ast_compound_statement *compound_statement; - ast_expression *expression; - ast_declarator_list *declarator_list; - ast_struct_specifier *struct_specifier; - ast_declaration *declaration; - ast_switch_body *switch_body; - ast_case_label *case_label; - ast_case_label_list *case_label_list; - ast_case_statement *case_statement; - ast_case_statement_list *case_statement_list; - ast_interface_block *interface_block; - - struct { - ast_node *cond; - ast_expression *rest; - } for_rest_statement; - - struct { - ast_node *then_statement; - ast_node *else_statement; - } selection_rest_statement; -} - -%token ATTRIBUTE CONST_TOK BOOL_TOK FLOAT_TOK INT_TOK UINT_TOK -%token BREAK CONTINUE DO ELSE FOR IF DISCARD RETURN SWITCH CASE DEFAULT -%token BVEC2 BVEC3 BVEC4 IVEC2 IVEC3 IVEC4 UVEC2 UVEC3 UVEC4 VEC2 VEC3 VEC4 -%token CENTROID IN_TOK OUT_TOK INOUT_TOK UNIFORM VARYING SAMPLE -%token NOPERSPECTIVE FLAT SMOOTH -%token MAT2X2 MAT2X3 MAT2X4 -%token MAT3X2 MAT3X3 MAT3X4 -%token MAT4X2 MAT4X3 MAT4X4 -%token SAMPLER1D SAMPLER2D SAMPLER3D SAMPLERCUBE SAMPLER1DSHADOW SAMPLER2DSHADOW -%token SAMPLERCUBESHADOW SAMPLER1DARRAY SAMPLER2DARRAY SAMPLER1DARRAYSHADOW -%token SAMPLER2DARRAYSHADOW SAMPLERCUBEARRAY SAMPLERCUBEARRAYSHADOW -%token ISAMPLER1D ISAMPLER2D ISAMPLER3D ISAMPLERCUBE -%token ISAMPLER1DARRAY ISAMPLER2DARRAY ISAMPLERCUBEARRAY -%token USAMPLER1D USAMPLER2D USAMPLER3D USAMPLERCUBE USAMPLER1DARRAY -%token USAMPLER2DARRAY USAMPLERCUBEARRAY -%token SAMPLER2DRECT ISAMPLER2DRECT USAMPLER2DRECT SAMPLER2DRECTSHADOW -%token SAMPLERBUFFER ISAMPLERBUFFER USAMPLERBUFFER -%token SAMPLER2DMS ISAMPLER2DMS USAMPLER2DMS -%token SAMPLER2DMSARRAY ISAMPLER2DMSARRAY USAMPLER2DMSARRAY -%token SAMPLEREXTERNALOES -%token IMAGE1D IMAGE2D IMAGE3D IMAGE2DRECT IMAGECUBE IMAGEBUFFER -%token IMAGE1DARRAY IMAGE2DARRAY IMAGECUBEARRAY IMAGE2DMS IMAGE2DMSARRAY -%token IIMAGE1D IIMAGE2D IIMAGE3D IIMAGE2DRECT IIMAGECUBE IIMAGEBUFFER -%token IIMAGE1DARRAY IIMAGE2DARRAY IIMAGECUBEARRAY IIMAGE2DMS IIMAGE2DMSARRAY -%token UIMAGE1D UIMAGE2D UIMAGE3D UIMAGE2DRECT UIMAGECUBE UIMAGEBUFFER -%token UIMAGE1DARRAY UIMAGE2DARRAY UIMAGECUBEARRAY UIMAGE2DMS UIMAGE2DMSARRAY -%token IMAGE1DSHADOW IMAGE2DSHADOW IMAGE1DARRAYSHADOW IMAGE2DARRAYSHADOW -%token COHERENT VOLATILE RESTRICT READONLY WRITEONLY -%token ATOMIC_UINT -%token STRUCT VOID_TOK WHILE -%token IDENTIFIER TYPE_IDENTIFIER NEW_IDENTIFIER -%type any_identifier -%type instance_name_opt -%token FLOATCONSTANT -%token INTCONSTANT UINTCONSTANT BOOLCONSTANT -%token FIELD_SELECTION -%token LEFT_OP RIGHT_OP -%token INC_OP DEC_OP LE_OP GE_OP EQ_OP NE_OP -%token AND_OP OR_OP XOR_OP MUL_ASSIGN DIV_ASSIGN ADD_ASSIGN -%token MOD_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN XOR_ASSIGN OR_ASSIGN -%token SUB_ASSIGN -%token INVARIANT PRECISE -%token LOWP MEDIUMP HIGHP SUPERP PRECISION - -%token VERSION_TOK EXTENSION LINE COLON EOL INTERFACE OUTPUT -%token PRAGMA_DEBUG_ON PRAGMA_DEBUG_OFF -%token PRAGMA_OPTIMIZE_ON PRAGMA_OPTIMIZE_OFF -%token PRAGMA_INVARIANT_ALL -%token LAYOUT_TOK - - /* Reserved words that are not actually used in the grammar. - */ -%token ASM CLASS UNION ENUM TYPEDEF TEMPLATE THIS PACKED_TOK GOTO -%token INLINE_TOK NOINLINE PUBLIC_TOK STATIC EXTERN EXTERNAL -%token LONG_TOK SHORT_TOK DOUBLE_TOK HALF FIXED_TOK UNSIGNED INPUT_TOK -%token HVEC2 HVEC3 HVEC4 DVEC2 DVEC3 DVEC4 FVEC2 FVEC3 FVEC4 -%token SAMPLER3DRECT -%token SIZEOF CAST NAMESPACE USING -%token RESOURCE PATCH -%token SUBROUTINE - -%token ERROR_TOK - -%token COMMON PARTITION ACTIVE FILTER ROW_MAJOR - -%type variable_identifier -%type statement -%type statement_list -%type simple_statement -%type precision_qualifier -%type type_qualifier -%type auxiliary_storage_qualifier -%type storage_qualifier -%type interpolation_qualifier -%type layout_qualifier -%type layout_qualifier_id_list layout_qualifier_id -%type interface_block_layout_qualifier -%type interface_qualifier -%type type_specifier -%type type_specifier_nonarray -%type array_specifier -%type basic_type_specifier_nonarray -%type fully_specified_type -%type function_prototype -%type function_header -%type function_header_with_parameters -%type function_declarator -%type parameter_declarator -%type parameter_declaration -%type parameter_qualifier -%type parameter_direction_qualifier -%type parameter_type_specifier -%type function_definition -%type compound_statement_no_new_scope -%type compound_statement -%type statement_no_new_scope -%type expression_statement -%type expression -%type primary_expression -%type assignment_expression -%type conditional_expression -%type logical_or_expression -%type logical_xor_expression -%type logical_and_expression -%type inclusive_or_expression -%type exclusive_or_expression -%type and_expression -%type equality_expression -%type relational_expression -%type shift_expression -%type additive_expression -%type multiplicative_expression -%type unary_expression -%type constant_expression -%type integer_expression -%type postfix_expression -%type function_call_header_with_parameters -%type function_call_header_no_parameters -%type function_call_header -%type function_call_generic -%type function_call_or_method -%type function_call -%type method_call_generic -%type method_call_header_with_parameters -%type method_call_header_no_parameters -%type method_call_header -%type assignment_operator -%type unary_operator -%type function_identifier -%type external_declaration -%type init_declarator_list -%type single_declaration -%type initializer -%type initializer_list -%type declaration -%type declaration_statement -%type jump_statement -%type interface_block -%type basic_interface_block -%type struct_specifier -%type struct_declaration_list -%type struct_declaration -%type struct_declarator -%type struct_declarator_list -%type member_list -%type member_declaration -%type selection_statement -%type selection_rest_statement -%type switch_statement -%type switch_body -%type case_label_list -%type case_label -%type case_statement -%type case_statement_list -%type iteration_statement -%type condition -%type conditionopt -%type for_init_statement -%type for_rest_statement -%type integer_constant -%type layout_defaults - -%right THEN ELSE -%% - -translation_unit: - version_statement extension_statement_list - { - _mesa_glsl_initialize_types(state); - } - external_declaration_list - { - delete state->symbols; - state->symbols = new(ralloc_parent(state)) glsl_symbol_table; - _mesa_glsl_initialize_types(state); - } - ; - -version_statement: - /* blank - no #version specified: defaults are already set */ - | VERSION_TOK INTCONSTANT EOL - { - state->process_version_directive(&@2, $2, NULL); - if (state->error) { - YYERROR; - } - } - | VERSION_TOK INTCONSTANT any_identifier EOL - { - state->process_version_directive(&@2, $2, $3); - if (state->error) { - YYERROR; - } - } - ; - -pragma_statement: - PRAGMA_DEBUG_ON EOL - | PRAGMA_DEBUG_OFF EOL - | PRAGMA_OPTIMIZE_ON EOL - | PRAGMA_OPTIMIZE_OFF EOL - | PRAGMA_INVARIANT_ALL EOL - { - if (!state->is_version(120, 100)) { - _mesa_glsl_warning(& @1, state, - "pragma `invariant(all)' not supported in %s " - "(GLSL ES 1.00 or GLSL 1.20 required)", - state->get_version_string()); - } else { - state->all_invariant = true; - } - } - ; - -extension_statement_list: - - | extension_statement_list extension_statement - ; - -any_identifier: - IDENTIFIER - | TYPE_IDENTIFIER - | NEW_IDENTIFIER - ; - -extension_statement: - EXTENSION any_identifier COLON any_identifier EOL - { - if (!_mesa_glsl_process_extension($2, & @2, $4, & @4, state)) { - YYERROR; - } - } - ; - -external_declaration_list: - external_declaration - { - /* FINISHME: The NULL test is required because pragmas are set to - * FINISHME: NULL. (See production rule for external_declaration.) - */ - if ($1 != NULL) - state->translation_unit.push_tail(& $1->link); - } - | external_declaration_list external_declaration - { - /* FINISHME: The NULL test is required because pragmas are set to - * FINISHME: NULL. (See production rule for external_declaration.) - */ - if ($2 != NULL) - state->translation_unit.push_tail(& $2->link); - } - | external_declaration_list extension_statement { - if (!state->allow_extension_directive_midshader) { - _mesa_glsl_error(& @2, state, - "#extension directive is not allowed " - "in the middle of a shader"); - YYERROR; - } - } - ; - -variable_identifier: - IDENTIFIER - | NEW_IDENTIFIER - ; - -primary_expression: - variable_identifier - { - void *ctx = state; - $$ = new(ctx) ast_expression(ast_identifier, NULL, NULL, NULL); - $$->set_location(@1); - $$->primary_expression.identifier = $1; - } - | INTCONSTANT - { - void *ctx = state; - $$ = new(ctx) ast_expression(ast_int_constant, NULL, NULL, NULL); - $$->set_location(@1); - $$->primary_expression.int_constant = $1; - } - | UINTCONSTANT - { - void *ctx = state; - $$ = new(ctx) ast_expression(ast_uint_constant, NULL, NULL, NULL); - $$->set_location(@1); - $$->primary_expression.uint_constant = $1; - } - | FLOATCONSTANT - { - void *ctx = state; - $$ = new(ctx) ast_expression(ast_float_constant, NULL, NULL, NULL); - $$->set_location(@1); - $$->primary_expression.float_constant = $1; - } - | BOOLCONSTANT - { - void *ctx = state; - $$ = new(ctx) ast_expression(ast_bool_constant, NULL, NULL, NULL); - $$->set_location(@1); - $$->primary_expression.bool_constant = $1; - } - | '(' expression ')' - { - $$ = $2; - } - ; - -postfix_expression: - primary_expression - | postfix_expression '[' integer_expression ']' - { - void *ctx = state; - $$ = new(ctx) ast_expression(ast_array_index, $1, $3, NULL); - $$->set_location_range(@1, @4); - } - | function_call - { - $$ = $1; - } - | postfix_expression '.' any_identifier - { - void *ctx = state; - $$ = new(ctx) ast_expression(ast_field_selection, $1, NULL, NULL); - $$->set_location_range(@1, @3); - $$->primary_expression.identifier = $3; - } - | postfix_expression INC_OP - { - void *ctx = state; - $$ = new(ctx) ast_expression(ast_post_inc, $1, NULL, NULL); - $$->set_location_range(@1, @2); - } - | postfix_expression DEC_OP - { - void *ctx = state; - $$ = new(ctx) ast_expression(ast_post_dec, $1, NULL, NULL); - $$->set_location_range(@1, @2); - } - ; - -integer_expression: - expression - ; - -function_call: - function_call_or_method - ; - -function_call_or_method: - function_call_generic - | postfix_expression '.' method_call_generic - { - void *ctx = state; - $$ = new(ctx) ast_expression(ast_field_selection, $1, $3, NULL); - $$->set_location_range(@1, @3); - } - ; - -function_call_generic: - function_call_header_with_parameters ')' - | function_call_header_no_parameters ')' - ; - -function_call_header_no_parameters: - function_call_header VOID_TOK - | function_call_header - ; - -function_call_header_with_parameters: - function_call_header assignment_expression - { - $$ = $1; - $$->set_location(@1); - $$->expressions.push_tail(& $2->link); - } - | function_call_header_with_parameters ',' assignment_expression - { - $$ = $1; - $$->set_location(@1); - $$->expressions.push_tail(& $3->link); - } - ; - - // Grammar Note: Constructors look like functions, but lexical - // analysis recognized most of them as keywords. They are now - // recognized through "type_specifier". -function_call_header: - function_identifier '(' - ; - -function_identifier: - type_specifier - { - void *ctx = state; - $$ = new(ctx) ast_function_expression($1); - $$->set_location(@1); - } - | variable_identifier - { - void *ctx = state; - ast_expression *callee = new(ctx) ast_expression($1); - callee->set_location(@1); - $$ = new(ctx) ast_function_expression(callee); - $$->set_location(@1); - } - | FIELD_SELECTION - { - void *ctx = state; - ast_expression *callee = new(ctx) ast_expression($1); - callee->set_location(@1); - $$ = new(ctx) ast_function_expression(callee); - $$->set_location(@1); - } - ; - -method_call_generic: - method_call_header_with_parameters ')' - | method_call_header_no_parameters ')' - ; - -method_call_header_no_parameters: - method_call_header VOID_TOK - | method_call_header - ; - -method_call_header_with_parameters: - method_call_header assignment_expression - { - $$ = $1; - $$->set_location(@1); - $$->expressions.push_tail(& $2->link); - } - | method_call_header_with_parameters ',' assignment_expression - { - $$ = $1; - $$->set_location(@1); - $$->expressions.push_tail(& $3->link); - } - ; - - // Grammar Note: Constructors look like methods, but lexical - // analysis recognized most of them as keywords. They are now - // recognized through "type_specifier". -method_call_header: - variable_identifier '(' - { - void *ctx = state; - ast_expression *callee = new(ctx) ast_expression($1); - callee->set_location(@1); - $$ = new(ctx) ast_function_expression(callee); - $$->set_location(@1); - } - ; - - // Grammar Note: No traditional style type casts. -unary_expression: - postfix_expression - | INC_OP unary_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression(ast_pre_inc, $2, NULL, NULL); - $$->set_location(@1); - } - | DEC_OP unary_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression(ast_pre_dec, $2, NULL, NULL); - $$->set_location(@1); - } - | unary_operator unary_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression($1, $2, NULL, NULL); - $$->set_location_range(@1, @2); - } - ; - - // Grammar Note: No '*' or '&' unary ops. Pointers are not supported. -unary_operator: - '+' { $$ = ast_plus; } - | '-' { $$ = ast_neg; } - | '!' { $$ = ast_logic_not; } - | '~' { $$ = ast_bit_not; } - ; - -multiplicative_expression: - unary_expression - | multiplicative_expression '*' unary_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_mul, $1, $3); - $$->set_location_range(@1, @3); - } - | multiplicative_expression '/' unary_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_div, $1, $3); - $$->set_location_range(@1, @3); - } - | multiplicative_expression '%' unary_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_mod, $1, $3); - $$->set_location_range(@1, @3); - } - ; - -additive_expression: - multiplicative_expression - | additive_expression '+' multiplicative_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_add, $1, $3); - $$->set_location_range(@1, @3); - } - | additive_expression '-' multiplicative_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_sub, $1, $3); - $$->set_location_range(@1, @3); - } - ; - -shift_expression: - additive_expression - | shift_expression LEFT_OP additive_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_lshift, $1, $3); - $$->set_location_range(@1, @3); - } - | shift_expression RIGHT_OP additive_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_rshift, $1, $3); - $$->set_location_range(@1, @3); - } - ; - -relational_expression: - shift_expression - | relational_expression '<' shift_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_less, $1, $3); - $$->set_location_range(@1, @3); - } - | relational_expression '>' shift_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_greater, $1, $3); - $$->set_location_range(@1, @3); - } - | relational_expression LE_OP shift_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_lequal, $1, $3); - $$->set_location_range(@1, @3); - } - | relational_expression GE_OP shift_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_gequal, $1, $3); - $$->set_location_range(@1, @3); - } - ; - -equality_expression: - relational_expression - | equality_expression EQ_OP relational_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_equal, $1, $3); - $$->set_location_range(@1, @3); - } - | equality_expression NE_OP relational_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_nequal, $1, $3); - $$->set_location_range(@1, @3); - } - ; - -and_expression: - equality_expression - | and_expression '&' equality_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_bit_and, $1, $3); - $$->set_location_range(@1, @3); - } - ; - -exclusive_or_expression: - and_expression - | exclusive_or_expression '^' and_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_bit_xor, $1, $3); - $$->set_location_range(@1, @3); - } - ; - -inclusive_or_expression: - exclusive_or_expression - | inclusive_or_expression '|' exclusive_or_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_bit_or, $1, $3); - $$->set_location_range(@1, @3); - } - ; - -logical_and_expression: - inclusive_or_expression - | logical_and_expression AND_OP inclusive_or_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_logic_and, $1, $3); - $$->set_location_range(@1, @3); - } - ; - -logical_xor_expression: - logical_and_expression - | logical_xor_expression XOR_OP logical_and_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_logic_xor, $1, $3); - $$->set_location_range(@1, @3); - } - ; - -logical_or_expression: - logical_xor_expression - | logical_or_expression OR_OP logical_xor_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression_bin(ast_logic_or, $1, $3); - $$->set_location_range(@1, @3); - } - ; - -conditional_expression: - logical_or_expression - | logical_or_expression '?' expression ':' assignment_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression(ast_conditional, $1, $3, $5); - $$->set_location_range(@1, @5); - } - ; - -assignment_expression: - conditional_expression - | unary_expression assignment_operator assignment_expression - { - void *ctx = state; - $$ = new(ctx) ast_expression($2, $1, $3, NULL); - $$->set_location_range(@1, @3); - } - ; - -assignment_operator: - '=' { $$ = ast_assign; } - | MUL_ASSIGN { $$ = ast_mul_assign; } - | DIV_ASSIGN { $$ = ast_div_assign; } - | MOD_ASSIGN { $$ = ast_mod_assign; } - | ADD_ASSIGN { $$ = ast_add_assign; } - | SUB_ASSIGN { $$ = ast_sub_assign; } - | LEFT_ASSIGN { $$ = ast_ls_assign; } - | RIGHT_ASSIGN { $$ = ast_rs_assign; } - | AND_ASSIGN { $$ = ast_and_assign; } - | XOR_ASSIGN { $$ = ast_xor_assign; } - | OR_ASSIGN { $$ = ast_or_assign; } - ; - -expression: - assignment_expression - { - $$ = $1; - } - | expression ',' assignment_expression - { - void *ctx = state; - if ($1->oper != ast_sequence) { - $$ = new(ctx) ast_expression(ast_sequence, NULL, NULL, NULL); - $$->set_location_range(@1, @3); - $$->expressions.push_tail(& $1->link); - } else { - $$ = $1; - } - - $$->expressions.push_tail(& $3->link); - } - ; - -constant_expression: - conditional_expression - ; - -declaration: - function_prototype ';' - { - state->symbols->pop_scope(); - $$ = $1; - } - | init_declarator_list ';' - { - $$ = $1; - } - | PRECISION precision_qualifier type_specifier ';' - { - $3->default_precision = $2; - $$ = $3; - } - | interface_block - { - $$ = $1; - } - ; - -function_prototype: - function_declarator ')' - ; - -function_declarator: - function_header - | function_header_with_parameters - ; - -function_header_with_parameters: - function_header parameter_declaration - { - $$ = $1; - $$->parameters.push_tail(& $2->link); - } - | function_header_with_parameters ',' parameter_declaration - { - $$ = $1; - $$->parameters.push_tail(& $3->link); - } - ; - -function_header: - fully_specified_type variable_identifier '(' - { - void *ctx = state; - $$ = new(ctx) ast_function(); - $$->set_location(@2); - $$->return_type = $1; - $$->identifier = $2; - - state->symbols->add_function(new(state) ir_function($2)); - state->symbols->push_scope(); - } - ; - -parameter_declarator: - type_specifier any_identifier - { - void *ctx = state; - $$ = new(ctx) ast_parameter_declarator(); - $$->set_location_range(@1, @2); - $$->type = new(ctx) ast_fully_specified_type(); - $$->type->set_location(@1); - $$->type->specifier = $1; - $$->identifier = $2; - } - | type_specifier any_identifier array_specifier - { - void *ctx = state; - $$ = new(ctx) ast_parameter_declarator(); - $$->set_location_range(@1, @3); - $$->type = new(ctx) ast_fully_specified_type(); - $$->type->set_location(@1); - $$->type->specifier = $1; - $$->identifier = $2; - $$->array_specifier = $3; - } - ; - -parameter_declaration: - parameter_qualifier parameter_declarator - { - $$ = $2; - $$->type->qualifier = $1; - } - | parameter_qualifier parameter_type_specifier - { - void *ctx = state; - $$ = new(ctx) ast_parameter_declarator(); - $$->set_location(@2); - $$->type = new(ctx) ast_fully_specified_type(); - $$->type->set_location_range(@1, @2); - $$->type->qualifier = $1; - $$->type->specifier = $2; - } - ; - -parameter_qualifier: - /* empty */ - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - } - | CONST_TOK parameter_qualifier - { - if ($2.flags.q.constant) - _mesa_glsl_error(&@1, state, "duplicate const qualifier"); - - $$ = $2; - $$.flags.q.constant = 1; - } - | PRECISE parameter_qualifier - { - if ($2.flags.q.precise) - _mesa_glsl_error(&@1, state, "duplicate precise qualifier"); - - $$ = $2; - $$.flags.q.precise = 1; - } - | parameter_direction_qualifier parameter_qualifier - { - if (($1.flags.q.in || $1.flags.q.out) && ($2.flags.q.in || $2.flags.q.out)) - _mesa_glsl_error(&@1, state, "duplicate in/out/inout qualifier"); - - if (!state->ARB_shading_language_420pack_enable && $2.flags.q.constant) - _mesa_glsl_error(&@1, state, "in/out/inout must come after const " - "or precise"); - - $$ = $1; - $$.merge_qualifier(&@1, state, $2); - } - | precision_qualifier parameter_qualifier - { - if ($2.precision != ast_precision_none) - _mesa_glsl_error(&@1, state, "duplicate precision qualifier"); - - if (!state->ARB_shading_language_420pack_enable && $2.flags.i != 0) - _mesa_glsl_error(&@1, state, "precision qualifiers must come last"); - - $$ = $2; - $$.precision = $1; - } - -parameter_direction_qualifier: - IN_TOK - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.in = 1; - } - | OUT_TOK - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.out = 1; - } - | INOUT_TOK - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.in = 1; - $$.flags.q.out = 1; - } - ; - -parameter_type_specifier: - type_specifier - ; - -init_declarator_list: - - single_declaration - | init_declarator_list ',' any_identifier - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration($3, NULL, NULL); - decl->set_location(@3); - - $$ = $1; - $$->declarations.push_tail(&decl->link); - state->symbols->add_variable(new(state) ir_variable(NULL, $3, ir_var_auto, glsl_precision_undefined)); - } - | init_declarator_list ',' any_identifier array_specifier - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration($3, $4, NULL); - decl->set_location_range(@3, @4); - - $$ = $1; - $$->declarations.push_tail(&decl->link); - state->symbols->add_variable(new(state) ir_variable(NULL, $3, ir_var_auto, glsl_precision_undefined)); - } - | init_declarator_list ',' any_identifier array_specifier '=' initializer - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration($3, $4, $6); - decl->set_location_range(@3, @4); - - $$ = $1; - $$->declarations.push_tail(&decl->link); - state->symbols->add_variable(new(state) ir_variable(NULL, $3, ir_var_auto, glsl_precision_undefined)); - } - | init_declarator_list ',' any_identifier '=' initializer - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration($3, NULL, $5); - decl->set_location(@3); - - $$ = $1; - $$->declarations.push_tail(&decl->link); - state->symbols->add_variable(new(state) ir_variable(NULL, $3, ir_var_auto, glsl_precision_undefined)); - } - ; - - // Grammar Note: No 'enum', or 'typedef'. -single_declaration: - fully_specified_type - { - void *ctx = state; - /* Empty declaration list is valid. */ - $$ = new(ctx) ast_declarator_list($1); - $$->set_location(@1); - } - | fully_specified_type any_identifier - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration($2, NULL, NULL); - decl->set_location(@2); - - $$ = new(ctx) ast_declarator_list($1); - $$->set_location_range(@1, @2); - $$->declarations.push_tail(&decl->link); - } - | fully_specified_type any_identifier array_specifier - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration($2, $3, NULL); - decl->set_location_range(@2, @3); - - $$ = new(ctx) ast_declarator_list($1); - $$->set_location_range(@1, @3); - $$->declarations.push_tail(&decl->link); - } - | fully_specified_type any_identifier array_specifier '=' initializer - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration($2, $3, $5); - decl->set_location_range(@2, @3); - - $$ = new(ctx) ast_declarator_list($1); - $$->set_location_range(@1, @3); - $$->declarations.push_tail(&decl->link); - } - | fully_specified_type any_identifier '=' initializer - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration($2, NULL, $4); - decl->set_location(@2); - - $$ = new(ctx) ast_declarator_list($1); - $$->set_location_range(@1, @2); - $$->declarations.push_tail(&decl->link); - } - | INVARIANT variable_identifier - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration($2, NULL, NULL); - decl->set_location(@2); - - $$ = new(ctx) ast_declarator_list(NULL); - $$->set_location_range(@1, @2); - $$->invariant = true; - - $$->declarations.push_tail(&decl->link); - } - | PRECISE variable_identifier - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration($2, NULL, NULL); - decl->set_location(@2); - - $$ = new(ctx) ast_declarator_list(NULL); - $$->set_location_range(@1, @2); - $$->precise = true; - - $$->declarations.push_tail(&decl->link); - } - ; - -fully_specified_type: - type_specifier - { - void *ctx = state; - $$ = new(ctx) ast_fully_specified_type(); - $$->set_location(@1); - $$->specifier = $1; - } - | type_qualifier type_specifier - { - void *ctx = state; - $$ = new(ctx) ast_fully_specified_type(); - $$->set_location_range(@1, @2); - $$->qualifier = $1; - $$->specifier = $2; - } - ; - -layout_qualifier: - LAYOUT_TOK '(' layout_qualifier_id_list ')' - { - $$ = $3; - } - ; - -layout_qualifier_id_list: - layout_qualifier_id - | layout_qualifier_id_list ',' layout_qualifier_id - { - $$ = $1; - if (!$$.merge_qualifier(& @3, state, $3)) { - YYERROR; - } - } - ; - -integer_constant: - INTCONSTANT { $$ = $1; } - | UINTCONSTANT { $$ = $1; } - ; - -layout_qualifier_id: - any_identifier - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - - /* Layout qualifiers for ARB_fragment_coord_conventions. */ - if (!$$.flags.i && (state->ARB_fragment_coord_conventions_enable || - state->is_version(150, 0))) { - if (match_layout_qualifier($1, "origin_upper_left", state) == 0) { - $$.flags.q.origin_upper_left = 1; - } else if (match_layout_qualifier($1, "pixel_center_integer", - state) == 0) { - $$.flags.q.pixel_center_integer = 1; - } - - if ($$.flags.i && state->ARB_fragment_coord_conventions_warn) { - _mesa_glsl_warning(& @1, state, - "GL_ARB_fragment_coord_conventions layout " - "identifier `%s' used", $1); - } - } - - /* Layout qualifiers for AMD/ARB_conservative_depth. */ - if (!$$.flags.i && - (state->AMD_conservative_depth_enable || - state->ARB_conservative_depth_enable)) { - if (match_layout_qualifier($1, "depth_any", state) == 0) { - $$.flags.q.depth_any = 1; - } else if (match_layout_qualifier($1, "depth_greater", state) == 0) { - $$.flags.q.depth_greater = 1; - } else if (match_layout_qualifier($1, "depth_less", state) == 0) { - $$.flags.q.depth_less = 1; - } else if (match_layout_qualifier($1, "depth_unchanged", - state) == 0) { - $$.flags.q.depth_unchanged = 1; - } - - if ($$.flags.i && state->AMD_conservative_depth_warn) { - _mesa_glsl_warning(& @1, state, - "GL_AMD_conservative_depth " - "layout qualifier `%s' is used", $1); - } - if ($$.flags.i && state->ARB_conservative_depth_warn) { - _mesa_glsl_warning(& @1, state, - "GL_ARB_conservative_depth " - "layout qualifier `%s' is used", $1); - } - } - - /* See also interface_block_layout_qualifier. */ - if (!$$.flags.i && state->has_uniform_buffer_objects()) { - if (match_layout_qualifier($1, "std140", state) == 0) { - $$.flags.q.std140 = 1; - } else if (match_layout_qualifier($1, "shared", state) == 0) { - $$.flags.q.shared = 1; - } else if (match_layout_qualifier($1, "column_major", state) == 0) { - $$.flags.q.column_major = 1; - /* "row_major" is a reserved word in GLSL 1.30+. Its token is parsed - * below in the interface_block_layout_qualifier rule. - * - * It is not a reserved word in GLSL ES 3.00, so it's handled here as - * an identifier. - * - * Also, this takes care of alternate capitalizations of - * "row_major" (which is necessary because layout qualifiers - * are case-insensitive in desktop GLSL). - */ - } else if (match_layout_qualifier($1, "row_major", state) == 0) { - $$.flags.q.row_major = 1; - /* "packed" is a reserved word in GLSL, and its token is - * parsed below in the interface_block_layout_qualifier rule. - * However, we must take care of alternate capitalizations of - * "packed", because layout qualifiers are case-insensitive - * in desktop GLSL. - */ - } else if (match_layout_qualifier($1, "packed", state) == 0) { - $$.flags.q.packed = 1; - } - - if ($$.flags.i && state->ARB_uniform_buffer_object_warn) { - _mesa_glsl_warning(& @1, state, - "#version 140 / GL_ARB_uniform_buffer_object " - "layout qualifier `%s' is used", $1); - } - } - - /* Layout qualifiers for GLSL 1.50 geometry shaders. */ - if (!$$.flags.i) { - static const struct { - const char *s; - GLenum e; - } map[] = { - { "points", GL_POINTS }, - { "lines", GL_LINES }, - { "lines_adjacency", GL_LINES_ADJACENCY }, - { "line_strip", GL_LINE_STRIP }, - { "triangles", GL_TRIANGLES }, - { "triangles_adjacency", GL_TRIANGLES_ADJACENCY }, - { "triangle_strip", GL_TRIANGLE_STRIP }, - }; - for (unsigned i = 0; i < Elements(map); i++) { - if (match_layout_qualifier($1, map[i].s, state) == 0) { - $$.flags.q.prim_type = 1; - $$.prim_type = map[i].e; - break; - } - } - - if ($$.flags.i && !state->is_version(150, 0)) { - _mesa_glsl_error(& @1, state, "#version 150 layout " - "qualifier `%s' used", $1); - } - } - - /* Layout qualifiers for ARB_shader_image_load_store. */ - if (state->ARB_shader_image_load_store_enable || - state->is_version(420, 0)) { - if (!$$.flags.i) { - static const struct { - const char *name; - GLenum format; - glsl_base_type base_type; - } map[] = { - { "rgba32f", GL_RGBA32F, GLSL_TYPE_FLOAT }, - { "rgba16f", GL_RGBA16F, GLSL_TYPE_FLOAT }, - { "rg32f", GL_RG32F, GLSL_TYPE_FLOAT }, - { "rg16f", GL_RG16F, GLSL_TYPE_FLOAT }, - { "r11f_g11f_b10f", GL_R11F_G11F_B10F, GLSL_TYPE_FLOAT }, - { "r32f", GL_R32F, GLSL_TYPE_FLOAT }, - { "r16f", GL_R16F, GLSL_TYPE_FLOAT }, - { "rgba32ui", GL_RGBA32UI, GLSL_TYPE_UINT }, - { "rgba16ui", GL_RGBA16UI, GLSL_TYPE_UINT }, - { "rgb10_a2ui", GL_RGB10_A2UI, GLSL_TYPE_UINT }, - { "rgba8ui", GL_RGBA8UI, GLSL_TYPE_UINT }, - { "rg32ui", GL_RG32UI, GLSL_TYPE_UINT }, - { "rg16ui", GL_RG16UI, GLSL_TYPE_UINT }, - { "rg8ui", GL_RG8UI, GLSL_TYPE_UINT }, - { "r32ui", GL_R32UI, GLSL_TYPE_UINT }, - { "r16ui", GL_R16UI, GLSL_TYPE_UINT }, - { "r8ui", GL_R8UI, GLSL_TYPE_UINT }, - { "rgba32i", GL_RGBA32I, GLSL_TYPE_INT }, - { "rgba16i", GL_RGBA16I, GLSL_TYPE_INT }, - { "rgba8i", GL_RGBA8I, GLSL_TYPE_INT }, - { "rg32i", GL_RG32I, GLSL_TYPE_INT }, - { "rg16i", GL_RG16I, GLSL_TYPE_INT }, - { "rg8i", GL_RG8I, GLSL_TYPE_INT }, - { "r32i", GL_R32I, GLSL_TYPE_INT }, - { "r16i", GL_R16I, GLSL_TYPE_INT }, - { "r8i", GL_R8I, GLSL_TYPE_INT }, - { "rgba16", GL_RGBA16, GLSL_TYPE_FLOAT }, - { "rgb10_a2", GL_RGB10_A2, GLSL_TYPE_FLOAT }, - { "rgba8", GL_RGBA8, GLSL_TYPE_FLOAT }, - { "rg16", GL_RG16, GLSL_TYPE_FLOAT }, - { "rg8", GL_RG8, GLSL_TYPE_FLOAT }, - { "r16", GL_R16, GLSL_TYPE_FLOAT }, - { "r8", GL_R8, GLSL_TYPE_FLOAT }, - { "rgba16_snorm", GL_RGBA16_SNORM, GLSL_TYPE_FLOAT }, - { "rgba8_snorm", GL_RGBA8_SNORM, GLSL_TYPE_FLOAT }, - { "rg16_snorm", GL_RG16_SNORM, GLSL_TYPE_FLOAT }, - { "rg8_snorm", GL_RG8_SNORM, GLSL_TYPE_FLOAT }, - { "r16_snorm", GL_R16_SNORM, GLSL_TYPE_FLOAT }, - { "r8_snorm", GL_R8_SNORM, GLSL_TYPE_FLOAT } - }; - - for (unsigned i = 0; i < Elements(map); i++) { - if (match_layout_qualifier($1, map[i].name, state) == 0) { - $$.flags.q.explicit_image_format = 1; - $$.image_format = map[i].format; - $$.image_base_type = map[i].base_type; - break; - } - } - } - - if (!$$.flags.i && - match_layout_qualifier($1, "early_fragment_tests", state) == 0) { - $$.flags.q.early_fragment_tests = 1; - } - } - - if (!$$.flags.i) { - _mesa_glsl_error(& @1, state, "unrecognized layout identifier " - "`%s'", $1); - YYERROR; - } - } - | any_identifier '=' integer_constant - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - - if (match_layout_qualifier("location", $1, state) == 0) { - $$.flags.q.explicit_location = 1; - - if ($$.flags.q.attribute == 1 && - state->ARB_explicit_attrib_location_warn) { - _mesa_glsl_warning(& @1, state, - "GL_ARB_explicit_attrib_location layout " - "identifier `%s' used", $1); - } - - if ($3 >= 0) { - $$.location = $3; - } else { - _mesa_glsl_error(& @3, state, "invalid location %d specified", $3); - YYERROR; - } - } - - if (match_layout_qualifier("index", $1, state) == 0) { - $$.flags.q.explicit_index = 1; - - if ($3 >= 0) { - $$.index = $3; - } else { - _mesa_glsl_error(& @3, state, "invalid index %d specified", $3); - YYERROR; - } - } - - if ((state->ARB_shading_language_420pack_enable || - state->ARB_shader_atomic_counters_enable) && - match_layout_qualifier("binding", $1, state) == 0) { - $$.flags.q.explicit_binding = 1; - $$.binding = $3; - } - - if (state->ARB_shader_atomic_counters_enable && - match_layout_qualifier("offset", $1, state) == 0) { - $$.flags.q.explicit_offset = 1; - $$.offset = $3; - } - - if (match_layout_qualifier("max_vertices", $1, state) == 0) { - $$.flags.q.max_vertices = 1; - - if ($3 < 0) { - _mesa_glsl_error(& @3, state, - "invalid max_vertices %d specified", $3); - YYERROR; - } else { - $$.max_vertices = $3; - if (!state->is_version(150, 0)) { - _mesa_glsl_error(& @3, state, - "#version 150 max_vertices qualifier " - "specified", $3); - } - } - } - - if (state->stage == MESA_SHADER_GEOMETRY) { - if (match_layout_qualifier("stream", $1, state) == 0 && - state->check_explicit_attrib_stream_allowed(& @3)) { - $$.flags.q.stream = 1; - - if ($3 < 0) { - _mesa_glsl_error(& @3, state, - "invalid stream %d specified", $3); - YYERROR; - } else { - $$.flags.q.explicit_stream = 1; - $$.stream = $3; - } - } - } - - static const char * const local_size_qualifiers[3] = { - "local_size_x", - "local_size_y", - "local_size_z", - }; - for (int i = 0; i < 3; i++) { - if (match_layout_qualifier(local_size_qualifiers[i], $1, - state) == 0) { - if ($3 <= 0) { - _mesa_glsl_error(& @3, state, - "invalid %s of %d specified", - local_size_qualifiers[i], $3); - YYERROR; - } else if (!state->is_version(430, 0) && - !state->ARB_compute_shader_enable) { - _mesa_glsl_error(& @3, state, - "%s qualifier requires GLSL 4.30 or " - "ARB_compute_shader", - local_size_qualifiers[i]); - YYERROR; - } else { - $$.flags.q.local_size |= (1 << i); - $$.local_size[i] = $3; - } - break; - } - } - - if (match_layout_qualifier("invocations", $1, state) == 0) { - $$.flags.q.invocations = 1; - - if ($3 <= 0) { - _mesa_glsl_error(& @3, state, - "invalid invocations %d specified", $3); - YYERROR; - } else if ($3 > MAX_GEOMETRY_SHADER_INVOCATIONS) { - _mesa_glsl_error(& @3, state, - "invocations (%d) exceeds " - "GL_MAX_GEOMETRY_SHADER_INVOCATIONS", $3); - YYERROR; - } else { - $$.invocations = $3; - if (!state->is_version(400, 0) && - !state->ARB_gpu_shader5_enable) { - _mesa_glsl_error(& @3, state, - "GL_ARB_gpu_shader5 invocations " - "qualifier specified", $3); - } - } - } - - /* If the identifier didn't match any known layout identifiers, - * emit an error. - */ - if (!$$.flags.i) { - _mesa_glsl_error(& @1, state, "unrecognized layout identifier " - "`%s'", $1); - YYERROR; - } - } - | interface_block_layout_qualifier - { - $$ = $1; - /* Layout qualifiers for ARB_uniform_buffer_object. */ - if ($$.flags.q.uniform && !state->has_uniform_buffer_objects()) { - _mesa_glsl_error(& @1, state, - "#version 140 / GL_ARB_uniform_buffer_object " - "layout qualifier `%s' is used", $1); - } else if ($$.flags.q.uniform && state->ARB_uniform_buffer_object_warn) { - _mesa_glsl_warning(& @1, state, - "#version 140 / GL_ARB_uniform_buffer_object " - "layout qualifier `%s' is used", $1); - } - } - ; - -/* This is a separate language rule because we parse these as tokens - * (due to them being reserved keywords) instead of identifiers like - * most qualifiers. See the any_identifier path of - * layout_qualifier_id for the others. - * - * Note that since layout qualifiers are case-insensitive in desktop - * GLSL, all of these qualifiers need to be handled as identifiers as - * well (by the any_identifier path of layout_qualifier_id). - */ -interface_block_layout_qualifier: - ROW_MAJOR - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.row_major = 1; - } - | PACKED_TOK - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.packed = 1; - } - ; - -interpolation_qualifier: - SMOOTH - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.smooth = 1; - } - | FLAT - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.flat = 1; - } - | NOPERSPECTIVE - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.noperspective = 1; - } - ; - -type_qualifier: - /* Single qualifiers */ - INVARIANT - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.invariant = 1; - } - | PRECISE - { - memset(& $$, 0, sizeof($$)); - $$.flags.q.precise = 1; - } - | auxiliary_storage_qualifier - | storage_qualifier - | interpolation_qualifier - | layout_qualifier - | precision_qualifier - { - memset(&$$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.precision = $1; - } - - /* Multiple qualifiers: - * In GLSL 4.20, these can be specified in any order. In earlier versions, - * they appear in this order (see GLSL 1.50 section 4.7 & comments below): - * - * invariant interpolation auxiliary storage precision ...or... - * layout storage precision - * - * Each qualifier's rule ensures that the accumulated qualifiers on the right - * side don't contain any that must appear on the left hand side. - * For example, when processing a storage qualifier, we check that there are - * no auxiliary, interpolation, layout, invariant, or precise qualifiers to the right. - */ - | PRECISE type_qualifier - { - if ($2.flags.q.precise) - _mesa_glsl_error(&@1, state, "duplicate \"precise\" qualifier"); - - $$ = $2; - $$.flags.q.precise = 1; - } - | INVARIANT type_qualifier - { - if ($2.flags.q.invariant) - _mesa_glsl_error(&@1, state, "duplicate \"invariant\" qualifier"); - - if (!state->ARB_shading_language_420pack_enable && $2.flags.q.precise) - _mesa_glsl_error(&@1, state, - "\"invariant\" must come after \"precise\""); - - $$ = $2; - $$.flags.q.invariant = 1; - } - | interpolation_qualifier type_qualifier - { - /* Section 4.3 of the GLSL 1.40 specification states: - * "...qualified with one of these interpolation qualifiers" - * - * GLSL 1.30 claims to allow "one or more", but insists that: - * "These interpolation qualifiers may only precede the qualifiers in, - * centroid in, out, or centroid out in a declaration." - * - * ...which means that e.g. smooth can't precede smooth, so there can be - * only one after all, and the 1.40 text is a clarification, not a change. - */ - if ($2.has_interpolation()) - _mesa_glsl_error(&@1, state, "duplicate interpolation qualifier"); - - if (!state->ARB_shading_language_420pack_enable && - ($2.flags.q.precise || $2.flags.q.invariant)) { - _mesa_glsl_error(&@1, state, "interpolation qualifiers must come " - "after \"precise\" or \"invariant\""); - } - - $$ = $1; - $$.merge_qualifier(&@1, state, $2); - } - | layout_qualifier type_qualifier - { - /* In the absence of ARB_shading_language_420pack, layout qualifiers may - * appear no later than auxiliary storage qualifiers. There is no - * particularly clear spec language mandating this, but in all examples - * the layout qualifier precedes the storage qualifier. - * - * We allow combinations of layout with interpolation, invariant or - * precise qualifiers since these are useful in ARB_separate_shader_objects. - * There is no clear spec guidance on this either. - */ - if (!state->ARB_shading_language_420pack_enable && $2.has_layout()) - _mesa_glsl_error(&@1, state, "duplicate layout(...) qualifiers"); - - $$ = $1; - $$.merge_qualifier(&@1, state, $2); - } - | auxiliary_storage_qualifier type_qualifier - { - if ($2.has_auxiliary_storage()) { - _mesa_glsl_error(&@1, state, - "duplicate auxiliary storage qualifier (centroid or sample)"); - } - - if (!state->ARB_shading_language_420pack_enable && - ($2.flags.q.precise || $2.flags.q.invariant || - $2.has_interpolation() || $2.has_layout())) { - _mesa_glsl_error(&@1, state, "auxiliary storage qualifiers must come " - "just before storage qualifiers"); - } - $$ = $1; - $$.merge_qualifier(&@1, state, $2); - } - | storage_qualifier type_qualifier - { - /* Section 4.3 of the GLSL 1.20 specification states: - * "Variable declarations may have a storage qualifier specified..." - * 1.30 clarifies this to "may have one storage qualifier". - */ - if ($2.has_storage()) - _mesa_glsl_error(&@1, state, "duplicate storage qualifier"); - - if (!state->ARB_shading_language_420pack_enable && - ($2.flags.q.precise || $2.flags.q.invariant || $2.has_interpolation() || - $2.has_layout() || $2.has_auxiliary_storage())) { - _mesa_glsl_error(&@1, state, "storage qualifiers must come after " - "precise, invariant, interpolation, layout and auxiliary " - "storage qualifiers"); - } - - $$ = $1; - $$.merge_qualifier(&@1, state, $2); - } - | precision_qualifier type_qualifier - { - if ($2.precision != ast_precision_none) - _mesa_glsl_error(&@1, state, "duplicate precision qualifier"); - - if (!state->ARB_shading_language_420pack_enable && $2.flags.i != 0) - _mesa_glsl_error(&@1, state, "precision qualifiers must come last"); - - $$ = $2; - $$.precision = $1; - } - ; - -auxiliary_storage_qualifier: - CENTROID - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.centroid = 1; - } - | SAMPLE - { - memset(& $$, 0, sizeof($$)); - $$.flags.q.sample = 1; - } - /* TODO: "patch" also goes here someday. */ - -storage_qualifier: - CONST_TOK - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.constant = 1; - } - | ATTRIBUTE - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.attribute = 1; - } - | VARYING - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.varying = 1; - } - | IN_TOK - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.in = 1; - } - | OUT_TOK - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.out = 1; - } - | INOUT_TOK - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.in = 1; - $$.flags.q.out = 1; - - if (state->stage == MESA_SHADER_GEOMETRY && - state->has_explicit_attrib_stream()) { - /* Section 4.3.8.2 (Output Layout Qualifiers) of the GLSL 4.00 - * spec says: - * - * "If the block or variable is declared with the stream - * identifier, it is associated with the specified stream; - * otherwise, it is associated with the current default stream." - */ - $$.flags.q.stream = 1; - $$.flags.q.explicit_stream = 0; - $$.stream = state->out_qualifier->stream; - } - } - | UNIFORM - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.uniform = 1; - } - | COHERENT - { - memset(& $$, 0, sizeof($$)); - $$.flags.q.coherent = 1; - } - | VOLATILE - { - memset(& $$, 0, sizeof($$)); - $$.flags.q._volatile = 1; - } - | RESTRICT - { - STATIC_ASSERT(sizeof($$.flags.q) <= sizeof($$.flags.i)); - memset(& $$, 0, sizeof($$)); - $$.flags.q.restrict_flag = 1; - } - | READONLY - { - memset(& $$, 0, sizeof($$)); - $$.flags.q.read_only = 1; - } - | WRITEONLY - { - memset(& $$, 0, sizeof($$)); - $$.flags.q.write_only = 1; - } - ; - -array_specifier: - '[' ']' - { - void *ctx = state; - $$ = new(ctx) ast_array_specifier(@1); - $$->set_location_range(@1, @2); - } - | '[' constant_expression ']' - { - void *ctx = state; - $$ = new(ctx) ast_array_specifier(@1, $2); - $$->set_location_range(@1, @3); - } - | array_specifier '[' ']' - { - $$ = $1; - - if (!state->ARB_arrays_of_arrays_enable) { - _mesa_glsl_error(& @1, state, - "GL_ARB_arrays_of_arrays " - "required for defining arrays of arrays"); - } else { - _mesa_glsl_error(& @1, state, - "only the outermost array dimension can " - "be unsized"); - } - } - | array_specifier '[' constant_expression ']' - { - $$ = $1; - - if (!state->ARB_arrays_of_arrays_enable) { - _mesa_glsl_error(& @1, state, - "GL_ARB_arrays_of_arrays " - "required for defining arrays of arrays"); - } - - $$->add_dimension($3); - } - ; - -type_specifier: - type_specifier_nonarray - | type_specifier_nonarray array_specifier - { - $$ = $1; - $$->array_specifier = $2; - } - ; - -type_specifier_nonarray: - basic_type_specifier_nonarray - { - void *ctx = state; - $$ = new(ctx) ast_type_specifier($1); - $$->set_location(@1); - } - | struct_specifier - { - void *ctx = state; - $$ = new(ctx) ast_type_specifier($1); - $$->set_location(@1); - } - | TYPE_IDENTIFIER - { - void *ctx = state; - $$ = new(ctx) ast_type_specifier($1); - $$->set_location(@1); - } - ; - -basic_type_specifier_nonarray: - VOID_TOK { $$ = "void"; } - | FLOAT_TOK { $$ = "float"; } - | INT_TOK { $$ = "int"; } - | UINT_TOK { $$ = "uint"; } - | BOOL_TOK { $$ = "bool"; } - | VEC2 { $$ = "vec2"; } - | VEC3 { $$ = "vec3"; } - | VEC4 { $$ = "vec4"; } - | BVEC2 { $$ = "bvec2"; } - | BVEC3 { $$ = "bvec3"; } - | BVEC4 { $$ = "bvec4"; } - | IVEC2 { $$ = "ivec2"; } - | IVEC3 { $$ = "ivec3"; } - | IVEC4 { $$ = "ivec4"; } - | UVEC2 { $$ = "uvec2"; } - | UVEC3 { $$ = "uvec3"; } - | UVEC4 { $$ = "uvec4"; } - | MAT2X2 { $$ = "mat2"; } - | MAT2X3 { $$ = "mat2x3"; } - | MAT2X4 { $$ = "mat2x4"; } - | MAT3X2 { $$ = "mat3x2"; } - | MAT3X3 { $$ = "mat3"; } - | MAT3X4 { $$ = "mat3x4"; } - | MAT4X2 { $$ = "mat4x2"; } - | MAT4X3 { $$ = "mat4x3"; } - | MAT4X4 { $$ = "mat4"; } - | SAMPLER1D { $$ = "sampler1D"; } - | SAMPLER2D { $$ = "sampler2D"; } - | SAMPLER2DRECT { $$ = "sampler2DRect"; } - | SAMPLER3D { $$ = "sampler3D"; } - | SAMPLERCUBE { $$ = "samplerCube"; } - | SAMPLEREXTERNALOES { $$ = "samplerExternalOES"; } - | SAMPLER1DSHADOW { $$ = "sampler1DShadow"; } - | SAMPLER2DSHADOW { $$ = "sampler2DShadow"; } - | SAMPLER2DRECTSHADOW { $$ = "sampler2DRectShadow"; } - | SAMPLERCUBESHADOW { $$ = "samplerCubeShadow"; } - | SAMPLER1DARRAY { $$ = "sampler1DArray"; } - | SAMPLER2DARRAY { $$ = "sampler2DArray"; } - | SAMPLER1DARRAYSHADOW { $$ = "sampler1DArrayShadow"; } - | SAMPLER2DARRAYSHADOW { $$ = "sampler2DArrayShadow"; } - | SAMPLERBUFFER { $$ = "samplerBuffer"; } - | SAMPLERCUBEARRAY { $$ = "samplerCubeArray"; } - | SAMPLERCUBEARRAYSHADOW { $$ = "samplerCubeArrayShadow"; } - | ISAMPLER1D { $$ = "isampler1D"; } - | ISAMPLER2D { $$ = "isampler2D"; } - | ISAMPLER2DRECT { $$ = "isampler2DRect"; } - | ISAMPLER3D { $$ = "isampler3D"; } - | ISAMPLERCUBE { $$ = "isamplerCube"; } - | ISAMPLER1DARRAY { $$ = "isampler1DArray"; } - | ISAMPLER2DARRAY { $$ = "isampler2DArray"; } - | ISAMPLERBUFFER { $$ = "isamplerBuffer"; } - | ISAMPLERCUBEARRAY { $$ = "isamplerCubeArray"; } - | USAMPLER1D { $$ = "usampler1D"; } - | USAMPLER2D { $$ = "usampler2D"; } - | USAMPLER2DRECT { $$ = "usampler2DRect"; } - | USAMPLER3D { $$ = "usampler3D"; } - | USAMPLERCUBE { $$ = "usamplerCube"; } - | USAMPLER1DARRAY { $$ = "usampler1DArray"; } - | USAMPLER2DARRAY { $$ = "usampler2DArray"; } - | USAMPLERBUFFER { $$ = "usamplerBuffer"; } - | USAMPLERCUBEARRAY { $$ = "usamplerCubeArray"; } - | SAMPLER2DMS { $$ = "sampler2DMS"; } - | ISAMPLER2DMS { $$ = "isampler2DMS"; } - | USAMPLER2DMS { $$ = "usampler2DMS"; } - | SAMPLER2DMSARRAY { $$ = "sampler2DMSArray"; } - | ISAMPLER2DMSARRAY { $$ = "isampler2DMSArray"; } - | USAMPLER2DMSARRAY { $$ = "usampler2DMSArray"; } - | IMAGE1D { $$ = "image1D"; } - | IMAGE2D { $$ = "image2D"; } - | IMAGE3D { $$ = "image3D"; } - | IMAGE2DRECT { $$ = "image2DRect"; } - | IMAGECUBE { $$ = "imageCube"; } - | IMAGEBUFFER { $$ = "imageBuffer"; } - | IMAGE1DARRAY { $$ = "image1DArray"; } - | IMAGE2DARRAY { $$ = "image2DArray"; } - | IMAGECUBEARRAY { $$ = "imageCubeArray"; } - | IMAGE2DMS { $$ = "image2DMS"; } - | IMAGE2DMSARRAY { $$ = "image2DMSArray"; } - | IIMAGE1D { $$ = "iimage1D"; } - | IIMAGE2D { $$ = "iimage2D"; } - | IIMAGE3D { $$ = "iimage3D"; } - | IIMAGE2DRECT { $$ = "iimage2DRect"; } - | IIMAGECUBE { $$ = "iimageCube"; } - | IIMAGEBUFFER { $$ = "iimageBuffer"; } - | IIMAGE1DARRAY { $$ = "iimage1DArray"; } - | IIMAGE2DARRAY { $$ = "iimage2DArray"; } - | IIMAGECUBEARRAY { $$ = "iimageCubeArray"; } - | IIMAGE2DMS { $$ = "iimage2DMS"; } - | IIMAGE2DMSARRAY { $$ = "iimage2DMSArray"; } - | UIMAGE1D { $$ = "uimage1D"; } - | UIMAGE2D { $$ = "uimage2D"; } - | UIMAGE3D { $$ = "uimage3D"; } - | UIMAGE2DRECT { $$ = "uimage2DRect"; } - | UIMAGECUBE { $$ = "uimageCube"; } - | UIMAGEBUFFER { $$ = "uimageBuffer"; } - | UIMAGE1DARRAY { $$ = "uimage1DArray"; } - | UIMAGE2DARRAY { $$ = "uimage2DArray"; } - | UIMAGECUBEARRAY { $$ = "uimageCubeArray"; } - | UIMAGE2DMS { $$ = "uimage2DMS"; } - | UIMAGE2DMSARRAY { $$ = "uimage2DMSArray"; } - | ATOMIC_UINT { $$ = "atomic_uint"; } - ; - -precision_qualifier: - HIGHP - { - state->check_precision_qualifiers_allowed(&@1); - $$ = ast_precision_high; - } - | MEDIUMP - { - state->check_precision_qualifiers_allowed(&@1); - $$ = ast_precision_medium; - } - | LOWP - { - state->check_precision_qualifiers_allowed(&@1); - $$ = ast_precision_low; - } - ; - -struct_specifier: - STRUCT any_identifier '{' struct_declaration_list '}' - { - void *ctx = state; - $$ = new(ctx) ast_struct_specifier($2, $4); - $$->set_location_range(@2, @5); - state->symbols->add_type($2, glsl_type::void_type); - } - | STRUCT '{' struct_declaration_list '}' - { - void *ctx = state; - $$ = new(ctx) ast_struct_specifier(NULL, $3); - $$->set_location_range(@2, @4); - } - ; - -struct_declaration_list: - struct_declaration - { - $$ = $1; - $1->link.self_link(); - } - | struct_declaration_list struct_declaration - { - $$ = $1; - $$->link.insert_before(& $2->link); - } - ; - -struct_declaration: - fully_specified_type struct_declarator_list ';' - { - void *ctx = state; - ast_fully_specified_type *const type = $1; - type->set_location(@1); - - if (type->qualifier.flags.i != 0) - _mesa_glsl_error(&@1, state, - "only precision qualifiers may be applied to " - "structure members"); - - $$ = new(ctx) ast_declarator_list(type); - $$->set_location(@2); - - $$->declarations.push_degenerate_list_at_head(& $2->link); - } - ; - -struct_declarator_list: - struct_declarator - { - $$ = $1; - $1->link.self_link(); - } - | struct_declarator_list ',' struct_declarator - { - $$ = $1; - $$->link.insert_before(& $3->link); - } - ; - -struct_declarator: - any_identifier - { - void *ctx = state; - $$ = new(ctx) ast_declaration($1, NULL, NULL); - $$->set_location(@1); - } - | any_identifier array_specifier - { - void *ctx = state; - $$ = new(ctx) ast_declaration($1, $2, NULL); - $$->set_location_range(@1, @2); - } - ; - -initializer: - assignment_expression - | '{' initializer_list '}' - { - $$ = $2; - } - | '{' initializer_list ',' '}' - { - $$ = $2; - } - ; - -initializer_list: - initializer - { - void *ctx = state; - $$ = new(ctx) ast_aggregate_initializer(); - $$->set_location(@1); - $$->expressions.push_tail(& $1->link); - } - | initializer_list ',' initializer - { - $1->expressions.push_tail(& $3->link); - } - ; - -declaration_statement: - declaration - ; - - // Grammar Note: labeled statements for SWITCH only; 'goto' is not - // supported. -statement: - compound_statement { $$ = (ast_node *) $1; } - | simple_statement - ; - -simple_statement: - declaration_statement - | expression_statement - | selection_statement - | switch_statement - | iteration_statement - | jump_statement - ; - -compound_statement: - '{' '}' - { - void *ctx = state; - $$ = new(ctx) ast_compound_statement(true, NULL); - $$->set_location_range(@1, @2); - } - | '{' - { - state->symbols->push_scope(); - } - statement_list '}' - { - void *ctx = state; - $$ = new(ctx) ast_compound_statement(true, $3); - $$->set_location_range(@1, @4); - state->symbols->pop_scope(); - } - ; - -statement_no_new_scope: - compound_statement_no_new_scope { $$ = (ast_node *) $1; } - | simple_statement - ; - -compound_statement_no_new_scope: - '{' '}' - { - void *ctx = state; - $$ = new(ctx) ast_compound_statement(false, NULL); - $$->set_location_range(@1, @2); - } - | '{' statement_list '}' - { - void *ctx = state; - $$ = new(ctx) ast_compound_statement(false, $2); - $$->set_location_range(@1, @3); - } - ; - -statement_list: - statement - { - if ($1 == NULL) { - _mesa_glsl_error(& @1, state, " statement"); - assert($1 != NULL); - } - - $$ = $1; - $$->link.self_link(); - } - | statement_list statement - { - if ($2 == NULL) { - _mesa_glsl_error(& @2, state, " statement"); - assert($2 != NULL); - } - $$ = $1; - $$->link.insert_before(& $2->link); - } - ; - -expression_statement: - ';' - { - void *ctx = state; - $$ = new(ctx) ast_expression_statement(NULL); - $$->set_location(@1); - } - | expression ';' - { - void *ctx = state; - $$ = new(ctx) ast_expression_statement($1); - $$->set_location(@1); - } - ; - -selection_statement: - IF '(' expression ')' selection_rest_statement - { - $$ = new(state) ast_selection_statement($3, $5.then_statement, - $5.else_statement); - $$->set_location_range(@1, @5); - } - ; - -selection_rest_statement: - statement ELSE statement - { - $$.then_statement = $1; - $$.else_statement = $3; - } - | statement %prec THEN - { - $$.then_statement = $1; - $$.else_statement = NULL; - } - ; - -condition: - expression - { - $$ = (ast_node *) $1; - } - | fully_specified_type any_identifier '=' initializer - { - void *ctx = state; - ast_declaration *decl = new(ctx) ast_declaration($2, NULL, $4); - ast_declarator_list *declarator = new(ctx) ast_declarator_list($1); - decl->set_location_range(@2, @4); - declarator->set_location(@1); - - declarator->declarations.push_tail(&decl->link); - $$ = declarator; - } - ; - -/* - * switch_statement grammar is based on the syntax described in the body - * of the GLSL spec, not in it's appendix!!! - */ -switch_statement: - SWITCH '(' expression ')' switch_body - { - $$ = new(state) ast_switch_statement($3, $5); - $$->set_location_range(@1, @5); - } - ; - -switch_body: - '{' '}' - { - $$ = new(state) ast_switch_body(NULL); - $$->set_location_range(@1, @2); - } - | '{' case_statement_list '}' - { - $$ = new(state) ast_switch_body($2); - $$->set_location_range(@1, @3); - } - ; - -case_label: - CASE expression ':' - { - $$ = new(state) ast_case_label($2); - $$->set_location(@2); - } - | DEFAULT ':' - { - $$ = new(state) ast_case_label(NULL); - $$->set_location(@2); - } - ; - -case_label_list: - case_label - { - ast_case_label_list *labels = new(state) ast_case_label_list(); - - labels->labels.push_tail(& $1->link); - $$ = labels; - $$->set_location(@1); - } - | case_label_list case_label - { - $$ = $1; - $$->labels.push_tail(& $2->link); - } - ; - -case_statement: - case_label_list statement - { - ast_case_statement *stmts = new(state) ast_case_statement($1); - stmts->set_location(@2); - - stmts->stmts.push_tail(& $2->link); - $$ = stmts; - } - | case_statement statement - { - $$ = $1; - $$->stmts.push_tail(& $2->link); - } - ; - -case_statement_list: - case_statement - { - ast_case_statement_list *cases= new(state) ast_case_statement_list(); - cases->set_location(@1); - - cases->cases.push_tail(& $1->link); - $$ = cases; - } - | case_statement_list case_statement - { - $$ = $1; - $$->cases.push_tail(& $2->link); - } - ; - -iteration_statement: - WHILE '(' condition ')' statement_no_new_scope - { - void *ctx = state; - $$ = new(ctx) ast_iteration_statement(ast_iteration_statement::ast_while, - NULL, $3, NULL, $5); - $$->set_location_range(@1, @4); - } - | DO statement WHILE '(' expression ')' ';' - { - void *ctx = state; - $$ = new(ctx) ast_iteration_statement(ast_iteration_statement::ast_do_while, - NULL, $5, NULL, $2); - $$->set_location_range(@1, @6); - } - | FOR '(' for_init_statement for_rest_statement ')' statement_no_new_scope - { - void *ctx = state; - $$ = new(ctx) ast_iteration_statement(ast_iteration_statement::ast_for, - $3, $4.cond, $4.rest, $6); - $$->set_location_range(@1, @6); - } - ; - -for_init_statement: - expression_statement - | declaration_statement - ; - -conditionopt: - condition - | /* empty */ - { - $$ = NULL; - } - ; - -for_rest_statement: - conditionopt ';' - { - $$.cond = $1; - $$.rest = NULL; - } - | conditionopt ';' expression - { - $$.cond = $1; - $$.rest = $3; - } - ; - - // Grammar Note: No 'goto'. Gotos are not supported. -jump_statement: - CONTINUE ';' - { - void *ctx = state; - $$ = new(ctx) ast_jump_statement(ast_jump_statement::ast_continue, NULL); - $$->set_location(@1); - } - | BREAK ';' - { - void *ctx = state; - $$ = new(ctx) ast_jump_statement(ast_jump_statement::ast_break, NULL); - $$->set_location(@1); - } - | RETURN ';' - { - void *ctx = state; - $$ = new(ctx) ast_jump_statement(ast_jump_statement::ast_return, NULL); - $$->set_location(@1); - } - | RETURN expression ';' - { - void *ctx = state; - $$ = new(ctx) ast_jump_statement(ast_jump_statement::ast_return, $2); - $$->set_location_range(@1, @2); - } - | DISCARD ';' // Fragment shader only. - { - void *ctx = state; - $$ = new(ctx) ast_jump_statement(ast_jump_statement::ast_discard, NULL); - $$->set_location(@1); - } - ; - -external_declaration: - function_definition { $$ = $1; } - | declaration { $$ = $1; } - | pragma_statement { $$ = NULL; } - | layout_defaults { $$ = $1; } - ; - -function_definition: - function_prototype compound_statement_no_new_scope - { - void *ctx = state; - $$ = new(ctx) ast_function_definition(); - $$->set_location_range(@1, @2); - $$->prototype = $1; - $$->body = $2; - - state->symbols->pop_scope(); - } - ; - -/* layout_qualifieropt is packed into this rule */ -interface_block: - basic_interface_block - { - $$ = $1; - } - | layout_qualifier basic_interface_block - { - ast_interface_block *block = $2; - if (!block->layout.merge_qualifier(& @1, state, $1)) { - YYERROR; - } - - foreach_list_typed (ast_declarator_list, member, link, &block->declarations) { - ast_type_qualifier& qualifier = member->type->qualifier; - if (qualifier.flags.q.stream && qualifier.stream != block->layout.stream) { - _mesa_glsl_error(& @1, state, - "stream layout qualifier on " - "interface block member does not match " - "the interface block (%d vs %d)", - qualifier.stream, block->layout.stream); - YYERROR; - } - } - $$ = block; - } - ; - -basic_interface_block: - interface_qualifier NEW_IDENTIFIER '{' member_list '}' instance_name_opt ';' - { - ast_interface_block *const block = $6; - - block->block_name = $2; - block->declarations.push_degenerate_list_at_head(& $4->link); - - if ($1.flags.q.uniform) { - if (!state->has_uniform_buffer_objects()) { - _mesa_glsl_error(& @1, state, - "#version 140 / GL_ARB_uniform_buffer_object " - "required for defining uniform blocks"); - } else if (state->ARB_uniform_buffer_object_warn) { - _mesa_glsl_warning(& @1, state, - "#version 140 / GL_ARB_uniform_buffer_object " - "required for defining uniform blocks"); - } - } else { - if (state->es_shader || state->language_version < 150) { - _mesa_glsl_error(& @1, state, - "#version 150 required for using " - "interface blocks"); - } - } - - /* From the GLSL 1.50.11 spec, section 4.3.7 ("Interface Blocks"): - * "It is illegal to have an input block in a vertex shader - * or an output block in a fragment shader" - */ - if ((state->stage == MESA_SHADER_VERTEX) && $1.flags.q.in) { - _mesa_glsl_error(& @1, state, - "`in' interface block is not allowed for " - "a vertex shader"); - } else if ((state->stage == MESA_SHADER_FRAGMENT) && $1.flags.q.out) { - _mesa_glsl_error(& @1, state, - "`out' interface block is not allowed for " - "a fragment shader"); - } - - /* Since block arrays require names, and both features are added in - * the same language versions, we don't have to explicitly - * version-check both things. - */ - if (block->instance_name != NULL) { - state->check_version(150, 300, & @1, "interface blocks with " - "an instance name are not allowed"); - } - - uint64_t interface_type_mask; - struct ast_type_qualifier temp_type_qualifier; - - /* Get a bitmask containing only the in/out/uniform flags, allowing us - * to ignore other irrelevant flags like interpolation qualifiers. - */ - temp_type_qualifier.flags.i = 0; - temp_type_qualifier.flags.q.uniform = true; - temp_type_qualifier.flags.q.in = true; - temp_type_qualifier.flags.q.out = true; - interface_type_mask = temp_type_qualifier.flags.i; - - /* Get the block's interface qualifier. The interface_qualifier - * production rule guarantees that only one bit will be set (and - * it will be in/out/uniform). - */ - uint64_t block_interface_qualifier = $1.flags.i; - - block->layout.flags.i |= block_interface_qualifier; - - if (state->stage == MESA_SHADER_GEOMETRY && - state->has_explicit_attrib_stream()) { - /* Assign global layout's stream value. */ - block->layout.flags.q.stream = 1; - block->layout.flags.q.explicit_stream = 0; - block->layout.stream = state->out_qualifier->stream; - } - - foreach_list_typed (ast_declarator_list, member, link, &block->declarations) { - ast_type_qualifier& qualifier = member->type->qualifier; - if ((qualifier.flags.i & interface_type_mask) == 0) { - /* GLSLangSpec.1.50.11, 4.3.7 (Interface Blocks): - * "If no optional qualifier is used in a member declaration, the - * qualifier of the variable is just in, out, or uniform as declared - * by interface-qualifier." - */ - qualifier.flags.i |= block_interface_qualifier; - } else if ((qualifier.flags.i & interface_type_mask) != - block_interface_qualifier) { - /* GLSLangSpec.1.50.11, 4.3.7 (Interface Blocks): - * "If optional qualifiers are used, they can include interpolation - * and storage qualifiers and they must declare an input, output, - * or uniform variable consistent with the interface qualifier of - * the block." - */ - _mesa_glsl_error(& @1, state, - "uniform/in/out qualifier on " - "interface block member does not match " - "the interface block"); - } - } - - $$ = block; - } - ; - -interface_qualifier: - IN_TOK - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.in = 1; - } - | OUT_TOK - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.out = 1; - } - | UNIFORM - { - memset(& $$, 0, sizeof($$)); - $$.precision = ast_precision_none; - $$.flags.q.uniform = 1; - } - ; - -instance_name_opt: - /* empty */ - { - $$ = new(state) ast_interface_block(*state->default_uniform_qualifier, - NULL, NULL); - } - | NEW_IDENTIFIER - { - $$ = new(state) ast_interface_block(*state->default_uniform_qualifier, - $1, NULL); - $$->set_location(@1); - } - | NEW_IDENTIFIER array_specifier - { - $$ = new(state) ast_interface_block(*state->default_uniform_qualifier, - $1, $2); - $$->set_location_range(@1, @2); - } - ; - -member_list: - member_declaration - { - $$ = $1; - $1->link.self_link(); - } - | member_declaration member_list - { - $$ = $1; - $2->link.insert_before(& $$->link); - } - ; - -member_declaration: - fully_specified_type struct_declarator_list ';' - { - void *ctx = state; - ast_fully_specified_type *type = $1; - type->set_location(@1); - - if (type->qualifier.flags.q.attribute) { - _mesa_glsl_error(& @1, state, - "keyword 'attribute' cannot be used with " - "interface block member"); - } else if (type->qualifier.flags.q.varying) { - _mesa_glsl_error(& @1, state, - "keyword 'varying' cannot be used with " - "interface block member"); - } - - $$ = new(ctx) ast_declarator_list(type); - $$->set_location(@2); - - $$->declarations.push_degenerate_list_at_head(& $2->link); - } - ; - -layout_defaults: - layout_qualifier UNIFORM ';' - { - if (!state->default_uniform_qualifier->merge_qualifier(& @1, state, $1)) { - YYERROR; - } - $$ = NULL; - } - - | layout_qualifier IN_TOK ';' - { - $$ = NULL; - if (!state->in_qualifier->merge_in_qualifier(& @1, state, $1, $$)) { - YYERROR; - } - } - - | layout_qualifier OUT_TOK ';' - { - if (state->stage != MESA_SHADER_GEOMETRY) { - _mesa_glsl_error(& @1, state, - "out layout qualifiers only valid in " - "geometry shaders"); - } else { - if ($1.flags.q.prim_type) { - /* Make sure this is a valid output primitive type. */ - switch ($1.prim_type) { - case GL_POINTS: - case GL_LINE_STRIP: - case GL_TRIANGLE_STRIP: - break; - default: - _mesa_glsl_error(&@1, state, "invalid geometry shader output " - "primitive type"); - break; - } - } - if (!state->out_qualifier->merge_qualifier(& @1, state, $1)) - YYERROR; - - /* Allow future assigments of global out's stream id value */ - state->out_qualifier->flags.q.explicit_stream = 0; - } - $$ = NULL; - } diff --git a/3rdparty/glsl-optimizer/src/glsl/glsl_parser_extras.cpp b/3rdparty/glsl-optimizer/src/glsl/glsl_parser_extras.cpp deleted file mode 100644 index b759ead6d..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glsl_parser_extras.cpp +++ /dev/null @@ -1,1680 +0,0 @@ -/* - * Copyright © 2008, 2009 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#include -#include -#include -#include - -extern "C" { -#include "main/core.h" /* for struct gl_context */ -#include "main/context.h" -} - -#include "util/ralloc.h" -#include "ast.h" -#include "glsl_parser_extras.h" -#include "glsl_parser.h" -#include "ir_optimization.h" -#include "loop_analysis.h" -#include "standalone_scaffolding.h" - -/** - * Format a short human-readable description of the given GLSL version. - */ -const char * -glsl_compute_version_string(void *mem_ctx, bool is_es, unsigned version) -{ - return ralloc_asprintf(mem_ctx, "GLSL%s %d.%02d", is_es ? " ES" : "", - version / 100, version % 100); -} - - -static const unsigned known_desktop_glsl_versions[] = - { 110, 120, 130, 140, 150, 330, 400, 410, 420, 430, 440 }; - - -_mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx, - gl_shader_stage stage, - void *mem_ctx) - : ctx(_ctx), cs_input_local_size_specified(false), cs_input_local_size(), - switch_state() -{ - assert(stage < MESA_SHADER_STAGES); - this->stage = stage; - - this->scanner = NULL; - this->translation_unit.make_empty(); - this->symbols = new(mem_ctx) glsl_symbol_table; - - this->info_log = ralloc_strdup(mem_ctx, ""); - this->error = false; - this->loop_nesting_ast = NULL; - - this->struct_specifier_depth = 0; - - this->uses_builtin_functions = false; - - /* Set default language version and extensions */ - this->language_version = ctx->Const.ForceGLSLVersion ? - ctx->Const.ForceGLSLVersion : 110; - this->es_shader = false; - this->metal_target = false; - this->had_version_string = false; - this->had_float_precision = false; - this->ARB_texture_rectangle_enable = true; - - /* OpenGL ES 2.0 has different defaults from desktop GL. */ - if (ctx->API == API_OPENGLES2) { - this->language_version = 100; - this->es_shader = true; - this->ARB_texture_rectangle_enable = false; - } - - this->extensions = &ctx->Extensions; - - this->Const.MaxLights = ctx->Const.MaxLights; - this->Const.MaxClipPlanes = ctx->Const.MaxClipPlanes; - this->Const.MaxTextureUnits = ctx->Const.MaxTextureUnits; - this->Const.MaxTextureCoords = ctx->Const.MaxTextureCoordUnits; - this->Const.MaxVertexAttribs = ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs; - this->Const.MaxVertexUniformComponents = ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents; - this->Const.MaxVertexTextureImageUnits = ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits; - this->Const.MaxCombinedTextureImageUnits = ctx->Const.MaxCombinedTextureImageUnits; - this->Const.MaxTextureImageUnits = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits; - this->Const.MaxFragmentUniformComponents = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents; - this->Const.MinProgramTexelOffset = ctx->Const.MinProgramTexelOffset; - this->Const.MaxProgramTexelOffset = ctx->Const.MaxProgramTexelOffset; - - this->Const.MaxDrawBuffers = ctx->Const.MaxDrawBuffers; - - /* 1.50 constants */ - this->Const.MaxVertexOutputComponents = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents; - this->Const.MaxGeometryInputComponents = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxInputComponents; - this->Const.MaxGeometryOutputComponents = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxOutputComponents; - this->Const.MaxFragmentInputComponents = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents; - this->Const.MaxGeometryTextureImageUnits = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits; - this->Const.MaxGeometryOutputVertices = ctx->Const.MaxGeometryOutputVertices; - this->Const.MaxGeometryTotalOutputComponents = ctx->Const.MaxGeometryTotalOutputComponents; - this->Const.MaxGeometryUniformComponents = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxUniformComponents; - - this->Const.MaxVertexAtomicCounters = ctx->Const.Program[MESA_SHADER_VERTEX].MaxAtomicCounters; - this->Const.MaxGeometryAtomicCounters = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxAtomicCounters; - this->Const.MaxFragmentAtomicCounters = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters; - this->Const.MaxCombinedAtomicCounters = ctx->Const.MaxCombinedAtomicCounters; - this->Const.MaxAtomicBufferBindings = ctx->Const.MaxAtomicBufferBindings; - - /* Compute shader constants */ - for (unsigned i = 0; i < Elements(this->Const.MaxComputeWorkGroupCount); i++) - this->Const.MaxComputeWorkGroupCount[i] = ctx->Const.MaxComputeWorkGroupCount[i]; - for (unsigned i = 0; i < Elements(this->Const.MaxComputeWorkGroupSize); i++) - this->Const.MaxComputeWorkGroupSize[i] = ctx->Const.MaxComputeWorkGroupSize[i]; - - this->Const.MaxImageUnits = ctx->Const.MaxImageUnits; - this->Const.MaxCombinedImageUnitsAndFragmentOutputs = ctx->Const.MaxCombinedImageUnitsAndFragmentOutputs; - this->Const.MaxImageSamples = ctx->Const.MaxImageSamples; - this->Const.MaxVertexImageUniforms = ctx->Const.Program[MESA_SHADER_VERTEX].MaxImageUniforms; - this->Const.MaxGeometryImageUniforms = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxImageUniforms; - this->Const.MaxFragmentImageUniforms = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxImageUniforms; - this->Const.MaxCombinedImageUniforms = ctx->Const.MaxCombinedImageUniforms; - - this->current_function = NULL; - this->toplevel_ir = NULL; - this->found_return = false; - this->all_invariant = false; - this->user_structures = NULL; - this->num_user_structures = 0; - - /* Populate the list of supported GLSL versions */ - /* FINISHME: Once the OpenGL 3.0 'forward compatible' context or - * the OpenGL 3.2 Core context is supported, this logic will need - * change. Older versions of GLSL are no longer supported - * outside the compatibility contexts of 3.x. - */ - this->num_supported_versions = 0; - if (_mesa_is_desktop_gl(ctx)) { - for (unsigned i = 0; i < ARRAY_SIZE(known_desktop_glsl_versions); i++) { - if (known_desktop_glsl_versions[i] <= ctx->Const.GLSLVersion) { - this->supported_versions[this->num_supported_versions].ver - = known_desktop_glsl_versions[i]; - this->supported_versions[this->num_supported_versions].es = false; - this->num_supported_versions++; - } - } - } - if (ctx->API == API_OPENGLES2 || ctx->Extensions.ARB_ES2_compatibility) { - this->supported_versions[this->num_supported_versions].ver = 100; - this->supported_versions[this->num_supported_versions].es = true; - this->num_supported_versions++; - } - if (_mesa_is_gles3(ctx) || ctx->Extensions.ARB_ES3_compatibility) { - this->supported_versions[this->num_supported_versions].ver = 300; - this->supported_versions[this->num_supported_versions].es = true; - this->num_supported_versions++; - } - assert(this->num_supported_versions - <= ARRAY_SIZE(this->supported_versions)); - - /* Create a string for use in error messages to tell the user which GLSL - * versions are supported. - */ - char *supported = ralloc_strdup(this, ""); - for (unsigned i = 0; i < this->num_supported_versions; i++) { - unsigned ver = this->supported_versions[i].ver; - const char *const prefix = (i == 0) - ? "" - : ((i == this->num_supported_versions - 1) ? ", and " : ", "); - const char *const suffix = (this->supported_versions[i].es) ? " ES" : ""; - - ralloc_asprintf_append(& supported, "%s%u.%02u%s", - prefix, - ver / 100, ver % 100, - suffix); - } - - this->supported_version_string = supported; - - if (ctx->Const.ForceGLSLExtensionsWarn) - _mesa_glsl_process_extension("all", NULL, "warn", NULL, this); - - this->default_uniform_qualifier = new(this) ast_type_qualifier; - this->default_uniform_qualifier->flags.q.shared = 1; - this->default_uniform_qualifier->flags.q.column_major = 1; - - this->fs_uses_gl_fragcoord = false; - this->fs_redeclares_gl_fragcoord = false; - this->fs_origin_upper_left = false; - this->fs_pixel_center_integer = false; - this->fs_redeclares_gl_fragcoord_with_no_layout_qualifiers = false; - - this->gs_input_prim_type_specified = false; - this->gs_input_size = 0; - this->in_qualifier = new(this) ast_type_qualifier(); - this->out_qualifier = new(this) ast_type_qualifier(); - this->early_fragment_tests = false; - memset(this->atomic_counter_offsets, 0, - sizeof(this->atomic_counter_offsets)); - this->allow_extension_directive_midshader = - ctx->Const.AllowGLSLExtensionDirectiveMidShader; -} - -/** - * Determine whether the current GLSL version is sufficiently high to support - * a certain feature, and generate an error message if it isn't. - * - * \param required_glsl_version and \c required_glsl_es_version are - * interpreted as they are in _mesa_glsl_parse_state::is_version(). - * - * \param locp is the parser location where the error should be reported. - * - * \param fmt (and additional arguments) constitute a printf-style error - * message to report if the version check fails. Information about the - * current and required GLSL versions will be appended. So, for example, if - * the GLSL version being compiled is 1.20, and check_version(130, 300, locp, - * "foo unsupported") is called, the error message will be "foo unsupported in - * GLSL 1.20 (GLSL 1.30 or GLSL 3.00 ES required)". - */ -bool -_mesa_glsl_parse_state::check_version(unsigned required_glsl_version, - unsigned required_glsl_es_version, - YYLTYPE *locp, const char *fmt, ...) -{ - if (this->is_version(required_glsl_version, required_glsl_es_version)) - return true; - - va_list args; - va_start(args, fmt); - char *problem = ralloc_vasprintf(this, fmt, args); - va_end(args); - const char *glsl_version_string - = glsl_compute_version_string(this, false, required_glsl_version); - const char *glsl_es_version_string - = glsl_compute_version_string(this, true, required_glsl_es_version); - const char *requirement_string = ""; - if (required_glsl_version && required_glsl_es_version) { - requirement_string = ralloc_asprintf(this, " (%s or %s required)", - glsl_version_string, - glsl_es_version_string); - } else if (required_glsl_version) { - requirement_string = ralloc_asprintf(this, " (%s required)", - glsl_version_string); - } else if (required_glsl_es_version) { - requirement_string = ralloc_asprintf(this, " (%s required)", - glsl_es_version_string); - } - _mesa_glsl_error(locp, this, "%s in %s%s", - problem, this->get_version_string(), - requirement_string); - - return false; -} - -/** - * Process a GLSL #version directive. - * - * \param version is the integer that follows the #version token. - * - * \param ident is a string identifier that follows the integer, if any is - * present. Otherwise NULL. - */ -void -_mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version, - const char *ident) -{ - bool es_token_present = false; - if (ident) { - if (strcmp(ident, "es") == 0) { - es_token_present = true; - } else if (version >= 150) { - if (strcmp(ident, "core") == 0) { - /* Accept the token. There's no need to record that this is - * a core profile shader since that's the only profile we support. - */ - } else if (strcmp(ident, "compatibility") == 0) { - _mesa_glsl_error(locp, this, - "the compatibility profile is not supported"); - } else { - _mesa_glsl_error(locp, this, - "\"%s\" is not a valid shading language profile; " - "if present, it must be \"core\"", ident); - } - } else { - _mesa_glsl_error(locp, this, - "illegal text following version number"); - } - } - - this->es_shader = es_token_present; - if (version == 100) { - if (es_token_present) { - _mesa_glsl_error(locp, this, - "GLSL 1.00 ES should be selected using " - "`#version 100'"); - } else { - this->es_shader = true; - } - } - - if (this->es_shader) { - this->ARB_texture_rectangle_enable = false; - } - - this->language_version = version; - this->had_version_string = true; - - bool supported = false; - for (unsigned i = 0; i < this->num_supported_versions; i++) { - if (this->supported_versions[i].ver == (unsigned) version - && this->supported_versions[i].es == this->es_shader) { - supported = true; - break; - } - } - - if (!supported) { - _mesa_glsl_error(locp, this, "%s is not supported. " - "Supported versions are: %s", - this->get_version_string(), - this->supported_version_string); - - /* On exit, the language_version must be set to a valid value. - * Later calls to _mesa_glsl_initialize_types will misbehave if - * the version is invalid. - */ - switch (this->ctx->API) { - case API_OPENGL_COMPAT: - case API_OPENGL_CORE: - this->language_version = this->ctx->Const.GLSLVersion; - break; - - case API_OPENGLES: - assert(!"Should not get here."); - /* FALLTHROUGH */ - - case API_OPENGLES2: - this->language_version = 100; - break; - } - } -} - - -/** - * Translate a gl_shader_stage to a short shader stage name for debug - * printouts and error messages. - */ -const char * -_mesa_shader_stage_to_string(unsigned stage) -{ - switch (stage) { - case MESA_SHADER_VERTEX: return "vertex"; - case MESA_SHADER_FRAGMENT: return "fragment"; - case MESA_SHADER_GEOMETRY: return "geometry"; - } - - assert(!"Should not get here."); - return "unknown"; -} - -/* This helper function will append the given message to the shader's - info log and report it via GL_ARB_debug_output. Per that extension, - 'type' is one of the enum values classifying the message, and - 'id' is the implementation-defined ID of the given message. */ -static void -_mesa_glsl_msg(const YYLTYPE *locp, _mesa_glsl_parse_state *state, - GLenum type, const char *fmt, va_list ap) -{ - bool error = (type == MESA_DEBUG_TYPE_ERROR); - GLuint msg_id = 0; - - assert(state->info_log != NULL); - - /* Get the offset that the new message will be written to. */ - int msg_offset = strlen(state->info_log); - - // format: - // (line,col): type: message - ralloc_asprintf_append(&state->info_log, "(%u,%u): %s: ", - locp->first_line, - locp->first_column, - error ? "error" : "warning"); - ralloc_vasprintf_append(&state->info_log, fmt, ap); - - const char *const msg = &state->info_log[msg_offset]; - struct gl_context *ctx = state->ctx; - - /* Report the error via GL_ARB_debug_output. */ - _mesa_shader_debug(ctx, type, &msg_id, msg, strlen(msg)); - - ralloc_strcat(&state->info_log, "\n"); -} - -void -_mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state, - const char *fmt, ...) -{ - va_list ap; - - state->error = true; - - va_start(ap, fmt); - _mesa_glsl_msg(locp, state, MESA_DEBUG_TYPE_ERROR, fmt, ap); - va_end(ap); -} - - -void -_mesa_glsl_warning(const YYLTYPE *locp, _mesa_glsl_parse_state *state, - const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - _mesa_glsl_msg(locp, state, MESA_DEBUG_TYPE_OTHER, fmt, ap); - va_end(ap); -} - - -/** - * Enum representing the possible behaviors that can be specified in - * an #extension directive. - */ -enum ext_behavior { - extension_disable, - extension_enable, - extension_require, - extension_warn -}; - -/** - * Element type for _mesa_glsl_supported_extensions - */ -struct _mesa_glsl_extension { - /** - * Name of the extension when referred to in a GLSL extension - * statement - */ - const char *name; - - /** True if this extension is available to desktop GL shaders */ - bool avail_in_GL; - - /** True if this extension is available to GLES shaders */ - bool avail_in_ES; - - /** - * Flag in the gl_extensions struct indicating whether this - * extension is supported by the driver, or - * &gl_extensions::dummy_true if supported by all drivers. - * - * Note: the type (GLboolean gl_extensions::*) is a "pointer to - * member" type, the type-safe alternative to the "offsetof" macro. - * In a nutshell: - * - * - foo bar::* p declares p to be an "offset" to a field of type - * foo that exists within struct bar - * - &bar::baz computes the "offset" of field baz within struct bar - * - x.*p accesses the field of x that exists at "offset" p - * - x->*p is equivalent to (*x).*p - */ - const GLboolean gl_extensions::* supported_flag; - - /** - * Flag in the _mesa_glsl_parse_state struct that should be set - * when this extension is enabled. - * - * See note in _mesa_glsl_extension::supported_flag about "pointer - * to member" types. - */ - bool _mesa_glsl_parse_state::* enable_flag; - - /** - * Flag in the _mesa_glsl_parse_state struct that should be set - * when the shader requests "warn" behavior for this extension. - * - * See note in _mesa_glsl_extension::supported_flag about "pointer - * to member" types. - */ - bool _mesa_glsl_parse_state::* warn_flag; - - - bool compatible_with_state(const _mesa_glsl_parse_state *state) const; - void set_flags(_mesa_glsl_parse_state *state, ext_behavior behavior) const; -}; - -#define EXT(NAME, GL, ES, SUPPORTED_FLAG) \ - { "GL_" #NAME, GL, ES, &gl_extensions::SUPPORTED_FLAG, \ - &_mesa_glsl_parse_state::NAME##_enable, \ - &_mesa_glsl_parse_state::NAME##_warn } - -/** - * Table of extensions that can be enabled/disabled within a shader, - * and the conditions under which they are supported. - */ -static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = { - /* API availability */ - /* name GL ES supported flag */ - - /* ARB extensions go here, sorted alphabetically. - */ - EXT(ARB_arrays_of_arrays, true, false, ARB_arrays_of_arrays), - EXT(ARB_compute_shader, true, false, ARB_compute_shader), - EXT(ARB_conservative_depth, true, false, ARB_conservative_depth), - EXT(ARB_derivative_control, true, false, ARB_derivative_control), - EXT(ARB_draw_buffers, true, false, dummy_true), - EXT(ARB_draw_instanced, true, false, ARB_draw_instanced), - EXT(ARB_explicit_attrib_location, true, false, ARB_explicit_attrib_location), - EXT(ARB_explicit_uniform_location, true, false, ARB_explicit_uniform_location), - EXT(ARB_fragment_coord_conventions, true, false, ARB_fragment_coord_conventions), - EXT(ARB_fragment_layer_viewport, true, false, ARB_fragment_layer_viewport), - EXT(ARB_gpu_shader5, true, false, ARB_gpu_shader5), - EXT(ARB_sample_shading, true, false, ARB_sample_shading), - EXT(ARB_separate_shader_objects, true, false, dummy_true), - EXT(ARB_shader_atomic_counters, true, false, ARB_shader_atomic_counters), - EXT(ARB_shader_bit_encoding, true, false, ARB_shader_bit_encoding), - EXT(ARB_shader_image_load_store, true, false, ARB_shader_image_load_store), - EXT(ARB_shader_stencil_export, true, false, ARB_shader_stencil_export), - EXT(ARB_shader_texture_lod, true, false, ARB_shader_texture_lod), - EXT(ARB_shader_viewport_layer_array, true, false, ARB_shader_viewport_layer_array), - EXT(ARB_shading_language_420pack, true, false, ARB_shading_language_420pack), - EXT(ARB_shading_language_packing, true, false, ARB_shading_language_packing), - EXT(ARB_texture_cube_map_array, true, false, ARB_texture_cube_map_array), - EXT(ARB_texture_gather, true, false, ARB_texture_gather), - EXT(ARB_texture_multisample, true, false, ARB_texture_multisample), - EXT(ARB_texture_query_levels, true, false, ARB_texture_query_levels), - EXT(ARB_texture_query_lod, true, false, ARB_texture_query_lod), - EXT(ARB_texture_rectangle, true, false, dummy_true), - EXT(ARB_uniform_buffer_object, true, false, ARB_uniform_buffer_object), - EXT(ARB_viewport_array, true, false, ARB_viewport_array), - - /* KHR extensions go here, sorted alphabetically. - */ - - /* OES extensions go here, sorted alphabetically. - */ - EXT(OES_EGL_image_external, false, true, OES_EGL_image_external), - EXT(OES_standard_derivatives, false, true, OES_standard_derivatives), - EXT(OES_texture_3D, false, true, EXT_texture3D), - - /* All other extensions go here, sorted alphabetically. - */ - EXT(AMD_conservative_depth, true, false, ARB_conservative_depth), - EXT(AMD_shader_stencil_export, true, false, ARB_shader_stencil_export), - EXT(AMD_shader_trinary_minmax, true, false, dummy_true), - EXT(AMD_vertex_shader_layer, true, false, AMD_vertex_shader_layer), - EXT(AMD_vertex_shader_viewport_index, true, false, AMD_vertex_shader_viewport_index), - EXT(EXT_draw_buffers, false, true, EXT_draw_buffers), - EXT(EXT_draw_instanced, false, true, EXT_draw_instanced), - EXT(EXT_frag_depth, false, true, EXT_frag_depth), - EXT(EXT_gpu_shader4, true, false, EXT_gpu_shader4), - EXT(EXT_separate_shader_objects, false, true, dummy_true), - EXT(EXT_shader_framebuffer_fetch, false, true, EXT_shader_framebuffer_fetch), - EXT(EXT_shader_integer_mix, true, true, EXT_shader_integer_mix), - EXT(EXT_shader_texture_lod, true, true, ARB_shader_texture_lod), // BK - made it available in GLSL - EXT(EXT_shadow_samplers, false, true, EXT_shadow_samplers), - EXT(EXT_texture_array, true, true, EXT_texture_array), // BK - made it available in ESSL -}; - -#undef EXT - - -/** - * Determine whether a given extension is compatible with the target, - * API, and extension information in the current parser state. - */ -bool _mesa_glsl_extension::compatible_with_state(const _mesa_glsl_parse_state * - state) const -{ - /* Check that this extension matches whether we are compiling - * for desktop GL or GLES. - */ - if (state->es_shader) { - if (!this->avail_in_ES) return false; - } else { - if (!this->avail_in_GL) return false; - } - - /* Check that this extension is supported by the OpenGL - * implementation. - * - * Note: the ->* operator indexes into state->extensions by the - * offset this->supported_flag. See - * _mesa_glsl_extension::supported_flag for more info. - */ - return !!(state->extensions->*(this->supported_flag)); -} - -/** - * Set the appropriate flags in the parser state to establish the - * given behavior for this extension. - */ -void _mesa_glsl_extension::set_flags(_mesa_glsl_parse_state *state, - ext_behavior behavior) const -{ - /* Note: the ->* operator indexes into state by the - * offsets this->enable_flag and this->warn_flag. See - * _mesa_glsl_extension::supported_flag for more info. - */ - state->*(this->enable_flag) = (behavior != extension_disable); - state->*(this->warn_flag) = (behavior == extension_warn); -} - -/** - * Find an extension by name in _mesa_glsl_supported_extensions. If - * the name is not found, return NULL. - */ -static const _mesa_glsl_extension *find_extension(const char *name) -{ - for (unsigned i = 0; i < Elements(_mesa_glsl_supported_extensions); ++i) { - if (strcmp(name, _mesa_glsl_supported_extensions[i].name) == 0) { - return &_mesa_glsl_supported_extensions[i]; - } - } - return NULL; -} - - -bool -_mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp, - const char *behavior_string, YYLTYPE *behavior_locp, - _mesa_glsl_parse_state *state) -{ - ext_behavior behavior; - if (strcmp(behavior_string, "warn") == 0) { - behavior = extension_warn; - } else if (strcmp(behavior_string, "require") == 0) { - behavior = extension_require; - } else if (strcmp(behavior_string, "enable") == 0) { - behavior = extension_enable; - } else if (strcmp(behavior_string, "disable") == 0) { - behavior = extension_disable; - } else { - _mesa_glsl_error(behavior_locp, state, - "unknown extension behavior `%s'", - behavior_string); - return false; - } - - if (strcmp(name, "all") == 0) { - if ((behavior == extension_enable) || (behavior == extension_require)) { - _mesa_glsl_error(name_locp, state, "cannot %s all extensions", - (behavior == extension_enable) - ? "enable" : "require"); - return false; - } else { - for (unsigned i = 0; - i < Elements(_mesa_glsl_supported_extensions); ++i) { - const _mesa_glsl_extension *extension - = &_mesa_glsl_supported_extensions[i]; - if (extension->compatible_with_state(state)) { - _mesa_glsl_supported_extensions[i].set_flags(state, behavior); - } - } - } - } else { - const _mesa_glsl_extension *extension = find_extension(name); - if (extension && extension->compatible_with_state(state)) { - extension->set_flags(state, behavior); - } else { - static const char fmt[] = "extension `%s' unsupported in %s shader"; - - if (behavior == extension_require) { - _mesa_glsl_error(name_locp, state, fmt, - name, _mesa_shader_stage_to_string(state->stage)); - return false; - } else { - _mesa_glsl_warning(name_locp, state, fmt, - name, _mesa_shader_stage_to_string(state->stage)); - } - } - } - - return true; -} - - -/** - * Recurses through and if is an aggregate initializer - * and sets 's field to . Gives later functions - * (process_array_constructor, et al) sufficient information to do type - * checking. - * - * Operates on assignments involving an aggregate initializer. E.g., - * - * vec4 pos = {1.0, -1.0, 0.0, 1.0}; - * - * or more ridiculously, - * - * struct S { - * vec4 v[2]; - * }; - * - * struct { - * S a[2], b; - * int c; - * } aggregate = { - * { - * { - * { - * {1.0, 2.0, 3.0, 4.0}, // a[0].v[0] - * {5.0, 6.0, 7.0, 8.0} // a[0].v[1] - * } // a[0].v - * }, // a[0] - * { - * { - * {1.0, 2.0, 3.0, 4.0}, // a[1].v[0] - * {5.0, 6.0, 7.0, 8.0} // a[1].v[1] - * } // a[1].v - * } // a[1] - * }, // a - * { - * { - * {1.0, 2.0, 3.0, 4.0}, // b.v[0] - * {5.0, 6.0, 7.0, 8.0} // b.v[1] - * } // b.v - * }, // b - * 4 // c - * }; - * - * This pass is necessary because the right-hand side of e = { ... } - * doesn't contain sufficient information to determine if the types match. - */ -void -_mesa_ast_set_aggregate_type(const glsl_type *type, - ast_expression *expr) -{ - ast_aggregate_initializer *ai = (ast_aggregate_initializer *)expr; - ai->constructor_type = type; - - /* If the aggregate is an array, recursively set its elements' types. */ - if (type->is_array()) { - /* Each array element has the type type->element_type(). - * - * E.g., if if struct S[2] we want to set each element's type to - * struct S. - */ - for (exec_node *expr_node = ai->expressions.head; - !expr_node->is_tail_sentinel(); - expr_node = expr_node->next) { - ast_expression *expr = exec_node_data(ast_expression, expr_node, - link); - - if (expr->oper == ast_aggregate) - _mesa_ast_set_aggregate_type(type->element_type(), expr); - } - - /* If the aggregate is a struct, recursively set its fields' types. */ - } else if (type->is_record()) { - exec_node *expr_node = ai->expressions.head; - - /* Iterate through the struct's fields. */ - for (unsigned i = 0; !expr_node->is_tail_sentinel() && i < type->length; - i++, expr_node = expr_node->next) { - ast_expression *expr = exec_node_data(ast_expression, expr_node, - link); - - if (expr->oper == ast_aggregate) { - _mesa_ast_set_aggregate_type(type->fields.structure[i].type, expr); - } - } - /* If the aggregate is a matrix, set its columns' types. */ - } else if (type->is_matrix()) { - for (exec_node *expr_node = ai->expressions.head; - !expr_node->is_tail_sentinel(); - expr_node = expr_node->next) { - ast_expression *expr = exec_node_data(ast_expression, expr_node, - link); - - if (expr->oper == ast_aggregate) - _mesa_ast_set_aggregate_type(type->column_type(), expr); - } - } -} - - -void -_mesa_ast_type_qualifier_print(const struct ast_type_qualifier *q) -{ - if (q->flags.q.constant) - printf("const "); - - if (q->flags.q.invariant) - printf("invariant "); - - if (q->flags.q.attribute) - printf("attribute "); - - if (q->flags.q.varying) - printf("varying "); - - if (q->flags.q.in && q->flags.q.out) - printf("inout "); - else { - if (q->flags.q.in) - printf("in "); - - if (q->flags.q.out) - printf("out "); - } - - if (q->flags.q.centroid) - printf("centroid "); - if (q->flags.q.sample) - printf("sample "); - if (q->flags.q.uniform) - printf("uniform "); - if (q->flags.q.smooth) - printf("smooth "); - if (q->flags.q.flat) - printf("flat "); - if (q->flags.q.noperspective) - printf("noperspective "); -} - - -void -ast_node::print(void) const -{ - printf("unhandled node "); -} - - -ast_node::ast_node(void) -{ - this->location.source = 0; - this->location.first_line = 0; - this->location.first_column = 0; - this->location.last_line = 0; - this->location.last_column = 0; -} - - -static void -ast_opt_array_dimensions_print(const ast_array_specifier *array_specifier) -{ - if (array_specifier) - array_specifier->print(); -} - - -void -ast_compound_statement::print(void) const -{ - printf("{\n"); - - foreach_list_typed(ast_node, ast, link, &this->statements) { - ast->print(); - } - - printf("}\n"); -} - - -ast_compound_statement::ast_compound_statement(int new_scope, - ast_node *statements) -{ - this->new_scope = new_scope; - - if (statements != NULL) { - this->statements.push_degenerate_list_at_head(&statements->link); - } -} - - -void -ast_expression::print(void) const -{ - switch (oper) { - case ast_assign: - case ast_mul_assign: - case ast_div_assign: - case ast_mod_assign: - case ast_add_assign: - case ast_sub_assign: - case ast_ls_assign: - case ast_rs_assign: - case ast_and_assign: - case ast_xor_assign: - case ast_or_assign: - subexpressions[0]->print(); - printf("%s ", operator_string(oper)); - subexpressions[1]->print(); - break; - - case ast_field_selection: - subexpressions[0]->print(); - printf(". %s ", primary_expression.identifier); - break; - - case ast_plus: - case ast_neg: - case ast_bit_not: - case ast_logic_not: - case ast_pre_inc: - case ast_pre_dec: - printf("%s ", operator_string(oper)); - subexpressions[0]->print(); - break; - - case ast_post_inc: - case ast_post_dec: - subexpressions[0]->print(); - printf("%s ", operator_string(oper)); - break; - - case ast_conditional: - subexpressions[0]->print(); - printf("? "); - subexpressions[1]->print(); - printf(": "); - subexpressions[2]->print(); - break; - - case ast_array_index: - subexpressions[0]->print(); - printf("[ "); - subexpressions[1]->print(); - printf("] "); - break; - - case ast_function_call: { - subexpressions[0]->print(); - printf("( "); - - foreach_list_typed (ast_node, ast, link, &this->expressions) { - if (&ast->link != this->expressions.get_head()) - printf(", "); - - ast->print(); - } - - printf(") "); - break; - } - - case ast_identifier: - printf("%s ", primary_expression.identifier); - break; - - case ast_int_constant: - printf("%d ", primary_expression.int_constant); - break; - - case ast_uint_constant: - printf("%u ", primary_expression.uint_constant); - break; - - case ast_float_constant: - printf("%f ", primary_expression.float_constant); - break; - - case ast_bool_constant: - printf("%s ", - primary_expression.bool_constant - ? "true" : "false"); - break; - - case ast_sequence: { - printf("( "); - foreach_list_typed (ast_node, ast, link, & this->expressions) { - if (&ast->link != this->expressions.get_head()) - printf(", "); - - ast->print(); - } - printf(") "); - break; - } - - case ast_aggregate: { - printf("{ "); - foreach_list_typed (ast_node, ast, link, & this->expressions) { - if (&ast->link != this->expressions.get_head()) - printf(", "); - - ast->print(); - } - printf("} "); - break; - } - - default: - assert(0); - break; - } -} - -ast_expression::ast_expression(int oper, - ast_expression *ex0, - ast_expression *ex1, - ast_expression *ex2) : - primary_expression() -{ - this->oper = ast_operators(oper); - this->subexpressions[0] = ex0; - this->subexpressions[1] = ex1; - this->subexpressions[2] = ex2; - this->non_lvalue_description = NULL; -} - - -void -ast_expression_statement::print(void) const -{ - if (expression) - expression->print(); - - printf("; "); -} - - -ast_expression_statement::ast_expression_statement(ast_expression *ex) : - expression(ex) -{ - /* empty */ -} - - -void -ast_function::print(void) const -{ - return_type->print(); - printf(" %s (", identifier); - - foreach_list_typed(ast_node, ast, link, & this->parameters) { - ast->print(); - } - - printf(")"); -} - - -ast_function::ast_function(void) - : return_type(NULL), identifier(NULL), is_definition(false), - signature(NULL) -{ - /* empty */ -} - - -void -ast_fully_specified_type::print(void) const -{ - _mesa_ast_type_qualifier_print(& qualifier); - specifier->print(); -} - - -void -ast_parameter_declarator::print(void) const -{ - type->print(); - if (identifier) - printf("%s ", identifier); - ast_opt_array_dimensions_print(array_specifier); -} - - -void -ast_function_definition::print(void) const -{ - prototype->print(); - body->print(); -} - - -void -ast_declaration::print(void) const -{ - printf("%s ", identifier); - ast_opt_array_dimensions_print(array_specifier); - - if (initializer) { - printf("= "); - initializer->print(); - } -} - - -ast_declaration::ast_declaration(const char *identifier, - ast_array_specifier *array_specifier, - ast_expression *initializer) -{ - this->identifier = identifier; - this->array_specifier = array_specifier; - this->initializer = initializer; -} - - -void -ast_declarator_list::print(void) const -{ - assert(type || invariant); - - if (type) - type->print(); - else if (invariant) - printf("invariant "); - else - printf("precise "); - - foreach_list_typed (ast_node, ast, link, & this->declarations) { - if (&ast->link != this->declarations.get_head()) - printf(", "); - - ast->print(); - } - - printf("; "); -} - - -ast_declarator_list::ast_declarator_list(ast_fully_specified_type *type) -{ - this->type = type; - this->invariant = false; - this->precise = false; -} - -void -ast_jump_statement::print(void) const -{ - switch (mode) { - case ast_continue: - printf("continue; "); - break; - case ast_break: - printf("break; "); - break; - case ast_return: - printf("return "); - if (opt_return_value) - opt_return_value->print(); - - printf("; "); - break; - case ast_discard: - printf("discard; "); - break; - } -} - - -ast_jump_statement::ast_jump_statement(int mode, ast_expression *return_value) - : opt_return_value(NULL) -{ - this->mode = ast_jump_modes(mode); - - if (mode == ast_return) - opt_return_value = return_value; -} - - -void -ast_selection_statement::print(void) const -{ - printf("if ( "); - condition->print(); - printf(") "); - - then_statement->print(); - - if (else_statement) { - printf("else "); - else_statement->print(); - } - -} - - -ast_selection_statement::ast_selection_statement(ast_expression *condition, - ast_node *then_statement, - ast_node *else_statement) -{ - this->condition = condition; - this->then_statement = then_statement; - this->else_statement = else_statement; -} - - -void -ast_switch_statement::print(void) const -{ - printf("switch ( "); - test_expression->print(); - printf(") "); - - body->print(); -} - - -ast_switch_statement::ast_switch_statement(ast_expression *test_expression, - ast_node *body) -{ - this->test_expression = test_expression; - this->body = body; -} - - -void -ast_switch_body::print(void) const -{ - printf("{\n"); - if (stmts != NULL) { - stmts->print(); - } - printf("}\n"); -} - - -ast_switch_body::ast_switch_body(ast_case_statement_list *stmts) -{ - this->stmts = stmts; -} - - -void ast_case_label::print(void) const -{ - if (test_value != NULL) { - printf("case "); - test_value->print(); - printf(": "); - } else { - printf("default: "); - } -} - - -ast_case_label::ast_case_label(ast_expression *test_value) -{ - this->test_value = test_value; -} - - -void ast_case_label_list::print(void) const -{ - foreach_list_typed(ast_node, ast, link, & this->labels) { - ast->print(); - } - printf("\n"); -} - - -ast_case_label_list::ast_case_label_list(void) -{ -} - - -void ast_case_statement::print(void) const -{ - labels->print(); - foreach_list_typed(ast_node, ast, link, & this->stmts) { - ast->print(); - printf("\n"); - } -} - - -ast_case_statement::ast_case_statement(ast_case_label_list *labels) -{ - this->labels = labels; -} - - -void ast_case_statement_list::print(void) const -{ - foreach_list_typed(ast_node, ast, link, & this->cases) { - ast->print(); - } -} - - -ast_case_statement_list::ast_case_statement_list(void) -{ -} - - -void -ast_iteration_statement::print(void) const -{ - switch (mode) { - case ast_for: - printf("for( "); - if (init_statement) - init_statement->print(); - printf("; "); - - if (condition) - condition->print(); - printf("; "); - - if (rest_expression) - rest_expression->print(); - printf(") "); - - body->print(); - break; - - case ast_while: - printf("while ( "); - if (condition) - condition->print(); - printf(") "); - body->print(); - break; - - case ast_do_while: - printf("do "); - body->print(); - printf("while ( "); - if (condition) - condition->print(); - printf("); "); - break; - } -} - - -ast_iteration_statement::ast_iteration_statement(int mode, - ast_node *init, - ast_node *condition, - ast_expression *rest_expression, - ast_node *body) -{ - this->mode = ast_iteration_modes(mode); - this->init_statement = init; - this->condition = condition; - this->rest_expression = rest_expression; - this->body = body; -} - - -void -ast_struct_specifier::print(void) const -{ - printf("struct %s { ", name); - foreach_list_typed(ast_node, ast, link, &this->declarations) { - ast->print(); - } - printf("} "); -} - - -ast_struct_specifier::ast_struct_specifier(const char *identifier, - ast_declarator_list *declarator_list) -{ - if (identifier == NULL) { - static unsigned anon_count = 1; - identifier = ralloc_asprintf(this, "#anon_struct_%04x", anon_count); - anon_count++; - } - name = identifier; - this->declarations.push_degenerate_list_at_head(&declarator_list->link); - is_declaration = true; -} - -static void -set_shader_inout_layout(struct gl_shader *shader, - struct _mesa_glsl_parse_state *state) -{ - if (shader->Stage != MESA_SHADER_GEOMETRY) { - /* Should have been prevented by the parser. */ - assert(!state->in_qualifier->flags.i); - assert(!state->out_qualifier->flags.i); - } - - if (shader->Stage != MESA_SHADER_COMPUTE) { - /* Should have been prevented by the parser. */ - assert(!state->cs_input_local_size_specified); - } - - if (shader->Stage != MESA_SHADER_FRAGMENT) { - /* Should have been prevented by the parser. */ - assert(!state->fs_uses_gl_fragcoord); - assert(!state->fs_redeclares_gl_fragcoord); - assert(!state->fs_pixel_center_integer); - assert(!state->fs_origin_upper_left); - } - - switch (shader->Stage) { - case MESA_SHADER_GEOMETRY: - shader->Geom.VerticesOut = 0; - if (state->out_qualifier->flags.q.max_vertices) - shader->Geom.VerticesOut = state->out_qualifier->max_vertices; - - if (state->gs_input_prim_type_specified) { - shader->Geom.InputType = state->in_qualifier->prim_type; - } else { - shader->Geom.InputType = PRIM_UNKNOWN; - } - - if (state->out_qualifier->flags.q.prim_type) { - shader->Geom.OutputType = state->out_qualifier->prim_type; - } else { - shader->Geom.OutputType = PRIM_UNKNOWN; - } - - shader->Geom.Invocations = 0; - if (state->in_qualifier->flags.q.invocations) - shader->Geom.Invocations = state->in_qualifier->invocations; - break; - - case MESA_SHADER_COMPUTE: - if (state->cs_input_local_size_specified) { - for (int i = 0; i < 3; i++) - shader->Comp.LocalSize[i] = state->cs_input_local_size[i]; - } else { - for (int i = 0; i < 3; i++) - shader->Comp.LocalSize[i] = 0; - } - break; - - case MESA_SHADER_FRAGMENT: - shader->redeclares_gl_fragcoord = state->fs_redeclares_gl_fragcoord; - shader->uses_gl_fragcoord = state->fs_uses_gl_fragcoord; - shader->pixel_center_integer = state->fs_pixel_center_integer; - shader->origin_upper_left = state->fs_origin_upper_left; - shader->ARB_fragment_coord_conventions_enable = - state->ARB_fragment_coord_conventions_enable; - break; - - default: - /* Nothing to do. */ - break; - } -} - -extern "C" { - -void -_mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, - bool dump_ast, bool dump_hir) -{ - struct _mesa_glsl_parse_state *state = - new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader); - const char *source = shader->Source; - - if (ctx->Const.GenerateTemporaryNames) - ir_variable::temporaries_allocate_names = true; - - state->error = !!glcpp_preprocess(state, &source, &state->info_log, - &ctx->Extensions, ctx); - - if (!state->error) { - _mesa_glsl_lexer_ctor(state, source); - _mesa_glsl_parse(state); - _mesa_glsl_lexer_dtor(state); - } - - if (dump_ast) { - foreach_list_typed(ast_node, ast, link, &state->translation_unit) { - ast->print(); - } - printf("\n\n"); - } - - ralloc_free(shader->ir); - shader->ir = new(shader) exec_list; - if (!state->error && !state->translation_unit.is_empty()) - _mesa_ast_to_hir(shader->ir, state); - - if (!state->error) { - validate_ir_tree(shader->ir); - - /* Print out the unoptimized IR. */ - if (dump_hir) { - _mesa_print_ir(stdout, shader->ir, state); - } - } - - - if (!state->error && !shader->ir->is_empty()) { - struct gl_shader_compiler_options *options = - &ctx->Const.ShaderCompilerOptions[shader->Stage]; - - /* Do some optimization at compile time to reduce shader IR size - * and reduce later work if the same shader is linked multiple times - */ - while (do_common_optimization(shader->ir, false, false, options, - ctx->Const.NativeIntegers)) - ; - - validate_ir_tree(shader->ir); - - enum ir_variable_mode other; - switch (shader->Stage) { - case MESA_SHADER_VERTEX: - other = ir_var_shader_in; - break; - case MESA_SHADER_FRAGMENT: - other = ir_var_shader_out; - break; - default: - /* Something invalid to ensure optimize_dead_builtin_uniforms - * doesn't remove anything other than uniforms or constants. - */ - other = ir_var_mode_count; - break; - } - - optimize_dead_builtin_variables(shader->ir, other); - - validate_ir_tree(shader->ir); - } - - if (shader->InfoLog) - ralloc_free(shader->InfoLog); - - shader->symbols = new(shader->ir) glsl_symbol_table; - shader->CompileStatus = !state->error; - shader->InfoLog = state->info_log; - shader->Version = state->language_version; - shader->IsES = state->es_shader; - shader->uses_builtin_functions = state->uses_builtin_functions; - - if (!state->error) - set_shader_inout_layout(shader, state); - - /* Retain any live IR, but trash the rest. */ - reparent_ir(shader->ir, shader->ir); - - /* Destroy the symbol table. Create a new symbol table that contains only - * the variables and functions that still exist in the IR. The symbol - * table will be used later during linking. - * - * There must NOT be any freed objects still referenced by the symbol - * table. That could cause the linker to dereference freed memory. - * - * We don't have to worry about types or interface-types here because those - * are fly-weights that are looked up by glsl_type. - */ - foreach_in_list (ir_instruction, ir, shader->ir) { - switch (ir->ir_type) { - case ir_type_function: - shader->symbols->add_function((ir_function *) ir); - break; - case ir_type_variable: { - ir_variable *const var = (ir_variable *) ir; - - if (var->data.mode != ir_var_temporary) - shader->symbols->add_variable(var); - break; - } - default: - break; - } - } - - delete state->symbols; - ralloc_free(state); -} - -} /* extern "C" */ -/** - * Do the set of common optimizations passes - * - * \param ir List of instructions to be optimized - * \param linked Is the shader linked? This enables - * optimizations passes that remove code at - * global scope and could cause linking to - * fail. - * \param uniform_locations_assigned Have locations already been assigned for - * uniforms? This prevents the declarations - * of unused uniforms from being removed. - * The setting of this flag only matters if - * \c linked is \c true. - * \param max_unroll_iterations Maximum number of loop iterations to be - * unrolled. Setting to 0 disables loop - * unrolling. - * \param options The driver's preferred shader options. - */ -bool -do_common_optimization(exec_list *ir, bool linked, - bool uniform_locations_assigned, - const struct gl_shader_compiler_options *options, - bool native_integers) -{ - GLboolean progress = GL_FALSE; - - progress = lower_instructions(ir, SUB_TO_ADD_NEG) || progress; - - if (linked) { - progress = do_function_inlining(ir) || progress; - progress = do_dead_functions(ir) || progress; - progress = do_structure_splitting(ir) || progress; - } - progress = do_if_simplification(ir) || progress; - progress = opt_flatten_nested_if_blocks(ir) || progress; - progress = do_copy_propagation(ir) || progress; - progress = do_copy_propagation_elements(ir) || progress; - - if (options->OptimizeForAOS && !linked) - progress = opt_flip_matrices(ir) || progress; - - if (linked && options->OptimizeForAOS) { - progress = do_vectorize(ir) || progress; - } - - if (linked) - progress = do_dead_code(ir, uniform_locations_assigned) || progress; - else - progress = do_dead_code_unlinked(ir) || progress; - progress = do_dead_code_local(ir) || progress; - progress = do_tree_grafting(ir) || progress; - progress = do_constant_propagation(ir) || progress; - if (linked) - progress = do_constant_variable(ir) || progress; - else - progress = do_constant_variable_unlinked(ir) || progress; - progress = do_constant_folding(ir) || progress; - progress = do_minmax_prune(ir) || progress; - progress = do_cse(ir) || progress; - progress = do_rebalance_tree(ir) || progress; - progress = do_algebraic(ir, native_integers, options) || progress; - progress = do_lower_jumps(ir) || progress; - progress = do_vec_index_to_swizzle(ir) || progress; - progress = lower_vector_insert(ir, false) || progress; - progress = do_swizzle_swizzle(ir) || progress; - progress = do_noop_swizzle(ir) || progress; - - progress = optimize_split_arrays(ir, linked, false) || progress; - progress = optimize_redundant_jumps(ir) || progress; - - loop_state *ls = analyze_loop_variables(ir); - if (ls->loop_found) { - progress = set_loop_controls(ir, ls) || progress; - progress = unroll_loops(ir, ls, options) || progress; - } - delete ls; - - return !!progress; -} - -extern "C" { - -/** - * To be called at GL teardown time, this frees compiler datastructures. - * - * After calling this, any previously compiled shaders and shader - * programs would be invalid. So this should happen at approximately - * program exit. - */ -void -_mesa_destroy_shader_compiler(void) -{ - _mesa_destroy_shader_compiler_caches(); - - _mesa_glsl_release_types(); -} - -/** - * Releases compiler caches to trade off performance for memory. - * - * Intended to be used with glReleaseShaderCompiler(). - */ -void -_mesa_destroy_shader_compiler_caches(void) -{ - _mesa_glsl_release_builtin_functions(); -} - -} diff --git a/3rdparty/glsl-optimizer/src/glsl/glsl_parser_extras.h b/3rdparty/glsl-optimizer/src/glsl/glsl_parser_extras.h deleted file mode 100644 index 2f9ab717b..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glsl_parser_extras.h +++ /dev/null @@ -1,601 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef GLSL_PARSER_EXTRAS_H -#define GLSL_PARSER_EXTRAS_H - -/* - * Most of the definitions here only apply to C++ - */ -#ifdef __cplusplus - - -#include -#include "glsl_symbol_table.h" - -struct gl_context; - -struct glsl_switch_state { - /** Temporary variables needed for switch statement. */ - ir_variable *test_var; - ir_variable *is_fallthru_var; - ir_variable *is_break_var; - class ast_switch_statement *switch_nesting_ast; - - /** Used to set condition if 'default' label should be chosen. */ - ir_variable *run_default; - - /** Table of constant values already used in case labels */ - struct hash_table *labels_ht; - class ast_case_label *previous_default; - - bool is_switch_innermost; // if switch stmt is closest to break, ... -}; - -const char * -glsl_compute_version_string(void *mem_ctx, bool is_es, unsigned version); - -typedef struct YYLTYPE { - int first_line; - int first_column; - int last_line; - int last_column; - unsigned source; -} YYLTYPE; -# define YYLTYPE_IS_DECLARED 1 -# define YYLTYPE_IS_TRIVIAL 1 - -extern void _mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state, - const char *fmt, ...); - - -struct _mesa_glsl_parse_state { - _mesa_glsl_parse_state(struct gl_context *_ctx, gl_shader_stage stage, - void *mem_ctx); - - DECLARE_RALLOC_CXX_OPERATORS(_mesa_glsl_parse_state); - - /** - * Generate a string representing the GLSL version currently being compiled - * (useful for error messages). - */ - const char *get_version_string() - { - return glsl_compute_version_string(this, this->es_shader, - this->language_version); - } - - /** - * Determine whether the current GLSL version is sufficiently high to - * support a certain feature. - * - * \param required_glsl_version is the desktop GLSL version that is - * required to support the feature, or 0 if no version of desktop GLSL - * supports the feature. - * - * \param required_glsl_es_version is the GLSL ES version that is required - * to support the feature, or 0 if no version of GLSL ES suports the - * feature. - */ - bool is_version(unsigned required_glsl_version, - unsigned required_glsl_es_version) const - { - unsigned required_version = this->es_shader ? - required_glsl_es_version : required_glsl_version; - return required_version != 0 - && this->language_version >= required_version; - } - - bool check_version(unsigned required_glsl_version, - unsigned required_glsl_es_version, - YYLTYPE *locp, const char *fmt, ...) PRINTFLIKE(5, 6); - - bool check_precision_qualifiers_allowed(YYLTYPE *locp) - { - return check_version(130, 100, locp, - "precision qualifiers are forbidden"); - } - - bool check_bitwise_operations_allowed(YYLTYPE *locp) - { - return check_version(130, 300, locp, "bit-wise operations are forbidden"); - } - - bool check_explicit_attrib_stream_allowed(YYLTYPE *locp) - { - if (!this->has_explicit_attrib_stream()) { - const char *const requirement = "GL_ARB_gpu_shader5 extension or GLSL 400"; - - _mesa_glsl_error(locp, this, "explicit stream requires %s", - requirement); - return false; - } - - return true; - } - - bool check_explicit_attrib_location_allowed(YYLTYPE *locp, - const ir_variable *var) - { - if (!this->has_explicit_attrib_location()) { - const char *const requirement = this->es_shader - ? "GLSL ES 300" - : "GL_ARB_explicit_attrib_location extension or GLSL 330"; - - _mesa_glsl_error(locp, this, "%s explicit location requires %s", - mode_string(var), requirement); - return false; - } - - return true; - } - - bool check_separate_shader_objects_allowed(YYLTYPE *locp, - const ir_variable *var) - { - if (!this->has_separate_shader_objects()) { - const char *const requirement = this->es_shader - ? "GL_EXT_separate_shader_objects extension" - : "GL_ARB_separate_shader_objects extension or GLSL 420"; - - _mesa_glsl_error(locp, this, "%s explicit location requires %s", - mode_string(var), requirement); - return false; - } - - return true; - } - - bool check_explicit_uniform_location_allowed(YYLTYPE *locp, - const ir_variable *) - { - if (!this->has_explicit_attrib_location() || - !this->ARB_explicit_uniform_location_enable) { - _mesa_glsl_error(locp, this, - "uniform explicit location requires " - "GL_ARB_explicit_uniform_location and either " - "GL_ARB_explicit_attrib_location or GLSL 330."); - return false; - } - - return true; - } - - bool has_explicit_attrib_stream() const - { - return ARB_gpu_shader5_enable || is_version(400, 0); - } - - bool has_explicit_attrib_location() const - { - return ARB_explicit_attrib_location_enable || is_version(330, 300); - } - - bool has_uniform_buffer_objects() const - { - return ARB_uniform_buffer_object_enable || is_version(140, 300); - } - - bool has_separate_shader_objects() const - { - return ARB_separate_shader_objects_enable || is_version(410, 0) - || EXT_separate_shader_objects_enable; - } - - void process_version_directive(YYLTYPE *locp, int version, - const char *ident); - - struct gl_context *const ctx; - void *scanner; - exec_list translation_unit; - glsl_symbol_table *symbols; - - unsigned num_supported_versions; - struct { - unsigned ver; - bool es; - } supported_versions[12]; - - bool es_shader; - bool metal_target; - unsigned language_version; - bool had_version_string; - bool had_float_precision; - gl_shader_stage stage; - - /** - * Number of nested struct_specifier levels - * - * Outside a struct_specifier, this is zero. - */ - unsigned struct_specifier_depth; - - /** - * Default uniform layout qualifiers tracked during parsing. - * Currently affects uniform blocks and uniform buffer variables in - * those blocks. - */ - struct ast_type_qualifier *default_uniform_qualifier; - - /** - * Variables to track different cases if a fragment shader redeclares - * built-in variable gl_FragCoord. - * - * Note: These values are computed at ast_to_hir time rather than at parse - * time. - */ - bool fs_redeclares_gl_fragcoord; - bool fs_origin_upper_left; - bool fs_pixel_center_integer; - bool fs_redeclares_gl_fragcoord_with_no_layout_qualifiers; - - /** - * True if a geometry shader input primitive type was specified using a - * layout directive. - * - * Note: this value is computed at ast_to_hir time rather than at parse - * time. - */ - bool gs_input_prim_type_specified; - - /** Input layout qualifiers from GLSL 1.50. (geometry shader controls)*/ - struct ast_type_qualifier *in_qualifier; - - /** - * True if a compute shader input local size was specified using a layout - * directive. - * - * Note: this value is computed at ast_to_hir time rather than at parse - * time. - */ - bool cs_input_local_size_specified; - - /** - * If cs_input_local_size_specified is true, the local size that was - * specified. Otherwise ignored. - */ - unsigned cs_input_local_size[3]; - - /** Output layout qualifiers from GLSL 1.50. (geometry shader controls)*/ - struct ast_type_qualifier *out_qualifier; - - /** - * Printable list of GLSL versions supported by the current context - * - * \note - * This string should probably be generated per-context instead of per - * invokation of the compiler. This should be changed when the method of - * tracking supported GLSL versions changes. - */ - const char *supported_version_string; - - /** - * Implementation defined limits that affect built-in variables, etc. - * - * \sa struct gl_constants (in mtypes.h) - */ - struct { - /* 1.10 */ - unsigned MaxLights; - unsigned MaxClipPlanes; - unsigned MaxTextureUnits; - unsigned MaxTextureCoords; - unsigned MaxVertexAttribs; - unsigned MaxVertexUniformComponents; - unsigned MaxVertexTextureImageUnits; - unsigned MaxCombinedTextureImageUnits; - unsigned MaxTextureImageUnits; - unsigned MaxFragmentUniformComponents; - - /* ARB_draw_buffers */ - unsigned MaxDrawBuffers; - - /* 3.00 ES */ - int MinProgramTexelOffset; - int MaxProgramTexelOffset; - - /* 1.50 */ - unsigned MaxVertexOutputComponents; - unsigned MaxGeometryInputComponents; - unsigned MaxGeometryOutputComponents; - unsigned MaxFragmentInputComponents; - unsigned MaxGeometryTextureImageUnits; - unsigned MaxGeometryOutputVertices; - unsigned MaxGeometryTotalOutputComponents; - unsigned MaxGeometryUniformComponents; - - /* ARB_shader_atomic_counters */ - unsigned MaxVertexAtomicCounters; - unsigned MaxGeometryAtomicCounters; - unsigned MaxFragmentAtomicCounters; - unsigned MaxCombinedAtomicCounters; - unsigned MaxAtomicBufferBindings; - - /* ARB_compute_shader */ - unsigned MaxComputeWorkGroupCount[3]; - unsigned MaxComputeWorkGroupSize[3]; - - /* ARB_shader_image_load_store */ - unsigned MaxImageUnits; - unsigned MaxCombinedImageUnitsAndFragmentOutputs; - unsigned MaxImageSamples; - unsigned MaxVertexImageUniforms; - unsigned MaxGeometryImageUniforms; - unsigned MaxFragmentImageUniforms; - unsigned MaxCombinedImageUniforms; - } Const; - - /** - * During AST to IR conversion, pointer to current IR function - * - * Will be \c NULL whenever the AST to IR conversion is not inside a - * function definition. - */ - class ir_function_signature *current_function; - - /** - * During AST to IR conversion, pointer to the toplevel IR - * instruction list being generated. - */ - exec_list *toplevel_ir; - - /** Have we found a return statement in this function? */ - bool found_return; - - /** Was there an error during compilation? */ - bool error; - - /** - * Are all shader inputs / outputs invariant? - * - * This is set when the 'STDGL invariant(all)' pragma is used. - */ - bool all_invariant; - - /** Loop or switch statement containing the current instructions. */ - class ast_iteration_statement *loop_nesting_ast; - - struct glsl_switch_state switch_state; - - /** List of structures defined in user code. */ - const glsl_type **user_structures; - unsigned num_user_structures; - - char *info_log; - - /** - * \name Enable bits for GLSL extensions - */ - /*@{*/ - /* ARB extensions go here, sorted alphabetically. - */ - bool ARB_arrays_of_arrays_enable; - bool ARB_arrays_of_arrays_warn; - bool ARB_compute_shader_enable; - bool ARB_compute_shader_warn; - bool ARB_conservative_depth_enable; - bool ARB_conservative_depth_warn; - bool ARB_derivative_control_enable; - bool ARB_derivative_control_warn; - bool ARB_draw_buffers_enable; - bool ARB_draw_buffers_warn; - bool ARB_draw_instanced_enable; - bool ARB_draw_instanced_warn; - bool ARB_explicit_attrib_location_enable; - bool ARB_explicit_attrib_location_warn; - bool ARB_explicit_uniform_location_enable; - bool ARB_explicit_uniform_location_warn; - bool ARB_fragment_coord_conventions_enable; - bool ARB_fragment_coord_conventions_warn; - bool ARB_fragment_layer_viewport_enable; - bool ARB_fragment_layer_viewport_warn; - bool ARB_gpu_shader5_enable; - bool ARB_gpu_shader5_warn; - bool ARB_sample_shading_enable; - bool ARB_sample_shading_warn; - bool ARB_separate_shader_objects_enable; - bool ARB_separate_shader_objects_warn; - bool ARB_shader_atomic_counters_enable; - bool ARB_shader_atomic_counters_warn; - bool ARB_shader_bit_encoding_enable; - bool ARB_shader_bit_encoding_warn; - bool ARB_shader_image_load_store_enable; - bool ARB_shader_image_load_store_warn; - bool ARB_shader_stencil_export_enable; - bool ARB_shader_stencil_export_warn; - bool ARB_shader_texture_lod_enable; - bool ARB_shader_texture_lod_warn; - bool ARB_shader_viewport_layer_array_enable; - bool ARB_shader_viewport_layer_array_warn; - bool ARB_shading_language_420pack_enable; - bool ARB_shading_language_420pack_warn; - bool ARB_shading_language_packing_enable; - bool ARB_shading_language_packing_warn; - bool ARB_texture_cube_map_array_enable; - bool ARB_texture_cube_map_array_warn; - bool ARB_texture_gather_enable; - bool ARB_texture_gather_warn; - bool ARB_texture_multisample_enable; - bool ARB_texture_multisample_warn; - bool ARB_texture_query_levels_enable; - bool ARB_texture_query_levels_warn; - bool ARB_texture_query_lod_enable; - bool ARB_texture_query_lod_warn; - bool ARB_texture_rectangle_enable; - bool ARB_texture_rectangle_warn; - bool ARB_uniform_buffer_object_enable; - bool ARB_uniform_buffer_object_warn; - bool ARB_viewport_array_enable; - bool ARB_viewport_array_warn; - - /* KHR extensions go here, sorted alphabetically. - */ - - /* OES extensions go here, sorted alphabetically. - */ - bool OES_EGL_image_external_enable; - bool OES_EGL_image_external_warn; - bool OES_standard_derivatives_enable; - bool OES_standard_derivatives_warn; - bool OES_texture_3D_enable; - bool OES_texture_3D_warn; - - /* All other extensions go here, sorted alphabetically. - */ - bool AMD_conservative_depth_enable; - bool AMD_conservative_depth_warn; - bool AMD_shader_stencil_export_enable; - bool AMD_shader_stencil_export_warn; - bool AMD_shader_trinary_minmax_enable; - bool AMD_shader_trinary_minmax_warn; - bool AMD_vertex_shader_layer_enable; - bool AMD_vertex_shader_layer_warn; - bool AMD_vertex_shader_viewport_index_enable; - bool AMD_vertex_shader_viewport_index_warn; - bool EXT_draw_buffers_enable; - bool EXT_draw_buffers_warn; - bool EXT_draw_instanced_enable; - bool EXT_draw_instanced_warn; - bool EXT_frag_depth_enable; - bool EXT_frag_depth_warn; - bool EXT_gpu_shader4_enable; - bool EXT_gpu_shader4_warn; - bool EXT_separate_shader_objects_enable; - bool EXT_separate_shader_objects_warn; - bool EXT_shader_framebuffer_fetch_enable; - bool EXT_shader_framebuffer_fetch_warn; - bool EXT_shader_integer_mix_enable; - bool EXT_shader_integer_mix_warn; - bool EXT_shader_texture_lod_enable; - bool EXT_shader_texture_lod_warn; - bool EXT_shadow_samplers_enable; - bool EXT_shadow_samplers_warn; - bool EXT_texture_array_enable; - bool EXT_texture_array_warn; - - /*@}*/ - - /** Extensions supported by the OpenGL implementation. */ - const struct gl_extensions *extensions; - - bool uses_builtin_functions; - bool fs_uses_gl_fragcoord; - - /** - * For geometry shaders, size of the most recently seen input declaration - * that was a sized array, or 0 if no sized input array declarations have - * been seen. - * - * Unused for other shader types. - */ - unsigned gs_input_size; - - bool early_fragment_tests; - - /** Atomic counter offsets by binding */ - unsigned atomic_counter_offsets[MAX_COMBINED_ATOMIC_BUFFERS]; - - bool allow_extension_directive_midshader; -}; - -# define YYLLOC_DEFAULT(Current, Rhs, N) \ -do { \ - if (N) \ - { \ - (Current).first_line = YYRHSLOC(Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC(Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC(Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC(Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC(Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC(Rhs, 0).last_column; \ - } \ - (Current).source = 0; \ -} while (0) - -/** - * Emit a warning to the shader log - * - * \sa _mesa_glsl_error - */ -extern void _mesa_glsl_warning(const YYLTYPE *locp, - _mesa_glsl_parse_state *state, - const char *fmt, ...); - -extern void _mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state, - const char *string); - -extern void _mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state); - -union YYSTYPE; -extern int _mesa_glsl_lexer_lex(union YYSTYPE *yylval, YYLTYPE *yylloc, - void *scanner); - -extern int _mesa_glsl_parse(struct _mesa_glsl_parse_state *); - -/** - * Process elements of the #extension directive - * - * \return - * If \c name and \c behavior are valid, \c true is returned. Otherwise - * \c false is returned. - */ -extern bool _mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp, - const char *behavior, - YYLTYPE *behavior_locp, - _mesa_glsl_parse_state *state); - -#endif /* __cplusplus */ - - -/* - * These definitions apply to C and C++ - */ -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Get the textual name of the specified shader stage (which is a - * gl_shader_stage). - */ -extern const char * -_mesa_shader_stage_to_string(unsigned stage); - -extern int glcpp_preprocess(void *ctx, const char **shader, char **info_log, - const struct gl_extensions *extensions, struct gl_context *gl_ctx); - -extern void _mesa_destroy_shader_compiler(void); -extern void _mesa_destroy_shader_compiler_caches(void); - -#ifdef __cplusplus -} -#endif - - -#endif /* GLSL_PARSER_EXTRAS_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/glsl_symbol_table.cpp b/3rdparty/glsl-optimizer/src/glsl/glsl_symbol_table.cpp deleted file mode 100644 index 2294dda42..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glsl_symbol_table.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "glsl_symbol_table.h" - -class symbol_table_entry { -public: - DECLARE_RALLOC_CXX_OPERATORS(symbol_table_entry); - - bool add_interface(const glsl_type *i, enum ir_variable_mode mode) - { - const glsl_type **dest; - - switch (mode) { - case ir_var_uniform: - dest = &ibu; - break; - case ir_var_shader_in: - dest = &ibi; - break; - case ir_var_shader_out: - dest = &ibo; - break; - default: - assert(!"Unsupported interface variable mode!"); - return false; - } - - if (*dest != NULL) { - return false; - } else { - *dest = i; - return true; - } - } - - const glsl_type *get_interface(enum ir_variable_mode mode) - { - switch (mode) { - case ir_var_uniform: - return ibu; - case ir_var_shader_in: - return ibi; - case ir_var_shader_out: - return ibo; - default: - assert(!"Unsupported interface variable mode!"); - return NULL; - } - } - - symbol_table_entry(ir_variable *v) : - v(v), f(0), t(0), ibu(0), ibi(0), ibo(0), a(0) {} - symbol_table_entry(ir_function *f) : - v(0), f(f), t(0), ibu(0), ibi(0), ibo(0), a(0) {} - symbol_table_entry(const glsl_type *t) : - v(0), f(0), t(t), ibu(0), ibi(0), ibo(0), a(0) {} - symbol_table_entry(const glsl_type *t, enum ir_variable_mode mode) : - v(0), f(0), t(0), ibu(0), ibi(0), ibo(0), a(0) - { - assert(t->is_interface()); - add_interface(t, mode); - } - symbol_table_entry(const class ast_type_specifier *a): - v(0), f(0), t(0), ibu(0), ibi(0), ibo(0), a(a) {} - - ir_variable *v; - ir_function *f; - const glsl_type *t; - const glsl_type *ibu; - const glsl_type *ibi; - const glsl_type *ibo; - const class ast_type_specifier *a; -}; - -glsl_symbol_table::glsl_symbol_table() -{ - this->separate_function_namespace = false; - this->table = _mesa_symbol_table_ctor(); - this->mem_ctx = ralloc_context(NULL); -} - -glsl_symbol_table::~glsl_symbol_table() -{ - _mesa_symbol_table_dtor(table); - ralloc_free(mem_ctx); -} - -void glsl_symbol_table::push_scope() -{ - _mesa_symbol_table_push_scope(table); -} - -void glsl_symbol_table::pop_scope() -{ - _mesa_symbol_table_pop_scope(table); -} - -bool glsl_symbol_table::name_declared_this_scope(const char *name) -{ - return _mesa_symbol_table_symbol_scope(table, -1, name) == 0; -} - -bool glsl_symbol_table::add_variable(ir_variable *v) -{ - assert(v->data.mode != ir_var_temporary); - - if (this->separate_function_namespace) { - /* In 1.10, functions and variables have separate namespaces. */ - symbol_table_entry *existing = get_entry(v->name); - if (name_declared_this_scope(v->name)) { - /* If there's already an existing function (not a constructor!) in - * the current scope, just update the existing entry to include 'v'. - */ - if (existing->v == NULL && existing->t == NULL) { - existing->v = v; - return true; - } - } else { - /* If not declared at this scope, add a new entry. But if an existing - * entry includes a function, propagate that to this block - otherwise - * the new variable declaration would shadow the function. - */ - symbol_table_entry *entry = new(mem_ctx) symbol_table_entry(v); - if (existing != NULL) - entry->f = existing->f; - int added = _mesa_symbol_table_add_symbol(table, -1, v->name, entry); - assert(added == 0); - (void)added; - return true; - } - return false; - } - - /* 1.20+ rules: */ - symbol_table_entry *entry = new(mem_ctx) symbol_table_entry(v); - return _mesa_symbol_table_add_symbol(table, -1, v->name, entry) == 0; -} - -bool glsl_symbol_table::add_type(const char *name, const glsl_type *t) -{ - symbol_table_entry *entry = new(mem_ctx) symbol_table_entry(t); - return _mesa_symbol_table_add_symbol(table, -1, name, entry) == 0; -} - -bool glsl_symbol_table::add_interface(const char *name, const glsl_type *i, - enum ir_variable_mode mode) -{ - assert(i->is_interface()); - symbol_table_entry *entry = get_entry(name); - if (entry == NULL) { - symbol_table_entry *entry = - new(mem_ctx) symbol_table_entry(i, mode); - bool add_interface_symbol_result = - _mesa_symbol_table_add_symbol(table, -1, name, entry) == 0; - assert(add_interface_symbol_result); - return add_interface_symbol_result; - } else { - return entry->add_interface(i, mode); - } -} - -bool glsl_symbol_table::add_function(ir_function *f) -{ - if (this->separate_function_namespace && name_declared_this_scope(f->name)) { - /* In 1.10, functions and variables have separate namespaces. */ - symbol_table_entry *existing = get_entry(f->name); - if ((existing->f == NULL) && (existing->t == NULL)) { - existing->f = f; - return true; - } - } - symbol_table_entry *entry = new(mem_ctx) symbol_table_entry(f); - return _mesa_symbol_table_add_symbol(table, -1, f->name, entry) == 0; -} - -void glsl_symbol_table::add_global_function(ir_function *f) -{ - symbol_table_entry *entry = new(mem_ctx) symbol_table_entry(f); - int added = _mesa_symbol_table_add_global_symbol(table, -1, f->name, entry); - assert(added == 0); - (void)added; -} - -ir_variable *glsl_symbol_table::get_variable(const char *name) -{ - symbol_table_entry *entry = get_entry(name); - return entry != NULL ? entry->v : NULL; -} - -const glsl_type *glsl_symbol_table::get_type(const char *name) -{ - symbol_table_entry *entry = get_entry(name); - return entry != NULL ? entry->t : NULL; -} - -const glsl_type *glsl_symbol_table::get_interface(const char *name, - enum ir_variable_mode mode) -{ - symbol_table_entry *entry = get_entry(name); - return entry != NULL ? entry->get_interface(mode) : NULL; -} - -ir_function *glsl_symbol_table::get_function(const char *name) -{ - symbol_table_entry *entry = get_entry(name); - return entry != NULL ? entry->f : NULL; -} - -symbol_table_entry *glsl_symbol_table::get_entry(const char *name) -{ - return (symbol_table_entry *) - _mesa_symbol_table_find_symbol(table, -1, name); -} - -void -glsl_symbol_table::disable_variable(const char *name) -{ - /* Ideally we would remove the variable's entry from the symbol table, but - * that would be difficult. Fortunately, since this is only used for - * built-in variables, it won't be possible for the shader to re-introduce - * the variable later, so all we really need to do is to make sure that - * further attempts to access it using get_variable() will return NULL. - */ - symbol_table_entry *entry = get_entry(name); - if (entry != NULL) { - entry->v = NULL; - } -} diff --git a/3rdparty/glsl-optimizer/src/glsl/glsl_symbol_table.h b/3rdparty/glsl-optimizer/src/glsl/glsl_symbol_table.h deleted file mode 100644 index e32b88b86..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glsl_symbol_table.h +++ /dev/null @@ -1,108 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef GLSL_SYMBOL_TABLE -#define GLSL_SYMBOL_TABLE - -#include - -extern "C" { -#include "program/symbol_table.h" -} -#include "ir.h" - -class symbol_table_entry; -struct glsl_type; - -/** - * Facade class for _mesa_symbol_table - * - * Wraps the existing \c _mesa_symbol_table data structure to enforce some - * type safe and some symbol table invariants. - */ -struct glsl_symbol_table { - DECLARE_RALLOC_CXX_OPERATORS(glsl_symbol_table) - - glsl_symbol_table(); - ~glsl_symbol_table(); - - /* In 1.10, functions and variables have separate namespaces. */ - bool separate_function_namespace; - - void push_scope(); - void pop_scope(); - - /** - * Determine whether a name was declared at the current scope - */ - bool name_declared_this_scope(const char *name); - - /** - * \name Methods to add symbols to the table - * - * There is some temptation to rename all these functions to \c add_symbol - * or similar. However, this breaks symmetry with the getter functions and - * reduces the clarity of the intention of code that uses these methods. - */ - /*@{*/ - bool add_variable(ir_variable *v); - bool add_type(const char *name, const glsl_type *t); - bool add_function(ir_function *f); - bool add_interface(const char *name, const glsl_type *i, - enum ir_variable_mode mode); - /*@}*/ - - /** - * Add an function at global scope without checking for scoping conflicts. - */ - void add_global_function(ir_function *f); - - /** - * \name Methods to get symbols from the table - */ - /*@{*/ - ir_variable *get_variable(const char *name); - const glsl_type *get_type(const char *name); - ir_function *get_function(const char *name); - const glsl_type *get_interface(const char *name, - enum ir_variable_mode mode); - /*@}*/ - - /** - * Disable a previously-added variable so that it no longer appears to be - * in the symbol table. This is necessary when gl_PerVertex is redeclared, - * to ensure that previously-available built-in variables are no longer - * available. - */ - void disable_variable(const char *name); - -private: - symbol_table_entry *get_entry(const char *name); - - struct _mesa_symbol_table *table; - void *mem_ctx; -}; - -#endif /* GLSL_SYMBOL_TABLE */ diff --git a/3rdparty/glsl-optimizer/src/glsl/glsl_types.cpp b/3rdparty/glsl-optimizer/src/glsl/glsl_types.cpp deleted file mode 100644 index 4e10082cd..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glsl_types.cpp +++ /dev/null @@ -1,1098 +0,0 @@ -/* - * Copyright © 2009 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include -#include "main/core.h" /* for Elements, MAX2 */ -#include "glsl_parser_extras.h" -#include "glsl_types.h" -#include "main/glminimal.h" -extern "C" { -#include "program/hash_table.h" -} - -hash_table *glsl_type::array_types = NULL; -hash_table *glsl_type::record_types = NULL; -hash_table *glsl_type::interface_types = NULL; -void *glsl_type::mem_ctx = NULL; - -void -glsl_type::init_ralloc_type_ctx(void) -{ - if (glsl_type::mem_ctx == NULL) { - glsl_type::mem_ctx = ralloc_autofree_context(); - assert(glsl_type::mem_ctx != NULL); - } -} - -glsl_type::glsl_type(GLenum gl_type, - glsl_base_type base_type, unsigned vector_elements, - unsigned matrix_columns, const char *name) : - gl_type(gl_type), - base_type(base_type), - sampler_dimensionality(0), sampler_shadow(0), sampler_array(0), - sampler_type(0), interface_packing(0), - vector_elements(vector_elements), matrix_columns(matrix_columns), - length(0) -{ - init_ralloc_type_ctx(); - assert(name != NULL); - this->name = ralloc_strdup(this->mem_ctx, name); - /* Neither dimension is zero or both dimensions are zero. - */ - assert((vector_elements == 0) == (matrix_columns == 0)); - memset(& fields, 0, sizeof(fields)); -} - -glsl_type::glsl_type(GLenum gl_type, glsl_base_type base_type, - enum glsl_sampler_dim dim, bool shadow, bool array, - unsigned type, const char *name) : - gl_type(gl_type), - base_type(base_type), - sampler_dimensionality(dim), sampler_shadow(shadow), - sampler_array(array), sampler_type(type), interface_packing(0), - length(0) -{ - init_ralloc_type_ctx(); - assert(name != NULL); - this->name = ralloc_strdup(this->mem_ctx, name); - memset(& fields, 0, sizeof(fields)); - - if (base_type == GLSL_TYPE_SAMPLER) { - /* Samplers take no storage whatsoever. */ - matrix_columns = vector_elements = 0; - } else { - matrix_columns = vector_elements = 1; - } -} - -glsl_type::glsl_type(const glsl_struct_field *fields, unsigned num_fields, - const char *name) : - gl_type(0), - base_type(GLSL_TYPE_STRUCT), - sampler_dimensionality(0), sampler_shadow(0), sampler_array(0), - sampler_type(0), interface_packing(0), - vector_elements(0), matrix_columns(0), - length(num_fields) -{ - unsigned int i; - - init_ralloc_type_ctx(); - assert(name != NULL); - this->name = ralloc_strdup(this->mem_ctx, name); - this->fields.structure = ralloc_array(this->mem_ctx, - glsl_struct_field, length); - for (i = 0; i < length; i++) { - this->fields.structure[i].type = fields[i].type; - this->fields.structure[i].name = ralloc_strdup(this->fields.structure, - fields[i].name); - this->fields.structure[i].precision = fields[i].precision; - this->fields.structure[i].location = fields[i].location; - this->fields.structure[i].interpolation = fields[i].interpolation; - this->fields.structure[i].centroid = fields[i].centroid; - this->fields.structure[i].sample = fields[i].sample; - this->fields.structure[i].matrix_layout = fields[i].matrix_layout; - } -} - -glsl_type::glsl_type(const glsl_struct_field *fields, unsigned num_fields, - enum glsl_interface_packing packing, const char *name) : - gl_type(0), - base_type(GLSL_TYPE_INTERFACE), - sampler_dimensionality(0), sampler_shadow(0), sampler_array(0), - sampler_type(0), interface_packing((unsigned) packing), - vector_elements(0), matrix_columns(0), - length(num_fields) -{ - unsigned int i; - - init_ralloc_type_ctx(); - assert(name != NULL); - this->name = ralloc_strdup(this->mem_ctx, name); - this->fields.structure = ralloc_array(this->mem_ctx, - glsl_struct_field, length); - for (i = 0; i < length; i++) { - this->fields.structure[i].type = fields[i].type; - this->fields.structure[i].name = ralloc_strdup(this->fields.structure, - fields[i].name); - this->fields.structure[i].precision = fields[i].precision; - this->fields.structure[i].location = fields[i].location; - this->fields.structure[i].interpolation = fields[i].interpolation; - this->fields.structure[i].centroid = fields[i].centroid; - this->fields.structure[i].sample = fields[i].sample; - this->fields.structure[i].matrix_layout = fields[i].matrix_layout; - } -} - - -bool -glsl_type::contains_sampler() const -{ - if (this->is_array()) { - return this->fields.array->contains_sampler(); - } else if (this->is_record()) { - for (unsigned int i = 0; i < this->length; i++) { - if (this->fields.structure[i].type->contains_sampler()) - return true; - } - return false; - } else { - return this->is_sampler(); - } -} - - -bool -glsl_type::contains_integer() const -{ - if (this->is_array()) { - return this->fields.array->contains_integer(); - } else if (this->is_record()) { - for (unsigned int i = 0; i < this->length; i++) { - if (this->fields.structure[i].type->contains_integer()) - return true; - } - return false; - } else { - return this->is_integer(); - } -} - -bool -glsl_type::contains_opaque() const { - switch (base_type) { - case GLSL_TYPE_SAMPLER: - case GLSL_TYPE_IMAGE: - case GLSL_TYPE_ATOMIC_UINT: - return true; - case GLSL_TYPE_ARRAY: - return element_type()->contains_opaque(); - case GLSL_TYPE_STRUCT: - for (unsigned int i = 0; i < length; i++) { - if (fields.structure[i].type->contains_opaque()) - return true; - } - return false; - default: - return false; - } -} - -gl_texture_index -glsl_type::sampler_index() const -{ - const glsl_type *const t = (this->is_array()) ? this->fields.array : this; - - assert(t->is_sampler()); - - switch (t->sampler_dimensionality) { - case GLSL_SAMPLER_DIM_1D: - return (t->sampler_array) ? TEXTURE_1D_ARRAY_INDEX : TEXTURE_1D_INDEX; - case GLSL_SAMPLER_DIM_2D: - return (t->sampler_array) ? TEXTURE_2D_ARRAY_INDEX : TEXTURE_2D_INDEX; - case GLSL_SAMPLER_DIM_3D: - return TEXTURE_3D_INDEX; - case GLSL_SAMPLER_DIM_CUBE: - return (t->sampler_array) ? TEXTURE_CUBE_ARRAY_INDEX : TEXTURE_CUBE_INDEX; - case GLSL_SAMPLER_DIM_RECT: - return TEXTURE_RECT_INDEX; - case GLSL_SAMPLER_DIM_BUF: - return TEXTURE_BUFFER_INDEX; - case GLSL_SAMPLER_DIM_EXTERNAL: - return TEXTURE_EXTERNAL_INDEX; - case GLSL_SAMPLER_DIM_MS: - return (t->sampler_array) ? TEXTURE_2D_MULTISAMPLE_ARRAY_INDEX : TEXTURE_2D_MULTISAMPLE_INDEX; - default: - assert(!"Should not get here."); - return TEXTURE_BUFFER_INDEX; - } -} - -bool -glsl_type::contains_image() const -{ - if (this->is_array()) { - return this->fields.array->contains_image(); - } else if (this->is_record()) { - for (unsigned int i = 0; i < this->length; i++) { - if (this->fields.structure[i].type->contains_image()) - return true; - } - return false; - } else { - return this->is_image(); - } -} - -const glsl_type *glsl_type::get_base_type() const -{ - switch (base_type) { - case GLSL_TYPE_UINT: - return uint_type; - case GLSL_TYPE_INT: - return int_type; - case GLSL_TYPE_FLOAT: - return float_type; - case GLSL_TYPE_BOOL: - return bool_type; - default: - return error_type; - } -} - - -const glsl_type *glsl_type::get_scalar_type() const -{ - const glsl_type *type = this; - - /* Handle arrays */ - while (type->base_type == GLSL_TYPE_ARRAY) - type = type->fields.array; - - /* Handle vectors and matrices */ - switch (type->base_type) { - case GLSL_TYPE_UINT: - return uint_type; - case GLSL_TYPE_INT: - return int_type; - case GLSL_TYPE_FLOAT: - return float_type; - case GLSL_TYPE_BOOL: - return bool_type; - default: - /* Handle everything else */ - return type; - } -} - - -void -_mesa_glsl_release_types(void) -{ - if (glsl_type::array_types != NULL) { - hash_table_dtor(glsl_type::array_types); - glsl_type::array_types = NULL; - } - - if (glsl_type::record_types != NULL) { - hash_table_dtor(glsl_type::record_types); - glsl_type::record_types = NULL; - } -} - - -glsl_type::glsl_type(const glsl_type *array, unsigned length) : - base_type(GLSL_TYPE_ARRAY), - sampler_dimensionality(0), sampler_shadow(0), sampler_array(0), - sampler_type(0), interface_packing(0), - vector_elements(0), matrix_columns(0), - name(NULL), length(length) -{ - this->fields.array = array; - /* Inherit the gl type of the base. The GL type is used for - * uniform/statevar handling in Mesa and the arrayness of the type - * is represented by the size rather than the type. - */ - this->gl_type = array->gl_type; - - /* Allow a maximum of 10 characters for the array size. This is enough - * for 32-bits of ~0. The extra 3 are for the '[', ']', and terminating - * NUL. - */ - const unsigned name_length = (unsigned)strlen(array->name) + 10 + 3; - char *const n = (char *) ralloc_size(this->mem_ctx, name_length); - - if (length == 0) - snprintf(n, name_length, "%s[]", array->name); - else { - /* insert outermost dimensions in the correct spot - * otherwise the dimension order will be backwards - */ - const char *pos = strchr(array->name, '['); - if (pos) { - int idx = pos - array->name; - snprintf(n, idx+1, "%s", array->name); - snprintf(n + idx, name_length - idx, "[%u]%s", - length, array->name + idx); - } else { - snprintf(n, name_length, "%s[%u]", array->name, length); - } - } - - this->name = n; -} - - -const glsl_type * -glsl_type::vec(unsigned components) -{ - if (components == 0 || components > 4) - return error_type; - - static const glsl_type *const ts[] = { - float_type, vec2_type, vec3_type, vec4_type - }; - return ts[components - 1]; -} - - -const glsl_type * -glsl_type::ivec(unsigned components) -{ - if (components == 0 || components > 4) - return error_type; - - static const glsl_type *const ts[] = { - int_type, ivec2_type, ivec3_type, ivec4_type - }; - return ts[components - 1]; -} - - -const glsl_type * -glsl_type::uvec(unsigned components) -{ - if (components == 0 || components > 4) - return error_type; - - static const glsl_type *const ts[] = { - uint_type, uvec2_type, uvec3_type, uvec4_type - }; - return ts[components - 1]; -} - - -const glsl_type * -glsl_type::bvec(unsigned components) -{ - if (components == 0 || components > 4) - return error_type; - - static const glsl_type *const ts[] = { - bool_type, bvec2_type, bvec3_type, bvec4_type - }; - return ts[components - 1]; -} - - -const glsl_type * -glsl_type::get_instance(unsigned base_type, unsigned rows, unsigned columns) -{ - if (base_type == GLSL_TYPE_VOID) - return void_type; - - if ((rows < 1) || (rows > 4) || (columns < 1) || (columns > 4)) - return error_type; - - /* Treat GLSL vectors as Nx1 matrices. - */ - if (columns == 1) { - switch (base_type) { - case GLSL_TYPE_UINT: - return uvec(rows); - case GLSL_TYPE_INT: - return ivec(rows); - case GLSL_TYPE_FLOAT: - return vec(rows); - case GLSL_TYPE_BOOL: - return bvec(rows); - default: - return error_type; - } - } else { - if ((base_type != GLSL_TYPE_FLOAT) || (rows == 1)) - return error_type; - - /* GLSL matrix types are named mat{COLUMNS}x{ROWS}. Only the following - * combinations are valid: - * - * 1 2 3 4 - * 1 - * 2 x x x - * 3 x x x - * 4 x x x - */ -#define IDX(c,r) (((c-1)*3) + (r-1)) - - switch (IDX(columns, rows)) { - case IDX(2,2): return mat2_type; - case IDX(2,3): return mat2x3_type; - case IDX(2,4): return mat2x4_type; - case IDX(3,2): return mat3x2_type; - case IDX(3,3): return mat3_type; - case IDX(3,4): return mat3x4_type; - case IDX(4,2): return mat4x2_type; - case IDX(4,3): return mat4x3_type; - case IDX(4,4): return mat4_type; - default: return error_type; - } - } - - assert(!"Should not get here."); - return error_type; -} - - -const glsl_type * -glsl_type::get_array_instance(const glsl_type *base, unsigned array_size) -{ - - if (array_types == NULL) { - array_types = hash_table_ctor(64, hash_table_string_hash, - hash_table_string_compare); - } - - /* Generate a name using the base type pointer in the key. This is - * done because the name of the base type may not be unique across - * shaders. For example, two shaders may have different record types - * named 'foo'. - */ - char key[128]; - snprintf(key, sizeof(key), "%p[%u]", (void *) base, array_size); - - const glsl_type *t = (glsl_type *) hash_table_find(array_types, key); - if (t == NULL) { - t = new glsl_type(base, array_size); - - hash_table_insert(array_types, (void *) t, ralloc_strdup(mem_ctx, key)); - } - - assert(t->base_type == GLSL_TYPE_ARRAY); - assert(t->length == array_size); - assert(t->fields.array == base); - - return t; -} - - -bool -glsl_type::record_compare(const glsl_type *b) const -{ - if (this->length != b->length) - return false; - - if (this->interface_packing != b->interface_packing) - return false; - - /* From the GLSL 4.20 specification (Sec 4.2): - * - * "Structures must have the same name, sequence of type names, and - * type definitions, and field names to be considered the same type." - * - * GLSL ES behaves the same (Ver 1.00 Sec 4.2.4, Ver 3.00 Sec 4.2.5). - * - * Note that we cannot force type name check when comparing unnamed - * structure types, these have a unique name assigned during parsing. - */ - if (!this->is_anonymous() && !b->is_anonymous()) - if (strcmp(this->name, b->name) != 0) - return false; - - for (unsigned i = 0; i < this->length; i++) { - if (this->fields.structure[i].type != b->fields.structure[i].type) - return false; - if (strcmp(this->fields.structure[i].name, - b->fields.structure[i].name) != 0) - return false; - if (this->fields.structure[i].matrix_layout - != b->fields.structure[i].matrix_layout) - return false; - if (this->fields.structure[i].location - != b->fields.structure[i].location) - return false; - if (this->fields.structure[i].interpolation - != b->fields.structure[i].interpolation) - return false; - if (this->fields.structure[i].centroid - != b->fields.structure[i].centroid) - return false; - if (this->fields.structure[i].sample - != b->fields.structure[i].sample) - return false; - if (this->fields.structure[i].precision - != b->fields.structure[i].precision) - return false; - } - - return true; -} - - -int -glsl_type::record_key_compare(const void *a, const void *b) -{ - const glsl_type *const key1 = (glsl_type *) a; - const glsl_type *const key2 = (glsl_type *) b; - - /* Return zero is the types match (there is zero difference) or non-zero - * otherwise. - */ - if (strcmp(key1->name, key2->name) != 0) - return 1; - - return !key1->record_compare(key2); -} - - -unsigned -glsl_type::record_key_hash(const void *a) -{ - const glsl_type *const key = (glsl_type *) a; - char hash_key[128]; - unsigned size = 0; - - size = snprintf(hash_key, sizeof(hash_key), "%08x", key->length); - - for (unsigned i = 0; i < key->length; i++) { - if (size >= sizeof(hash_key)) - break; - - size += snprintf(& hash_key[size], sizeof(hash_key) - size, - "%p", (void *) key->fields.structure[i].type); - } - - return hash_table_string_hash(& hash_key); -} - - -const glsl_type * -glsl_type::get_record_instance(const glsl_struct_field *fields, - unsigned num_fields, - const char *name) -{ - const glsl_type key(fields, num_fields, name); - - if (record_types == NULL) { - record_types = hash_table_ctor(64, record_key_hash, record_key_compare); - } - - const glsl_type *t = (glsl_type *) hash_table_find(record_types, & key); - if (t == NULL) { - t = new glsl_type(fields, num_fields, name); - - hash_table_insert(record_types, (void *) t, t); - } - - assert(t->base_type == GLSL_TYPE_STRUCT); - assert(t->length == num_fields); - assert(strcmp(t->name, name) == 0); - - return t; -} - - -const glsl_type * -glsl_type::get_interface_instance(const glsl_struct_field *fields, - unsigned num_fields, - enum glsl_interface_packing packing, - const char *block_name) -{ - const glsl_type key(fields, num_fields, packing, block_name); - - if (interface_types == NULL) { - interface_types = hash_table_ctor(64, record_key_hash, record_key_compare); - } - - const glsl_type *t = (glsl_type *) hash_table_find(interface_types, & key); - if (t == NULL) { - t = new glsl_type(fields, num_fields, packing, block_name); - - hash_table_insert(interface_types, (void *) t, t); - } - - assert(t->base_type == GLSL_TYPE_INTERFACE); - assert(t->length == num_fields); - assert(strcmp(t->name, block_name) == 0); - - return t; -} - - -const glsl_type * -glsl_type::field_type(const char *name) const -{ - if (this->base_type != GLSL_TYPE_STRUCT - && this->base_type != GLSL_TYPE_INTERFACE) - return error_type; - - for (unsigned i = 0; i < this->length; i++) { - if (strcmp(name, this->fields.structure[i].name) == 0) - return this->fields.structure[i].type; - } - - return error_type; -} - -glsl_precision -glsl_type::field_precision(const char *name) const -{ - if (this->base_type != GLSL_TYPE_STRUCT) - return glsl_precision_undefined; - - for (unsigned i = 0; i < this->length; i++) { - if (strcmp(name, this->fields.structure[i].name) == 0) - return this->fields.structure[i].precision; - } - - return glsl_precision_undefined; -} - - -int -glsl_type::field_index(const char *name) const -{ - if (this->base_type != GLSL_TYPE_STRUCT - && this->base_type != GLSL_TYPE_INTERFACE) - return -1; - - for (unsigned i = 0; i < this->length; i++) { - if (strcmp(name, this->fields.structure[i].name) == 0) - return i; - } - - return -1; -} - - -unsigned -glsl_type::component_slots() const -{ - switch (this->base_type) { - case GLSL_TYPE_UINT: - case GLSL_TYPE_INT: - case GLSL_TYPE_FLOAT: - case GLSL_TYPE_BOOL: - return this->components(); - - case GLSL_TYPE_STRUCT: - case GLSL_TYPE_INTERFACE: { - unsigned size = 0; - - for (unsigned i = 0; i < this->length; i++) - size += this->fields.structure[i].type->component_slots(); - - return size; - } - - case GLSL_TYPE_ARRAY: - return this->length * this->fields.array->component_slots(); - - case GLSL_TYPE_IMAGE: - return 1; - - case GLSL_TYPE_SAMPLER: - case GLSL_TYPE_ATOMIC_UINT: - case GLSL_TYPE_VOID: - case GLSL_TYPE_ERROR: - break; - } - - return 0; -} - -unsigned -glsl_type::uniform_locations() const -{ - unsigned size = 0; - - switch (this->base_type) { - case GLSL_TYPE_UINT: - case GLSL_TYPE_INT: - case GLSL_TYPE_FLOAT: - case GLSL_TYPE_BOOL: - case GLSL_TYPE_SAMPLER: - case GLSL_TYPE_IMAGE: - return 1; - - case GLSL_TYPE_STRUCT: - case GLSL_TYPE_INTERFACE: - for (unsigned i = 0; i < this->length; i++) - size += this->fields.structure[i].type->uniform_locations(); - return size; - case GLSL_TYPE_ARRAY: - return this->length * this->fields.array->uniform_locations(); - default: - return 0; - } -} - -bool -glsl_type::can_implicitly_convert_to(const glsl_type *desired, - _mesa_glsl_parse_state *state) const -{ - if (this == desired) - return true; - - /* There is no conversion among matrix types. */ - if (this->matrix_columns > 1 || desired->matrix_columns > 1) - return false; - - /* Vector size must match. */ - if (this->vector_elements != desired->vector_elements) - return false; - - /* int and uint can be converted to float. */ - if (desired->is_float() && this->is_integer()) - return true; - - /* With GLSL 4.0 / ARB_gpu_shader5, int can be converted to uint. - * Note that state may be NULL here, when resolving function calls in the - * linker. By this time, all the state-dependent checks have already - * happened though, so allow anything that's allowed in any shader version. */ - if ((!state || state->is_version(400, 0) || state->ARB_gpu_shader5_enable) && - desired->base_type == GLSL_TYPE_UINT && this->base_type == GLSL_TYPE_INT) - return true; - - return false; -} - -unsigned -glsl_type::std140_base_alignment(bool row_major) const -{ - /* (1) If the member is a scalar consuming basic machine units, the - * base alignment is . - * - * (2) If the member is a two- or four-component vector with components - * consuming basic machine units, the base alignment is 2 or - * 4, respectively. - * - * (3) If the member is a three-component vector with components consuming - * basic machine units, the base alignment is 4. - */ - if (this->is_scalar() || this->is_vector()) { - switch (this->vector_elements) { - case 1: - return 4; - case 2: - return 8; - case 3: - case 4: - return 16; - } - } - - /* (4) If the member is an array of scalars or vectors, the base alignment - * and array stride are set to match the base alignment of a single - * array element, according to rules (1), (2), and (3), and rounded up - * to the base alignment of a vec4. The array may have padding at the - * end; the base offset of the member following the array is rounded up - * to the next multiple of the base alignment. - * - * (6) If the member is an array of column-major matrices with - * columns and rows, the matrix is stored identically to a row of - * * column vectors with components each, according to rule - * (4). - * - * (8) If the member is an array of row-major matrices with columns - * and rows, the matrix is stored identically to a row of * - * row vectors with components each, according to rule (4). - * - * (10) If the member is an array of structures, the elements of - * the array are laid out in order, according to rule (9). - */ - if (this->is_array()) { - if (this->fields.array->is_scalar() || - this->fields.array->is_vector() || - this->fields.array->is_matrix()) { - return MAX2(this->fields.array->std140_base_alignment(row_major), 16); - } else { - assert(this->fields.array->is_record()); - return this->fields.array->std140_base_alignment(row_major); - } - } - - /* (5) If the member is a column-major matrix with columns and - * rows, the matrix is stored identically to an array of - * column vectors with components each, according to - * rule (4). - * - * (7) If the member is a row-major matrix with columns and - * rows, the matrix is stored identically to an array of - * row vectors with components each, according to rule (4). - */ - if (this->is_matrix()) { - const struct glsl_type *vec_type, *array_type; - int c = this->matrix_columns; - int r = this->vector_elements; - - if (row_major) { - vec_type = get_instance(GLSL_TYPE_FLOAT, c, 1); - array_type = glsl_type::get_array_instance(vec_type, r); - } else { - vec_type = get_instance(GLSL_TYPE_FLOAT, r, 1); - array_type = glsl_type::get_array_instance(vec_type, c); - } - - return array_type->std140_base_alignment(false); - } - - /* (9) If the member is a structure, the base alignment of the - * structure is , where is the largest base alignment - * value of any of its members, and rounded up to the base - * alignment of a vec4. The individual members of this - * sub-structure are then assigned offsets by applying this set - * of rules recursively, where the base offset of the first - * member of the sub-structure is equal to the aligned offset - * of the structure. The structure may have padding at the end; - * the base offset of the member following the sub-structure is - * rounded up to the next multiple of the base alignment of the - * structure. - */ - if (this->is_record()) { - unsigned base_alignment = 16; - for (unsigned i = 0; i < this->length; i++) { - bool field_row_major = row_major; - const enum glsl_matrix_layout matrix_layout = - glsl_matrix_layout(this->fields.structure[i].matrix_layout); - if (matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR) { - field_row_major = true; - } else if (matrix_layout == GLSL_MATRIX_LAYOUT_COLUMN_MAJOR) { - field_row_major = false; - } - - const struct glsl_type *field_type = this->fields.structure[i].type; - base_alignment = MAX2(base_alignment, - field_type->std140_base_alignment(field_row_major)); - } - return base_alignment; - } - - assert(!"not reached"); - return -1; -} - -unsigned -glsl_type::std140_size(bool row_major) const -{ - /* (1) If the member is a scalar consuming basic machine units, the - * base alignment is . - * - * (2) If the member is a two- or four-component vector with components - * consuming basic machine units, the base alignment is 2 or - * 4, respectively. - * - * (3) If the member is a three-component vector with components consuming - * basic machine units, the base alignment is 4. - */ - if (this->is_scalar() || this->is_vector()) { - return this->vector_elements * 4; - } - - /* (5) If the member is a column-major matrix with columns and - * rows, the matrix is stored identically to an array of - * column vectors with components each, according to - * rule (4). - * - * (6) If the member is an array of column-major matrices with - * columns and rows, the matrix is stored identically to a row of - * * column vectors with components each, according to rule - * (4). - * - * (7) If the member is a row-major matrix with columns and - * rows, the matrix is stored identically to an array of - * row vectors with components each, according to rule (4). - * - * (8) If the member is an array of row-major matrices with columns - * and rows, the matrix is stored identically to a row of * - * row vectors with components each, according to rule (4). - */ - if (this->without_array()->is_matrix()) { - const struct glsl_type *element_type; - const struct glsl_type *vec_type; - unsigned int array_len; - - if (this->is_array()) { - element_type = this->fields.array; - array_len = this->length; - } else { - element_type = this; - array_len = 1; - } - - if (row_major) { - vec_type = get_instance(GLSL_TYPE_FLOAT, - element_type->matrix_columns, 1); - array_len *= element_type->vector_elements; - } else { - vec_type = get_instance(GLSL_TYPE_FLOAT, - element_type->vector_elements, 1); - array_len *= element_type->matrix_columns; - } - const glsl_type *array_type = glsl_type::get_array_instance(vec_type, - array_len); - - return array_type->std140_size(false); - } - - /* (4) If the member is an array of scalars or vectors, the base alignment - * and array stride are set to match the base alignment of a single - * array element, according to rules (1), (2), and (3), and rounded up - * to the base alignment of a vec4. The array may have padding at the - * end; the base offset of the member following the array is rounded up - * to the next multiple of the base alignment. - * - * (10) If the member is an array of structures, the elements of - * the array are laid out in order, according to rule (9). - */ - if (this->is_array()) { - if (this->fields.array->is_record()) { - return this->length * this->fields.array->std140_size(row_major); - } else { - unsigned element_base_align = - this->fields.array->std140_base_alignment(row_major); - return this->length * MAX2(element_base_align, 16); - } - } - - /* (9) If the member is a structure, the base alignment of the - * structure is , where is the largest base alignment - * value of any of its members, and rounded up to the base - * alignment of a vec4. The individual members of this - * sub-structure are then assigned offsets by applying this set - * of rules recursively, where the base offset of the first - * member of the sub-structure is equal to the aligned offset - * of the structure. The structure may have padding at the end; - * the base offset of the member following the sub-structure is - * rounded up to the next multiple of the base alignment of the - * structure. - */ - if (this->is_record()) { - unsigned size = 0; - unsigned max_align = 0; - - for (unsigned i = 0; i < this->length; i++) { - bool field_row_major = row_major; - const enum glsl_matrix_layout matrix_layout = - glsl_matrix_layout(this->fields.structure[i].matrix_layout); - if (matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR) { - field_row_major = true; - } else if (matrix_layout == GLSL_MATRIX_LAYOUT_COLUMN_MAJOR) { - field_row_major = false; - } - - const struct glsl_type *field_type = this->fields.structure[i].type; - unsigned align = field_type->std140_base_alignment(field_row_major); - size = glsl_align(size, align); - size += field_type->std140_size(field_row_major); - - max_align = MAX2(align, max_align); - - if (field_type->is_record() && (i + 1 < this->length)) - size = glsl_align(size, 16); - } - size = glsl_align(size, MAX2(max_align, 16)); - return size; - } - - assert(!"not reached"); - return -1; -} - - -unsigned -glsl_type::count_attribute_slots() const -{ - /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec: - * - * "A scalar input counts the same amount against this limit as a vec4, - * so applications may want to consider packing groups of four - * unrelated float inputs together into a vector to better utilize the - * capabilities of the underlying hardware. A matrix input will use up - * multiple locations. The number of locations used will equal the - * number of columns in the matrix." - * - * The spec does not explicitly say how arrays are counted. However, it - * should be safe to assume the total number of slots consumed by an array - * is the number of entries in the array multiplied by the number of slots - * consumed by a single element of the array. - * - * The spec says nothing about how structs are counted, because vertex - * attributes are not allowed to be (or contain) structs. However, Mesa - * allows varying structs, the number of varying slots taken up by a - * varying struct is simply equal to the sum of the number of slots taken - * up by each element. - */ - switch (this->base_type) { - case GLSL_TYPE_UINT: - case GLSL_TYPE_INT: - case GLSL_TYPE_FLOAT: - case GLSL_TYPE_BOOL: - return this->matrix_columns; - - case GLSL_TYPE_STRUCT: - case GLSL_TYPE_INTERFACE: { - unsigned size = 0; - - for (unsigned i = 0; i < this->length; i++) - size += this->fields.structure[i].type->count_attribute_slots(); - - return size; - } - - case GLSL_TYPE_ARRAY: - return this->length * this->fields.array->count_attribute_slots(); - - case GLSL_TYPE_SAMPLER: - case GLSL_TYPE_IMAGE: - case GLSL_TYPE_ATOMIC_UINT: - case GLSL_TYPE_VOID: - case GLSL_TYPE_ERROR: - break; - } - - assert(!"Unexpected type in count_attribute_slots()"); - - return 0; -} - -int -glsl_type::coordinate_components() const -{ - int size; - - switch (sampler_dimensionality) { - case GLSL_SAMPLER_DIM_1D: - case GLSL_SAMPLER_DIM_BUF: - size = 1; - break; - case GLSL_SAMPLER_DIM_2D: - case GLSL_SAMPLER_DIM_RECT: - case GLSL_SAMPLER_DIM_MS: - case GLSL_SAMPLER_DIM_EXTERNAL: - size = 2; - break; - case GLSL_SAMPLER_DIM_3D: - case GLSL_SAMPLER_DIM_CUBE: - size = 3; - break; - default: - assert(!"Should not get here."); - size = 1; - break; - } - - /* Array textures need an additional component for the array index. */ - if (sampler_array) - size += 1; - - return size; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/glsl_types.h b/3rdparty/glsl-optimizer/src/glsl/glsl_types.h deleted file mode 100644 index fa97268df..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/glsl_types.h +++ /dev/null @@ -1,752 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright © 2009 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef GLSL_TYPES_H -#define GLSL_TYPES_H - -#include -#include -#include "c99_compat.h" -#include "main/mtypes.h" /* for gl_texture_index, C++'s enum rules are broken */ - -#ifdef __cplusplus -extern "C" { -#endif - -struct _mesa_glsl_parse_state; -struct glsl_symbol_table; - -extern void -_mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state); - -extern void -_mesa_glsl_release_types(void); - -#ifdef __cplusplus -} -#endif - -enum glsl_base_type { - GLSL_TYPE_UINT = 0, - GLSL_TYPE_INT, - GLSL_TYPE_FLOAT, - GLSL_TYPE_BOOL, - GLSL_TYPE_SAMPLER, - GLSL_TYPE_IMAGE, - GLSL_TYPE_ATOMIC_UINT, - GLSL_TYPE_STRUCT, - GLSL_TYPE_INTERFACE, - GLSL_TYPE_ARRAY, - GLSL_TYPE_VOID, - GLSL_TYPE_ERROR -}; - -enum glsl_sampler_dim { - GLSL_SAMPLER_DIM_1D = 0, - GLSL_SAMPLER_DIM_2D, - GLSL_SAMPLER_DIM_3D, - GLSL_SAMPLER_DIM_CUBE, - GLSL_SAMPLER_DIM_RECT, - GLSL_SAMPLER_DIM_BUF, - GLSL_SAMPLER_DIM_EXTERNAL, - GLSL_SAMPLER_DIM_MS -}; - -enum glsl_interface_packing { - GLSL_INTERFACE_PACKING_STD140, - GLSL_INTERFACE_PACKING_SHARED, - GLSL_INTERFACE_PACKING_PACKED -}; - -enum glsl_precision { - glsl_precision_high = 0, - glsl_precision_medium, - glsl_precision_low, - glsl_precision_undefined, -}; - -enum glsl_matrix_layout { - /** - * The layout of the matrix is inherited from the object containing the - * matrix (the top level structure or the uniform block). - */ - GLSL_MATRIX_LAYOUT_INHERITED, - - /** - * Explicit column-major layout - * - * If a uniform block doesn't have an explicit layout set, it will default - * to this layout. - */ - GLSL_MATRIX_LAYOUT_COLUMN_MAJOR, - - /** - * Row-major layout - */ - GLSL_MATRIX_LAYOUT_ROW_MAJOR -}; - -#ifdef __cplusplus -#include "../mesa/main/glminimal.h" -#include "util/ralloc.h" - -struct glsl_type { - GLenum gl_type; - glsl_base_type base_type; - - unsigned sampler_dimensionality:3; /**< \see glsl_sampler_dim */ - unsigned sampler_shadow:1; - unsigned sampler_array:1; - unsigned sampler_type:2; /**< Type of data returned using this - * sampler or image. Only \c - * GLSL_TYPE_FLOAT, \c GLSL_TYPE_INT, - * and \c GLSL_TYPE_UINT are valid. - */ - unsigned interface_packing:2; - - /* Callers of this ralloc-based new need not call delete. It's - * easier to just ralloc_free 'mem_ctx' (or any of its ancestors). */ - static void* operator new(size_t size) - { - if (glsl_type::mem_ctx == NULL) { - glsl_type::mem_ctx = ralloc_context(NULL); - assert(glsl_type::mem_ctx != NULL); - } - - void *type; - - type = ralloc_size(glsl_type::mem_ctx, size); - assert(type != NULL); - - return type; - } - - /* If the user *does* call delete, that's OK, we will just - * ralloc_free in that case. */ - static void operator delete(void *type) - { - ralloc_free(type); - } - - /** - * \name Vector and matrix element counts - * - * For scalars, each of these values will be 1. For non-numeric types - * these will be 0. - */ - /*@{*/ - unsigned vector_elements:3; /**< 1, 2, 3, or 4 vector elements. */ - unsigned matrix_columns:3; /**< 1, 2, 3, or 4 matrix columns. */ - /*@}*/ - - /** - * Name of the data type - * - * Will never be \c NULL. - */ - const char *name; - - /** - * For \c GLSL_TYPE_ARRAY, this is the length of the array. For - * \c GLSL_TYPE_STRUCT or \c GLSL_TYPE_INTERFACE, it is the number of - * elements in the structure and the number of values pointed to by - * \c fields.structure (below). - */ - unsigned length; - - /** - * Subtype of composite data types. - */ - union { - const struct glsl_type *array; /**< Type of array elements. */ - const struct glsl_type *parameters; /**< Parameters to function. */ - struct glsl_struct_field *structure; /**< List of struct fields. */ - } fields; - - /** - * \name Pointers to various public type singletons - */ - /*@{*/ -#undef DECL_TYPE -#define DECL_TYPE(NAME, ...) \ - static const glsl_type *const NAME##_type; -#undef STRUCT_TYPE -#define STRUCT_TYPE(NAME) \ - static const glsl_type *const struct_##NAME##_type; -#include "builtin_type_macros.h" - /*@}*/ - - /** - * Convenience accessors for vector types (shorter than get_instance()). - * @{ - */ - static const glsl_type *vec(unsigned components); - static const glsl_type *ivec(unsigned components); - static const glsl_type *uvec(unsigned components); - static const glsl_type *bvec(unsigned components); - /**@}*/ - - /** - * For numeric and boolean derived types returns the basic scalar type - * - * If the type is a numeric or boolean scalar, vector, or matrix type, - * this function gets the scalar type of the individual components. For - * all other types, including arrays of numeric or boolean types, the - * error type is returned. - */ - const glsl_type *get_base_type() const; - - /** - * Get the basic scalar type which this type aggregates. - * - * If the type is a numeric or boolean scalar, vector, or matrix, or an - * array of any of those, this function gets the scalar type of the - * individual components. For structs and arrays of structs, this function - * returns the struct type. For samplers and arrays of samplers, this - * function returns the sampler type. - */ - const glsl_type *get_scalar_type() const; - - /** - * Query the type of elements in an array - * - * \return - * Pointer to the type of elements in the array for array types, or \c NULL - * for non-array types. - */ - const glsl_type *element_type() const - { - return is_array() ? fields.array : NULL; - } - - /** - * Get the instance of a built-in scalar, vector, or matrix type - */ - static const glsl_type *get_instance(unsigned base_type, unsigned rows, - unsigned columns); - - /** - * Get the instance of an array type - */ - static const glsl_type *get_array_instance(const glsl_type *base, - unsigned elements); - - /** - * Get the instance of a record type - */ - static const glsl_type *get_record_instance(const glsl_struct_field *fields, - unsigned num_fields, - const char *name); - - /** - * Get the instance of an interface block type - */ - static const glsl_type *get_interface_instance(const glsl_struct_field *fields, - unsigned num_fields, - enum glsl_interface_packing packing, - const char *block_name); - - /** - * Query the total number of scalars that make up a scalar, vector or matrix - */ - unsigned components() const - { - return vector_elements * matrix_columns; - } - - /** - * Calculate the number of components slots required to hold this type - * - * This is used to determine how many uniform or varying locations a type - * might occupy. - */ - unsigned component_slots() const; - - /** - * Calculate the number of unique values from glGetUniformLocation for the - * elements of the type. - * - * This is used to allocate slots in the UniformRemapTable, the amount of - * locations may not match with actual used storage space by the driver. - */ - unsigned uniform_locations() const; - - /** - * Calculate the number of attribute slots required to hold this type - * - * This implements the language rules of GLSL 1.50 for counting the number - * of slots used by a vertex attribute. It also determines the number of - * varying slots the type will use up in the absence of varying packing - * (and thus, it can be used to measure the number of varying slots used by - * the varyings that are generated by lower_packed_varyings). - */ - unsigned count_attribute_slots() const; - - - /** - * Alignment in bytes of the start of this type in a std140 uniform - * block. - */ - unsigned std140_base_alignment(bool row_major) const; - - /** Size in bytes of this type in a std140 uniform block. - * - * Note that this is not GL_UNIFORM_SIZE (which is the number of - * elements in the array) - */ - unsigned std140_size(bool row_major) const; - - /** - * \brief Can this type be implicitly converted to another? - * - * \return True if the types are identical or if this type can be converted - * to \c desired according to Section 4.1.10 of the GLSL spec. - * - * \verbatim - * From page 25 (31 of the pdf) of the GLSL 1.50 spec, Section 4.1.10 - * Implicit Conversions: - * - * In some situations, an expression and its type will be implicitly - * converted to a different type. The following table shows all allowed - * implicit conversions: - * - * Type of expression | Can be implicitly converted to - * -------------------------------------------------- - * int float - * uint - * - * ivec2 vec2 - * uvec2 - * - * ivec3 vec3 - * uvec3 - * - * ivec4 vec4 - * uvec4 - * - * There are no implicit array or structure conversions. For example, - * an array of int cannot be implicitly converted to an array of float. - * There are no implicit conversions between signed and unsigned - * integers. - * \endverbatim - */ - bool can_implicitly_convert_to(const glsl_type *desired, - _mesa_glsl_parse_state *state) const; - - /** - * Query whether or not a type is a scalar (non-vector and non-matrix). - */ - bool is_scalar() const - { - return (vector_elements == 1) - && (base_type >= GLSL_TYPE_UINT) - && (base_type <= GLSL_TYPE_BOOL); - } - - /** - * Query whether or not a type is a vector - */ - bool is_vector() const - { - return (vector_elements > 1) - && (matrix_columns == 1) - && (base_type >= GLSL_TYPE_UINT) - && (base_type <= GLSL_TYPE_BOOL); - } - - /** - * Query whether or not a type is a matrix - */ - bool is_matrix() const - { - /* GLSL only has float matrices. */ - return (matrix_columns > 1) && (base_type == GLSL_TYPE_FLOAT); - } - - /** - * Query whether or not a type is a non-array numeric type - */ - bool is_numeric() const - { - return (base_type >= GLSL_TYPE_UINT) && (base_type <= GLSL_TYPE_FLOAT); - } - - /** - * Query whether or not a type is an integral type - */ - bool is_integer() const - { - return (base_type == GLSL_TYPE_UINT) || (base_type == GLSL_TYPE_INT); - } - - /** - * Query whether or not type is an integral type, or for struct and array - * types, contains an integral type. - */ - bool contains_integer() const; - - /** - * Query whether or not a type is a float type - */ - bool is_float() const - { - return base_type == GLSL_TYPE_FLOAT; - } - - /** - * Query whether or not a type is a non-array boolean type - */ - bool is_boolean() const - { - return base_type == GLSL_TYPE_BOOL; - } - - /** - * Query whether or not a type is a sampler - */ - bool is_sampler() const - { - return base_type == GLSL_TYPE_SAMPLER; - } - - /** - * Query whether or not type is a sampler, or for struct and array - * types, contains a sampler. - */ - bool contains_sampler() const; - - /** - * Get the Mesa texture target index for a sampler type. - */ - gl_texture_index sampler_index() const; - - /** - * Query whether or not type is an image, or for struct and array - * types, contains an image. - */ - bool contains_image() const; - - /** - * Query whether or not a type is an image - */ - bool is_image() const - { - return base_type == GLSL_TYPE_IMAGE; - } - - /** - * Query whether or not a type is an array - */ - bool is_array() const - { - return base_type == GLSL_TYPE_ARRAY; - } - - /** - * Query whether or not a type is a record - */ - bool is_record() const - { - return base_type == GLSL_TYPE_STRUCT; - } - - /** - * Query whether or not a type is an interface - */ - bool is_interface() const - { - return base_type == GLSL_TYPE_INTERFACE; - } - - /** - * Query whether or not a type is the void type singleton. - */ - bool is_void() const - { - return base_type == GLSL_TYPE_VOID; - } - - /** - * Query whether or not a type is the error type singleton. - */ - bool is_error() const - { - return base_type == GLSL_TYPE_ERROR; - } - - /** - * Query if a type is unnamed/anonymous (named by the parser) - */ - bool is_anonymous() const - { - return !strncmp(name, "#anon", 5); - } - - /** - * Get the type stripped of any arrays - * - * \return - * Pointer to the type of elements of the first non-array type for array - * types, or pointer to itself for non-array types. - */ - const glsl_type *without_array() const - { - return this->is_array() ? this->fields.array : this; - } - - /** - * Return the amount of atomic counter storage required for a type. - */ - unsigned atomic_size() const - { - if (base_type == GLSL_TYPE_ATOMIC_UINT) - return ATOMIC_COUNTER_SIZE; - else if (is_array()) - return length * element_type()->atomic_size(); - else - return 0; - } - - /** - * Return whether a type contains any atomic counters. - */ - bool contains_atomic() const - { - return atomic_size() > 0; - } - - /** - * Return whether a type contains any opaque types. - */ - bool contains_opaque() const; - - /** - * Query the full type of a matrix row - * - * \return - * If the type is not a matrix, \c glsl_type::error_type is returned. - * Otherwise a type matching the rows of the matrix is returned. - */ - const glsl_type *row_type() const - { - return is_matrix() - ? get_instance(base_type, matrix_columns, 1) - : error_type; - } - - /** - * Query the full type of a matrix column - * - * \return - * If the type is not a matrix, \c glsl_type::error_type is returned. - * Otherwise a type matching the columns of the matrix is returned. - */ - const glsl_type *column_type() const - { - return is_matrix() - ? get_instance(base_type, vector_elements, 1) - : error_type; - } - - /** - * Get the type of a structure field - * - * \return - * Pointer to the type of the named field. If the type is not a structure - * or the named field does not exist, \c glsl_type::error_type is returned. - */ - const glsl_type *field_type(const char *name) const; - - glsl_precision field_precision(const char *name) const; - - - /** - * Get the location of a filed within a record type - */ - int field_index(const char *name) const; - - /** - * Query the number of elements in an array type - * - * \return - * The number of elements in the array for array types or -1 for non-array - * types. If the number of elements in the array has not yet been declared, - * zero is returned. - */ - int array_size() const - { - return is_array() ? length : -1; - } - - /** - * Query whether the array size for all dimensions has been declared. - */ - bool is_unsized_array() const - { - return is_array() && length == 0; - } - - /** - * Return the number of coordinate components needed for this - * sampler or image type. - * - * This is based purely on the sampler's dimensionality. For example, this - * returns 1 for sampler1D, and 3 for sampler2DArray. - * - * Note that this is often different than actual coordinate type used in - * a texturing built-in function, since those pack additional values (such - * as the shadow comparitor or projector) into the coordinate type. - */ - int coordinate_components() const; - - /** - * Compare a record type against another record type. - * - * This is useful for matching record types declared across shader stages. - */ - bool record_compare(const glsl_type *b) const; - -private: - /** - * ralloc context for all glsl_type allocations - * - * Set on the first call to \c glsl_type::new. - */ - static void *mem_ctx; - - void init_ralloc_type_ctx(void); - - /** Constructor for vector and matrix types */ - glsl_type(GLenum gl_type, - glsl_base_type base_type, unsigned vector_elements, - unsigned matrix_columns, const char *name); - - /** Constructor for sampler or image types */ - glsl_type(GLenum gl_type, glsl_base_type base_type, - enum glsl_sampler_dim dim, bool shadow, bool array, - unsigned type, const char *name); - - /** Constructor for record types */ - glsl_type(const glsl_struct_field *fields, unsigned num_fields, - const char *name); - - /** Constructor for interface types */ - glsl_type(const glsl_struct_field *fields, unsigned num_fields, - enum glsl_interface_packing packing, const char *name); - - /** Constructor for array types */ - glsl_type(const glsl_type *array, unsigned length); - - /** Hash table containing the known array types. */ - static struct hash_table *array_types; - - /** Hash table containing the known record types. */ - static struct hash_table *record_types; - - /** Hash table containing the known interface types. */ - static struct hash_table *interface_types; - - static int record_key_compare(const void *a, const void *b); - static unsigned record_key_hash(const void *key); - - /** - * \name Built-in type flyweights - */ - /*@{*/ -#undef DECL_TYPE -#define DECL_TYPE(NAME, ...) static const glsl_type _##NAME##_type; -#undef STRUCT_TYPE -#define STRUCT_TYPE(NAME) static const glsl_type _struct_##NAME##_type; -#include "builtin_type_macros.h" - /*@}*/ - - /** - * \name Friend functions. - * - * These functions are friends because they must have C linkage and the - * need to call various private methods or access various private static - * data. - */ - /*@{*/ - friend void _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *); - friend void _mesa_glsl_release_types(void); - /*@}*/ -}; - -struct glsl_struct_field { - const struct glsl_type *type; - const char *name; - glsl_precision precision; - - /** - * For interface blocks, gl_varying_slot corresponding to the input/output - * if this is a built-in input/output (i.e. a member of the built-in - * gl_PerVertex interface block); -1 otherwise. - * - * Ignored for structs. - */ - int location; - - /** - * For interface blocks, the interpolation mode (as in - * ir_variable::interpolation). 0 otherwise. - */ - unsigned interpolation:2; - - /** - * For interface blocks, 1 if this variable uses centroid interpolation (as - * in ir_variable::centroid). 0 otherwise. - */ - unsigned centroid:1; - - /** - * For interface blocks, 1 if this variable uses sample interpolation (as - * in ir_variable::sample). 0 otherwise. - */ - unsigned sample:1; - - /** - * Layout of the matrix. Uses glsl_matrix_layout values. - */ - unsigned matrix_layout:2; - - /** - * For interface blocks, it has a value if this variable uses multiple vertex - * streams (as in ir_variable::stream). -1 otherwise. - */ - int stream; -}; - -static inline unsigned int -glsl_align(unsigned int a, unsigned int align) -{ - return (a + align - 1) / align * align; -} - -#undef DECL_TYPE -#undef STRUCT_TYPE -#endif /* __cplusplus */ - -#endif /* GLSL_TYPES_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/hir_field_selection.cpp b/3rdparty/glsl-optimizer/src/glsl/hir_field_selection.cpp deleted file mode 100644 index 0fa976811..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/hir_field_selection.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "ir.h" -#include "glsl_parser_extras.h" -#include "ast.h" -#include "glsl_types.h" - -ir_rvalue * -_mesa_ast_field_selection_to_hir(const ast_expression *expr, - exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - void *ctx = state; - ir_rvalue *result = NULL; - ir_rvalue *op; - - op = expr->subexpressions[0]->hir(instructions, state); - - /* There are two kinds of field selection. There is the selection of a - * specific field from a structure, and there is the selection of a - * swizzle / mask from a vector. Which is which is determined entirely - * by the base type of the thing to which the field selection operator is - * being applied. - */ - YYLTYPE loc = expr->get_location(); - if (op->type->is_error()) { - /* silently propagate the error */ - } else if (op->type->base_type == GLSL_TYPE_STRUCT - || op->type->base_type == GLSL_TYPE_INTERFACE) { - result = new(ctx) ir_dereference_record(op, - expr->primary_expression.identifier); - - if (result->type->is_error()) { - _mesa_glsl_error(& loc, state, "cannot access field `%s' of " - "structure", - expr->primary_expression.identifier); - } - } else if (expr->subexpressions[1] != NULL) { - /* Handle "method calls" in GLSL 1.20 - namely, array.length() */ - state->check_version(120, 300, &loc, "methods not supported"); - - ast_expression *call = expr->subexpressions[1]; - assert(call->oper == ast_function_call); - - const char *method; - method = call->subexpressions[0]->primary_expression.identifier; - - if (strcmp(method, "length") == 0) { - if (!call->expressions.is_empty()) - _mesa_glsl_error(&loc, state, "length method takes no arguments"); - - if (op->type->is_array()) { - if (op->type->is_unsized_array()) - _mesa_glsl_error(&loc, state, "length called on unsized array"); - - result = new(ctx) ir_constant(op->type->array_size()); - } else if (op->type->is_vector()) { - if (state->ARB_shading_language_420pack_enable) { - /* .length() returns int. */ - result = new(ctx) ir_constant((int) op->type->vector_elements); - } else { - _mesa_glsl_error(&loc, state, "length method on matrix only available" - "with ARB_shading_language_420pack"); - } - } else if (op->type->is_matrix()) { - if (state->ARB_shading_language_420pack_enable) { - /* .length() returns int. */ - result = new(ctx) ir_constant((int) op->type->matrix_columns); - } else { - _mesa_glsl_error(&loc, state, "length method on matrix only available" - "with ARB_shading_language_420pack"); - } - } - } else { - _mesa_glsl_error(&loc, state, "unknown method: `%s'", method); - } - } else if (op->type->is_vector() || - (state->ARB_shading_language_420pack_enable && - op->type->is_scalar())) { - ir_swizzle *swiz = ir_swizzle::create(op, - expr->primary_expression.identifier, - op->type->vector_elements); - if (swiz != NULL) { - result = swiz; - } else { - /* FINISHME: Logging of error messages should be moved into - * FINISHME: ir_swizzle::create. This allows the generation of more - * FINISHME: specific error messages. - */ - _mesa_glsl_error(& loc, state, "invalid swizzle / mask `%s'", - expr->primary_expression.identifier); - } - } else { - _mesa_glsl_error(& loc, state, "cannot access field `%s' of " - "non-structure / non-vector", - expr->primary_expression.identifier); - } - - return result ? result : ir_rvalue::error_value(ctx); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir.cpp b/3rdparty/glsl-optimizer/src/glsl/ir.cpp deleted file mode 100644 index 2786d838b..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir.cpp +++ /dev/null @@ -1,2019 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#include -#include "main/core.h" /* for MAX2 */ -#include "ir.h" -#include "glsl_types.h" - -glsl_precision higher_precision (ir_instruction* a, ir_instruction* b) -{ - if (!a && !b) - return glsl_precision_undefined; - if (!a) - return precision_from_ir (b); - if (!b) - return precision_from_ir (a); - return higher_precision (precision_from_ir(a), precision_from_ir(b)); -} - - -ir_rvalue::ir_rvalue(enum ir_node_type t, glsl_precision precision) - : ir_instruction(t) - , precision(precision) -{ - this->type = glsl_type::error_type; -} - -bool ir_rvalue::is_zero() const -{ - return false; -} - -bool ir_rvalue::is_one() const -{ - return false; -} - -bool ir_rvalue::is_negative_one() const -{ - return false; -} - -bool ir_rvalue::is_basis() const -{ - return false; -} - -/** - * Modify the swizzle make to move one component to another - * - * \param m IR swizzle to be modified - * \param from Component in the RHS that is to be swizzled - * \param to Desired swizzle location of \c from - */ -static void -update_rhs_swizzle(ir_swizzle_mask &m, unsigned from, unsigned to) -{ - switch (to) { - case 0: m.x = from; break; - case 1: m.y = from; break; - case 2: m.z = from; break; - case 3: m.w = from; break; - default: assert(!"Should not get here."); - } - - m.num_components = MAX2(m.num_components, (to + 1)); -} - -void -ir_assignment::set_lhs(ir_rvalue *lhs) -{ - void *mem_ctx = this; - bool swizzled = false; - - while (lhs != NULL) { - ir_swizzle *swiz = lhs->as_swizzle(); - - if (swiz == NULL) - break; - - unsigned write_mask = 0; - ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 }; - - for (unsigned i = 0; i < swiz->mask.num_components; i++) { - unsigned c = 0; - - switch (i) { - case 0: c = swiz->mask.x; break; - case 1: c = swiz->mask.y; break; - case 2: c = swiz->mask.z; break; - case 3: c = swiz->mask.w; break; - default: assert(!"Should not get here."); - } - - write_mask |= (((this->write_mask >> i) & 1) << c); - update_rhs_swizzle(rhs_swiz, i, c); - } - - this->write_mask = write_mask; - lhs = swiz->val; - - this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz); - swizzled = true; - } - - if (swizzled) { - /* Now, RHS channels line up with the LHS writemask. Collapse it - * to just the channels that will be written. - */ - ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 }; - int rhs_chan = 0; - for (int i = 0; i < 4; i++) { - if (write_mask & (1 << i)) - update_rhs_swizzle(rhs_swiz, i, rhs_chan++); - } - this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz); - } - - assert((lhs == NULL) || lhs->as_dereference()); - - this->lhs = (ir_dereference *) lhs; -} - -ir_variable * -ir_assignment::whole_variable_written() -{ - ir_variable *v = this->lhs->whole_variable_referenced(); - - if (v == NULL) - return NULL; - - if (v->type->is_scalar()) - return v; - - if (v->type->is_vector()) { - const unsigned mask = (1U << v->type->vector_elements) - 1; - - if (mask != this->write_mask) - return NULL; - } - - /* Either all the vector components are assigned or the variable is some - * composite type (and the whole thing is assigned. - */ - return v; -} - -ir_assignment::ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, - ir_rvalue *condition, unsigned write_mask) - : ir_instruction(ir_type_assignment) -{ - this->condition = condition; - this->rhs = rhs; - this->lhs = lhs; - this->write_mask = write_mask; - - if (lhs->type->is_scalar() || lhs->type->is_vector()) { - int lhs_components = 0; - for (int i = 0; i < 4; i++) { - if (write_mask & (1 << i)) - lhs_components++; - } - - assert(lhs_components == this->rhs->type->vector_elements); - } -} - -ir_assignment::ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, - ir_rvalue *condition) - : ir_instruction(ir_type_assignment) -{ - this->condition = condition; - this->rhs = rhs; - - /* If the RHS is a vector type, assume that all components of the vector - * type are being written to the LHS. The write mask comes from the RHS - * because we can have a case where the LHS is a vec4 and the RHS is a - * vec3. In that case, the assignment is: - * - * (assign (...) (xyz) (var_ref lhs) (var_ref rhs)) - */ - if (rhs->type->is_vector()) - this->write_mask = (1U << rhs->type->vector_elements) - 1; - else if (rhs->type->is_scalar()) - this->write_mask = 1; - else - this->write_mask = 0; - - this->set_lhs(lhs); -} - -ir_expression::ir_expression(int op, const struct glsl_type *type, - ir_rvalue *op0, ir_rvalue *op1, - ir_rvalue *op2, ir_rvalue *op3) - : ir_rvalue(ir_type_expression, higher_precision(higher_precision(op0,op1), higher_precision(op2,op3))) -{ - this->type = type; - this->operation = ir_expression_operation(op); - this->operands[0] = op0; - this->operands[1] = op1; - this->operands[2] = op2; - this->operands[3] = op3; -#ifndef NDEBUG - int num_operands = get_num_operands(this->operation); - for (int i = num_operands; i < 4; i++) { - assert(this->operands[i] == NULL); - } -#endif -} - -ir_expression::ir_expression(int op, ir_rvalue *op0) - : ir_rvalue(ir_type_expression, precision_from_ir(op0)) -{ - this->operation = ir_expression_operation(op); - this->operands[0] = op0; - this->operands[1] = NULL; - this->operands[2] = NULL; - this->operands[3] = NULL; - - assert(op <= ir_last_unop); - - switch (this->operation) { - case ir_unop_bit_not: - case ir_unop_logic_not: - case ir_unop_neg: - case ir_unop_abs: - case ir_unop_sign: - case ir_unop_rcp: - case ir_unop_rsq: - case ir_unop_sqrt: - case ir_unop_normalize: - case ir_unop_exp: - case ir_unop_log: - case ir_unop_exp2: - case ir_unop_log2: - case ir_unop_trunc: - case ir_unop_ceil: - case ir_unop_floor: - case ir_unop_fract: - case ir_unop_round_even: - case ir_unop_sin: - case ir_unop_cos: - case ir_unop_sin_reduced: - case ir_unop_cos_reduced: - case ir_unop_dFdx: - case ir_unop_dFdx_coarse: - case ir_unop_dFdx_fine: - case ir_unop_dFdy: - case ir_unop_dFdy_coarse: - case ir_unop_dFdy_fine: - case ir_unop_bitfield_reverse: - case ir_unop_interpolate_at_centroid: - case ir_unop_saturate: - this->type = op0->type; - break; - - case ir_unop_f2i: - case ir_unop_b2i: - case ir_unop_u2i: - case ir_unop_bitcast_f2i: - case ir_unop_bit_count: - case ir_unop_find_msb: - case ir_unop_find_lsb: - this->type = glsl_type::get_instance(GLSL_TYPE_INT, - op0->type->vector_elements, 1); - break; - - case ir_unop_b2f: - case ir_unop_i2f: - case ir_unop_u2f: - case ir_unop_bitcast_i2f: - case ir_unop_bitcast_u2f: - this->type = glsl_type::get_instance(GLSL_TYPE_FLOAT, - op0->type->vector_elements, 1); - break; - - case ir_unop_f2b: - case ir_unop_i2b: - this->type = glsl_type::get_instance(GLSL_TYPE_BOOL, - op0->type->vector_elements, 1); - break; - - case ir_unop_i2u: - case ir_unop_f2u: - case ir_unop_bitcast_f2u: - this->type = glsl_type::get_instance(GLSL_TYPE_UINT, - op0->type->vector_elements, 1); - break; - - case ir_unop_noise: - case ir_unop_unpack_half_2x16_split_x: - case ir_unop_unpack_half_2x16_split_y: - this->type = glsl_type::float_type; - break; - - case ir_unop_any: - this->type = glsl_type::bool_type; - break; - - case ir_unop_pack_snorm_2x16: - case ir_unop_pack_snorm_4x8: - case ir_unop_pack_unorm_2x16: - case ir_unop_pack_unorm_4x8: - case ir_unop_pack_half_2x16: - this->type = glsl_type::uint_type; - break; - - case ir_unop_unpack_snorm_2x16: - case ir_unop_unpack_unorm_2x16: - case ir_unop_unpack_half_2x16: - this->type = glsl_type::vec2_type; - break; - - case ir_unop_unpack_snorm_4x8: - case ir_unop_unpack_unorm_4x8: - this->type = glsl_type::vec4_type; - break; - - default: - assert(!"not reached: missing automatic type setup for ir_expression"); - this->type = op0->type; - break; - } -} - -ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1) - : ir_rvalue(ir_type_expression, higher_precision(op0,op1)) -{ - this->operation = ir_expression_operation(op); - this->operands[0] = op0; - this->operands[1] = op1; - this->operands[2] = NULL; - this->operands[3] = NULL; - - assert(op > ir_last_unop); - - switch (this->operation) { - case ir_binop_all_equal: - case ir_binop_any_nequal: - this->type = glsl_type::bool_type; - break; - - case ir_binop_add: - case ir_binop_sub: - case ir_binop_min: - case ir_binop_max: - case ir_binop_pow: - case ir_binop_mul: - case ir_binop_div: - case ir_binop_mod: - if (op0->type->is_scalar()) { - this->type = op1->type; - } else if (op1->type->is_scalar()) { - this->type = op0->type; - } else { - /* FINISHME: matrix types */ - assert(!op0->type->is_matrix() && !op1->type->is_matrix()); - assert(op0->type == op1->type); - this->type = op0->type; - } - break; - - case ir_binop_logic_and: - case ir_binop_logic_xor: - case ir_binop_logic_or: - case ir_binop_bit_and: - case ir_binop_bit_xor: - case ir_binop_bit_or: - assert(!op0->type->is_matrix()); - assert(!op1->type->is_matrix()); - if (op0->type->is_scalar()) { - this->type = op1->type; - } else if (op1->type->is_scalar()) { - this->type = op0->type; - } else { - assert(op0->type->vector_elements == op1->type->vector_elements); - this->type = op0->type; - } - break; - - case ir_binop_equal: - case ir_binop_nequal: - case ir_binop_lequal: - case ir_binop_gequal: - case ir_binop_less: - case ir_binop_greater: - assert(op0->type == op1->type); - this->type = glsl_type::get_instance(GLSL_TYPE_BOOL, - op0->type->vector_elements, 1); - break; - - case ir_binop_dot: - this->type = glsl_type::float_type; - break; - - case ir_binop_pack_half_2x16_split: - this->type = glsl_type::uint_type; - break; - - case ir_binop_imul_high: - case ir_binop_carry: - case ir_binop_borrow: - case ir_binop_lshift: - case ir_binop_rshift: - case ir_binop_bfm: - case ir_binop_ldexp: - case ir_binop_interpolate_at_offset: - case ir_binop_interpolate_at_sample: - this->type = op0->type; - this->set_precision(op0->get_precision()); - break; - - case ir_binop_vector_extract: - this->type = op0->type->get_scalar_type(); - this->set_precision(op0->get_precision()); - break; - - default: - assert(!"not reached: missing automatic type setup for ir_expression"); - this->type = glsl_type::float_type; - } -} - -ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1, - ir_rvalue *op2) - : ir_rvalue(ir_type_expression, higher_precision(precision_from_ir(op0),higher_precision(op1,op2))) -{ - this->operation = ir_expression_operation(op); - this->operands[0] = op0; - this->operands[1] = op1; - this->operands[2] = op2; - this->operands[3] = NULL; - - assert(op > ir_last_binop && op <= ir_last_triop); - - switch (this->operation) { - case ir_triop_fma: - case ir_triop_clamp: - case ir_triop_lrp: - case ir_triop_bitfield_extract: - case ir_triop_vector_insert: - this->type = op0->type; - break; - - case ir_triop_bfi: - case ir_triop_csel: - this->type = op1->type; - break; - - default: - assert(!"not reached: missing automatic type setup for ir_expression"); - this->type = glsl_type::float_type; - } -} - -unsigned int -ir_expression::get_num_operands(ir_expression_operation op) -{ - assert(op <= ir_last_opcode); - - if (op <= ir_last_unop) - return 1; - - if (op <= ir_last_binop) - return 2; - - if (op <= ir_last_triop) - return 3; - - if (op <= ir_last_quadop) - return 4; - - assert(false); - return 0; -} - -static const char *const operator_strs[] = { - "~", - "!", - "neg", - "abs", - "sign", - "rcp", - "rsq", - "sqrt", - "normalize", - "exp", - "log", - "exp2", - "log2", - "f2i", - "f2u", - "i2f", - "f2b", - "b2f", - "i2b", - "b2i", - "u2f", - "i2u", - "u2i", - "bitcast_i2f", - "bitcast_f2i", - "bitcast_u2f", - "bitcast_f2u", - "any", - "trunc", - "ceil", - "floor", - "fract", - "round_even", - "sin", - "cos", - "sin_reduced", - "cos_reduced", - "dFdx", - "dFdxCoarse", - "dFdxFine", - "dFdy", - "dFdyCoarse", - "dFdyFine", - "packSnorm2x16", - "packSnorm4x8", - "packUnorm2x16", - "packUnorm4x8", - "packHalf2x16", - "unpackSnorm2x16", - "unpackSnorm4x8", - "unpackUnorm2x16", - "unpackUnorm4x8", - "unpackHalf2x16", - "unpackHalf2x16_split_x", - "unpackHalf2x16_split_y", - "bitfield_reverse", - "bit_count", - "find_msb", - "find_lsb", - "sat", - "noise", - "interpolate_at_centroid", - "+", - "-", - "*", - "imul_high", - "/", - "carry", - "borrow", - "%", - "<", - ">", - "<=", - ">=", - "==", - "!=", - "all_equal", - "any_nequal", - "<<", - ">>", - "&", - "^", - "|", - "&&", - "^^", - "||", - "dot", - "min", - "max", - "pow", - "packHalf2x16_split", - "bfm", - "ubo_load", - "ldexp", - "vector_extract", - "interpolate_at_offset", - "interpolate_at_sample", - "fma", - "clamp", - "lrp", - "csel", - "bfi", - "bitfield_extract", - "vector_insert", - "bitfield_insert", - "vector", -}; - -const char *ir_expression::operator_string(ir_expression_operation op) -{ - assert((unsigned int) op < Elements(operator_strs)); - assert(Elements(operator_strs) == (ir_quadop_vector + 1)); - return operator_strs[op]; -} - -const char *ir_expression::operator_string() -{ - return operator_string(this->operation); -} - -const char* -depth_layout_string(ir_depth_layout layout) -{ - switch(layout) { - case ir_depth_layout_none: return ""; - case ir_depth_layout_any: return "depth_any"; - case ir_depth_layout_greater: return "depth_greater"; - case ir_depth_layout_less: return "depth_less"; - case ir_depth_layout_unchanged: return "depth_unchanged"; - - default: - assert(0); - return ""; - } -} - -ir_expression_operation -ir_expression::get_operator(const char *str) -{ - const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]); - for (int op = 0; op < operator_count; op++) { - if (strcmp(str, operator_strs[op]) == 0) - return (ir_expression_operation) op; - } - return (ir_expression_operation) -1; -} - -ir_constant::ir_constant() - : ir_rvalue(ir_type_constant, glsl_precision_undefined) -{ -} - -ir_constant::ir_constant(const struct glsl_type *type, - const ir_constant_data *data, glsl_precision precision) - : ir_rvalue(ir_type_constant, precision) -{ - assert((type->base_type >= GLSL_TYPE_UINT) - && (type->base_type <= GLSL_TYPE_BOOL)); - - this->type = type; - memcpy(& this->value, data, sizeof(this->value)); -} - -ir_constant::ir_constant(float f, unsigned vector_elements) - : ir_rvalue(ir_type_constant, glsl_precision_undefined) -{ - assert(vector_elements <= 4); - this->type = glsl_type::get_instance(GLSL_TYPE_FLOAT, vector_elements, 1); - for (unsigned i = 0; i < vector_elements; i++) { - this->value.f[i] = f; - } - for (unsigned i = vector_elements; i < 16; i++) { - this->value.f[i] = 0; - } -} - -ir_constant::ir_constant(unsigned int u, unsigned vector_elements) - : ir_rvalue(ir_type_constant, glsl_precision_undefined) -{ - assert(vector_elements <= 4); - this->type = glsl_type::get_instance(GLSL_TYPE_UINT, vector_elements, 1); - for (unsigned i = 0; i < vector_elements; i++) { - this->value.u[i] = u; - } - for (unsigned i = vector_elements; i < 16; i++) { - this->value.u[i] = 0; - } -} - -ir_constant::ir_constant(int integer, unsigned vector_elements) - : ir_rvalue(ir_type_constant, glsl_precision_undefined) -{ - assert(vector_elements <= 4); - this->type = glsl_type::get_instance(GLSL_TYPE_INT, vector_elements, 1); - for (unsigned i = 0; i < vector_elements; i++) { - this->value.i[i] = integer; - } - for (unsigned i = vector_elements; i < 16; i++) { - this->value.i[i] = 0; - } -} - -ir_constant::ir_constant(bool b, unsigned vector_elements) - : ir_rvalue(ir_type_constant, glsl_precision_undefined) -{ - assert(vector_elements <= 4); - this->type = glsl_type::get_instance(GLSL_TYPE_BOOL, vector_elements, 1); - for (unsigned i = 0; i < vector_elements; i++) { - this->value.b[i] = b; - } - for (unsigned i = vector_elements; i < 16; i++) { - this->value.b[i] = false; - } -} - -ir_constant::ir_constant(const ir_constant *c, unsigned i) - : ir_rvalue(ir_type_constant, c->precision) -{ - this->type = c->type->get_base_type(); - - switch (this->type->base_type) { - case GLSL_TYPE_UINT: this->value.u[0] = c->value.u[i]; break; - case GLSL_TYPE_INT: this->value.i[0] = c->value.i[i]; break; - case GLSL_TYPE_FLOAT: this->value.f[0] = c->value.f[i]; break; - case GLSL_TYPE_BOOL: this->value.b[0] = c->value.b[i]; break; - default: assert(!"Should not get here."); break; - } -} - -ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list) - : ir_rvalue(ir_type_constant, glsl_precision_undefined) -{ - this->type = type; - - assert(type->is_scalar() || type->is_vector() || type->is_matrix() - || type->is_record() || type->is_array()); - - if (type->is_array()) { - this->array_elements = ralloc_array(this, ir_constant *, type->length); - unsigned i = 0; - foreach_in_list(ir_constant, value, value_list) { - assert(value->as_constant() != NULL); - - this->array_elements[i++] = value; - } - return; - } - - /* If the constant is a record, the types of each of the entries in - * value_list must be a 1-for-1 match with the structure components. Each - * entry must also be a constant. Just move the nodes from the value_list - * to the list in the ir_constant. - */ - /* FINISHME: Should there be some type checking and / or assertions here? */ - /* FINISHME: Should the new constant take ownership of the nodes from - * FINISHME: value_list, or should it make copies? - */ - if (type->is_record()) { - value_list->move_nodes_to(& this->components); - return; - } - - for (unsigned i = 0; i < 16; i++) { - this->value.u[i] = 0; - } - - ir_constant *value = (ir_constant *) (value_list->head); - - /* Constructors with exactly one scalar argument are special for vectors - * and matrices. For vectors, the scalar value is replicated to fill all - * the components. For matrices, the scalar fills the components of the - * diagonal while the rest is filled with 0. - */ - if (value->type->is_scalar() && value->next->is_tail_sentinel()) { - if (type->is_matrix()) { - /* Matrix - fill diagonal (rest is already set to 0) */ - assert(type->base_type == GLSL_TYPE_FLOAT); - for (unsigned i = 0; i < type->matrix_columns; i++) - this->value.f[i * type->vector_elements + i] = value->value.f[0]; - } else { - /* Vector or scalar - fill all components */ - switch (type->base_type) { - case GLSL_TYPE_UINT: - case GLSL_TYPE_INT: - for (unsigned i = 0; i < type->components(); i++) - this->value.u[i] = value->value.u[0]; - break; - case GLSL_TYPE_FLOAT: - for (unsigned i = 0; i < type->components(); i++) - this->value.f[i] = value->value.f[0]; - break; - case GLSL_TYPE_BOOL: - for (unsigned i = 0; i < type->components(); i++) - this->value.b[i] = value->value.b[0]; - break; - default: - assert(!"Should not get here."); - break; - } - } - return; - } - - if (type->is_matrix() && value->type->is_matrix()) { - assert(value->next->is_tail_sentinel()); - - /* From section 5.4.2 of the GLSL 1.20 spec: - * "If a matrix is constructed from a matrix, then each component - * (column i, row j) in the result that has a corresponding component - * (column i, row j) in the argument will be initialized from there." - */ - unsigned cols = MIN2(type->matrix_columns, value->type->matrix_columns); - unsigned rows = MIN2(type->vector_elements, value->type->vector_elements); - for (unsigned i = 0; i < cols; i++) { - for (unsigned j = 0; j < rows; j++) { - const unsigned src = i * value->type->vector_elements + j; - const unsigned dst = i * type->vector_elements + j; - this->value.f[dst] = value->value.f[src]; - } - } - - /* "All other components will be initialized to the identity matrix." */ - for (unsigned i = cols; i < type->matrix_columns; i++) - this->value.f[i * type->vector_elements + i] = 1.0; - - return; - } - - /* Use each component from each entry in the value_list to initialize one - * component of the constant being constructed. - */ - for (unsigned i = 0; i < type->components(); /* empty */) { - assert(value->as_constant() != NULL); - assert(!value->is_tail_sentinel()); - - for (unsigned j = 0; j < value->type->components(); j++) { - switch (type->base_type) { - case GLSL_TYPE_UINT: - this->value.u[i] = value->get_uint_component(j); - break; - case GLSL_TYPE_INT: - this->value.i[i] = value->get_int_component(j); - break; - case GLSL_TYPE_FLOAT: - this->value.f[i] = value->get_float_component(j); - break; - case GLSL_TYPE_BOOL: - this->value.b[i] = value->get_bool_component(j); - break; - default: - /* FINISHME: What to do? Exceptions are not the answer. - */ - break; - } - - i++; - if (i >= type->components()) - break; - } - - value = (ir_constant *) value->next; - } -} - -ir_constant * -ir_constant::zero(void *mem_ctx, const glsl_type *type) -{ - assert(type->is_scalar() || type->is_vector() || type->is_matrix() - || type->is_record() || type->is_array()); - - ir_constant *c = new(mem_ctx) ir_constant; - c->type = type; - memset(&c->value, 0, sizeof(c->value)); - - if (type->is_array()) { - c->array_elements = ralloc_array(c, ir_constant *, type->length); - - for (unsigned i = 0; i < type->length; i++) - c->array_elements[i] = ir_constant::zero(c, type->element_type()); - } - - if (type->is_record()) { - for (unsigned i = 0; i < type->length; i++) { - ir_constant *comp = ir_constant::zero(mem_ctx, type->fields.structure[i].type); - c->components.push_tail(comp); - } - } - - return c; -} - -bool -ir_constant::get_bool_component(unsigned i) const -{ - switch (this->type->base_type) { - case GLSL_TYPE_UINT: return this->value.u[i] != 0; - case GLSL_TYPE_INT: return this->value.i[i] != 0; - case GLSL_TYPE_FLOAT: return ((int)this->value.f[i]) != 0; - case GLSL_TYPE_BOOL: return this->value.b[i]; - default: assert(!"Should not get here."); break; - } - - /* Must return something to make the compiler happy. This is clearly an - * error case. - */ - return false; -} - -float -ir_constant::get_float_component(unsigned i) const -{ - switch (this->type->base_type) { - case GLSL_TYPE_UINT: return (float) this->value.u[i]; - case GLSL_TYPE_INT: return (float) this->value.i[i]; - case GLSL_TYPE_FLOAT: return this->value.f[i]; - case GLSL_TYPE_BOOL: return this->value.b[i] ? 1.0f : 0.0f; - default: assert(!"Should not get here."); break; - } - - /* Must return something to make the compiler happy. This is clearly an - * error case. - */ - return 0.0; -} - -int -ir_constant::get_int_component(unsigned i) const -{ - switch (this->type->base_type) { - case GLSL_TYPE_UINT: return this->value.u[i]; - case GLSL_TYPE_INT: return this->value.i[i]; - case GLSL_TYPE_FLOAT: return (int) this->value.f[i]; - case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0; - default: assert(!"Should not get here."); break; - } - - /* Must return something to make the compiler happy. This is clearly an - * error case. - */ - return 0; -} - -unsigned -ir_constant::get_uint_component(unsigned i) const -{ - switch (this->type->base_type) { - case GLSL_TYPE_UINT: return this->value.u[i]; - case GLSL_TYPE_INT: return this->value.i[i]; - case GLSL_TYPE_FLOAT: return (unsigned) this->value.f[i]; - case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0; - default: assert(!"Should not get here."); break; - } - - /* Must return something to make the compiler happy. This is clearly an - * error case. - */ - return 0; -} - -ir_constant * -ir_constant::get_array_element(unsigned i) const -{ - assert(this->type->is_array()); - - /* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec: - * - * "Behavior is undefined if a shader subscripts an array with an index - * less than 0 or greater than or equal to the size the array was - * declared with." - * - * Most out-of-bounds accesses are removed before things could get this far. - * There are cases where non-constant array index values can get constant - * folded. - */ - if (int(i) < 0) - i = 0; - else if (i >= this->type->length) - i = this->type->length - 1; - - return array_elements[i]; -} - -ir_constant * -ir_constant::get_record_field(const char *name) -{ - int idx = this->type->field_index(name); - - if (idx < 0) - return NULL; - - if (this->components.is_empty()) - return NULL; - - exec_node *node = this->components.head; - for (int i = 0; i < idx; i++) { - node = node->next; - - /* If the end of the list is encountered before the element matching the - * requested field is found, return NULL. - */ - if (node->is_tail_sentinel()) - return NULL; - } - - return (ir_constant *) node; -} - -void -ir_constant::copy_offset(ir_constant *src, int offset) -{ - switch (this->type->base_type) { - case GLSL_TYPE_UINT: - case GLSL_TYPE_INT: - case GLSL_TYPE_FLOAT: - case GLSL_TYPE_BOOL: { - unsigned int size = src->type->components(); - assert (size <= this->type->components() - offset); - for (unsigned int i=0; itype->base_type) { - case GLSL_TYPE_UINT: - value.u[i+offset] = src->get_uint_component(i); - break; - case GLSL_TYPE_INT: - value.i[i+offset] = src->get_int_component(i); - break; - case GLSL_TYPE_FLOAT: - value.f[i+offset] = src->get_float_component(i); - break; - case GLSL_TYPE_BOOL: - value.b[i+offset] = src->get_bool_component(i); - break; - default: // Shut up the compiler - break; - } - } - break; - } - - case GLSL_TYPE_STRUCT: { - assert (src->type == this->type); - this->components.make_empty(); - foreach_in_list(ir_constant, orig, &src->components) { - this->components.push_tail(orig->clone(this, NULL)); - } - break; - } - - case GLSL_TYPE_ARRAY: { - assert (src->type == this->type); - for (unsigned i = 0; i < this->type->length; i++) { - this->array_elements[i] = src->array_elements[i]->clone(this, NULL); - } - break; - } - - default: - assert(!"Should not get here."); - break; - } -} - -void -ir_constant::copy_masked_offset(ir_constant *src, int offset, unsigned int mask) -{ - assert (!type->is_array() && !type->is_record()); - - if (!type->is_vector() && !type->is_matrix()) { - offset = 0; - mask = 1; - } - - int id = 0; - for (int i=0; i<4; i++) { - if (mask & (1 << i)) { - switch (this->type->base_type) { - case GLSL_TYPE_UINT: - value.u[i+offset] = src->get_uint_component(id++); - break; - case GLSL_TYPE_INT: - value.i[i+offset] = src->get_int_component(id++); - break; - case GLSL_TYPE_FLOAT: - value.f[i+offset] = src->get_float_component(id++); - break; - case GLSL_TYPE_BOOL: - value.b[i+offset] = src->get_bool_component(id++); - break; - default: - assert(!"Should not get here."); - return; - } - } - } -} - -bool -ir_constant::has_value(const ir_constant *c) const -{ - if (this->type != c->type) - return false; - - if (this->type->is_array()) { - for (unsigned i = 0; i < this->type->length; i++) { - if (!this->array_elements[i]->has_value(c->array_elements[i])) - return false; - } - return true; - } - - if (this->type->base_type == GLSL_TYPE_STRUCT) { - const exec_node *a_node = this->components.head; - const exec_node *b_node = c->components.head; - - while (!a_node->is_tail_sentinel()) { - assert(!b_node->is_tail_sentinel()); - - const ir_constant *const a_field = (ir_constant *) a_node; - const ir_constant *const b_field = (ir_constant *) b_node; - - if (!a_field->has_value(b_field)) - return false; - - a_node = a_node->next; - b_node = b_node->next; - } - - return true; - } - - for (unsigned i = 0; i < this->type->components(); i++) { - switch (this->type->base_type) { - case GLSL_TYPE_UINT: - if (this->value.u[i] != c->value.u[i]) - return false; - break; - case GLSL_TYPE_INT: - if (this->value.i[i] != c->value.i[i]) - return false; - break; - case GLSL_TYPE_FLOAT: - if (this->value.f[i] != c->value.f[i]) - return false; - break; - case GLSL_TYPE_BOOL: - if (this->value.b[i] != c->value.b[i]) - return false; - break; - default: - assert(!"Should not get here."); - return false; - } - } - - return true; -} - -bool -ir_constant::is_value(float f, int i) const -{ - if (!this->type->is_scalar() && !this->type->is_vector()) - return false; - - /* Only accept boolean values for 0/1. */ - if (int(bool(i)) != i && this->type->is_boolean()) - return false; - - for (unsigned c = 0; c < this->type->vector_elements; c++) { - switch (this->type->base_type) { - case GLSL_TYPE_FLOAT: - if (this->value.f[c] != f) - return false; - break; - case GLSL_TYPE_INT: - if (this->value.i[c] != i) - return false; - break; - case GLSL_TYPE_UINT: - if (this->value.u[c] != unsigned(i)) - return false; - break; - case GLSL_TYPE_BOOL: - if (this->value.b[c] != bool(i)) - return false; - break; - default: - /* The only other base types are structures, arrays, and samplers. - * Samplers cannot be constants, and the others should have been - * filtered out above. - */ - assert(!"Should not get here."); - return false; - } - } - - return true; -} - -bool -ir_constant::is_zero() const -{ - return is_value(0.0, 0); -} - -bool -ir_constant::is_one() const -{ - return is_value(1.0, 1); -} - -bool -ir_constant::is_negative_one() const -{ - return is_value(-1.0, -1); -} - -bool -ir_constant::is_basis() const -{ - if (!this->type->is_scalar() && !this->type->is_vector()) - return false; - - if (this->type->is_boolean()) - return false; - - unsigned ones = 0; - for (unsigned c = 0; c < this->type->vector_elements; c++) { - switch (this->type->base_type) { - case GLSL_TYPE_FLOAT: - if (this->value.f[c] == 1.0) - ones++; - else if (this->value.f[c] != 0.0) - return false; - break; - case GLSL_TYPE_INT: - if (this->value.i[c] == 1) - ones++; - else if (this->value.i[c] != 0) - return false; - break; - case GLSL_TYPE_UINT: - if (int(this->value.u[c]) == 1) - ones++; - else if (int(this->value.u[c]) != 0) - return false; - break; - default: - /* The only other base types are structures, arrays, samplers, and - * booleans. Samplers cannot be constants, and the others should - * have been filtered out above. - */ - assert(!"Should not get here."); - return false; - } - } - - return ones == 1; -} - -bool -ir_constant::is_uint16_constant() const -{ - if (!type->is_integer()) - return false; - - return value.u[0] < (1 << 16); -} - -ir_loop::ir_loop() - : ir_instruction(ir_type_loop) -{ -} - - -ir_dereference_variable::ir_dereference_variable(ir_variable *var) - : ir_dereference(ir_type_dereference_variable, precision_from_ir(var)) -{ - assert(var != NULL); - - this->var = var; - this->type = var->type; -} - - -ir_dereference_array::ir_dereference_array(ir_rvalue *value, - ir_rvalue *array_index) - : ir_dereference(ir_type_dereference_array, precision_from_ir(value)) -{ - this->array_index = array_index; - this->set_array(value); -} - - -ir_dereference_array::ir_dereference_array(ir_variable *var, - ir_rvalue *array_index) - : ir_dereference(ir_type_dereference_array, precision_from_ir(var)) -{ - void *ctx = ralloc_parent(var); - - this->array_index = array_index; - this->set_array(new(ctx) ir_dereference_variable(var)); -} - - -void -ir_dereference_array::set_array(ir_rvalue *value) -{ - assert(value != NULL); - - this->array = value; - - const glsl_type *const vt = this->array->type; - - if (vt->is_array()) { - type = vt->element_type(); - } else if (vt->is_matrix()) { - type = vt->column_type(); - } else if (vt->is_vector()) { - type = vt->get_base_type(); - } -} - - -ir_dereference_record::ir_dereference_record(ir_rvalue *value, - const char *field) - : ir_dereference(ir_type_dereference_record, precision_from_ir(value)) -{ - assert(value != NULL); - - this->record = value; - this->field = ralloc_strdup(this, field); - this->type = this->record->type->field_type(field); - if (this->record) - this->precision = this->record->type->field_precision(field); -} - - -ir_dereference_record::ir_dereference_record(ir_variable *var, - const char *field) - : ir_dereference(ir_type_dereference_record, precision_from_ir(var)) -{ - void *ctx = ralloc_parent(var); - - this->record = new(ctx) ir_dereference_variable(var); - this->field = ralloc_strdup(this, field); - this->type = this->record->type->field_type(field); - if (this->record) - this->precision = this->record->type->field_precision(field); -} - -bool -ir_dereference::is_lvalue() const -{ - ir_variable *var = this->variable_referenced(); - - /* Every l-value derference chain eventually ends in a variable. - */ - if ((var == NULL) || var->data.read_only) - return false; - - /* From section 4.1.7 of the GLSL 4.40 spec: - * - * "Opaque variables cannot be treated as l-values; hence cannot - * be used as out or inout function parameters, nor can they be - * assigned into." - */ - if (this->type->contains_opaque()) - return false; - - return true; -} - - -static const char * const tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf", "txf_ms", "txs", "lod", "tg4", "query_levels" }; - -const char *ir_texture::opcode_string() -{ - assert((unsigned int) op <= - sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0])); - return tex_opcode_strs[op]; -} - -ir_texture_opcode -ir_texture::get_opcode(const char *str) -{ - const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]); - for (int op = 0; op < count; op++) { - if (strcmp(str, tex_opcode_strs[op]) == 0) - return (ir_texture_opcode) op; - } - return (ir_texture_opcode) -1; -} - - -void -ir_texture::set_sampler(ir_dereference *sampler, const glsl_type *type) -{ - assert(sampler != NULL); - assert(type != NULL); - this->sampler = sampler; - this->type = type; - - if (this->op == ir_txs || this->op == ir_query_levels) { - assert(type->base_type == GLSL_TYPE_INT); - } else if (this->op == ir_lod) { - assert(type->vector_elements == 2); - assert(type->base_type == GLSL_TYPE_FLOAT); - } else { - assert(sampler->type->sampler_type == (int) type->base_type); - if (sampler->type->sampler_shadow) - assert(type->vector_elements == 4 || type->vector_elements == 1); - else - assert(type->vector_elements == 4); - } -} - - -bool -ir_texture::has_lod(const glsl_type *sampler_type) -{ - assert(sampler_type->is_sampler()); - - switch (sampler_type->sampler_dimensionality) { - case GLSL_SAMPLER_DIM_RECT: - case GLSL_SAMPLER_DIM_BUF: - case GLSL_SAMPLER_DIM_MS: - return false; - default: - return true; - } -} - - -void -ir_swizzle::init_mask(const unsigned *comp, unsigned count) -{ - assert((count >= 1) && (count <= 4)); - - memset(&this->mask, 0, sizeof(this->mask)); - this->mask.num_components = count; - - unsigned dup_mask = 0; - switch (count) { - case 4: - assert(comp[3] <= 3); - dup_mask |= (1U << comp[3]) - & ((1U << comp[0]) | (1U << comp[1]) | (1U << comp[2])); - this->mask.w = comp[3]; - - case 3: - assert(comp[2] <= 3); - dup_mask |= (1U << comp[2]) - & ((1U << comp[0]) | (1U << comp[1])); - this->mask.z = comp[2]; - - case 2: - assert(comp[1] <= 3); - dup_mask |= (1U << comp[1]) - & ((1U << comp[0])); - this->mask.y = comp[1]; - - case 1: - assert(comp[0] <= 3); - this->mask.x = comp[0]; - } - - this->mask.has_duplicates = dup_mask != 0; - - /* Based on the number of elements in the swizzle and the base type - * (i.e., float, int, unsigned, or bool) of the vector being swizzled, - * generate the type of the resulting value. - */ - type = glsl_type::get_instance(val->type->base_type, mask.num_components, 1); -} - -ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z, - unsigned w, unsigned count) - : ir_rvalue(ir_type_swizzle, precision_from_ir(val)), val(val) -{ - const unsigned components[4] = { x, y, z, w }; - this->init_mask(components, count); -} - -ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp, - unsigned count) - : ir_rvalue(ir_type_swizzle, precision_from_ir(val)), val(val) -{ - this->init_mask(comp, count); -} - -ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask) - : ir_rvalue(ir_type_swizzle, precision_from_ir(val)) -{ - this->val = val; - this->mask = mask; - this->type = glsl_type::get_instance(val->type->base_type, - mask.num_components, 1); -} - -#define X 1 -#define R 5 -#define S 9 -#define I 13 - -ir_swizzle * -ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length) -{ - void *ctx = ralloc_parent(val); - - /* For each possible swizzle character, this table encodes the value in - * \c idx_map that represents the 0th element of the vector. For invalid - * swizzle characters (e.g., 'k'), a special value is used that will allow - * detection of errors. - */ - static const unsigned char base_idx[26] = { - /* a b c d e f g h i j k l m */ - R, R, I, I, I, I, R, I, I, I, I, I, I, - /* n o p q r s t u v w x y z */ - I, I, S, S, R, S, S, I, I, X, X, X, X - }; - - /* Each valid swizzle character has an entry in the previous table. This - * table encodes the base index encoded in the previous table plus the actual - * index of the swizzle character. When processing swizzles, the first - * character in the string is indexed in the previous table. Each character - * in the string is indexed in this table, and the value found there has the - * value form the first table subtracted. The result must be on the range - * [0,3]. - * - * For example, the string "wzyx" will get X from the first table. Each of - * the charcaters will get X+3, X+2, X+1, and X+0 from this table. After - * subtraction, the swizzle values are { 3, 2, 1, 0 }. - * - * The string "wzrg" will get X from the first table. Each of the characters - * will get X+3, X+2, R+0, and R+1 from this table. After subtraction, the - * swizzle values are { 3, 2, 4, 5 }. Since 4 and 5 are outside the range - * [0,3], the error is detected. - */ - static const unsigned char idx_map[26] = { - /* a b c d e f g h i j k l m */ - R+3, R+2, 0, 0, 0, 0, R+1, 0, 0, 0, 0, 0, 0, - /* n o p q r s t u v w x y z */ - 0, 0, S+2, S+3, R+0, S+0, S+1, 0, 0, X+3, X+0, X+1, X+2 - }; - - int swiz_idx[4] = { 0, 0, 0, 0 }; - unsigned i; - - - /* Validate the first character in the swizzle string and look up the base - * index value as described above. - */ - if ((str[0] < 'a') || (str[0] > 'z')) - return NULL; - - const unsigned base = base_idx[str[0] - 'a']; - - - for (i = 0; (i < 4) && (str[i] != '\0'); i++) { - /* Validate the next character, and, as described above, convert it to a - * swizzle index. - */ - if ((str[i] < 'a') || (str[i] > 'z')) - return NULL; - - swiz_idx[i] = idx_map[str[i] - 'a'] - base; - if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length)) - return NULL; - } - - if (str[i] != '\0') - return NULL; - - return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2], - swiz_idx[3], i); -} - -#undef X -#undef R -#undef S -#undef I - -ir_variable * -ir_swizzle::variable_referenced() const -{ - return this->val->variable_referenced(); -} - - -bool ir_variable::temporaries_allocate_names = false; - -const char ir_variable::tmp_name[] = "compiler_temp"; - -ir_variable::ir_variable(const struct glsl_type *type, const char *name, - ir_variable_mode mode, glsl_precision precision) - : ir_instruction(ir_type_variable) -{ - this->type = type; - - if (mode == ir_var_temporary && !ir_variable::temporaries_allocate_names) - name = NULL; - - /* The ir_variable clone method may call this constructor with name set to - * tmp_name. - */ - assert(name != NULL - || mode == ir_var_temporary - || mode == ir_var_function_in - || mode == ir_var_function_out - || mode == ir_var_function_inout); - assert(name != ir_variable::tmp_name - || mode == ir_var_temporary); - if (mode == ir_var_temporary - && (name == NULL || name == ir_variable::tmp_name)) { - this->name = ir_variable::tmp_name; - } else { - this->name = ralloc_strdup(this, name); - } - - this->u.max_ifc_array_access = NULL; - - this->data.explicit_location = false; - this->data.has_initializer = false; - this->data.location = -1; - this->data.location_frac = 0; - this->data.binding = 0; - this->data.warn_extension_index = 0; - this->constant_value = NULL; - this->constant_initializer = NULL; - this->data.origin_upper_left = false; - this->data.pixel_center_integer = false; - this->data.depth_layout = ir_depth_layout_none; - this->data.used = false; - this->data.read_only = false; - this->data.centroid = false; - this->data.sample = false; - this->data.invariant = false; - this->data.how_declared = ir_var_declared_normally; - this->data.mode = mode; - this->data.precision = precision; - this->data.interpolation = INTERP_QUALIFIER_NONE; - this->data.max_array_access = 0; - this->data.atomic.offset = 0; - this->data.image_read_only = false; - this->data.image_write_only = false; - this->data.image_coherent = false; - this->data.image_volatile = false; - this->data.image_restrict = false; - - if (type != NULL) { - if (type->base_type == GLSL_TYPE_SAMPLER) - this->data.read_only = true; - - if (type->is_interface()) - this->init_interface_type(type); - else if (type->is_array() && type->fields.array->is_interface()) - this->init_interface_type(type->fields.array); - } -} - - -const char * -interpolation_string(unsigned interpolation) -{ - switch (interpolation) { - case INTERP_QUALIFIER_NONE: return "no"; - case INTERP_QUALIFIER_SMOOTH: return "smooth"; - case INTERP_QUALIFIER_FLAT: return "flat"; - case INTERP_QUALIFIER_NOPERSPECTIVE: return "noperspective"; - } - - assert(!"Should not get here."); - return ""; -} - - -glsl_interp_qualifier -ir_variable::determine_interpolation_mode(bool flat_shade) -{ - if (this->data.interpolation != INTERP_QUALIFIER_NONE) - return (glsl_interp_qualifier) this->data.interpolation; - int location = this->data.location; - bool is_gl_Color = - location == VARYING_SLOT_COL0 || location == VARYING_SLOT_COL1; - if (flat_shade && is_gl_Color) - return INTERP_QUALIFIER_FLAT; - else - return INTERP_QUALIFIER_SMOOTH; -} - -const char *const ir_variable::warn_extension_table[] = { - "", - "GL_ARB_shader_stencil_export", - "GL_AMD_shader_stencil_export", -}; - -void -ir_variable::enable_extension_warning(const char *extension) -{ - for (unsigned i = 0; i < Elements(warn_extension_table); i++) { - if (strcmp(warn_extension_table[i], extension) == 0) { - this->data.warn_extension_index = i; - return; - } - } - - assert(!"Should not get here."); - this->data.warn_extension_index = 0; -} - -const char * -ir_variable::get_extension_warning() const -{ - return this->data.warn_extension_index == 0 - ? NULL : warn_extension_table[this->data.warn_extension_index]; -} - -ir_function_signature::ir_function_signature(const glsl_type *return_type, - glsl_precision precision, builtin_available_predicate b) - : ir_instruction(ir_type_function_signature), - return_type(return_type), precision(precision), is_defined(false), is_intrinsic(false), - builtin_avail(b), _function(NULL) -{ - this->origin = NULL; -} - - -bool -ir_function_signature::is_builtin() const -{ - return builtin_avail != NULL; -} - - -bool -ir_function_signature::is_builtin_available(const _mesa_glsl_parse_state *state) const -{ - /* We can't call the predicate without a state pointer, so just say that - * the signature is available. At compile time, we need the filtering, - * but also receive a valid state pointer. At link time, we're resolving - * imported built-in prototypes to their definitions, which will always - * be an exact match. So we can skip the filtering. - */ - if (state == NULL) - return true; - - assert(builtin_avail != NULL); - return builtin_avail(state); -} - - -static bool -modes_match(unsigned a, unsigned b) -{ - if (a == b) - return true; - - /* Accept "in" vs. "const in" */ - if ((a == ir_var_const_in && b == ir_var_function_in) || - (b == ir_var_const_in && a == ir_var_function_in)) - return true; - - return false; -} - - -const char * -ir_function_signature::qualifiers_match(exec_list *params) -{ - /* check that the qualifiers match. */ - foreach_two_lists(a_node, &this->parameters, b_node, params) { - ir_variable *a = (ir_variable *) a_node; - ir_variable *b = (ir_variable *) b_node; - - /* NOTE: precision does not affect qualifier matching */ - if (a->data.read_only != b->data.read_only || - !modes_match(a->data.mode, b->data.mode) || - a->data.interpolation != b->data.interpolation || - a->data.centroid != b->data.centroid || - a->data.sample != b->data.sample || - a->data.image_read_only != b->data.image_read_only || - a->data.image_write_only != b->data.image_write_only || - a->data.image_coherent != b->data.image_coherent || - a->data.image_volatile != b->data.image_volatile || - a->data.image_restrict != b->data.image_restrict) { - - /* parameter a's qualifiers don't match */ - return a->name; - } - } - return NULL; -} - - -void -ir_function_signature::replace_parameters(exec_list *new_params) -{ - /* Destroy all of the previous parameter information. If the previous - * parameter information comes from the function prototype, it may either - * specify incorrect parameter names or not have names at all. - */ - new_params->move_nodes_to(¶meters); -} - - -ir_function::ir_function(const char *name) - : ir_instruction(ir_type_function) -{ - this->name = ralloc_strdup(this, name); -} - - -bool -ir_function::has_user_signature() -{ - foreach_in_list(ir_function_signature, sig, &this->signatures) { - if (!sig->is_builtin()) - return true; - } - return false; -} - - -ir_rvalue * -ir_rvalue::error_value(void *mem_ctx) -{ - ir_rvalue *v = new(mem_ctx) ir_rvalue(ir_type_unset, glsl_precision_undefined); - - v->type = glsl_type::error_type; - return v; -} - - -void -visit_exec_list(exec_list *list, ir_visitor *visitor) -{ - foreach_in_list_safe(ir_instruction, node, list) { - node->accept(visitor); - } -} - - -static void -steal_memory(ir_instruction *ir, void *new_ctx) -{ - ir_variable *var = ir->as_variable(); - ir_constant *constant = ir->as_constant(); - if (var != NULL && var->constant_value != NULL) - steal_memory(var->constant_value, ir); - - if (var != NULL && var->constant_initializer != NULL) - steal_memory(var->constant_initializer, ir); - - /* The components of aggregate constants are not visited by the normal - * visitor, so steal their values by hand. - */ - if (constant != NULL) { - if (constant->type->is_record()) { - foreach_in_list(ir_constant, field, &constant->components) { - steal_memory(field, ir); - } - } else if (constant->type->is_array()) { - for (unsigned int i = 0; i < constant->type->length; i++) { - steal_memory(constant->array_elements[i], ir); - } - } - } - - ralloc_steal(new_ctx, ir); -} - - -void -reparent_ir(exec_list *list, void *mem_ctx) -{ - foreach_in_list(ir_instruction, node, list) { - visit_tree(node, steal_memory, mem_ctx); - } -} - - -glsl_precision -precision_from_ir (ir_instruction* ir) -{ - if (!ir) - return glsl_precision_undefined; - ir_variable* var = ir->as_variable(); - if (var) - return (glsl_precision)var->data.precision; - ir_rvalue* rv = ir->as_rvalue(); - if (rv) - return rv->get_precision(); - ir_call* fcall = ir->as_call(); - if (fcall && fcall->return_deref) - return fcall->return_deref->get_precision(); - if (ir->ir_type == ir_type_function_signature) - { - ir_function_signature* sig = (ir_function_signature*)ir; - return sig->precision; - } - return glsl_precision_high; -} - -static ir_rvalue * -try_min_one(ir_rvalue *ir) -{ - ir_expression *expr = ir->as_expression(); - - if (!expr || expr->operation != ir_binop_min) - return NULL; - - if (expr->operands[0]->is_one()) - return expr->operands[1]; - - if (expr->operands[1]->is_one()) - return expr->operands[0]; - - return NULL; -} - -static ir_rvalue * -try_max_zero(ir_rvalue *ir) -{ - ir_expression *expr = ir->as_expression(); - - if (!expr || expr->operation != ir_binop_max) - return NULL; - - if (expr->operands[0]->is_zero()) - return expr->operands[1]; - - if (expr->operands[1]->is_zero()) - return expr->operands[0]; - - return NULL; -} - -ir_rvalue * -ir_rvalue::as_rvalue_to_saturate() -{ - ir_expression *expr = this->as_expression(); - - if (!expr) - return NULL; - - ir_rvalue *max_zero = try_max_zero(expr); - if (max_zero) { - return try_min_one(max_zero); - } else { - ir_rvalue *min_one = try_min_one(expr); - if (min_one) { - return try_max_zero(min_one); - } - } - - return NULL; -} - - -unsigned -vertices_per_prim(GLenum prim) -{ - switch (prim) { - case GL_POINTS: - return 1; - case GL_LINES: - return 2; - case GL_TRIANGLES: - return 3; - case GL_LINES_ADJACENCY: - return 4; - case GL_TRIANGLES_ADJACENCY: - return 6; - default: - assert(!"Bad primitive"); - return 3; - } -} - -/** - * Generate a string describing the mode of a variable - */ -const char * -mode_string(const ir_variable *var) -{ - switch (var->data.mode) { - case ir_var_auto: - return (var->data.read_only) ? "global constant" : "global variable"; - - case ir_var_uniform: - return "uniform"; - - case ir_var_shader_in: - return "shader input"; - - case ir_var_shader_out: - return "shader output"; - - case ir_var_shader_inout: - return "shader inout"; - - case ir_var_function_in: - case ir_var_const_in: - return "function input"; - - case ir_var_function_out: - return "function output"; - - case ir_var_function_inout: - return "function inout"; - - case ir_var_system_value: - return "shader input"; - - case ir_var_temporary: - return "compiler temporary"; - - case ir_var_mode_count: - break; - } - - assert(!"Should not get here."); - return "invalid variable"; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir.h b/3rdparty/glsl-optimizer/src/glsl/ir.h deleted file mode 100644 index 8ae18fccc..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir.h +++ /dev/null @@ -1,2533 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef IR_H -#define IR_H - -#include -#include - -#include "c99_compat.h" -#include "util/ralloc.h" -#include "glsl_types.h" -#include "list.h" -#include "ir_visitor.h" -#include "ir_hierarchical_visitor.h" -#include "main/mtypes.h" -#include "main/macros.h" - -#ifdef __cplusplus - -/** - * \defgroup IR Intermediate representation nodes - * - * @{ - */ - -/** - * Class tags - * - * Each concrete class derived from \c ir_instruction has a value in this - * enumerant. The value for the type is stored in \c ir_instruction::ir_type - * by the constructor. While using type tags is not very C++, it is extremely - * convenient. For example, during debugging you can simply inspect - * \c ir_instruction::ir_type to find out the actual type of the object. - * - * In addition, it is possible to use a switch-statement based on \c - * \c ir_instruction::ir_type to select different behavior for different object - * types. For functions that have only slight differences for several object - * types, this allows writing very straightforward, readable code. - */ -enum ir_node_type { - ir_type_dereference_array, - ir_type_dereference_record, - ir_type_dereference_variable, - ir_type_constant, - ir_type_expression, - ir_type_swizzle, - ir_type_texture, - ir_type_variable, - ir_type_assignment, - ir_type_call, - ir_type_function, - ir_type_function_signature, - ir_type_if, - ir_type_loop, - ir_type_loop_jump, - ir_type_return, - ir_type_precision, - ir_type_typedecl, - ir_type_discard, - ir_type_emit_vertex, - ir_type_end_primitive, - ir_type_max, /**< maximum ir_type enum number, for validation */ - ir_type_unset = ir_type_max -}; - - -/** - * Base class of all IR instructions - */ -class ir_instruction : public exec_node { -public: - enum ir_node_type ir_type; - - /** - * GCC 4.7+ and clang warn when deleting an ir_instruction unless - * there's a virtual destructor present. Because we almost - * universally use ralloc for our memory management of - * ir_instructions, the destructor doesn't need to do any work. - */ - virtual ~ir_instruction() - { - } - - /** ir_print_visitor helper for debugging. */ - void print(void) const; - void fprint(FILE *f) const; - - virtual void accept(ir_visitor *) = 0; - virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0; - virtual ir_instruction *clone(void *mem_ctx, - struct hash_table *ht) const = 0; - - /** - * \name IR instruction downcast functions - * - * These functions either cast the object to a derived class or return - * \c NULL if the object's type does not match the specified derived class. - * Additional downcast functions will be added as needed. - */ - /*@{*/ - class ir_rvalue *as_rvalue() - { - if (ir_type == ir_type_dereference_array || - ir_type == ir_type_dereference_record || - ir_type == ir_type_dereference_variable || - ir_type == ir_type_constant || - ir_type == ir_type_expression || - ir_type == ir_type_swizzle || - ir_type == ir_type_texture) - return (class ir_rvalue *) this; - return NULL; - } - - class ir_dereference *as_dereference() - { - if (ir_type == ir_type_dereference_array || - ir_type == ir_type_dereference_record || - ir_type == ir_type_dereference_variable) - return (class ir_dereference *) this; - return NULL; - } - - class ir_jump *as_jump() - { - if (ir_type == ir_type_loop_jump || - ir_type == ir_type_return || - ir_type == ir_type_discard) - return (class ir_jump *) this; - return NULL; - } - - #define AS_CHILD(TYPE) \ - class ir_##TYPE * as_##TYPE() \ - { \ - return ir_type == ir_type_##TYPE ? (ir_##TYPE *) this : NULL; \ - } - AS_CHILD(variable) - AS_CHILD(function) - AS_CHILD(dereference_array) - AS_CHILD(dereference_variable) - AS_CHILD(dereference_record) - AS_CHILD(expression) - AS_CHILD(loop) - AS_CHILD(assignment) - AS_CHILD(call) - AS_CHILD(return) - AS_CHILD(if) - AS_CHILD(swizzle) - AS_CHILD(texture) - AS_CHILD(constant) - AS_CHILD(discard) - #undef AS_CHILD - /*@}*/ - - /** - * IR equality method: Return true if the referenced instruction would - * return the same value as this one. - * - * This intended to be used for CSE and algebraic optimizations, on rvalues - * in particular. No support for other instruction types (assignments, - * jumps, calls, etc.) is planned. - */ - virtual bool equals(ir_instruction *ir, enum ir_node_type ignore = ir_type_unset); - -protected: - ir_instruction(enum ir_node_type t) - : ir_type(t) - { - } - -private: - ir_instruction() - { - assert(!"Should not get here."); - } -}; - - -/** - * The base class for all "values"/expression trees. - */ -class ir_rvalue : public ir_instruction { -public: - const struct glsl_type *type; - - virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const; - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); - - ir_rvalue *as_rvalue_to_saturate(); - - virtual bool is_lvalue() const - { - return false; - } - - /** - * Get the variable that is ultimately referenced by an r-value - */ - virtual ir_variable *variable_referenced() const - { - return NULL; - } - - - /** - * If an r-value is a reference to a whole variable, get that variable - * - * \return - * Pointer to a variable that is completely dereferenced by the r-value. If - * the r-value is not a dereference or the dereference does not access the - * entire variable (i.e., it's just one array element, struct field), \c NULL - * is returned. - */ - virtual ir_variable *whole_variable_referenced() - { - return NULL; - } - - glsl_precision get_precision() const { return precision; } - void set_precision (glsl_precision prec) { precision = prec; } - - /** - * Determine if an r-value has the value zero - * - * The base implementation of this function always returns \c false. The - * \c ir_constant class over-rides this function to return \c true \b only - * for vector and scalar types that have all elements set to the value - * zero (or \c false for booleans). - * - * \sa ir_constant::has_value, ir_rvalue::is_one, ir_rvalue::is_negative_one, - * ir_constant::is_basis - */ - virtual bool is_zero() const; - - /** - * Determine if an r-value has the value one - * - * The base implementation of this function always returns \c false. The - * \c ir_constant class over-rides this function to return \c true \b only - * for vector and scalar types that have all elements set to the value - * one (or \c true for booleans). - * - * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_negative_one, - * ir_constant::is_basis - */ - virtual bool is_one() const; - - /** - * Determine if an r-value has the value negative one - * - * The base implementation of this function always returns \c false. The - * \c ir_constant class over-rides this function to return \c true \b only - * for vector and scalar types that have all elements set to the value - * negative one. For boolean types, the result is always \c false. - * - * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_one - * ir_constant::is_basis - */ - virtual bool is_negative_one() const; - - /** - * Determine if an r-value is a basis vector - * - * The base implementation of this function always returns \c false. The - * \c ir_constant class over-rides this function to return \c true \b only - * for vector and scalar types that have one element set to the value one, - * and the other elements set to the value zero. For boolean types, the - * result is always \c false. - * - * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_one, - * is_constant::is_negative_one - */ - virtual bool is_basis() const; - - /** - * Determine if an r-value is an unsigned integer constant which can be - * stored in 16 bits. - * - * \sa ir_constant::is_uint16_constant. - */ - virtual bool is_uint16_constant() const { return false; } - - /** - * Return a generic value of error_type. - * - * Allocation will be performed with 'mem_ctx' as ralloc owner. - */ - static ir_rvalue *error_value(void *mem_ctx); - -protected: - ir_rvalue(enum ir_node_type t, glsl_precision precision); - - glsl_precision precision; -}; - - -/** - * Variable storage classes - */ -enum ir_variable_mode { - ir_var_auto = 0, /**< Function local variables and globals. */ - ir_var_uniform, /**< Variable declared as a uniform. */ - ir_var_shader_in, - ir_var_shader_out, - ir_var_shader_inout, - ir_var_function_in, - ir_var_function_out, - ir_var_function_inout, - ir_var_const_in, /**< "in" param that must be a constant expression */ - ir_var_system_value, /**< Ex: front-face, instance-id, etc. */ - ir_var_temporary, /**< Temporary variable generated during compilation. */ - ir_var_mode_count /**< Number of variable modes */ -}; - -/** - * Enum keeping track of how a variable was declared. For error checking of - * the gl_PerVertex redeclaration rules. - */ -enum ir_var_declaration_type { - /** - * Normal declaration (for most variables, this means an explicit - * declaration. Exception: temporaries are always implicitly declared, but - * they still use ir_var_declared_normally). - * - * Note: an ir_variable that represents a named interface block uses - * ir_var_declared_normally. - */ - ir_var_declared_normally = 0, - - /** - * Variable was explicitly declared (or re-declared) in an unnamed - * interface block. - */ - ir_var_declared_in_block, - - /** - * Variable is an implicitly declared built-in that has not been explicitly - * re-declared by the shader. - */ - ir_var_declared_implicitly, -}; - -/** - * \brief Layout qualifiers for gl_FragDepth. - * - * The AMD/ARB_conservative_depth extensions allow gl_FragDepth to be redeclared - * with a layout qualifier. - */ -enum ir_depth_layout { - ir_depth_layout_none, /**< No depth layout is specified. */ - ir_depth_layout_any, - ir_depth_layout_greater, - ir_depth_layout_less, - ir_depth_layout_unchanged -}; - -/** - * \brief Convert depth layout qualifier to string. - */ -const char* -depth_layout_string(ir_depth_layout layout); - -/** - * Description of built-in state associated with a uniform - * - * \sa ir_variable::state_slots - */ -struct ir_state_slot { - int tokens[5]; - int swizzle; -}; - - -/** - * Get the string value for an interpolation qualifier - * - * \return The string that would be used in a shader to specify \c - * mode will be returned. - * - * This function is used to generate error messages of the form "shader - * uses %s interpolation qualifier", so in the case where there is no - * interpolation qualifier, it returns "no". - * - * This function should only be used on a shader input or output variable. - */ -const char *interpolation_string(unsigned interpolation); - - -class ir_variable : public ir_instruction { -public: - ir_variable(const struct glsl_type *, const char *, ir_variable_mode, glsl_precision); - - virtual ir_variable *clone(void *mem_ctx, struct hash_table *ht) const; - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - - /** - * Determine how this variable should be interpolated based on its - * interpolation qualifier (if present), whether it is gl_Color or - * gl_SecondaryColor, and whether flatshading is enabled in the current GL - * state. - * - * The return value will always be either INTERP_QUALIFIER_SMOOTH, - * INTERP_QUALIFIER_NOPERSPECTIVE, or INTERP_QUALIFIER_FLAT. - */ - glsl_interp_qualifier determine_interpolation_mode(bool flat_shade); - - /** - * Determine whether or not a variable is part of a uniform block. - */ - inline bool is_in_uniform_block() const - { - return this->data.mode == ir_var_uniform && this->interface_type != NULL; - } - - /** - * Determine whether or not a variable is the declaration of an interface - * block - * - * For the first declaration below, there will be an \c ir_variable named - * "instance" whose type and whose instance_type will be the same - * \cglsl_type. For the second declaration, there will be an \c ir_variable - * named "f" whose type is float and whose instance_type is B2. - * - * "instance" is an interface instance variable, but "f" is not. - * - * uniform B1 { - * float f; - * } instance; - * - * uniform B2 { - * float f; - * }; - */ - inline bool is_interface_instance() const - { - const glsl_type *const t = this->type; - - return (t == this->interface_type) - || (t->is_array() && t->fields.array == this->interface_type); - } - - /** - * Set this->interface_type on a newly created variable. - */ - void init_interface_type(const struct glsl_type *type) - { - assert(this->interface_type == NULL); - this->interface_type = type; - if (this->is_interface_instance()) { - this->u.max_ifc_array_access = - rzalloc_array(this, unsigned, type->length); - } - } - - /** - * Change this->interface_type on a variable that previously had a - * different, but compatible, interface_type. This is used during linking - * to set the size of arrays in interface blocks. - */ - void change_interface_type(const struct glsl_type *type) - { - if (this->u.max_ifc_array_access != NULL) { - /* max_ifc_array_access has already been allocated, so make sure the - * new interface has the same number of fields as the old one. - */ - assert(this->interface_type->length == type->length); - } - this->interface_type = type; - } - - /** - * Change this->interface_type on a variable that previously had a - * different, and incompatible, interface_type. This is used during - * compilation to handle redeclaration of the built-in gl_PerVertex - * interface block. - */ - void reinit_interface_type(const struct glsl_type *type) - { - if (this->u.max_ifc_array_access != NULL) { -#ifndef NDEBUG - /* Redeclaring gl_PerVertex is only allowed if none of the built-ins - * it defines have been accessed yet; so it's safe to throw away the - * old max_ifc_array_access pointer, since all of its values are - * zero. - */ - for (unsigned i = 0; i < this->interface_type->length; i++) - assert(this->u.max_ifc_array_access[i] == 0); -#endif - ralloc_free(this->u.max_ifc_array_access); - this->u.max_ifc_array_access = NULL; - } - this->interface_type = NULL; - init_interface_type(type); - } - - const glsl_type *get_interface_type() const - { - return this->interface_type; - } - - /** - * Get the max_ifc_array_access pointer - * - * A "set" function is not needed because the array is dynmically allocated - * as necessary. - */ - inline unsigned *get_max_ifc_array_access() - { - assert(this->data._num_state_slots == 0); - return this->u.max_ifc_array_access; - } - - inline unsigned get_num_state_slots() const - { - assert(!this->is_interface_instance() - || this->data._num_state_slots == 0); - return this->data._num_state_slots; - } - - inline void set_num_state_slots(unsigned n) - { - assert(!this->is_interface_instance() - || n == 0); - this->data._num_state_slots = n; - } - - inline ir_state_slot *get_state_slots() - { - return this->is_interface_instance() ? NULL : this->u.state_slots; - } - - inline const ir_state_slot *get_state_slots() const - { - return this->is_interface_instance() ? NULL : this->u.state_slots; - } - - inline ir_state_slot *allocate_state_slots(unsigned n) - { - assert(!this->is_interface_instance()); - - this->u.state_slots = ralloc_array(this, ir_state_slot, n); - this->data._num_state_slots = 0; - - if (this->u.state_slots != NULL) - this->data._num_state_slots = n; - - return this->u.state_slots; - } - - inline bool is_name_ralloced() const - { - return this->name != ir_variable::tmp_name; - } - - /** - * Enable emitting extension warnings for this variable - */ - void enable_extension_warning(const char *extension); - - /** - * Get the extension warning string for this variable - * - * If warnings are not enabled, \c NULL is returned. - */ - const char *get_extension_warning() const; - - /** - * Declared type of the variable - */ - const struct glsl_type *type; - - /** - * Declared name of the variable - */ - const char *name; - - struct ir_variable_data { - - /** - * Is the variable read-only? - * - * This is set for variables declared as \c const, shader inputs, - * and uniforms. - */ - unsigned read_only:1; - unsigned centroid:1; - unsigned sample:1; - unsigned invariant:1; - unsigned precise:1; - - /** - * Has this variable been used for reading or writing? - * - * Several GLSL semantic checks require knowledge of whether or not a - * variable has been used. For example, it is an error to redeclare a - * variable as invariant after it has been used. - * - * This is only maintained in the ast_to_hir.cpp path, not in - * Mesa's fixed function or ARB program paths. - */ - unsigned used:1; - - /** - * Has this variable been statically assigned? - * - * This answers whether the variable was assigned in any path of - * the shader during ast_to_hir. This doesn't answer whether it is - * still written after dead code removal, nor is it maintained in - * non-ast_to_hir.cpp (GLSL parsing) paths. - */ - unsigned assigned:1; - - /** - * Enum indicating how the variable was declared. See - * ir_var_declaration_type. - * - * This is used to detect certain kinds of illegal variable redeclarations. - */ - unsigned how_declared:2; - - /** - * Storage class of the variable. - * - * \sa ir_variable_mode - */ - unsigned mode:4; - - /** - * Interpolation mode for shader inputs / outputs - * - * \sa ir_variable_interpolation - */ - unsigned interpolation:2; - - unsigned precision:2; - - /** - * \name ARB_fragment_coord_conventions - * @{ - */ - unsigned origin_upper_left:1; - unsigned pixel_center_integer:1; - /*@}*/ - - /** - * Was the location explicitly set in the shader? - * - * If the location is explicitly set in the shader, it \b cannot be changed - * by the linker or by the API (e.g., calls to \c glBindAttribLocation have - * no effect). - */ - unsigned explicit_location:1; - unsigned explicit_index:1; - - /** - * Was an initial binding explicitly set in the shader? - * - * If so, constant_value contains an integer ir_constant representing the - * initial binding point. - */ - unsigned explicit_binding:1; - - /** - * Does this variable have an initializer? - * - * This is used by the linker to cross-validiate initializers of global - * variables. - */ - unsigned has_initializer:1; - - /** - * Is this variable a generic output or input that has not yet been matched - * up to a variable in another stage of the pipeline? - * - * This is used by the linker as scratch storage while assigning locations - * to generic inputs and outputs. - */ - unsigned is_unmatched_generic_inout:1; - - /** - * If non-zero, then this variable may be packed along with other variables - * into a single varying slot, so this offset should be applied when - * accessing components. For example, an offset of 1 means that the x - * component of this variable is actually stored in component y of the - * location specified by \c location. - */ - unsigned location_frac:2; - - /** - * Layout of the matrix. Uses glsl_matrix_layout values. - */ - unsigned matrix_layout:2; - - /** - * Non-zero if this variable was created by lowering a named interface - * block which was not an array. - * - * Note that this variable and \c from_named_ifc_block_array will never - * both be non-zero. - */ - unsigned from_named_ifc_block_nonarray:1; - - /** - * Non-zero if this variable was created by lowering a named interface - * block which was an array. - * - * Note that this variable and \c from_named_ifc_block_nonarray will never - * both be non-zero. - */ - unsigned from_named_ifc_block_array:1; - - /** - * Non-zero if the variable must be a shader input. This is useful for - * constraints on function parameters. - */ - unsigned must_be_shader_input:1; - - /** - * Output index for dual source blending. - * - * \note - * The GLSL spec only allows the values 0 or 1 for the index in \b dual - * source blending. - */ - unsigned index:1; - - /** - * \brief Layout qualifier for gl_FragDepth. - * - * This is not equal to \c ir_depth_layout_none if and only if this - * variable is \c gl_FragDepth and a layout qualifier is specified. - */ - ir_depth_layout depth_layout:3; - - /** - * ARB_shader_image_load_store qualifiers. - */ - unsigned image_read_only:1; /**< "readonly" qualifier. */ - unsigned image_write_only:1; /**< "writeonly" qualifier. */ - unsigned image_coherent:1; - unsigned image_volatile:1; - unsigned image_restrict:1; - - /** - * Emit a warning if this variable is accessed. - */ - private: - uint8_t warn_extension_index; - - public: - /** Image internal format if specified explicitly, otherwise GL_NONE. */ - uint16_t image_format; - - private: - /** - * Number of state slots used - * - * \note - * This could be stored in as few as 7-bits, if necessary. If it is made - * smaller, add an assertion to \c ir_variable::allocate_state_slots to - * be safe. - */ - uint16_t _num_state_slots; - - public: - /** - * Initial binding point for a sampler, atomic, or UBO. - * - * For array types, this represents the binding point for the first element. - */ - int16_t binding; - - /** - * Storage location of the base of this variable - * - * The precise meaning of this field depends on the nature of the variable. - * - * - Vertex shader input: one of the values from \c gl_vert_attrib. - * - Vertex shader output: one of the values from \c gl_varying_slot. - * - Geometry shader input: one of the values from \c gl_varying_slot. - * - Geometry shader output: one of the values from \c gl_varying_slot. - * - Fragment shader input: one of the values from \c gl_varying_slot. - * - Fragment shader output: one of the values from \c gl_frag_result. - * - Uniforms: Per-stage uniform slot number for default uniform block. - * - Uniforms: Index within the uniform block definition for UBO members. - * - Other: This field is not currently used. - * - * If the variable is a uniform, shader input, or shader output, and the - * slot has not been assigned, the value will be -1. - */ - int location; - - /** - * Vertex stream output identifier. - */ - unsigned stream; - - /** - * Location an atomic counter is stored at. - */ - struct { - unsigned offset; - } atomic; - - /** - * Highest element accessed with a constant expression array index - * - * Not used for non-array variables. - */ - unsigned max_array_access; - - /** - * Allow (only) ir_variable direct access private members. - */ - friend class ir_variable; - } data; - - /** - * Value assigned in the initializer of a variable declared "const" - */ - ir_constant *constant_value; - - /** - * Constant expression assigned in the initializer of the variable - * - * \warning - * This field and \c ::constant_value are distinct. Even if the two fields - * refer to constants with the same value, they must point to separate - * objects. - */ - ir_constant *constant_initializer; - -private: - static const char *const warn_extension_table[]; - - union { - /** - * For variables which satisfy the is_interface_instance() predicate, - * this points to an array of integers such that if the ith member of - * the interface block is an array, max_ifc_array_access[i] is the - * maximum array element of that member that has been accessed. If the - * ith member of the interface block is not an array, - * max_ifc_array_access[i] is unused. - * - * For variables whose type is not an interface block, this pointer is - * NULL. - */ - unsigned *max_ifc_array_access; - - /** - * Built-in state that backs this uniform - * - * Once set at variable creation, \c state_slots must remain invariant. - * - * If the variable is not a uniform, \c _num_state_slots will be zero - * and \c state_slots will be \c NULL. - */ - ir_state_slot *state_slots; - } u; - - /** - * For variables that are in an interface block or are an instance of an - * interface block, this is the \c GLSL_TYPE_INTERFACE type for that block. - * - * \sa ir_variable::location - */ - const glsl_type *interface_type; - - /** - * Name used for anonymous compiler temporaries - */ - static const char tmp_name[]; - -public: - /** - * Should the construct keep names for ir_var_temporary variables? - * - * When this global is false, names passed to the constructor for - * \c ir_var_temporary variables will be dropped. Instead, the variable will - * be named "compiler_temp". This name will be in static storage. - * - * \warning - * \b NEVER change the mode of an \c ir_var_temporary. - * - * \warning - * This variable is \b not thread-safe. It is global, \b not - * per-context. It begins life false. A context can, at some point, make - * it true. From that point on, it will be true forever. This should be - * okay since it will only be set true while debugging. - */ - static bool temporaries_allocate_names; -}; - -/** - * A function that returns whether a built-in function is available in the - * current shading language (based on version, ES or desktop, and extensions). - */ -typedef bool (*builtin_available_predicate)(const _mesa_glsl_parse_state *); - -/*@{*/ -/** - * The representation of a function instance; may be the full definition or - * simply a prototype. - */ -class ir_function_signature : public ir_instruction { - /* An ir_function_signature will be part of the list of signatures in - * an ir_function. - */ -public: - ir_function_signature(const glsl_type *return_type, glsl_precision precision, - builtin_available_predicate builtin_avail = NULL); - - virtual ir_function_signature *clone(void *mem_ctx, - struct hash_table *ht) const; - ir_function_signature *clone_prototype(void *mem_ctx, - struct hash_table *ht) const; - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - /** - * Attempt to evaluate this function as a constant expression, - * given a list of the actual parameters and the variable context. - * Returns NULL for non-built-ins. - */ - ir_constant *constant_expression_value(exec_list *actual_parameters, struct hash_table *variable_context); - - /** - * Get the name of the function for which this is a signature - */ - const char *function_name() const; - - /** - * Get a handle to the function for which this is a signature - * - * There is no setter function, this function returns a \c const pointer, - * and \c ir_function_signature::_function is private for a reason. The - * only way to make a connection between a function and function signature - * is via \c ir_function::add_signature. This helps ensure that certain - * invariants (i.e., a function signature is in the list of signatures for - * its \c _function) are met. - * - * \sa ir_function::add_signature - */ - inline const class ir_function *function() const - { - return this->_function; - } - - /** - * Check whether the qualifiers match between this signature's parameters - * and the supplied parameter list. If not, returns the name of the first - * parameter with mismatched qualifiers (for use in error messages). - */ - const char *qualifiers_match(exec_list *params); - - /** - * Replace the current parameter list with the given one. This is useful - * if the current information came from a prototype, and either has invalid - * or missing parameter names. - */ - void replace_parameters(exec_list *new_params); - - /** - * Function return type. - */ - const struct glsl_type *return_type; - - glsl_precision precision; - - /** - * List of ir_variable of function parameters. - * - * This represents the storage. The paramaters passed in a particular - * call will be in ir_call::actual_paramaters. - */ - struct exec_list parameters; - - /** Whether or not this function has a body (which may be empty). */ - unsigned is_defined:1; - - /** Whether or not this function signature is a built-in. */ - bool is_builtin() const; - - /** - * Whether or not this function is an intrinsic to be implemented - * by the driver. - */ - bool is_intrinsic; - - /** Whether or not a built-in is available for this shader. */ - bool is_builtin_available(const _mesa_glsl_parse_state *state) const; - - /** Body of instructions in the function. */ - struct exec_list body; - -private: - /** - * A function pointer to a predicate that answers whether a built-in - * function is available in the current shader. NULL if not a built-in. - */ - builtin_available_predicate builtin_avail; - - /** Function of which this signature is one overload. */ - class ir_function *_function; - - /** Function signature of which this one is a prototype clone */ - const ir_function_signature *origin; - - friend class ir_function; - - /** - * Helper function to run a list of instructions for constant - * expression evaluation. - * - * The hash table represents the values of the visible variables. - * There are no scoping issues because the table is indexed on - * ir_variable pointers, not variable names. - * - * Returns false if the expression is not constant, true otherwise, - * and the value in *result if result is non-NULL. - */ - bool constant_expression_evaluate_expression_list(const struct exec_list &body, - struct hash_table *variable_context, - ir_constant **result); -}; - - -/** - * Header for tracking multiple overloaded functions with the same name. - * Contains a list of ir_function_signatures representing each of the - * actual functions. - */ -class ir_function : public ir_instruction { -public: - ir_function(const char *name); - - virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const; - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - void add_signature(ir_function_signature *sig) - { - sig->_function = this; - this->signatures.push_tail(sig); - } - - /** - * Find a signature that matches a set of actual parameters, taking implicit - * conversions into account. Also flags whether the match was exact. - */ - ir_function_signature *matching_signature(_mesa_glsl_parse_state *state, - const exec_list *actual_param, - bool allow_builtins, - bool *match_is_exact); - - /** - * Find a signature that matches a set of actual parameters, taking implicit - * conversions into account. - */ - ir_function_signature *matching_signature(_mesa_glsl_parse_state *state, - const exec_list *actual_param, - bool allow_builtins); - - /** - * Find a signature that exactly matches a set of actual parameters without - * any implicit type conversions. - */ - ir_function_signature *exact_matching_signature(_mesa_glsl_parse_state *state, - const exec_list *actual_ps); - - /** - * Name of the function. - */ - const char *name; - - /** Whether or not this function has a signature that isn't a built-in. */ - bool has_user_signature(); - - /** - * List of ir_function_signature for each overloaded function with this name. - */ - struct exec_list signatures; -}; - -inline const char *ir_function_signature::function_name() const -{ - return this->_function->name; -} -/*@}*/ - - -/** - * IR instruction representing high-level if-statements - */ -class ir_if : public ir_instruction { -public: - ir_if(ir_rvalue *condition) - : ir_instruction(ir_type_if), condition(condition) - { - } - - virtual ir_if *clone(void *mem_ctx, struct hash_table *ht) const; - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - ir_rvalue *condition; - /** List of ir_instruction for the body of the then branch */ - exec_list then_instructions; - /** List of ir_instruction for the body of the else branch */ - exec_list else_instructions; -}; - - -/** - * IR instruction representing a high-level loop structure. - */ -class ir_loop : public ir_instruction { -public: - ir_loop(); - - virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const; - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - /** List of ir_instruction that make up the body of the loop. */ - exec_list body_instructions; -}; - - -class ir_assignment : public ir_instruction { -public: - ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition = NULL); - - /** - * Construct an assignment with an explicit write mask - * - * \note - * Since a write mask is supplied, the LHS must already be a bare - * \c ir_dereference. The cannot be any swizzles in the LHS. - */ - ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, ir_rvalue *condition, - unsigned write_mask); - - virtual ir_assignment *clone(void *mem_ctx, struct hash_table *ht) const; - - virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - /** - * Get a whole variable written by an assignment - * - * If the LHS of the assignment writes a whole variable, the variable is - * returned. Otherwise \c NULL is returned. Examples of whole-variable - * assignment are: - * - * - Assigning to a scalar - * - Assigning to all components of a vector - * - Whole array (or matrix) assignment - * - Whole structure assignment - */ - ir_variable *whole_variable_written(); - - /** - * Set the LHS of an assignment - */ - void set_lhs(ir_rvalue *lhs); - - /** - * Left-hand side of the assignment. - * - * This should be treated as read only. If you need to set the LHS of an - * assignment, use \c ir_assignment::set_lhs. - */ - ir_dereference *lhs; - - /** - * Value being assigned - */ - ir_rvalue *rhs; - - /** - * Optional condition for the assignment. - */ - ir_rvalue *condition; - - - /** - * Component mask written - * - * For non-vector types in the LHS, this field will be zero. For vector - * types, a bit will be set for each component that is written. Note that - * for \c vec2 and \c vec3 types only the lower bits will ever be set. - * - * A partially-set write mask means that each enabled channel gets - * the value from a consecutive channel of the rhs. For example, - * to write just .xyw of gl_FrontColor with color: - * - * (assign (constant bool (1)) (xyw) - * (var_ref gl_FragColor) - * (swiz xyw (var_ref color))) - */ - unsigned write_mask:4; -}; - -/* Update ir_expression::get_num_operands() and operator_strs when - * updating this list. - */ -enum ir_expression_operation { - ir_unop_bit_not, - ir_unop_logic_not, - ir_unop_neg, - ir_unop_abs, - ir_unop_sign, - ir_unop_rcp, - ir_unop_rsq, - ir_unop_sqrt, - ir_unop_normalize, - ir_unop_exp, /**< Log base e on gentype */ - ir_unop_log, /**< Natural log on gentype */ - ir_unop_exp2, - ir_unop_log2, - ir_unop_f2i, /**< Float-to-integer conversion. */ - ir_unop_f2u, /**< Float-to-unsigned conversion. */ - ir_unop_i2f, /**< Integer-to-float conversion. */ - ir_unop_f2b, /**< Float-to-boolean conversion */ - ir_unop_b2f, /**< Boolean-to-float conversion */ - ir_unop_i2b, /**< int-to-boolean conversion */ - ir_unop_b2i, /**< Boolean-to-int conversion */ - ir_unop_u2f, /**< Unsigned-to-float conversion. */ - ir_unop_i2u, /**< Integer-to-unsigned conversion. */ - ir_unop_u2i, /**< Unsigned-to-integer conversion. */ - ir_unop_bitcast_i2f, /**< Bit-identical int-to-float "conversion" */ - ir_unop_bitcast_f2i, /**< Bit-identical float-to-int "conversion" */ - ir_unop_bitcast_u2f, /**< Bit-identical uint-to-float "conversion" */ - ir_unop_bitcast_f2u, /**< Bit-identical float-to-uint "conversion" */ - ir_unop_any, - - /** - * \name Unary floating-point rounding operations. - */ - /*@{*/ - ir_unop_trunc, - ir_unop_ceil, - ir_unop_floor, - ir_unop_fract, - ir_unop_round_even, - /*@}*/ - - /** - * \name Trigonometric operations. - */ - /*@{*/ - ir_unop_sin, - ir_unop_cos, - ir_unop_sin_reduced, /**< Reduced range sin. [-pi, pi] */ - ir_unop_cos_reduced, /**< Reduced range cos. [-pi, pi] */ - /*@}*/ - - /** - * \name Partial derivatives. - */ - /*@{*/ - ir_unop_dFdx, - ir_unop_dFdx_coarse, - ir_unop_dFdx_fine, - ir_unop_dFdy, - ir_unop_dFdy_coarse, - ir_unop_dFdy_fine, - /*@}*/ - - /** - * \name Floating point pack and unpack operations. - */ - /*@{*/ - ir_unop_pack_snorm_2x16, - ir_unop_pack_snorm_4x8, - ir_unop_pack_unorm_2x16, - ir_unop_pack_unorm_4x8, - ir_unop_pack_half_2x16, - ir_unop_unpack_snorm_2x16, - ir_unop_unpack_snorm_4x8, - ir_unop_unpack_unorm_2x16, - ir_unop_unpack_unorm_4x8, - ir_unop_unpack_half_2x16, - /*@}*/ - - /** - * \name Lowered floating point unpacking operations. - * - * \see lower_packing_builtins_visitor::split_unpack_half_2x16 - */ - /*@{*/ - ir_unop_unpack_half_2x16_split_x, - ir_unop_unpack_half_2x16_split_y, - /*@}*/ - - /** - * \name Bit operations, part of ARB_gpu_shader5. - */ - /*@{*/ - ir_unop_bitfield_reverse, - ir_unop_bit_count, - ir_unop_find_msb, - ir_unop_find_lsb, - /*@}*/ - - ir_unop_saturate, - ir_unop_noise, - - /** - * Interpolate fs input at centroid - * - * operand0 is the fs input. - */ - ir_unop_interpolate_at_centroid, - - /** - * A sentinel marking the last of the unary operations. - */ - ir_last_unop = ir_unop_interpolate_at_centroid, - - ir_binop_add, - ir_binop_sub, - ir_binop_mul, /**< Floating-point or low 32-bit integer multiply. */ - ir_binop_imul_high, /**< Calculates the high 32-bits of a 64-bit multiply. */ - ir_binop_div, - - /** - * Returns the carry resulting from the addition of the two arguments. - */ - /*@{*/ - ir_binop_carry, - /*@}*/ - - /** - * Returns the borrow resulting from the subtraction of the second argument - * from the first argument. - */ - /*@{*/ - ir_binop_borrow, - /*@}*/ - - /** - * Takes one of two combinations of arguments: - * - * - mod(vecN, vecN) - * - mod(vecN, float) - * - * Does not take integer types. - */ - ir_binop_mod, - - /** - * \name Binary comparison operators which return a boolean vector. - * The type of both operands must be equal. - */ - /*@{*/ - ir_binop_less, - ir_binop_greater, - ir_binop_lequal, - ir_binop_gequal, - ir_binop_equal, - ir_binop_nequal, - /** - * Returns single boolean for whether all components of operands[0] - * equal the components of operands[1]. - */ - ir_binop_all_equal, - /** - * Returns single boolean for whether any component of operands[0] - * is not equal to the corresponding component of operands[1]. - */ - ir_binop_any_nequal, - /*@}*/ - - /** - * \name Bit-wise binary operations. - */ - /*@{*/ - ir_binop_lshift, - ir_binop_rshift, - ir_binop_bit_and, - ir_binop_bit_xor, - ir_binop_bit_or, - /*@}*/ - - ir_binop_logic_and, - ir_binop_logic_xor, - ir_binop_logic_or, - - ir_binop_dot, - ir_binop_min, - ir_binop_max, - - ir_binop_pow, - - /** - * \name Lowered floating point packing operations. - * - * \see lower_packing_builtins_visitor::split_pack_half_2x16 - */ - /*@{*/ - ir_binop_pack_half_2x16_split, - /*@}*/ - - /** - * \name First half of a lowered bitfieldInsert() operation. - * - * \see lower_instructions::bitfield_insert_to_bfm_bfi - */ - /*@{*/ - ir_binop_bfm, - /*@}*/ - - /** - * Load a value the size of a given GLSL type from a uniform block. - * - * operand0 is the ir_constant uniform block index in the linked shader. - * operand1 is a byte offset within the uniform block. - */ - ir_binop_ubo_load, - - /** - * \name Multiplies a number by two to a power, part of ARB_gpu_shader5. - */ - /*@{*/ - ir_binop_ldexp, - /*@}*/ - - /** - * Extract a scalar from a vector - * - * operand0 is the vector - * operand1 is the index of the field to read from operand0 - */ - ir_binop_vector_extract, - - /** - * Interpolate fs input at offset - * - * operand0 is the fs input - * operand1 is the offset from the pixel center - */ - ir_binop_interpolate_at_offset, - - /** - * Interpolate fs input at sample position - * - * operand0 is the fs input - * operand1 is the sample ID - */ - ir_binop_interpolate_at_sample, - - /** - * A sentinel marking the last of the binary operations. - */ - ir_last_binop = ir_binop_interpolate_at_sample, - - /** - * \name Fused floating-point multiply-add, part of ARB_gpu_shader5. - */ - /*@{*/ - ir_triop_fma, - /*@}*/ - - ir_triop_clamp, - ir_triop_lrp, - - /** - * \name Conditional Select - * - * A vector conditional select instruction (like ?:, but operating per- - * component on vectors). - * - * \see lower_instructions_visitor::ldexp_to_arith - */ - /*@{*/ - ir_triop_csel, - /*@}*/ - - /** - * \name Second half of a lowered bitfieldInsert() operation. - * - * \see lower_instructions::bitfield_insert_to_bfm_bfi - */ - /*@{*/ - ir_triop_bfi, - /*@}*/ - - ir_triop_bitfield_extract, - - /** - * Generate a value with one field of a vector changed - * - * operand0 is the vector - * operand1 is the value to write into the vector result - * operand2 is the index in operand0 to be modified - */ - ir_triop_vector_insert, - - /** - * A sentinel marking the last of the ternary operations. - */ - ir_last_triop = ir_triop_vector_insert, - - ir_quadop_bitfield_insert, - - ir_quadop_vector, - - /** - * A sentinel marking the last of the ternary operations. - */ - ir_last_quadop = ir_quadop_vector, - - /** - * A sentinel marking the last of all operations. - */ - ir_last_opcode = ir_quadop_vector -}; - -class ir_expression : public ir_rvalue { -public: - ir_expression(int op, const struct glsl_type *type, - ir_rvalue *op0, ir_rvalue *op1 = NULL, - ir_rvalue *op2 = NULL, ir_rvalue *op3 = NULL); - - /** - * Constructor for unary operation expressions - */ - ir_expression(int op, ir_rvalue *); - - /** - * Constructor for binary operation expressions - */ - ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1); - - /** - * Constructor for ternary operation expressions - */ - ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1, ir_rvalue *op2); - - virtual bool equals(ir_instruction *ir, enum ir_node_type ignore = ir_type_unset); - - virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const; - - /** - * Attempt to constant-fold the expression - * - * The "variable_context" hash table links ir_variable * to ir_constant * - * that represent the variables' values. \c NULL represents an empty - * context. - * - * If the expression cannot be constant folded, this method will return - * \c NULL. - */ - virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); - - /** - * Determine the number of operands used by an expression - */ - static unsigned int get_num_operands(ir_expression_operation); - - /** - * Determine the number of operands used by an expression - */ - unsigned int get_num_operands() const - { - return (this->operation == ir_quadop_vector) - ? this->type->vector_elements : get_num_operands(operation); - } - - /** - * Return whether the expression operates on vectors horizontally. - */ - bool is_horizontal() const - { - return operation == ir_binop_all_equal || - operation == ir_binop_any_nequal || - operation == ir_unop_any || - operation == ir_binop_dot || - operation == ir_quadop_vector; - } - - /** - * Return a string representing this expression's operator. - */ - const char *operator_string(); - - /** - * Return a string representing this expression's operator. - */ - static const char *operator_string(ir_expression_operation); - - - /** - * Do a reverse-lookup to translate the given string into an operator. - */ - static ir_expression_operation get_operator(const char *); - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - ir_expression_operation operation; - ir_rvalue *operands[4]; -}; - - -/** - * HIR instruction representing a high-level function call, containing a list - * of parameters and returning a value in the supplied temporary. - */ -class ir_call : public ir_instruction { -public: - ir_call(ir_function_signature *callee, - ir_dereference_variable *return_deref, - exec_list *actual_parameters) - : ir_instruction(ir_type_call), return_deref(return_deref), callee(callee) - { - assert(callee->return_type != NULL); - actual_parameters->move_nodes_to(& this->actual_parameters); - this->use_builtin = callee->is_builtin(); - } - - virtual ir_call *clone(void *mem_ctx, struct hash_table *ht) const; - - virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - /** - * Get the name of the function being called. - */ - const char *callee_name() const - { - return callee->function_name(); - } - - /** - * Generates an inline version of the function before @ir, - * storing the return value in return_deref. - */ - void generate_inline(ir_instruction *ir); - - /** - * Storage for the function's return value. - * This must be NULL if the return type is void. - */ - ir_dereference_variable *return_deref; - - /** - * The specific function signature being called. - */ - ir_function_signature *callee; - - /* List of ir_rvalue of paramaters passed in this call. */ - exec_list actual_parameters; - - /** Should this call only bind to a built-in function? */ - bool use_builtin; -}; - - -/** - * \name Jump-like IR instructions. - * - * These include \c break, \c continue, \c return, and \c discard. - */ -/*@{*/ -class ir_jump : public ir_instruction { -protected: - ir_jump(enum ir_node_type t) - : ir_instruction(t) - { - } -}; - -class ir_return : public ir_jump { -public: - ir_return() - : ir_jump(ir_type_return), value(NULL) - { - } - - ir_return(ir_rvalue *value) - : ir_jump(ir_type_return), value(value) - { - } - - virtual ir_return *clone(void *mem_ctx, struct hash_table *) const; - - ir_rvalue *get_value() const - { - return value; - } - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - ir_rvalue *value; -}; - - -/** - * Jump instructions used inside loops - * - * These include \c break and \c continue. The \c break within a loop is - * different from the \c break within a switch-statement. - * - * \sa ir_switch_jump - */ -class ir_loop_jump : public ir_jump { -public: - enum jump_mode { - jump_break, - jump_continue - }; - - ir_loop_jump(jump_mode mode) - : ir_jump(ir_type_loop_jump) - { - this->mode = mode; - } - - virtual ir_loop_jump *clone(void *mem_ctx, struct hash_table *) const; - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - bool is_break() const - { - return mode == jump_break; - } - - bool is_continue() const - { - return mode == jump_continue; - } - - /** Mode selector for the jump instruction. */ - enum jump_mode mode; -}; - -/** - * IR instruction representing discard statements. - */ -class ir_discard : public ir_jump { -public: - ir_discard() - : ir_jump(ir_type_discard) - { - this->condition = NULL; - } - - ir_discard(ir_rvalue *cond) - : ir_jump(ir_type_discard) - { - this->condition = cond; - } - - virtual ir_discard *clone(void *mem_ctx, struct hash_table *ht) const; - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - ir_rvalue *condition; -}; -/*@}*/ - - -/** - * Texture sampling opcodes used in ir_texture - */ -enum ir_texture_opcode { - ir_tex, /**< Regular texture look-up */ - ir_txb, /**< Texture look-up with LOD bias */ - ir_txl, /**< Texture look-up with explicit LOD */ - ir_txd, /**< Texture look-up with partial derivatvies */ - ir_txf, /**< Texel fetch with explicit LOD */ - ir_txf_ms, /**< Multisample texture fetch */ - ir_txs, /**< Texture size */ - ir_lod, /**< Texture lod query */ - ir_tg4, /**< Texture gather */ - ir_query_levels /**< Texture levels query */ -}; - - -/** - * IR instruction to sample a texture - * - * The specific form of the IR instruction depends on the \c mode value - * selected from \c ir_texture_opcodes. In the printed IR, these will - * appear as: - * - * Texel offset (0 or an expression) - * | - * v - * (tex 0) - * (txb 0 ) - * (txl 0 ) - * (txd 0 (dPdx dPdy)) - * (txf 0 ) - * (txf_ms - * ) - * (txs ) - * (lod ) - * (tg4 ) - * (query_levels ) - */ -class ir_texture : public ir_rvalue { -public: - ir_texture(enum ir_texture_opcode op) - : ir_rvalue(ir_type_texture, glsl_precision_low), - op(op), sampler(NULL), coordinate(NULL), - offset(NULL) - { - memset(&lod_info, 0, sizeof(lod_info)); - } - - virtual ir_texture *clone(void *mem_ctx, struct hash_table *) const; - - virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - virtual bool equals(ir_instruction *ir, enum ir_node_type ignore = ir_type_unset); - - /** - * Return a string representing the ir_texture_opcode. - */ - const char *opcode_string(); - - /** Set the sampler and type. */ - void set_sampler(ir_dereference *sampler, const glsl_type *type); - - static bool has_lod(const glsl_type *sampler_type); - - /** - * Do a reverse-lookup to translate a string into an ir_texture_opcode. - */ - static ir_texture_opcode get_opcode(const char *); - - enum ir_texture_opcode op; - - /** Sampler to use for the texture access. */ - ir_dereference *sampler; - - /** Texture coordinate to sample */ - ir_rvalue *coordinate; - - /** Texel offset. */ - ir_rvalue *offset; - - union { - ir_rvalue *lod; /**< Floating point LOD */ - ir_rvalue *bias; /**< Floating point LOD bias */ - ir_rvalue *sample_index; /**< MSAA sample index */ - ir_rvalue *component; /**< Gather component selector */ - struct { - ir_rvalue *dPdx; /**< Partial derivative of coordinate wrt X */ - ir_rvalue *dPdy; /**< Partial derivative of coordinate wrt Y */ - } grad; - } lod_info; -}; - - -struct ir_swizzle_mask { - unsigned x:2; - unsigned y:2; - unsigned z:2; - unsigned w:2; - - /** - * Number of components in the swizzle. - */ - unsigned num_components:3; - - /** - * Does the swizzle contain duplicate components? - * - * L-value swizzles cannot contain duplicate components. - */ - unsigned has_duplicates:1; -}; - - -class ir_swizzle : public ir_rvalue { -public: - ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w, - unsigned count); - - ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count); - - ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask); - - virtual ir_swizzle *clone(void *mem_ctx, struct hash_table *) const; - - virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); - - /** - * Construct an ir_swizzle from the textual representation. Can fail. - */ - static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length); - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - virtual bool equals(ir_instruction *ir, enum ir_node_type ignore = ir_type_unset); - - bool is_lvalue() const - { - return val->is_lvalue() && !mask.has_duplicates; - } - - /** - * Get the variable that is ultimately referenced by an r-value - */ - virtual ir_variable *variable_referenced() const; - - ir_rvalue *val; - ir_swizzle_mask mask; - -private: - /** - * Initialize the mask component of a swizzle - * - * This is used by the \c ir_swizzle constructors. - */ - void init_mask(const unsigned *components, unsigned count); -}; - - -class ir_dereference : public ir_rvalue { -public: - virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0; - - bool is_lvalue() const; - - /** - * Get the variable that is ultimately referenced by an r-value - */ - virtual ir_variable *variable_referenced() const = 0; - -protected: - ir_dereference(ir_node_type t, glsl_precision precision) : ir_rvalue(t, precision) { } -}; - - -class ir_dereference_variable : public ir_dereference { -public: - ir_dereference_variable(ir_variable *var); - - virtual ir_dereference_variable *clone(void *mem_ctx, - struct hash_table *) const; - - virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); - - virtual bool equals(ir_instruction *ir, enum ir_node_type ignore = ir_type_unset); - - /** - * Get the variable that is ultimately referenced by an r-value - */ - virtual ir_variable *variable_referenced() const - { - return this->var; - } - - virtual ir_variable *whole_variable_referenced() - { - /* ir_dereference_variable objects always dereference the entire - * variable. However, if this dereference is dereferenced by anything - * else, the complete deferefernce chain is not a whole-variable - * dereference. This method should only be called on the top most - * ir_rvalue in a dereference chain. - */ - return this->var; - } - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - /** - * Object being dereferenced. - */ - ir_variable *var; -}; - - -class ir_dereference_array : public ir_dereference { -public: - ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index); - - ir_dereference_array(ir_variable *var, ir_rvalue *array_index); - - virtual ir_dereference_array *clone(void *mem_ctx, - struct hash_table *) const; - - virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); - - virtual bool equals(ir_instruction *ir, enum ir_node_type ignore = ir_type_unset); - - /** - * Get the variable that is ultimately referenced by an r-value - */ - virtual ir_variable *variable_referenced() const - { - return this->array->variable_referenced(); - } - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - ir_rvalue *array; - ir_rvalue *array_index; - -private: - void set_array(ir_rvalue *value); -}; - - -class ir_dereference_record : public ir_dereference { -public: - ir_dereference_record(ir_rvalue *value, const char *field); - - ir_dereference_record(ir_variable *var, const char *field); - - virtual ir_dereference_record *clone(void *mem_ctx, - struct hash_table *) const; - - virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); - - /** - * Get the variable that is ultimately referenced by an r-value - */ - virtual ir_variable *variable_referenced() const - { - return this->record->variable_referenced(); - } - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - ir_rvalue *record; - const char *field; -}; - - -/** - * Data stored in an ir_constant - */ -union ir_constant_data { - unsigned u[16]; - int i[16]; - float f[16]; - bool b[16]; -}; - - -class ir_constant : public ir_rvalue { -public: - ir_constant(const struct glsl_type *type, const ir_constant_data *data, glsl_precision precision = glsl_precision_undefined); - ir_constant(bool b, unsigned vector_elements=1); - ir_constant(unsigned int u, unsigned vector_elements=1); - ir_constant(int i, unsigned vector_elements=1); - ir_constant(float f, unsigned vector_elements=1); - - /** - * Construct an ir_constant from a list of ir_constant values - */ - ir_constant(const struct glsl_type *type, exec_list *values); - - /** - * Construct an ir_constant from a scalar component of another ir_constant - * - * The new \c ir_constant inherits the type of the component from the - * source constant. - * - * \note - * In the case of a matrix constant, the new constant is a scalar, \b not - * a vector. - */ - ir_constant(const ir_constant *c, unsigned i); - - /** - * Return a new ir_constant of the specified type containing all zeros. - */ - static ir_constant *zero(void *mem_ctx, const glsl_type *type); - - virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const; - - virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - virtual bool equals(ir_instruction *ir, enum ir_node_type ignore = ir_type_unset); - - /** - * Get a particular component of a constant as a specific type - * - * This is useful, for example, to get a value from an integer constant - * as a float or bool. This appears frequently when constructors are - * called with all constant parameters. - */ - /*@{*/ - bool get_bool_component(unsigned i) const; - float get_float_component(unsigned i) const; - int get_int_component(unsigned i) const; - unsigned get_uint_component(unsigned i) const; - /*@}*/ - - ir_constant *get_array_element(unsigned i) const; - - ir_constant *get_record_field(const char *name); - - /** - * Copy the values on another constant at a given offset. - * - * The offset is ignored for array or struct copies, it's only for - * scalars or vectors into vectors or matrices. - * - * With identical types on both sides and zero offset it's clone() - * without creating a new object. - */ - - void copy_offset(ir_constant *src, int offset); - - /** - * Copy the values on another constant at a given offset and - * following an assign-like mask. - * - * The mask is ignored for scalars. - * - * Note that this function only handles what assign can handle, - * i.e. at most a vector as source and a column of a matrix as - * destination. - */ - - void copy_masked_offset(ir_constant *src, int offset, unsigned int mask); - - /** - * Determine whether a constant has the same value as another constant - * - * \sa ir_constant::is_zero, ir_constant::is_one, - * ir_constant::is_negative_one, ir_constant::is_basis - */ - bool has_value(const ir_constant *) const; - - /** - * Return true if this ir_constant represents the given value. - * - * For vectors, this checks that each component is the given value. - */ - virtual bool is_value(float f, int i) const; - virtual bool is_zero() const; - virtual bool is_one() const; - virtual bool is_negative_one() const; - virtual bool is_basis() const; - - /** - * Return true for constants that could be stored as 16-bit unsigned values. - * - * Note that this will return true even for signed integer ir_constants, as - * long as the value is non-negative and fits in 16-bits. - */ - virtual bool is_uint16_constant() const; - - /** - * Value of the constant. - * - * The field used to back the values supplied by the constant is determined - * by the type associated with the \c ir_instruction. Constants may be - * scalars, vectors, or matrices. - */ - union ir_constant_data value; - - /* Array elements */ - ir_constant **array_elements; - - /* Structure fields */ - exec_list components; - -private: - /** - * Parameterless constructor only used by the clone method - */ - ir_constant(void); -}; - - -class ir_precision_statement : public ir_instruction { -public: - ir_precision_statement(const char *statement_to_store) - : ir_instruction(ir_type_precision) - { - ir_type = ir_type_precision; - precision_statement = statement_to_store; - } - - virtual ir_precision_statement *clone(void *mem_ctx, struct hash_table *) const; - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - /** - * Precision statement - */ - const char *precision_statement; -}; - - -class ir_typedecl_statement : public ir_instruction { -public: - ir_typedecl_statement(const glsl_type* type_decl) - : ir_instruction(ir_type_typedecl) - { - this->ir_type = ir_type_typedecl; - this->type_decl = type_decl; - } - - virtual ir_typedecl_statement *clone(void *mem_ctx, struct hash_table *) const; - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - const glsl_type* type_decl; -}; - - - -/** - * IR instruction to emit a vertex in a geometry shader. - */ -class ir_emit_vertex : public ir_instruction { -public: - ir_emit_vertex(ir_rvalue *stream) - : ir_instruction(ir_type_emit_vertex), - stream(stream) - { - assert(stream); - } - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_emit_vertex *clone(void *mem_ctx, struct hash_table *ht) const - { - return new(mem_ctx) ir_emit_vertex(this->stream->clone(mem_ctx, ht)); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - int stream_id() const - { - return stream->as_constant()->value.i[0]; - } - - ir_rvalue *stream; -}; - -/** - * IR instruction to complete the current primitive and start a new one in a - * geometry shader. - */ -class ir_end_primitive : public ir_instruction { -public: - ir_end_primitive(ir_rvalue *stream) - : ir_instruction(ir_type_end_primitive), - stream(stream) - { - assert(stream); - } - - virtual void accept(ir_visitor *v) - { - v->visit(this); - } - - virtual ir_end_primitive *clone(void *mem_ctx, struct hash_table *ht) const - { - return new(mem_ctx) ir_end_primitive(this->stream->clone(mem_ctx, ht)); - } - - virtual ir_visitor_status accept(ir_hierarchical_visitor *); - - int stream_id() const - { - return stream->as_constant()->value.i[0]; - } - - ir_rvalue *stream; -}; - -/*@}*/ - -/** - * Apply a visitor to each IR node in a list - */ -void -visit_exec_list(exec_list *list, ir_visitor *visitor); - -/** - * Validate invariants on each IR node in a list - */ -void validate_ir_tree(exec_list *instructions); - -struct _mesa_glsl_parse_state; -struct gl_shader_program; - -/** - * Detect whether an unlinked shader contains static recursion - * - * If the list of instructions is determined to contain static recursion, - * \c _mesa_glsl_error will be called to emit error messages for each function - * that is in the recursion cycle. - */ -void -detect_recursion_unlinked(struct _mesa_glsl_parse_state *state, - exec_list *instructions); - -/** - * Detect whether a linked shader contains static recursion - * - * If the list of instructions is determined to contain static recursion, - * \c link_error_printf will be called to emit error messages for each function - * that is in the recursion cycle. In addition, - * \c gl_shader_program::LinkStatus will be set to false. - */ -void -detect_recursion_linked(struct gl_shader_program *prog, - exec_list *instructions); - -/** - * Make a clone of each IR instruction in a list - * - * \param in List of IR instructions that are to be cloned - * \param out List to hold the cloned instructions - */ -void -clone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in); - -extern void -_mesa_glsl_initialize_variables(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - -extern void -_mesa_glsl_initialize_builtin_functions(); - -extern ir_function_signature * -_mesa_glsl_find_builtin_function(_mesa_glsl_parse_state *state, - const char *name, exec_list *actual_parameters); - -extern gl_shader * -_mesa_glsl_get_builtin_function_shader(void); - -extern void -_mesa_glsl_release_builtin_functions(void); - -extern void -reparent_ir(exec_list *list, void *mem_ctx); - -struct glsl_symbol_table; - -extern void -import_prototypes(const exec_list *source, exec_list *dest, - struct glsl_symbol_table *symbols, void *mem_ctx); - -extern void -do_set_program_inouts(exec_list *instructions, struct gl_program *prog, - gl_shader_stage shader_stage); - -extern glsl_precision -precision_from_ir (ir_instruction* ir); - - -extern glsl_precision higher_precision (ir_instruction* a, ir_instruction* b); -static inline glsl_precision higher_precision (glsl_precision a, glsl_precision b) -{ - return MIN2 (a, b); -} - -extern char * -prototype_string(const glsl_type *return_type, const char *name, - exec_list *parameters); - -const char * -mode_string(const ir_variable *var); - -/** - * Built-in / reserved GL variables names start with "gl_" - */ -static inline bool -is_gl_identifier(const char *s) -{ - return s && s[0] == 'g' && s[1] == 'l' && s[2] == '_'; -} - -extern "C" { -#endif /* __cplusplus */ - -extern void _mesa_print_ir(FILE *f, struct exec_list *instructions, - struct _mesa_glsl_parse_state *state); - -extern void -fprint_ir(FILE *f, const void *instruction); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -unsigned -vertices_per_prim(GLenum prim); - -#endif /* IR_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_basic_block.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_basic_block.cpp deleted file mode 100644 index ef37eba73..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_basic_block.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file ir_basic_block.cpp - * - * Basic block analysis of instruction streams. - */ - -#include "ir.h" -#include "ir_basic_block.h" - - -static ir_if* as_if_skip_discard (ir_instruction* ir) -{ - ir_if* irif = ir->as_if(); - if (!irif) - return NULL; - if (!irif->else_instructions.is_empty()) - return irif; - - bool only_discards = true; - int count = 0; - foreach_in_list(ir_instruction, iir, &irif->then_instructions) { - if (!iir->as_discard()) - { - only_discards = false; - break; - } - ++count; - } - - if (count == 1 && only_discards) - return NULL; - - return irif; -} - -/** - * Calls a user function for every basic block in the instruction stream. - * - * Basic block analysis is pretty easy in our IR thanks to the lack of - * unstructured control flow. We've got: - * - * ir_loop (for () {}, while () {}, do {} while ()) - * ir_loop_jump ( - * ir_if () {} - * ir_return - * ir_call() - * - * Note that the basic blocks returned by this don't encompass all - * operations performed by the program -- for example, if conditions - * don't get returned, nor do the assignments that will be generated - * for ir_call parameters. - */ -void call_for_basic_blocks(exec_list *instructions, - void (*callback)(ir_instruction *first, - ir_instruction *last, - void *data), - void *data) -{ - ir_instruction *leader = NULL; - ir_instruction *last = NULL; - - foreach_in_list(ir_instruction, ir, instructions) { - ir_if *ir_if; - ir_loop *ir_loop; - ir_function *ir_function; - - if (!leader) - leader = ir; - - if ((ir_if = as_if_skip_discard(ir))) { - callback(leader, ir, data); - leader = NULL; - - call_for_basic_blocks(&ir_if->then_instructions, callback, data); - call_for_basic_blocks(&ir_if->else_instructions, callback, data); - } else if ((ir_loop = ir->as_loop())) { - callback(leader, ir, data); - leader = NULL; - call_for_basic_blocks(&ir_loop->body_instructions, callback, data); - } else if (ir->as_jump() || ir->as_call()) { - callback(leader, ir, data); - leader = NULL; - } else if ((ir_function = ir->as_function())) { - /* A function definition doesn't interrupt our basic block - * since execution doesn't go into it. We should process the - * bodies of its signatures for BBs, though. - * - * Note that we miss an opportunity for producing more - * maximal BBs between the instructions that precede main() - * and the body of main(). Perhaps those instructions ought - * to live inside of main(). - */ - foreach_in_list(ir_function_signature, ir_sig, &ir_function->signatures) { - call_for_basic_blocks(&ir_sig->body, callback, data); - } - } - last = ir; - } - if (leader) { - callback(leader, last, data); - } -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_basic_block.h b/3rdparty/glsl-optimizer/src/glsl/ir_basic_block.h deleted file mode 100644 index dbd678b5c..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_basic_block.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -void call_for_basic_blocks(exec_list *instructions, - void (*callback)(ir_instruction *first, - ir_instruction *last, - void *data), - void *data); diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_builder.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_builder.cpp deleted file mode 100644 index b3b5cb06b..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_builder.cpp +++ /dev/null @@ -1,572 +0,0 @@ -/* - * Copyright © 2012 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -#include "ir_builder.h" -#include "program/prog_instruction.h" - -using namespace ir_builder; - -namespace ir_builder { - -void -ir_factory::emit(ir_instruction *ir) -{ - instructions->push_tail(ir); -} - -ir_variable * -ir_factory::make_temp(const glsl_type *type, const char *name, glsl_precision prec) -{ - ir_variable *var; - - var = new(mem_ctx) ir_variable(type, name, ir_var_temporary, prec); - emit(var); - - return var; -} - -ir_assignment * -assign(deref lhs, operand rhs, operand condition, int writemask) -{ - void *mem_ctx = ralloc_parent(lhs.val); - - ir_assignment *assign = new(mem_ctx) ir_assignment(lhs.val, - rhs.val, - condition.val, - writemask); - - return assign; -} - -ir_assignment * -assign(deref lhs, operand rhs) -{ - return assign(lhs, rhs, (1 << lhs.val->type->vector_elements) - 1); -} - -ir_assignment * -assign(deref lhs, operand rhs, int writemask) -{ - return assign(lhs, rhs, (ir_rvalue *) NULL, writemask); -} - -ir_assignment * -assign(deref lhs, operand rhs, operand condition) -{ - return assign(lhs, rhs, condition, (1 << lhs.val->type->vector_elements) - 1); -} - -ir_return * -ret(operand retval) -{ - void *mem_ctx = ralloc_parent(retval.val); - return new(mem_ctx) ir_return(retval.val); -} - -ir_swizzle * -swizzle(operand a, int swizzle, int components) -{ - void *mem_ctx = ralloc_parent(a.val); - - return new(mem_ctx) ir_swizzle(a.val, - GET_SWZ(swizzle, 0), - GET_SWZ(swizzle, 1), - GET_SWZ(swizzle, 2), - GET_SWZ(swizzle, 3), - components); -} - -ir_swizzle * -swizzle_for_size(operand a, unsigned components) -{ - void *mem_ctx = ralloc_parent(a.val); - - if ((int)a.val->type->vector_elements < components) - components = a.val->type->vector_elements; - - unsigned s[4] = { 0, 1, 2, 3 }; - for (int i = components; i < 4; i++) - s[i] = components - 1; - - return new(mem_ctx) ir_swizzle(a.val, s, components); -} - -ir_swizzle * -swizzle_xxxx(operand a) -{ - return swizzle(a, SWIZZLE_XXXX, 4); -} - -ir_swizzle * -swizzle_yyyy(operand a) -{ - return swizzle(a, SWIZZLE_YYYY, 4); -} - -ir_swizzle * -swizzle_zzzz(operand a) -{ - return swizzle(a, SWIZZLE_ZZZZ, 4); -} - -ir_swizzle * -swizzle_wwww(operand a) -{ - return swizzle(a, SWIZZLE_WWWW, 4); -} - -ir_swizzle * -swizzle_x(operand a) -{ - return swizzle(a, SWIZZLE_XXXX, 1); -} - -ir_swizzle * -swizzle_y(operand a) -{ - return swizzle(a, SWIZZLE_YYYY, 1); -} - -ir_swizzle * -swizzle_z(operand a) -{ - return swizzle(a, SWIZZLE_ZZZZ, 1); -} - -ir_swizzle * -swizzle_w(operand a) -{ - return swizzle(a, SWIZZLE_WWWW, 1); -} - -ir_swizzle * -swizzle_xy(operand a) -{ - return swizzle(a, SWIZZLE_XYZW, 2); -} - -ir_swizzle * -swizzle_xyz(operand a) -{ - return swizzle(a, SWIZZLE_XYZW, 3); -} - -ir_swizzle * -swizzle_xyzw(operand a) -{ - return swizzle(a, SWIZZLE_XYZW, 4); -} - -ir_expression * -expr(ir_expression_operation op, operand a) -{ - void *mem_ctx = ralloc_parent(a.val); - - return new(mem_ctx) ir_expression(op, a.val); -} - -ir_expression * -expr(ir_expression_operation op, operand a, operand b) -{ - void *mem_ctx = ralloc_parent(a.val); - - return new(mem_ctx) ir_expression(op, a.val, b.val); -} - -ir_expression * -expr(ir_expression_operation op, operand a, operand b, operand c) -{ - void *mem_ctx = ralloc_parent(a.val); - - return new(mem_ctx) ir_expression(op, a.val, b.val, c.val); -} - -ir_expression *add(operand a, operand b) -{ - return expr(ir_binop_add, a, b); -} - -ir_expression *sub(operand a, operand b) -{ - return expr(ir_binop_sub, a, b); -} - -ir_expression *min2(operand a, operand b) -{ - return expr(ir_binop_min, a, b); -} - -ir_expression *max2(operand a, operand b) -{ - return expr(ir_binop_max, a, b); -} - -ir_expression *mul(operand a, operand b) -{ - return expr(ir_binop_mul, a, b); -} - -ir_expression *imul_high(operand a, operand b) -{ - return expr(ir_binop_imul_high, a, b); -} - -ir_expression *div(operand a, operand b) -{ - return expr(ir_binop_div, a, b); -} - -ir_expression *carry(operand a, operand b) -{ - return expr(ir_binop_carry, a, b); -} - -ir_expression *borrow(operand a, operand b) -{ - return expr(ir_binop_borrow, a, b); -} - -ir_expression *round_even(operand a) -{ - return expr(ir_unop_round_even, a); -} - -/* dot for vectors, mul for scalars */ -ir_expression *dot(operand a, operand b) -{ - assert(a.val->type == b.val->type); - - if (a.val->type->vector_elements == 1) - return expr(ir_binop_mul, a, b); - - return expr(ir_binop_dot, a, b); -} - -ir_expression* -clamp(operand a, operand b, operand c) -{ - return expr(ir_triop_clamp, a, b, c); -} - -ir_expression * -saturate(operand a) -{ - return expr(ir_unop_saturate, a); -} - -ir_expression * -abs(operand a) -{ - return expr(ir_unop_abs, a); -} - -ir_expression * -neg(operand a) -{ - return expr(ir_unop_neg, a); -} - -ir_expression * -sin(operand a) -{ - return expr(ir_unop_sin, a); -} - -ir_expression * -cos(operand a) -{ - return expr(ir_unop_cos, a); -} - -ir_expression * -exp(operand a) -{ - return expr(ir_unop_exp, a); -} - -ir_expression * -rsq(operand a) -{ - return expr(ir_unop_rsq, a); -} - -ir_expression * -sqrt(operand a) -{ - return expr(ir_unop_sqrt, a); -} - -ir_expression * -log(operand a) -{ - return expr(ir_unop_log, a); -} - -ir_expression * -sign(operand a) -{ - return expr(ir_unop_sign, a); -} - -ir_expression* -equal(operand a, operand b) -{ - return expr(ir_binop_equal, a, b); -} - -ir_expression* -nequal(operand a, operand b) -{ - return expr(ir_binop_nequal, a, b); -} - -ir_expression* -less(operand a, operand b) -{ - return expr(ir_binop_less, a, b); -} - -ir_expression* -greater(operand a, operand b) -{ - return expr(ir_binop_greater, a, b); -} - -ir_expression* -lequal(operand a, operand b) -{ - return expr(ir_binop_lequal, a, b); -} - -ir_expression* -gequal(operand a, operand b) -{ - return expr(ir_binop_gequal, a, b); -} - -ir_expression* -logic_not(operand a) -{ - return expr(ir_unop_logic_not, a); -} - -ir_expression* -logic_and(operand a, operand b) -{ - return expr(ir_binop_logic_and, a, b); -} - -ir_expression* -logic_or(operand a, operand b) -{ - return expr(ir_binop_logic_or, a, b); -} - -ir_expression* -bit_not(operand a) -{ - return expr(ir_unop_bit_not, a); -} - -ir_expression* -bit_and(operand a, operand b) -{ - return expr(ir_binop_bit_and, a, b); -} - -ir_expression* -bit_or(operand a, operand b) -{ - return expr(ir_binop_bit_or, a, b); -} - -ir_expression* -lshift(operand a, operand b) -{ - return expr(ir_binop_lshift, a, b); -} - -ir_expression* -rshift(operand a, operand b) -{ - return expr(ir_binop_rshift, a, b); -} - -ir_expression* -f2i(operand a) -{ - return expr(ir_unop_f2i, a); -} - -ir_expression* -bitcast_f2i(operand a) -{ - return expr(ir_unop_bitcast_f2i, a); -} - -ir_expression* -i2f(operand a) -{ - return expr(ir_unop_i2f, a); -} - -ir_expression* -bitcast_i2f(operand a) -{ - return expr(ir_unop_bitcast_i2f, a); -} - -ir_expression* -i2u(operand a) -{ - return expr(ir_unop_i2u, a); -} - -ir_expression* -u2i(operand a) -{ - return expr(ir_unop_u2i, a); -} - -ir_expression* -f2u(operand a) -{ - return expr(ir_unop_f2u, a); -} - -ir_expression* -bitcast_f2u(operand a) -{ - return expr(ir_unop_bitcast_f2u, a); -} - -ir_expression* -u2f(operand a) -{ - return expr(ir_unop_u2f, a); -} - -ir_expression* -bitcast_u2f(operand a) -{ - return expr(ir_unop_bitcast_u2f, a); -} - -ir_expression* -i2b(operand a) -{ - return expr(ir_unop_i2b, a); -} - -ir_expression* -b2i(operand a) -{ - return expr(ir_unop_b2i, a); -} - -ir_expression * -f2b(operand a) -{ - return expr(ir_unop_f2b, a); -} - -ir_expression * -b2f(operand a) -{ - return expr(ir_unop_b2f, a); -} - -ir_expression * -interpolate_at_centroid(operand a) -{ - return expr(ir_unop_interpolate_at_centroid, a); -} - -ir_expression * -interpolate_at_offset(operand a, operand b) -{ - return expr(ir_binop_interpolate_at_offset, a, b); -} - -ir_expression * -interpolate_at_sample(operand a, operand b) -{ - return expr(ir_binop_interpolate_at_sample, a, b); -} - -ir_expression * -fma(operand a, operand b, operand c) -{ - return expr(ir_triop_fma, a, b, c); -} - -ir_expression * -lrp(operand x, operand y, operand a) -{ - return expr(ir_triop_lrp, x, y, a); -} - -ir_expression * -csel(operand a, operand b, operand c) -{ - return expr(ir_triop_csel, a, b, c); -} - -ir_expression * -bitfield_insert(operand a, operand b, operand c, operand d) -{ - void *mem_ctx = ralloc_parent(a.val); - return new(mem_ctx) ir_expression(ir_quadop_bitfield_insert, - a.val->type, a.val, b.val, c.val, d.val); -} - -ir_if* -if_tree(operand condition, - ir_instruction *then_branch) -{ - assert(then_branch != NULL); - - void *mem_ctx = ralloc_parent(condition.val); - - ir_if *result = new(mem_ctx) ir_if(condition.val); - result->then_instructions.push_tail(then_branch); - return result; -} - -ir_if* -if_tree(operand condition, - ir_instruction *then_branch, - ir_instruction *else_branch) -{ - assert(then_branch != NULL); - assert(else_branch != NULL); - - void *mem_ctx = ralloc_parent(condition.val); - - ir_if *result = new(mem_ctx) ir_if(condition.val); - result->then_instructions.push_tail(then_branch); - result->else_instructions.push_tail(else_branch); - return result; -} - -} /* namespace ir_builder */ diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_builder.h b/3rdparty/glsl-optimizer/src/glsl/ir_builder.h deleted file mode 100644 index a39ce9997..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_builder.h +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright © 2012 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -#include "ir.h" - -namespace ir_builder { - -#ifndef WRITEMASK_X -enum writemask { - WRITEMASK_X = 0x1, - WRITEMASK_Y = 0x2, - WRITEMASK_Z = 0x4, - WRITEMASK_W = 0x8, -}; -#endif - -/** - * This little class exists to let the helper expression generators - * take either an ir_rvalue * or an ir_variable * to be automatically - * dereferenced, while still providing compile-time type checking. - * - * You don't have to explicitly call the constructor -- C++ will see - * that you passed an ir_variable, and silently call the - * operand(ir_variable *var) constructor behind your back. - */ -class operand { -public: - operand(ir_rvalue *val) - : val(val) - { - } - - operand(ir_variable *var) - { - void *mem_ctx = ralloc_parent(var); - val = new(mem_ctx) ir_dereference_variable(var); - } - - ir_rvalue *val; -}; - -/** Automatic generator for ir_dereference_variable on assignment LHS. - * - * \sa operand - */ -class deref { -public: - deref(ir_dereference *val) - : val(val) - { - } - - deref(ir_variable *var) - { - void *mem_ctx = ralloc_parent(var); - val = new(mem_ctx) ir_dereference_variable(var); - } - - - ir_dereference *val; -}; - -class ir_factory { -public: - ir_factory(exec_list *instructions = NULL, void *mem_ctx = NULL) - : instructions(instructions), - mem_ctx(mem_ctx) - { - return; - } - - void emit(ir_instruction *ir); - ir_variable *make_temp(const glsl_type *type, const char *name, glsl_precision prec = glsl_precision_undefined); - - ir_constant* - constant(float f) - { - return new(mem_ctx) ir_constant(f); - } - - ir_constant* - constant(int i) - { - return new(mem_ctx) ir_constant(i); - } - - ir_constant* - constant(unsigned u) - { - return new(mem_ctx) ir_constant(u); - } - - ir_constant* - constant(bool b) - { - return new(mem_ctx) ir_constant(b); - } - - exec_list *instructions; - void *mem_ctx; -}; - -ir_assignment *assign(deref lhs, operand rhs); -ir_assignment *assign(deref lhs, operand rhs, int writemask); -ir_assignment *assign(deref lhs, operand rhs, operand condition); -ir_assignment *assign(deref lhs, operand rhs, operand condition, int writemask); - -ir_return *ret(operand retval); - -ir_expression *expr(ir_expression_operation op, operand a); -ir_expression *expr(ir_expression_operation op, operand a, operand b); -ir_expression *expr(ir_expression_operation op, operand a, operand b, operand c); -ir_expression *add(operand a, operand b); -ir_expression *sub(operand a, operand b); -ir_expression *mul(operand a, operand b); -ir_expression *imul_high(operand a, operand b); -ir_expression *div(operand a, operand b); -ir_expression *carry(operand a, operand b); -ir_expression *borrow(operand a, operand b); -ir_expression *round_even(operand a); -ir_expression *dot(operand a, operand b); -ir_expression *clamp(operand a, operand b, operand c); -ir_expression *saturate(operand a); -ir_expression *abs(operand a); -ir_expression *neg(operand a); -ir_expression *sin(operand a); -ir_expression *cos(operand a); -ir_expression *exp(operand a); -ir_expression *rsq(operand a); -ir_expression *sqrt(operand a); -ir_expression *log(operand a); -ir_expression *sign(operand a); - -ir_expression *equal(operand a, operand b); -ir_expression *nequal(operand a, operand b); -ir_expression *less(operand a, operand b); -ir_expression *greater(operand a, operand b); -ir_expression *lequal(operand a, operand b); -ir_expression *gequal(operand a, operand b); - -ir_expression *logic_not(operand a); -ir_expression *logic_and(operand a, operand b); -ir_expression *logic_or(operand a, operand b); - -ir_expression *bit_not(operand a); -ir_expression *bit_or(operand a, operand b); -ir_expression *bit_and(operand a, operand b); -ir_expression *lshift(operand a, operand b); -ir_expression *rshift(operand a, operand b); - -ir_expression *f2i(operand a); -ir_expression *bitcast_f2i(operand a); -ir_expression *i2f(operand a); -ir_expression *bitcast_i2f(operand a); -ir_expression *f2u(operand a); -ir_expression *bitcast_f2u(operand a); -ir_expression *u2f(operand a); -ir_expression *bitcast_u2f(operand a); -ir_expression *i2u(operand a); -ir_expression *u2i(operand a); -ir_expression *b2i(operand a); -ir_expression *i2b(operand a); -ir_expression *f2b(operand a); -ir_expression *b2f(operand a); - -ir_expression *min2(operand a, operand b); -ir_expression *max2(operand a, operand b); - -ir_expression *interpolate_at_centroid(operand a); -ir_expression *interpolate_at_offset(operand a, operand b); -ir_expression *interpolate_at_sample(operand a, operand b); - -ir_expression *fma(operand a, operand b, operand c); -ir_expression *lrp(operand x, operand y, operand a); -ir_expression *csel(operand a, operand b, operand c); -ir_expression *bitfield_insert(operand a, operand b, operand c, operand d); - -ir_swizzle *swizzle(operand a, int swizzle, int components); -/** - * Swizzle away later components, but preserve the ordering. - */ -ir_swizzle *swizzle_for_size(operand a, unsigned components); - -ir_swizzle *swizzle_xxxx(operand a); -ir_swizzle *swizzle_yyyy(operand a); -ir_swizzle *swizzle_zzzz(operand a); -ir_swizzle *swizzle_wwww(operand a); -ir_swizzle *swizzle_x(operand a); -ir_swizzle *swizzle_y(operand a); -ir_swizzle *swizzle_z(operand a); -ir_swizzle *swizzle_w(operand a); -ir_swizzle *swizzle_xy(operand a); -ir_swizzle *swizzle_xyz(operand a); -ir_swizzle *swizzle_xyzw(operand a); - -ir_if *if_tree(operand condition, - ir_instruction *then_branch); -ir_if *if_tree(operand condition, - ir_instruction *then_branch, - ir_instruction *else_branch); - -} /* namespace ir_builder */ diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_clone.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_clone.cpp deleted file mode 100644 index 140e36ff7..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_clone.cpp +++ /dev/null @@ -1,446 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include -#include "main/compiler.h" -#include "ir.h" -#include "glsl_types.h" -#include "program/hash_table.h" - -ir_rvalue * -ir_rvalue::clone(void *mem_ctx, struct hash_table *) const -{ - /* The only possible instantiation is the generic error value. */ - return error_value(mem_ctx); -} - -/** - * Duplicate an IR variable - */ -ir_variable * -ir_variable::clone(void *mem_ctx, struct hash_table *ht) const -{ - ir_variable *var = new(mem_ctx) ir_variable(this->type, this->name, - (ir_variable_mode) this->data.mode, (glsl_precision)this->data.precision); - - var->data.max_array_access = this->data.max_array_access; - if (this->is_interface_instance()) { - var->u.max_ifc_array_access = - rzalloc_array(var, unsigned, this->interface_type->length); - memcpy(var->u.max_ifc_array_access, this->u.max_ifc_array_access, - this->interface_type->length * sizeof(unsigned)); - } - - memcpy(&var->data, &this->data, sizeof(var->data)); - - if (this->get_state_slots()) { - ir_state_slot *s = var->allocate_state_slots(this->get_num_state_slots()); - memcpy(s, this->get_state_slots(), - sizeof(s[0]) * var->get_num_state_slots()); - } - - if (this->constant_value) - var->constant_value = this->constant_value->clone(mem_ctx, ht); - - if (this->constant_initializer) - var->constant_initializer = - this->constant_initializer->clone(mem_ctx, ht); - - var->interface_type = this->interface_type; - - if (ht) { - hash_table_insert(ht, var, (void *)const_cast(this)); - } - - return var; -} - -ir_swizzle * -ir_swizzle::clone(void *mem_ctx, struct hash_table *ht) const -{ - ir_swizzle* rv = new(mem_ctx) ir_swizzle(this->val->clone(mem_ctx, ht), this->mask); - rv->set_precision (this->get_precision()); - return rv; -} - -ir_return * -ir_return::clone(void *mem_ctx, struct hash_table *ht) const -{ - ir_rvalue *new_value = NULL; - - if (this->value) - new_value = this->value->clone(mem_ctx, ht); - - return new(mem_ctx) ir_return(new_value); -} - -ir_discard * -ir_discard::clone(void *mem_ctx, struct hash_table *ht) const -{ - ir_rvalue *new_condition = NULL; - - if (this->condition != NULL) - new_condition = this->condition->clone(mem_ctx, ht); - - return new(mem_ctx) ir_discard(new_condition); -} - -ir_loop_jump * -ir_loop_jump::clone(void *mem_ctx, struct hash_table *ht) const -{ - (void)ht; - - return new(mem_ctx) ir_loop_jump(this->mode); -} - -ir_if * -ir_if::clone(void *mem_ctx, struct hash_table *ht) const -{ - ir_if *new_if = new(mem_ctx) ir_if(this->condition->clone(mem_ctx, ht)); - - foreach_in_list(ir_instruction, ir, &this->then_instructions) { - new_if->then_instructions.push_tail(ir->clone(mem_ctx, ht)); - } - - foreach_in_list(ir_instruction, ir, &this->else_instructions) { - new_if->else_instructions.push_tail(ir->clone(mem_ctx, ht)); - } - - return new_if; -} - -ir_loop * -ir_loop::clone(void *mem_ctx, struct hash_table *ht) const -{ - ir_loop *new_loop = new(mem_ctx) ir_loop(); - - foreach_in_list(ir_instruction, ir, &this->body_instructions) { - new_loop->body_instructions.push_tail(ir->clone(mem_ctx, ht)); - } - - return new_loop; -} - -ir_call * -ir_call::clone(void *mem_ctx, struct hash_table *ht) const -{ - ir_dereference_variable *new_return_ref = NULL; - if (this->return_deref != NULL) - new_return_ref = this->return_deref->clone(mem_ctx, ht); - - exec_list new_parameters; - - foreach_in_list(ir_instruction, ir, &this->actual_parameters) { - new_parameters.push_tail(ir->clone(mem_ctx, ht)); - } - - ir_call* rv = new(mem_ctx) ir_call(this->callee, new_return_ref, &new_parameters); - return rv; -} - -ir_expression * -ir_expression::clone(void *mem_ctx, struct hash_table *ht) const -{ - ir_rvalue *op[Elements(this->operands)] = { NULL, }; - unsigned int i; - - for (i = 0; i < get_num_operands(); i++) { - op[i] = this->operands[i]->clone(mem_ctx, ht); - } - - ir_expression* rv = new(mem_ctx) ir_expression(this->operation, this->type, - op[0], op[1], op[2], op[3]); - rv->set_precision (this->get_precision()); - return rv; -} - -ir_dereference_variable * -ir_dereference_variable::clone(void *mem_ctx, struct hash_table *ht) const -{ - ir_variable *new_var; - - if (ht) { - new_var = (ir_variable *)hash_table_find(ht, this->var); - if (!new_var) - new_var = this->var; - } else { - new_var = this->var; - } - - ir_dereference_variable* rv = new(mem_ctx) ir_dereference_variable(new_var); - rv->set_precision (this->get_precision()); - return rv; -} - -ir_dereference_array * -ir_dereference_array::clone(void *mem_ctx, struct hash_table *ht) const -{ - return new(mem_ctx) ir_dereference_array(this->array->clone(mem_ctx, ht), - this->array_index->clone(mem_ctx, - ht)); -} - -ir_dereference_record * -ir_dereference_record::clone(void *mem_ctx, struct hash_table *ht) const -{ - return new(mem_ctx) ir_dereference_record(this->record->clone(mem_ctx, ht), - this->field); -} - -ir_texture * -ir_texture::clone(void *mem_ctx, struct hash_table *ht) const -{ - ir_texture *new_tex = new(mem_ctx) ir_texture(this->op); - new_tex->type = this->type; - - new_tex->sampler = this->sampler->clone(mem_ctx, ht); - if (this->coordinate) - new_tex->coordinate = this->coordinate->clone(mem_ctx, ht); - - if (this->offset != NULL) - new_tex->offset = this->offset->clone(mem_ctx, ht); - - switch (this->op) { - case ir_tex: - case ir_lod: - case ir_query_levels: - break; - case ir_txb: - new_tex->lod_info.bias = this->lod_info.bias->clone(mem_ctx, ht); - break; - case ir_txl: - case ir_txf: - case ir_txs: - new_tex->lod_info.lod = this->lod_info.lod->clone(mem_ctx, ht); - break; - case ir_txf_ms: - new_tex->lod_info.sample_index = this->lod_info.sample_index->clone(mem_ctx, ht); - break; - case ir_txd: - new_tex->lod_info.grad.dPdx = this->lod_info.grad.dPdx->clone(mem_ctx, ht); - new_tex->lod_info.grad.dPdy = this->lod_info.grad.dPdy->clone(mem_ctx, ht); - break; - case ir_tg4: - new_tex->lod_info.component = this->lod_info.component->clone(mem_ctx, ht); - break; - } - - return new_tex; -} - -ir_assignment * -ir_assignment::clone(void *mem_ctx, struct hash_table *ht) const -{ - ir_rvalue *new_condition = NULL; - - if (this->condition) - new_condition = this->condition->clone(mem_ctx, ht); - - ir_assignment *cloned = - new(mem_ctx) ir_assignment(this->lhs->clone(mem_ctx, ht), - this->rhs->clone(mem_ctx, ht), - new_condition); - cloned->write_mask = this->write_mask; - return cloned; -} - -ir_function * -ir_function::clone(void *mem_ctx, struct hash_table *ht) const -{ - ir_function *copy = new(mem_ctx) ir_function(this->name); - - foreach_in_list(const ir_function_signature, sig, &this->signatures) { - ir_function_signature *sig_copy = sig->clone(mem_ctx, ht); - copy->add_signature(sig_copy); - - if (ht != NULL) - hash_table_insert(ht, sig_copy, - (void *)const_cast(sig)); - } - - return copy; -} - -ir_function_signature * -ir_function_signature::clone(void *mem_ctx, struct hash_table *ht) const -{ - ir_function_signature *copy = this->clone_prototype(mem_ctx, ht); - - copy->is_defined = this->is_defined; - - /* Clone the instruction list. - */ - foreach_in_list(const ir_instruction, inst, &this->body) { - ir_instruction *const inst_copy = inst->clone(mem_ctx, ht); - copy->body.push_tail(inst_copy); - } - - return copy; -} - -ir_function_signature * -ir_function_signature::clone_prototype(void *mem_ctx, struct hash_table *ht) const -{ - ir_function_signature *copy = - new(mem_ctx) ir_function_signature(this->return_type, this->precision); - - copy->is_defined = false; - copy->builtin_avail = this->builtin_avail; - copy->origin = this; - - /* Clone the parameter list, but NOT the body. - */ - foreach_in_list(const ir_variable, param, &this->parameters) { - assert(const_cast(param)->as_variable() != NULL); - - ir_variable *const param_copy = param->clone(mem_ctx, ht); - copy->parameters.push_tail(param_copy); - } - - return copy; -} - -ir_constant * -ir_constant::clone(void *mem_ctx, struct hash_table *ht) const -{ - (void)ht; - - switch (this->type->base_type) { - case GLSL_TYPE_UINT: - case GLSL_TYPE_INT: - case GLSL_TYPE_FLOAT: - case GLSL_TYPE_BOOL: - return new(mem_ctx) ir_constant(this->type, &this->value, this->precision); - - case GLSL_TYPE_STRUCT: { - ir_constant *c = new(mem_ctx) ir_constant; - - c->type = this->type; - for (exec_node *node = this->components.head - ; !node->is_tail_sentinel() - ; node = node->next) { - ir_constant *const orig = (ir_constant *) node; - - c->components.push_tail(orig->clone(mem_ctx, NULL)); - } - - return c; - } - - case GLSL_TYPE_ARRAY: { - ir_constant *c = new(mem_ctx) ir_constant; - - c->type = this->type; - c->set_precision(this->get_precision()); - c->array_elements = ralloc_array(c, ir_constant *, this->type->length); - for (unsigned i = 0; i < this->type->length; i++) { - c->array_elements[i] = this->array_elements[i]->clone(mem_ctx, NULL); - } - return c; - } - - case GLSL_TYPE_SAMPLER: - case GLSL_TYPE_IMAGE: - case GLSL_TYPE_ATOMIC_UINT: - case GLSL_TYPE_VOID: - case GLSL_TYPE_ERROR: - case GLSL_TYPE_INTERFACE: - assert(!"Should not get here."); - break; - } - - return NULL; -} - - -ir_precision_statement * -ir_precision_statement::clone(void *mem_ctx, struct hash_table *ht) const -{ - return new(mem_ctx) ir_precision_statement(this->precision_statement); -} - -ir_typedecl_statement * -ir_typedecl_statement::clone(void *mem_ctx, struct hash_table *ht) const -{ - return new(mem_ctx) ir_typedecl_statement(this->type_decl); -} - - - -class fixup_ir_call_visitor : public ir_hierarchical_visitor { -public: - fixup_ir_call_visitor(struct hash_table *ht) - { - this->ht = ht; - } - - virtual ir_visitor_status visit_enter(ir_call *ir) - { - /* Try to find the function signature referenced by the ir_call in the - * table. If it is found, replace it with the value from the table. - */ - ir_function_signature *sig = - (ir_function_signature *) hash_table_find(this->ht, ir->callee); - if (sig != NULL) - ir->callee = sig; - - /* Since this may be used before function call parameters are flattened, - * the children also need to be processed. - */ - return visit_continue; - } - -private: - struct hash_table *ht; -}; - - -static void -fixup_function_calls(struct hash_table *ht, exec_list *instructions) -{ - fixup_ir_call_visitor v(ht); - v.run(instructions); -} - - -void -clone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in) -{ - struct hash_table *ht = - hash_table_ctor(0, hash_table_pointer_hash, hash_table_pointer_compare); - - foreach_in_list(const ir_instruction, original, in) { - ir_instruction *copy = original->clone(mem_ctx, ht); - - out->push_tail(copy); - } - - /* Make a pass over the cloned tree to fix up ir_call nodes to point to the - * cloned ir_function_signature nodes. This cannot be done automatically - * during cloning because the ir_call might be a forward reference (i.e., - * the function signature that it references may not have been cloned yet). - */ - fixup_function_calls(ht, out); - - hash_table_dtor(ht); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_constant_expression.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_constant_expression.cpp deleted file mode 100644 index 40954299e..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_constant_expression.cpp +++ /dev/null @@ -1,1978 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file ir_constant_expression.cpp - * Evaluate and process constant valued expressions - * - * In GLSL, constant valued expressions are used in several places. These - * must be processed and evaluated very early in the compilation process. - * - * * Sizes of arrays - * * Initializers for uniforms - * * Initializers for \c const variables - */ - -#include -#include "main/core.h" /* for MAX2, MIN2, CLAMP */ -#include "ir.h" -#include "glsl_types.h" -#include "program/hash_table.h" - -#if defined(_MSC_VER) && (_MSC_VER < 1800) -static int isnormal(double x) -{ - return _fpclass(x) == _FPCLASS_NN || _fpclass(x) == _FPCLASS_PN; -} -#elif defined(__SUNPRO_CC) -#include -static int isnormal(double x) -{ - return fpclass(x) == FP_NORMAL; -} -#endif - -#if defined(_MSC_VER) && _MSC_VER < 1800 -static double copysign(double x, double y) -{ - return _copysign(x, y); -} -#endif - -static float -dot(ir_constant *op0, ir_constant *op1) -{ - assert(op0->type->is_float() && op1->type->is_float()); - - float result = 0; - for (unsigned c = 0; c < op0->type->components(); c++) - result += op0->value.f[c] * op1->value.f[c]; - - return result; -} - -/* This method is the only one supported by gcc. Unions in particular - * are iffy, and read-through-converted-pointer is killed by strict - * aliasing. OTOH, the compiler sees through the memcpy, so the - * resulting asm is reasonable. - */ -static float -bitcast_u2f(unsigned int u) -{ - assert(sizeof(float) == sizeof(unsigned int)); - float f; - memcpy(&f, &u, sizeof(f)); - return f; -} - -static unsigned int -bitcast_f2u(float f) -{ - assert(sizeof(float) == sizeof(unsigned int)); - unsigned int u; - memcpy(&u, &f, sizeof(f)); - return u; -} - -/** - * Evaluate one component of a floating-point 4x8 unpacking function. - */ -typedef uint8_t -(*pack_1x8_func_t)(float); - -/** - * Evaluate one component of a floating-point 2x16 unpacking function. - */ -typedef uint16_t -(*pack_1x16_func_t)(float); - -/** - * Evaluate one component of a floating-point 4x8 unpacking function. - */ -typedef float -(*unpack_1x8_func_t)(uint8_t); - -/** - * Evaluate one component of a floating-point 2x16 unpacking function. - */ -typedef float -(*unpack_1x16_func_t)(uint16_t); - -/** - * Evaluate a 2x16 floating-point packing function. - */ -static uint32_t -pack_2x16(pack_1x16_func_t pack_1x16, - float x, float y) -{ - /* From section 8.4 of the GLSL ES 3.00 spec: - * - * packSnorm2x16 - * ------------- - * The first component of the vector will be written to the least - * significant bits of the output; the last component will be written to - * the most significant bits. - * - * The specifications for the other packing functions contain similar - * language. - */ - uint32_t u = 0; - u |= ((uint32_t) pack_1x16(x) << 0); - u |= ((uint32_t) pack_1x16(y) << 16); - return u; -} - -/** - * Evaluate a 4x8 floating-point packing function. - */ -static uint32_t -pack_4x8(pack_1x8_func_t pack_1x8, - float x, float y, float z, float w) -{ - /* From section 8.4 of the GLSL 4.30 spec: - * - * packSnorm4x8 - * ------------ - * The first component of the vector will be written to the least - * significant bits of the output; the last component will be written to - * the most significant bits. - * - * The specifications for the other packing functions contain similar - * language. - */ - uint32_t u = 0; - u |= ((uint32_t) pack_1x8(x) << 0); - u |= ((uint32_t) pack_1x8(y) << 8); - u |= ((uint32_t) pack_1x8(z) << 16); - u |= ((uint32_t) pack_1x8(w) << 24); - return u; -} - -/** - * Evaluate a 2x16 floating-point unpacking function. - */ -static void -unpack_2x16(unpack_1x16_func_t unpack_1x16, - uint32_t u, - float *x, float *y) -{ - /* From section 8.4 of the GLSL ES 3.00 spec: - * - * unpackSnorm2x16 - * --------------- - * The first component of the returned vector will be extracted from - * the least significant bits of the input; the last component will be - * extracted from the most significant bits. - * - * The specifications for the other unpacking functions contain similar - * language. - */ - *x = unpack_1x16((uint16_t) (u & 0xffff)); - *y = unpack_1x16((uint16_t) (u >> 16)); -} - -/** - * Evaluate a 4x8 floating-point unpacking function. - */ -static void -unpack_4x8(unpack_1x8_func_t unpack_1x8, uint32_t u, - float *x, float *y, float *z, float *w) -{ - /* From section 8.4 of the GLSL 4.30 spec: - * - * unpackSnorm4x8 - * -------------- - * The first component of the returned vector will be extracted from - * the least significant bits of the input; the last component will be - * extracted from the most significant bits. - * - * The specifications for the other unpacking functions contain similar - * language. - */ - *x = unpack_1x8((uint8_t) (u & 0xff)); - *y = unpack_1x8((uint8_t) (u >> 8)); - *z = unpack_1x8((uint8_t) (u >> 16)); - *w = unpack_1x8((uint8_t) (u >> 24)); -} - -/** - * Evaluate one component of packSnorm4x8. - */ -static uint8_t -pack_snorm_1x8(float x) -{ - /* From section 8.4 of the GLSL 4.30 spec: - * - * packSnorm4x8 - * ------------ - * The conversion for component c of v to fixed point is done as - * follows: - * - * packSnorm4x8: round(clamp(c, -1, +1) * 127.0) - * - * We must first cast the float to an int, because casting a negative - * float to a uint is undefined. - */ - return (uint8_t) (int8_t) - _mesa_round_to_even(CLAMP(x, -1.0f, +1.0f) * 127.0f); -} - -/** - * Evaluate one component of packSnorm2x16. - */ -static uint16_t -pack_snorm_1x16(float x) -{ - /* From section 8.4 of the GLSL ES 3.00 spec: - * - * packSnorm2x16 - * ------------- - * The conversion for component c of v to fixed point is done as - * follows: - * - * packSnorm2x16: round(clamp(c, -1, +1) * 32767.0) - * - * We must first cast the float to an int, because casting a negative - * float to a uint is undefined. - */ - return (uint16_t) (int16_t) - _mesa_round_to_even(CLAMP(x, -1.0f, +1.0f) * 32767.0f); -} - -/** - * Evaluate one component of unpackSnorm4x8. - */ -static float -unpack_snorm_1x8(uint8_t u) -{ - /* From section 8.4 of the GLSL 4.30 spec: - * - * unpackSnorm4x8 - * -------------- - * The conversion for unpacked fixed-point value f to floating point is - * done as follows: - * - * unpackSnorm4x8: clamp(f / 127.0, -1, +1) - */ - return CLAMP((int8_t) u / 127.0f, -1.0f, +1.0f); -} - -/** - * Evaluate one component of unpackSnorm2x16. - */ -static float -unpack_snorm_1x16(uint16_t u) -{ - /* From section 8.4 of the GLSL ES 3.00 spec: - * - * unpackSnorm2x16 - * --------------- - * The conversion for unpacked fixed-point value f to floating point is - * done as follows: - * - * unpackSnorm2x16: clamp(f / 32767.0, -1, +1) - */ - return CLAMP((int16_t) u / 32767.0f, -1.0f, +1.0f); -} - -/** - * Evaluate one component packUnorm4x8. - */ -static uint8_t -pack_unorm_1x8(float x) -{ - /* From section 8.4 of the GLSL 4.30 spec: - * - * packUnorm4x8 - * ------------ - * The conversion for component c of v to fixed point is done as - * follows: - * - * packUnorm4x8: round(clamp(c, 0, +1) * 255.0) - */ - return (uint8_t) _mesa_round_to_even(CLAMP(x, 0.0f, 1.0f) * 255.0f); -} - -/** - * Evaluate one component packUnorm2x16. - */ -static uint16_t -pack_unorm_1x16(float x) -{ - /* From section 8.4 of the GLSL ES 3.00 spec: - * - * packUnorm2x16 - * ------------- - * The conversion for component c of v to fixed point is done as - * follows: - * - * packUnorm2x16: round(clamp(c, 0, +1) * 65535.0) - */ - return (uint16_t) _mesa_round_to_even(CLAMP(x, 0.0f, 1.0f) * 65535.0f); -} - -/** - * Evaluate one component of unpackUnorm4x8. - */ -static float -unpack_unorm_1x8(uint8_t u) -{ - /* From section 8.4 of the GLSL 4.30 spec: - * - * unpackUnorm4x8 - * -------------- - * The conversion for unpacked fixed-point value f to floating point is - * done as follows: - * - * unpackUnorm4x8: f / 255.0 - */ - return (float) u / 255.0f; -} - -/** - * Evaluate one component of unpackUnorm2x16. - */ -static float -unpack_unorm_1x16(uint16_t u) -{ - /* From section 8.4 of the GLSL ES 3.00 spec: - * - * unpackUnorm2x16 - * --------------- - * The conversion for unpacked fixed-point value f to floating point is - * done as follows: - * - * unpackUnorm2x16: f / 65535.0 - */ - return (float) u / 65535.0f; -} - -/** - * Evaluate one component of packHalf2x16. - */ -static uint16_t -pack_half_1x16(float x) -{ - return _mesa_float_to_half(x); -} - -/** - * Evaluate one component of unpackHalf2x16. - */ -static float -unpack_half_1x16(uint16_t u) -{ - return _mesa_half_to_float(u); -} - -/** - * Get the constant that is ultimately referenced by an r-value, in a constant - * expression evaluation context. - * - * The offset is used when the reference is to a specific column of a matrix. - */ -static bool -constant_referenced(const ir_dereference *deref, - struct hash_table *variable_context, - ir_constant *&store, int &offset) -{ - store = NULL; - offset = 0; - - if (variable_context == NULL) - return false; - - switch (deref->ir_type) { - case ir_type_dereference_array: { - const ir_dereference_array *const da = - (const ir_dereference_array *) deref; - - ir_constant *const index_c = - da->array_index->constant_expression_value(variable_context); - - if (!index_c || !index_c->type->is_scalar() || !index_c->type->is_integer()) - break; - - const int index = index_c->type->base_type == GLSL_TYPE_INT ? - index_c->get_int_component(0) : - index_c->get_uint_component(0); - - ir_constant *substore; - int suboffset; - - const ir_dereference *const deref = da->array->as_dereference(); - if (!deref) - break; - - if (!constant_referenced(deref, variable_context, substore, suboffset)) - break; - - const glsl_type *const vt = da->array->type; - if (vt->is_array()) { - store = substore->get_array_element(index); - offset = 0; - } else if (vt->is_matrix()) { - store = substore; - offset = index * vt->vector_elements; - } else if (vt->is_vector()) { - store = substore; - offset = suboffset + index; - } - - break; - } - - case ir_type_dereference_record: { - const ir_dereference_record *const dr = - (const ir_dereference_record *) deref; - - const ir_dereference *const deref = dr->record->as_dereference(); - if (!deref) - break; - - ir_constant *substore; - int suboffset; - - if (!constant_referenced(deref, variable_context, substore, suboffset)) - break; - - /* Since we're dropping it on the floor... - */ - assert(suboffset == 0); - - store = substore->get_record_field(dr->field); - break; - } - - case ir_type_dereference_variable: { - const ir_dereference_variable *const dv = - (const ir_dereference_variable *) deref; - - store = (ir_constant *) hash_table_find(variable_context, dv->var); - break; - } - - default: - assert(!"Should not get here."); - break; - } - - return store != NULL; -} - - -ir_constant * -ir_rvalue::constant_expression_value(struct hash_table *) -{ - assert(this->type->is_error()); - return NULL; -} - -ir_constant * -ir_expression::constant_expression_value(struct hash_table *variable_context) -{ - if (this->type->is_error()) - return NULL; - - ir_constant *op[Elements(this->operands)] = { NULL, }; - ir_constant_data data; - - memset(&data, 0, sizeof(data)); - - for (unsigned operand = 0; operand < this->get_num_operands(); operand++) { - op[operand] = this->operands[operand]->constant_expression_value(variable_context); - if (!op[operand]) - return NULL; - } - - if (op[1] != NULL) - switch (this->operation) { - case ir_binop_lshift: - case ir_binop_rshift: - case ir_binop_ldexp: - case ir_binop_interpolate_at_offset: - case ir_binop_interpolate_at_sample: - case ir_binop_vector_extract: - case ir_triop_csel: - case ir_triop_bitfield_extract: - break; - - default: - assert(op[0]->type->base_type == op[1]->type->base_type); - break; - } - - bool op0_scalar = op[0]->type->is_scalar(); - bool op1_scalar = op[1] != NULL && op[1]->type->is_scalar(); - - /* When iterating over a vector or matrix's components, we want to increase - * the loop counter. However, for scalars, we want to stay at 0. - */ - unsigned c0_inc = op0_scalar ? 0 : 1; - unsigned c1_inc = op1_scalar ? 0 : 1; - unsigned components; - if (op1_scalar || !op[1]) { - components = op[0]->type->components(); - } else { - components = op[1]->type->components(); - } - - void *ctx = ralloc_parent(this); - - /* Handle array operations here, rather than below. */ - if (op[0]->type->is_array()) { - assert(op[1] != NULL && op[1]->type->is_array()); - switch (this->operation) { - case ir_binop_all_equal: - return new(ctx) ir_constant(op[0]->has_value(op[1])); - case ir_binop_any_nequal: - return new(ctx) ir_constant(!op[0]->has_value(op[1])); - default: - break; - } - return NULL; - } - - switch (this->operation) { - case ir_unop_bit_not: - switch (op[0]->type->base_type) { - case GLSL_TYPE_INT: - for (unsigned c = 0; c < components; c++) - data.i[c] = ~ op[0]->value.i[c]; - break; - case GLSL_TYPE_UINT: - for (unsigned c = 0; c < components; c++) - data.u[c] = ~ op[0]->value.u[c]; - break; - default: - assert(0); - } - break; - - case ir_unop_logic_not: - assert(op[0]->type->base_type == GLSL_TYPE_BOOL); - for (unsigned c = 0; c < op[0]->type->components(); c++) - data.b[c] = !op[0]->value.b[c]; - break; - - case ir_unop_f2i: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.i[c] = (int) op[0]->value.f[c]; - } - break; - case ir_unop_f2u: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.i[c] = (unsigned) op[0]->value.f[c]; - } - break; - case ir_unop_i2f: - assert(op[0]->type->base_type == GLSL_TYPE_INT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = (float) op[0]->value.i[c]; - } - break; - case ir_unop_u2f: - assert(op[0]->type->base_type == GLSL_TYPE_UINT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = (float) op[0]->value.u[c]; - } - break; - case ir_unop_b2f: - assert(op[0]->type->base_type == GLSL_TYPE_BOOL); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = op[0]->value.b[c] ? 1.0F : 0.0F; - } - break; - case ir_unop_f2b: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.b[c] = op[0]->value.f[c] != 0.0F ? true : false; - } - break; - case ir_unop_b2i: - assert(op[0]->type->base_type == GLSL_TYPE_BOOL); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.u[c] = op[0]->value.b[c] ? 1 : 0; - } - break; - case ir_unop_i2b: - assert(op[0]->type->is_integer()); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.b[c] = op[0]->value.u[c] ? true : false; - } - break; - case ir_unop_u2i: - assert(op[0]->type->base_type == GLSL_TYPE_UINT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.i[c] = op[0]->value.u[c]; - } - break; - case ir_unop_i2u: - assert(op[0]->type->base_type == GLSL_TYPE_INT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.u[c] = op[0]->value.i[c]; - } - break; - case ir_unop_bitcast_i2f: - assert(op[0]->type->base_type == GLSL_TYPE_INT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = bitcast_u2f(op[0]->value.i[c]); - } - break; - case ir_unop_bitcast_f2i: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.i[c] = bitcast_f2u(op[0]->value.f[c]); - } - break; - case ir_unop_bitcast_u2f: - assert(op[0]->type->base_type == GLSL_TYPE_UINT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = bitcast_u2f(op[0]->value.u[c]); - } - break; - case ir_unop_bitcast_f2u: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.u[c] = bitcast_f2u(op[0]->value.f[c]); - } - break; - case ir_unop_any: - assert(op[0]->type->is_boolean()); - data.b[0] = false; - for (unsigned c = 0; c < op[0]->type->components(); c++) { - if (op[0]->value.b[c]) - data.b[0] = true; - } - break; - - case ir_unop_trunc: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = truncf(op[0]->value.f[c]); - } - break; - - case ir_unop_round_even: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = (float)_mesa_round_to_even(op[0]->value.f[c]); - } - break; - - case ir_unop_ceil: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = ceilf(op[0]->value.f[c]); - } - break; - - case ir_unop_floor: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = floorf(op[0]->value.f[c]); - } - break; - - case ir_unop_normalize: - { - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - float mag2 = 0.0f; - for (unsigned c = 0; c < op[0]->type->components(); c++) { - mag2 += op[0]->value.f[c] * op[0]->value.f[c]; - } - // how would one express "vec3(nan)" in GLSL? no idea, so let's just not handle it - if (mag2 == 0.0f) - return NULL; - float mag = sqrtf(mag2); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = op[0]->value.f[c] / mag; - } - } - break; - - case ir_unop_fract: - for (unsigned c = 0; c < op[0]->type->components(); c++) { - switch (this->type->base_type) { - case GLSL_TYPE_UINT: - data.u[c] = 0; - break; - case GLSL_TYPE_INT: - data.i[c] = 0; - break; - case GLSL_TYPE_FLOAT: - data.f[c] = op[0]->value.f[c] - floor(op[0]->value.f[c]); - break; - default: - assert(0); - } - } - break; - - case ir_unop_sin: - case ir_unop_sin_reduced: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = sinf(op[0]->value.f[c]); - } - break; - - case ir_unop_cos: - case ir_unop_cos_reduced: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = cosf(op[0]->value.f[c]); - } - break; - - case ir_unop_neg: - for (unsigned c = 0; c < op[0]->type->components(); c++) { - switch (this->type->base_type) { - case GLSL_TYPE_UINT: - data.u[c] = -((int) op[0]->value.u[c]); - break; - case GLSL_TYPE_INT: - data.i[c] = -op[0]->value.i[c]; - break; - case GLSL_TYPE_FLOAT: - data.f[c] = -op[0]->value.f[c]; - break; - default: - assert(0); - } - } - break; - - case ir_unop_abs: - for (unsigned c = 0; c < op[0]->type->components(); c++) { - switch (this->type->base_type) { - case GLSL_TYPE_UINT: - data.u[c] = op[0]->value.u[c]; - break; - case GLSL_TYPE_INT: - data.i[c] = op[0]->value.i[c]; - if (data.i[c] < 0) - data.i[c] = -data.i[c]; - break; - case GLSL_TYPE_FLOAT: - data.f[c] = fabs(op[0]->value.f[c]); - break; - default: - assert(0); - } - } - break; - - case ir_unop_sign: - for (unsigned c = 0; c < op[0]->type->components(); c++) { - switch (this->type->base_type) { - case GLSL_TYPE_UINT: - data.u[c] = op[0]->value.i[c] > 0; - break; - case GLSL_TYPE_INT: - data.i[c] = (op[0]->value.i[c] > 0) - (op[0]->value.i[c] < 0); - break; - case GLSL_TYPE_FLOAT: - data.f[c] = float((op[0]->value.f[c] > 0)-(op[0]->value.f[c] < 0)); - break; - default: - assert(0); - } - } - break; - - case ir_unop_rcp: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - switch (this->type->base_type) { - case GLSL_TYPE_UINT: - if (op[0]->value.u[c] != 0.0) - data.u[c] = 1 / op[0]->value.u[c]; - break; - case GLSL_TYPE_INT: - if (op[0]->value.i[c] != 0.0) - data.i[c] = 1 / op[0]->value.i[c]; - break; - case GLSL_TYPE_FLOAT: - if (op[0]->value.f[c] != 0.0) - data.f[c] = 1.0F / op[0]->value.f[c]; - break; - default: - assert(0); - } - } - break; - - case ir_unop_rsq: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = 1.0F / sqrtf(op[0]->value.f[c]); - } - break; - - case ir_unop_sqrt: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = sqrtf(op[0]->value.f[c]); - } - break; - - case ir_unop_exp: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = expf(op[0]->value.f[c]); - } - break; - - case ir_unop_exp2: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = exp2f(op[0]->value.f[c]); - } - break; - - case ir_unop_log: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = logf(op[0]->value.f[c]); - } - break; - - case ir_unop_log2: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = log2f(op[0]->value.f[c]); - } - break; - - case ir_unop_dFdx: - case ir_unop_dFdx_coarse: - case ir_unop_dFdx_fine: - case ir_unop_dFdy: - case ir_unop_dFdy_coarse: - case ir_unop_dFdy_fine: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = 0.0; - } - break; - - case ir_unop_pack_snorm_2x16: - assert(op[0]->type == glsl_type::vec2_type); - data.u[0] = pack_2x16(pack_snorm_1x16, - op[0]->value.f[0], - op[0]->value.f[1]); - break; - case ir_unop_pack_snorm_4x8: - assert(op[0]->type == glsl_type::vec4_type); - data.u[0] = pack_4x8(pack_snorm_1x8, - op[0]->value.f[0], - op[0]->value.f[1], - op[0]->value.f[2], - op[0]->value.f[3]); - break; - case ir_unop_unpack_snorm_2x16: - assert(op[0]->type == glsl_type::uint_type); - unpack_2x16(unpack_snorm_1x16, - op[0]->value.u[0], - &data.f[0], &data.f[1]); - break; - case ir_unop_unpack_snorm_4x8: - assert(op[0]->type == glsl_type::uint_type); - unpack_4x8(unpack_snorm_1x8, - op[0]->value.u[0], - &data.f[0], &data.f[1], &data.f[2], &data.f[3]); - break; - case ir_unop_pack_unorm_2x16: - assert(op[0]->type == glsl_type::vec2_type); - data.u[0] = pack_2x16(pack_unorm_1x16, - op[0]->value.f[0], - op[0]->value.f[1]); - break; - case ir_unop_pack_unorm_4x8: - assert(op[0]->type == glsl_type::vec4_type); - data.u[0] = pack_4x8(pack_unorm_1x8, - op[0]->value.f[0], - op[0]->value.f[1], - op[0]->value.f[2], - op[0]->value.f[3]); - break; - case ir_unop_unpack_unorm_2x16: - assert(op[0]->type == glsl_type::uint_type); - unpack_2x16(unpack_unorm_1x16, - op[0]->value.u[0], - &data.f[0], &data.f[1]); - break; - case ir_unop_unpack_unorm_4x8: - assert(op[0]->type == glsl_type::uint_type); - unpack_4x8(unpack_unorm_1x8, - op[0]->value.u[0], - &data.f[0], &data.f[1], &data.f[2], &data.f[3]); - break; - case ir_unop_pack_half_2x16: - assert(op[0]->type == glsl_type::vec2_type); - data.u[0] = pack_2x16(pack_half_1x16, - op[0]->value.f[0], - op[0]->value.f[1]); - break; - case ir_unop_unpack_half_2x16: - assert(op[0]->type == glsl_type::uint_type); - unpack_2x16(unpack_half_1x16, - op[0]->value.u[0], - &data.f[0], &data.f[1]); - break; - case ir_binop_pow: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - data.f[c] = powf(op[0]->value.f[c], op[1]->value.f[c]); - } - break; - - case ir_binop_dot: - data.f[0] = dot(op[0], op[1]); - break; - - case ir_binop_min: - assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); - for (unsigned c = 0, c0 = 0, c1 = 0; - c < components; - c0 += c0_inc, c1 += c1_inc, c++) { - - switch (op[0]->type->base_type) { - case GLSL_TYPE_UINT: - data.u[c] = MIN2(op[0]->value.u[c0], op[1]->value.u[c1]); - break; - case GLSL_TYPE_INT: - data.i[c] = MIN2(op[0]->value.i[c0], op[1]->value.i[c1]); - break; - case GLSL_TYPE_FLOAT: - data.f[c] = MIN2(op[0]->value.f[c0], op[1]->value.f[c1]); - break; - default: - assert(0); - } - } - - break; - case ir_binop_max: - assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); - for (unsigned c = 0, c0 = 0, c1 = 0; - c < components; - c0 += c0_inc, c1 += c1_inc, c++) { - - switch (op[0]->type->base_type) { - case GLSL_TYPE_UINT: - data.u[c] = MAX2(op[0]->value.u[c0], op[1]->value.u[c1]); - break; - case GLSL_TYPE_INT: - data.i[c] = MAX2(op[0]->value.i[c0], op[1]->value.i[c1]); - break; - case GLSL_TYPE_FLOAT: - data.f[c] = MAX2(op[0]->value.f[c0], op[1]->value.f[c1]); - break; - default: - assert(0); - } - } - break; - - case ir_binop_add: - assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); - for (unsigned c = 0, c0 = 0, c1 = 0; - c < components; - c0 += c0_inc, c1 += c1_inc, c++) { - - switch (op[0]->type->base_type) { - case GLSL_TYPE_UINT: - data.u[c] = op[0]->value.u[c0] + op[1]->value.u[c1]; - break; - case GLSL_TYPE_INT: - data.i[c] = op[0]->value.i[c0] + op[1]->value.i[c1]; - break; - case GLSL_TYPE_FLOAT: - data.f[c] = op[0]->value.f[c0] + op[1]->value.f[c1]; - break; - default: - assert(0); - } - } - - break; - case ir_binop_sub: - assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); - for (unsigned c = 0, c0 = 0, c1 = 0; - c < components; - c0 += c0_inc, c1 += c1_inc, c++) { - - switch (op[0]->type->base_type) { - case GLSL_TYPE_UINT: - data.u[c] = op[0]->value.u[c0] - op[1]->value.u[c1]; - break; - case GLSL_TYPE_INT: - data.i[c] = op[0]->value.i[c0] - op[1]->value.i[c1]; - break; - case GLSL_TYPE_FLOAT: - data.f[c] = op[0]->value.f[c0] - op[1]->value.f[c1]; - break; - default: - assert(0); - } - } - - break; - case ir_binop_mul: - /* Check for equal types, or unequal types involving scalars */ - if ((op[0]->type == op[1]->type && !op[0]->type->is_matrix()) - || op0_scalar || op1_scalar) { - for (unsigned c = 0, c0 = 0, c1 = 0; - c < components; - c0 += c0_inc, c1 += c1_inc, c++) { - - switch (op[0]->type->base_type) { - case GLSL_TYPE_UINT: - data.u[c] = op[0]->value.u[c0] * op[1]->value.u[c1]; - break; - case GLSL_TYPE_INT: - data.i[c] = op[0]->value.i[c0] * op[1]->value.i[c1]; - break; - case GLSL_TYPE_FLOAT: - data.f[c] = op[0]->value.f[c0] * op[1]->value.f[c1]; - break; - default: - assert(0); - } - } - } else { - assert(op[0]->type->is_matrix() || op[1]->type->is_matrix()); - - /* Multiply an N-by-M matrix with an M-by-P matrix. Since either - * matrix can be a GLSL vector, either N or P can be 1. - * - * For vec*mat, the vector is treated as a row vector. This - * means the vector is a 1-row x M-column matrix. - * - * For mat*vec, the vector is treated as a column vector. Since - * matrix_columns is 1 for vectors, this just works. - */ - const unsigned n = op[0]->type->is_vector() - ? 1 : op[0]->type->vector_elements; - const unsigned m = op[1]->type->vector_elements; - const unsigned p = op[1]->type->matrix_columns; - for (unsigned j = 0; j < p; j++) { - for (unsigned i = 0; i < n; i++) { - for (unsigned k = 0; k < m; k++) { - data.f[i+n*j] += op[0]->value.f[i+n*k]*op[1]->value.f[k+m*j]; - } - } - } - } - - break; - case ir_binop_div: - /* FINISHME: Emit warning when division-by-zero is detected. */ - assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); - for (unsigned c = 0, c0 = 0, c1 = 0; - c < components; - c0 += c0_inc, c1 += c1_inc, c++) { - - switch (op[0]->type->base_type) { - case GLSL_TYPE_UINT: - if (op[1]->value.u[c1] == 0) { - data.u[c] = 0; - } else { - data.u[c] = op[0]->value.u[c0] / op[1]->value.u[c1]; - } - break; - case GLSL_TYPE_INT: - if (op[1]->value.i[c1] == 0) { - data.i[c] = 0; - } else { - data.i[c] = op[0]->value.i[c0] / op[1]->value.i[c1]; - } - break; - case GLSL_TYPE_FLOAT: - data.f[c] = op[0]->value.f[c0] / op[1]->value.f[c1]; - break; - default: - assert(0); - } - } - - break; - case ir_binop_mod: - /* FINISHME: Emit warning when division-by-zero is detected. */ - assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); - for (unsigned c = 0, c0 = 0, c1 = 0; - c < components; - c0 += c0_inc, c1 += c1_inc, c++) { - - switch (op[0]->type->base_type) { - case GLSL_TYPE_UINT: - if (op[1]->value.u[c1] == 0) { - data.u[c] = 0; - } else { - data.u[c] = op[0]->value.u[c0] % op[1]->value.u[c1]; - } - break; - case GLSL_TYPE_INT: - if (op[1]->value.i[c1] == 0) { - data.i[c] = 0; - } else { - data.i[c] = op[0]->value.i[c0] % op[1]->value.i[c1]; - } - break; - case GLSL_TYPE_FLOAT: - /* We don't use fmod because it rounds toward zero; GLSL specifies - * the use of floor. - */ - data.f[c] = op[0]->value.f[c0] - op[1]->value.f[c1] - * floorf(op[0]->value.f[c0] / op[1]->value.f[c1]); - break; - default: - assert(0); - } - } - - break; - - case ir_binop_logic_and: - assert(op[0]->type->base_type == GLSL_TYPE_BOOL); - for (unsigned c = 0; c < op[0]->type->components(); c++) - data.b[c] = op[0]->value.b[c] && op[1]->value.b[c]; - break; - case ir_binop_logic_xor: - assert(op[0]->type->base_type == GLSL_TYPE_BOOL); - for (unsigned c = 0; c < op[0]->type->components(); c++) - data.b[c] = op[0]->value.b[c] ^ op[1]->value.b[c]; - break; - case ir_binop_logic_or: - assert(op[0]->type->base_type == GLSL_TYPE_BOOL); - for (unsigned c = 0; c < op[0]->type->components(); c++) - data.b[c] = op[0]->value.b[c] || op[1]->value.b[c]; - break; - - case ir_binop_less: - assert(op[0]->type == op[1]->type); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - switch (op[0]->type->base_type) { - case GLSL_TYPE_UINT: - data.b[c] = op[0]->value.u[c] < op[1]->value.u[c]; - break; - case GLSL_TYPE_INT: - data.b[c] = op[0]->value.i[c] < op[1]->value.i[c]; - break; - case GLSL_TYPE_FLOAT: - data.b[c] = op[0]->value.f[c] < op[1]->value.f[c]; - break; - default: - assert(0); - } - } - break; - case ir_binop_greater: - assert(op[0]->type == op[1]->type); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - switch (op[0]->type->base_type) { - case GLSL_TYPE_UINT: - data.b[c] = op[0]->value.u[c] > op[1]->value.u[c]; - break; - case GLSL_TYPE_INT: - data.b[c] = op[0]->value.i[c] > op[1]->value.i[c]; - break; - case GLSL_TYPE_FLOAT: - data.b[c] = op[0]->value.f[c] > op[1]->value.f[c]; - break; - default: - assert(0); - } - } - break; - case ir_binop_lequal: - assert(op[0]->type == op[1]->type); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - switch (op[0]->type->base_type) { - case GLSL_TYPE_UINT: - data.b[c] = op[0]->value.u[c] <= op[1]->value.u[c]; - break; - case GLSL_TYPE_INT: - data.b[c] = op[0]->value.i[c] <= op[1]->value.i[c]; - break; - case GLSL_TYPE_FLOAT: - data.b[c] = op[0]->value.f[c] <= op[1]->value.f[c]; - break; - default: - assert(0); - } - } - break; - case ir_binop_gequal: - assert(op[0]->type == op[1]->type); - for (unsigned c = 0; c < op[0]->type->components(); c++) { - switch (op[0]->type->base_type) { - case GLSL_TYPE_UINT: - data.b[c] = op[0]->value.u[c] >= op[1]->value.u[c]; - break; - case GLSL_TYPE_INT: - data.b[c] = op[0]->value.i[c] >= op[1]->value.i[c]; - break; - case GLSL_TYPE_FLOAT: - data.b[c] = op[0]->value.f[c] >= op[1]->value.f[c]; - break; - default: - assert(0); - } - } - break; - case ir_binop_equal: - assert(op[0]->type == op[1]->type); - for (unsigned c = 0; c < components; c++) { - switch (op[0]->type->base_type) { - case GLSL_TYPE_UINT: - data.b[c] = op[0]->value.u[c] == op[1]->value.u[c]; - break; - case GLSL_TYPE_INT: - data.b[c] = op[0]->value.i[c] == op[1]->value.i[c]; - break; - case GLSL_TYPE_FLOAT: - data.b[c] = op[0]->value.f[c] == op[1]->value.f[c]; - break; - case GLSL_TYPE_BOOL: - data.b[c] = op[0]->value.b[c] == op[1]->value.b[c]; - break; - default: - assert(0); - } - } - break; - case ir_binop_nequal: - assert(op[0]->type == op[1]->type); - for (unsigned c = 0; c < components; c++) { - switch (op[0]->type->base_type) { - case GLSL_TYPE_UINT: - data.b[c] = op[0]->value.u[c] != op[1]->value.u[c]; - break; - case GLSL_TYPE_INT: - data.b[c] = op[0]->value.i[c] != op[1]->value.i[c]; - break; - case GLSL_TYPE_FLOAT: - data.b[c] = op[0]->value.f[c] != op[1]->value.f[c]; - break; - case GLSL_TYPE_BOOL: - data.b[c] = op[0]->value.b[c] != op[1]->value.b[c]; - break; - default: - assert(0); - } - } - break; - case ir_binop_all_equal: - data.b[0] = op[0]->has_value(op[1]); - break; - case ir_binop_any_nequal: - data.b[0] = !op[0]->has_value(op[1]); - break; - - case ir_binop_lshift: - for (unsigned c = 0, c0 = 0, c1 = 0; - c < components; - c0 += c0_inc, c1 += c1_inc, c++) { - - if (op[0]->type->base_type == GLSL_TYPE_INT && - op[1]->type->base_type == GLSL_TYPE_INT) { - data.i[c] = op[0]->value.i[c0] << op[1]->value.i[c1]; - - } else if (op[0]->type->base_type == GLSL_TYPE_INT && - op[1]->type->base_type == GLSL_TYPE_UINT) { - data.i[c] = op[0]->value.i[c0] << op[1]->value.u[c1]; - - } else if (op[0]->type->base_type == GLSL_TYPE_UINT && - op[1]->type->base_type == GLSL_TYPE_INT) { - data.u[c] = op[0]->value.u[c0] << op[1]->value.i[c1]; - - } else if (op[0]->type->base_type == GLSL_TYPE_UINT && - op[1]->type->base_type == GLSL_TYPE_UINT) { - data.u[c] = op[0]->value.u[c0] << op[1]->value.u[c1]; - } - } - break; - - case ir_binop_rshift: - for (unsigned c = 0, c0 = 0, c1 = 0; - c < components; - c0 += c0_inc, c1 += c1_inc, c++) { - - if (op[0]->type->base_type == GLSL_TYPE_INT && - op[1]->type->base_type == GLSL_TYPE_INT) { - data.i[c] = op[0]->value.i[c0] >> op[1]->value.i[c1]; - - } else if (op[0]->type->base_type == GLSL_TYPE_INT && - op[1]->type->base_type == GLSL_TYPE_UINT) { - data.i[c] = op[0]->value.i[c0] >> op[1]->value.u[c1]; - - } else if (op[0]->type->base_type == GLSL_TYPE_UINT && - op[1]->type->base_type == GLSL_TYPE_INT) { - data.u[c] = op[0]->value.u[c0] >> op[1]->value.i[c1]; - - } else if (op[0]->type->base_type == GLSL_TYPE_UINT && - op[1]->type->base_type == GLSL_TYPE_UINT) { - data.u[c] = op[0]->value.u[c0] >> op[1]->value.u[c1]; - } - } - break; - - case ir_binop_bit_and: - for (unsigned c = 0, c0 = 0, c1 = 0; - c < components; - c0 += c0_inc, c1 += c1_inc, c++) { - - switch (op[0]->type->base_type) { - case GLSL_TYPE_INT: - data.i[c] = op[0]->value.i[c0] & op[1]->value.i[c1]; - break; - case GLSL_TYPE_UINT: - data.u[c] = op[0]->value.u[c0] & op[1]->value.u[c1]; - break; - default: - assert(0); - } - } - break; - - case ir_binop_bit_or: - for (unsigned c = 0, c0 = 0, c1 = 0; - c < components; - c0 += c0_inc, c1 += c1_inc, c++) { - - switch (op[0]->type->base_type) { - case GLSL_TYPE_INT: - data.i[c] = op[0]->value.i[c0] | op[1]->value.i[c1]; - break; - case GLSL_TYPE_UINT: - data.u[c] = op[0]->value.u[c0] | op[1]->value.u[c1]; - break; - default: - assert(0); - } - } - break; - - case ir_binop_vector_extract: { - const int c = CLAMP(op[1]->value.i[0], 0, - (int) op[0]->type->vector_elements - 1); - - switch (op[0]->type->base_type) { - case GLSL_TYPE_UINT: - data.u[0] = op[0]->value.u[c]; - break; - case GLSL_TYPE_INT: - data.i[0] = op[0]->value.i[c]; - break; - case GLSL_TYPE_FLOAT: - data.f[0] = op[0]->value.f[c]; - break; - case GLSL_TYPE_BOOL: - data.b[0] = op[0]->value.b[c]; - break; - default: - assert(0); - } - break; - } - - case ir_binop_bit_xor: - for (unsigned c = 0, c0 = 0, c1 = 0; - c < components; - c0 += c0_inc, c1 += c1_inc, c++) { - - switch (op[0]->type->base_type) { - case GLSL_TYPE_INT: - data.i[c] = op[0]->value.i[c0] ^ op[1]->value.i[c1]; - break; - case GLSL_TYPE_UINT: - data.u[c] = op[0]->value.u[c0] ^ op[1]->value.u[c1]; - break; - default: - assert(0); - } - } - break; - - case ir_unop_bitfield_reverse: - /* http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious */ - for (unsigned c = 0; c < components; c++) { - unsigned int v = op[0]->value.u[c]; // input bits to be reversed - unsigned int r = v; // r will be reversed bits of v; first get LSB of v - int s = sizeof(v) * CHAR_BIT - 1; // extra shift needed at end - - for (v >>= 1; v; v >>= 1) { - r <<= 1; - r |= v & 1; - s--; - } - r <<= s; // shift when v's highest bits are zero - - data.u[c] = r; - } - break; - - case ir_unop_bit_count: - for (unsigned c = 0; c < components; c++) { - unsigned count = 0; - unsigned v = op[0]->value.u[c]; - - for (; v; count++) { - v &= v - 1; - } - data.u[c] = count; - } - break; - - case ir_unop_find_msb: - for (unsigned c = 0; c < components; c++) { - int v = op[0]->value.i[c]; - - if (v == 0 || (op[0]->type->base_type == GLSL_TYPE_INT && v == -1)) - data.i[c] = -1; - else { - int count = 0; - int top_bit = op[0]->type->base_type == GLSL_TYPE_UINT - ? 0 : v & (1 << 31); - - while (((v & (1 << 31)) == top_bit) && count != 32) { - count++; - v <<= 1; - } - - data.i[c] = 31 - count; - } - } - break; - - case ir_unop_find_lsb: - for (unsigned c = 0; c < components; c++) { - if (op[0]->value.i[c] == 0) - data.i[c] = -1; - else { - unsigned pos = 0; - unsigned v = op[0]->value.u[c]; - - for (; !(v & 1); v >>= 1) { - pos++; - } - data.u[c] = pos; - } - } - break; - - case ir_unop_saturate: - for (unsigned c = 0; c < components; c++) { - data.f[c] = CLAMP(op[0]->value.f[c], 0.0f, 1.0f); - } - break; - - case ir_triop_bitfield_extract: { - int offset = op[1]->value.i[0]; - int bits = op[2]->value.i[0]; - - for (unsigned c = 0; c < components; c++) { - if (bits == 0) - data.u[c] = 0; - else if (offset < 0 || bits < 0) - data.u[c] = 0; /* Undefined, per spec. */ - else if (offset + bits > 32) - data.u[c] = 0; /* Undefined, per spec. */ - else { - if (op[0]->type->base_type == GLSL_TYPE_INT) { - /* int so that the right shift will sign-extend. */ - int value = op[0]->value.i[c]; - value <<= 32 - bits - offset; - value >>= 32 - bits; - data.i[c] = value; - } else { - unsigned value = op[0]->value.u[c]; - value <<= 32 - bits - offset; - value >>= 32 - bits; - data.u[c] = value; - } - } - } - break; - } - - case ir_binop_bfm: { - int bits = op[0]->value.i[0]; - int offset = op[1]->value.i[0]; - - for (unsigned c = 0; c < components; c++) { - if (bits == 0) - data.u[c] = op[0]->value.u[c]; - else if (offset < 0 || bits < 0) - data.u[c] = 0; /* Undefined for bitfieldInsert, per spec. */ - else if (offset + bits > 32) - data.u[c] = 0; /* Undefined for bitfieldInsert, per spec. */ - else - data.u[c] = ((1 << bits) - 1) << offset; - } - break; - } - - case ir_binop_ldexp: - for (unsigned c = 0; c < components; c++) { - data.f[c] = ldexp(op[0]->value.f[c], op[1]->value.i[c]); - /* Flush subnormal values to zero. */ - if (!isnormal(data.f[c])) - data.f[c] = copysign(0.0f, op[0]->value.f[c]); - } - break; - - case ir_triop_fma: - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - assert(op[1]->type->base_type == GLSL_TYPE_FLOAT); - assert(op[2]->type->base_type == GLSL_TYPE_FLOAT); - - for (unsigned c = 0; c < components; c++) { - data.f[c] = op[0]->value.f[c] * op[1]->value.f[c] - + op[2]->value.f[c]; - } - break; - - case ir_triop_lrp: { - assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); - assert(op[1]->type->base_type == GLSL_TYPE_FLOAT); - assert(op[2]->type->base_type == GLSL_TYPE_FLOAT); - - unsigned c2_inc = op[2]->type->is_scalar() ? 0 : 1; - for (unsigned c = 0, c2 = 0; c < components; c2 += c2_inc, c++) { - data.f[c] = op[0]->value.f[c] * (1.0f - op[2]->value.f[c2]) + - (op[1]->value.f[c] * op[2]->value.f[c2]); - } - break; - } - - case ir_triop_csel: - for (unsigned c = 0; c < components; c++) { - data.u[c] = op[0]->value.b[c] ? op[1]->value.u[c] - : op[2]->value.u[c]; - } - break; - - case ir_triop_vector_insert: { - const unsigned idx = op[2]->value.u[0]; - - memcpy(&data, &op[0]->value, sizeof(data)); - - switch (this->type->base_type) { - case GLSL_TYPE_INT: - data.i[idx] = op[1]->value.i[0]; - break; - case GLSL_TYPE_UINT: - data.u[idx] = op[1]->value.u[0]; - break; - case GLSL_TYPE_FLOAT: - data.f[idx] = op[1]->value.f[0]; - break; - case GLSL_TYPE_BOOL: - data.b[idx] = op[1]->value.b[0]; - break; - default: - assert(!"Should not get here."); - break; - } - break; - } - - case ir_quadop_bitfield_insert: { - int offset = op[2]->value.i[0]; - int bits = op[3]->value.i[0]; - - for (unsigned c = 0; c < components; c++) { - if (bits == 0) - data.u[c] = op[0]->value.u[c]; - else if (offset < 0 || bits < 0) - data.u[c] = 0; /* Undefined, per spec. */ - else if (offset + bits > 32) - data.u[c] = 0; /* Undefined, per spec. */ - else { - unsigned insert_mask = ((1 << bits) - 1) << offset; - - unsigned insert = op[1]->value.u[c]; - insert <<= offset; - insert &= insert_mask; - - unsigned base = op[0]->value.u[c]; - base &= ~insert_mask; - - data.u[c] = base | insert; - } - } - break; - } - - case ir_quadop_vector: - for (unsigned c = 0; c < this->type->vector_elements; c++) { - switch (this->type->base_type) { - case GLSL_TYPE_INT: - data.i[c] = op[c]->value.i[0]; - break; - case GLSL_TYPE_UINT: - data.u[c] = op[c]->value.u[0]; - break; - case GLSL_TYPE_FLOAT: - data.f[c] = op[c]->value.f[0]; - break; - default: - assert(0); - } - } - break; - - default: - /* FINISHME: Should handle all expression types. */ - return NULL; - } - - return new(ctx) ir_constant(this->type, &data); -} - - -ir_constant * -ir_texture::constant_expression_value(struct hash_table *) -{ - /* texture lookups aren't constant expressions */ - return NULL; -} - - -ir_constant * -ir_swizzle::constant_expression_value(struct hash_table *variable_context) -{ - ir_constant *v = this->val->constant_expression_value(variable_context); - - if (v != NULL) { - ir_constant_data data = { { 0 } }; - - const unsigned swiz_idx[4] = { - this->mask.x, this->mask.y, this->mask.z, this->mask.w - }; - - for (unsigned i = 0; i < this->mask.num_components; i++) { - switch (v->type->base_type) { - case GLSL_TYPE_UINT: - case GLSL_TYPE_INT: data.u[i] = v->value.u[swiz_idx[i]]; break; - case GLSL_TYPE_FLOAT: data.f[i] = v->value.f[swiz_idx[i]]; break; - case GLSL_TYPE_BOOL: data.b[i] = v->value.b[swiz_idx[i]]; break; - default: assert(!"Should not get here."); break; - } - } - - void *ctx = ralloc_parent(this); - return new(ctx) ir_constant(this->type, &data); - } - return NULL; -} - - -ir_constant * -ir_dereference_variable::constant_expression_value(struct hash_table *variable_context) -{ - /* This may occur during compile and var->type is glsl_type::error_type */ - if (!var) - return NULL; - - /* Give priority to the context hashtable, if it exists */ - if (variable_context) { - ir_constant *value = (ir_constant *)hash_table_find(variable_context, var); - if(value) - return value; - } - - /* The constant_value of a uniform variable is its initializer, - * not the lifetime constant value of the uniform. - */ - if (var->data.mode == ir_var_uniform) - return NULL; - - if (!var->constant_value) - return NULL; - - return var->constant_value->clone(ralloc_parent(var), NULL); -} - - -ir_constant * -ir_dereference_array::constant_expression_value(struct hash_table *variable_context) -{ - ir_constant *array = this->array->constant_expression_value(variable_context); - ir_constant *idx = this->array_index->constant_expression_value(variable_context); - - if ((array != NULL) && (idx != NULL)) { - void *ctx = ralloc_parent(this); - if (array->type->is_matrix()) { - /* Array access of a matrix results in a vector. - */ - const unsigned column = idx->value.u[0]; - - const glsl_type *const column_type = array->type->column_type(); - - /* Offset in the constant matrix to the first element of the column - * to be extracted. - */ - const unsigned mat_idx = column * column_type->vector_elements; - - ir_constant_data data = { { 0 } }; - - switch (column_type->base_type) { - case GLSL_TYPE_UINT: - case GLSL_TYPE_INT: - for (unsigned i = 0; i < column_type->vector_elements; i++) - data.u[i] = array->value.u[mat_idx + i]; - - break; - - case GLSL_TYPE_FLOAT: - for (unsigned i = 0; i < column_type->vector_elements; i++) - data.f[i] = array->value.f[mat_idx + i]; - - break; - - default: - assert(!"Should not get here."); - break; - } - - return new(ctx) ir_constant(column_type, &data); - } else if (array->type->is_vector()) { - const unsigned component = idx->value.u[0]; - - return new(ctx) ir_constant(array, component); - } else { - const unsigned index = idx->value.u[0]; - return array->get_array_element(index)->clone(ctx, NULL); - } - } - return NULL; -} - - -ir_constant * -ir_dereference_record::constant_expression_value(struct hash_table *) -{ - ir_constant *v = this->record->constant_expression_value(); - - return (v != NULL) ? v->get_record_field(this->field) : NULL; -} - - -ir_constant * -ir_assignment::constant_expression_value(struct hash_table *) -{ - /* FINISHME: Handle CEs involving assignment (return RHS) */ - return NULL; -} - - -ir_constant * -ir_constant::constant_expression_value(struct hash_table *) -{ - return this; -} - - -ir_constant * -ir_call::constant_expression_value(struct hash_table *variable_context) -{ - return this->callee->constant_expression_value(&this->actual_parameters, variable_context); -} - - -bool ir_function_signature::constant_expression_evaluate_expression_list(const struct exec_list &body, - struct hash_table *variable_context, - ir_constant **result) -{ - foreach_in_list(ir_instruction, inst, &body) { - switch(inst->ir_type) { - - /* (declare () type symbol) */ - case ir_type_variable: { - ir_variable *var = inst->as_variable(); - hash_table_insert(variable_context, ir_constant::zero(this, var->type), var); - break; - } - - /* (assign [condition] (write-mask) (ref) (value)) */ - case ir_type_assignment: { - ir_assignment *asg = inst->as_assignment(); - if (asg->condition) { - ir_constant *cond = asg->condition->constant_expression_value(variable_context); - if (!cond) - return false; - if (!cond->get_bool_component(0)) - break; - } - - ir_constant *store = NULL; - int offset = 0; - - if (!constant_referenced(asg->lhs, variable_context, store, offset)) - return false; - - ir_constant *value = asg->rhs->constant_expression_value(variable_context); - - if (!value) - return false; - - store->copy_masked_offset(value, offset, asg->write_mask); - break; - } - - /* (return (expression)) */ - case ir_type_return: - assert (result); - *result = inst->as_return()->value->constant_expression_value(variable_context); - return *result != NULL; - - /* (call name (ref) (params))*/ - case ir_type_call: { - ir_call *call = inst->as_call(); - - /* Just say no to void functions in constant expressions. We - * don't need them at that point. - */ - - if (!call->return_deref) - return false; - - ir_constant *store = NULL; - int offset = 0; - - if (!constant_referenced(call->return_deref, variable_context, - store, offset)) - return false; - - ir_constant *value = call->constant_expression_value(variable_context); - - if(!value) - return false; - - store->copy_offset(value, offset); - break; - } - - /* (if condition (then-instructions) (else-instructions)) */ - case ir_type_if: { - ir_if *iif = inst->as_if(); - - ir_constant *cond = iif->condition->constant_expression_value(variable_context); - if (!cond || !cond->type->is_boolean()) - return false; - - exec_list &branch = cond->get_bool_component(0) ? iif->then_instructions : iif->else_instructions; - - *result = NULL; - if (!constant_expression_evaluate_expression_list(branch, variable_context, result)) - return false; - - /* If there was a return in the branch chosen, drop out now. */ - if (*result) - return true; - - break; - } - - /* Every other expression type, we drop out. */ - default: - return false; - } - } - - /* Reaching the end of the block is not an error condition */ - if (result) - *result = NULL; - - return true; -} - -ir_constant * -ir_function_signature::constant_expression_value(exec_list *actual_parameters, struct hash_table *variable_context) -{ - const glsl_type *type = this->return_type; - if (type == glsl_type::void_type) - return NULL; - - /* From the GLSL 1.20 spec, page 23: - * "Function calls to user-defined functions (non-built-in functions) - * cannot be used to form constant expressions." - */ - if (!this->is_builtin()) - return NULL; - - /* - * Of the builtin functions, only the texture lookups and the noise - * ones must not be used in constant expressions. They all include - * specific opcodes so they don't need to be special-cased at this - * point. - */ - - /* Initialize the table of dereferencable names with the function - * parameters. Verify their const-ness on the way. - * - * We expect the correctness of the number of parameters to have - * been checked earlier. - */ - hash_table *deref_hash = hash_table_ctor(8, hash_table_pointer_hash, - hash_table_pointer_compare); - - /* If "origin" is non-NULL, then the function body is there. So we - * have to use the variable objects from the object with the body, - * but the parameter instanciation on the current object. - */ - const exec_node *parameter_info = origin ? origin->parameters.head : parameters.head; - - foreach_in_list(ir_rvalue, n, actual_parameters) { - ir_constant *constant = n->constant_expression_value(variable_context); - if (constant == NULL) { - hash_table_dtor(deref_hash); - return NULL; - } - - - ir_variable *var = (ir_variable *)parameter_info; - hash_table_insert(deref_hash, constant, var); - - parameter_info = parameter_info->next; - } - - ir_constant *result = NULL; - - /* Now run the builtin function until something non-constant - * happens or we get the result. - */ - if (constant_expression_evaluate_expression_list(origin ? origin->body : body, deref_hash, &result) && result) - result = result->clone(ralloc_parent(this), NULL); - - hash_table_dtor(deref_hash); - - return result; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_equals.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_equals.cpp deleted file mode 100644 index 57a04ecba..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_equals.cpp +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright © 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "ir.h" - -/** - * Helper for checking equality when one instruction might be NULL, since you - * can't access a's vtable in that case. - */ -static bool -possibly_null_equals(ir_instruction *a, ir_instruction *b, enum ir_node_type ignore) -{ - if (!a || !b) - return !a && !b; - - return a->equals(b, ignore); -} - -/** - * The base equality function: Return not equal for anything we don't know - * about. - */ -bool -ir_instruction::equals(ir_instruction *, enum ir_node_type) -{ - return false; -} - -bool -ir_constant::equals(ir_instruction *ir, enum ir_node_type) -{ - const ir_constant *other = ir->as_constant(); - if (!other) - return false; - - if (type != other->type) - return false; - - for (unsigned i = 0; i < type->components(); i++) { - if (value.u[i] != other->value.u[i]) - return false; - } - - return true; -} - -bool -ir_dereference_variable::equals(ir_instruction *ir, enum ir_node_type) -{ - const ir_dereference_variable *other = ir->as_dereference_variable(); - if (!other) - return false; - - return var == other->var; -} - -bool -ir_dereference_array::equals(ir_instruction *ir, enum ir_node_type ignore) -{ - const ir_dereference_array *other = ir->as_dereference_array(); - if (!other) - return false; - - if (type != other->type) - return false; - - if (!array->equals(other->array, ignore)) - return false; - - if (!array_index->equals(other->array_index, ignore)) - return false; - - return true; -} - -bool -ir_swizzle::equals(ir_instruction *ir, enum ir_node_type ignore) -{ - const ir_swizzle *other = ir->as_swizzle(); - if (!other) - return false; - - if (type != other->type) - return false; - - if (ignore != ir_type_swizzle) { - if (mask.x != other->mask.x || - mask.y != other->mask.y || - mask.z != other->mask.z || - mask.w != other->mask.w) { - return false; - } - } - - return val->equals(other->val, ignore); -} - -bool -ir_texture::equals(ir_instruction *ir, enum ir_node_type ignore) -{ - const ir_texture *other = ir->as_texture(); - if (!other) - return false; - - if (type != other->type) - return false; - - if (op != other->op) - return false; - - if (!possibly_null_equals(coordinate, other->coordinate, ignore)) - return false; - -#if 0 // Note: glsl optimizer removed projector & shadow_comparitor fields - if (!possibly_null_equals(projector, other->projector, ignore)) - return false; - - if (!possibly_null_equals(shadow_comparitor, other->shadow_comparitor, ignore)) - return false; -#endif - - if (!possibly_null_equals(offset, other->offset, ignore)) - return false; - - if (!sampler->equals(other->sampler, ignore)) - return false; - - switch (op) { - case ir_tex: - case ir_lod: - case ir_query_levels: - break; - case ir_txb: - if (!lod_info.bias->equals(other->lod_info.bias, ignore)) - return false; - break; - case ir_txl: - case ir_txf: - case ir_txs: - if (!lod_info.lod->equals(other->lod_info.lod, ignore)) - return false; - break; - case ir_txd: - if (!lod_info.grad.dPdx->equals(other->lod_info.grad.dPdx, ignore) || - !lod_info.grad.dPdy->equals(other->lod_info.grad.dPdy, ignore)) - return false; - break; - case ir_txf_ms: - if (!lod_info.sample_index->equals(other->lod_info.sample_index, ignore)) - return false; - break; - case ir_tg4: - if (!lod_info.component->equals(other->lod_info.component, ignore)) - return false; - break; - default: - assert(!"Unrecognized texture op"); - } - - return true; -} - -bool -ir_expression::equals(ir_instruction *ir, enum ir_node_type ignore) -{ - const ir_expression *other = ir->as_expression(); - if (!other) - return false; - - if (type != other->type) - return false; - - if (operation != other->operation) - return false; - - for (unsigned i = 0; i < get_num_operands(); i++) { - if (!operands[i]->equals(other->operands[i], ignore)) - return false; - } - - return true; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_expression_flattening.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_expression_flattening.cpp deleted file mode 100644 index 7108da6bd..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_expression_flattening.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file ir_expression_flattening.cpp - * - * Takes the leaves of expression trees and makes them dereferences of - * assignments of the leaves to temporaries, according to a predicate. - * - * This is used for breaking down matrix operations, where it's easier to - * create a temporary and work on each of its vector components individually. - */ - -#include "ir.h" -#include "ir_rvalue_visitor.h" -#include "ir_expression_flattening.h" - -class ir_expression_flattening_visitor : public ir_rvalue_visitor { -public: - ir_expression_flattening_visitor(bool (*predicate)(ir_instruction *ir)) - { - this->predicate = predicate; - } - - virtual ~ir_expression_flattening_visitor() - { - /* empty */ - } - - void handle_rvalue(ir_rvalue **rvalue); - bool (*predicate)(ir_instruction *ir); -}; - -void -do_expression_flattening(exec_list *instructions, - bool (*predicate)(ir_instruction *ir)) -{ - ir_expression_flattening_visitor v(predicate); - - foreach_in_list(ir_instruction, ir, instructions) { - ir->accept(&v); - } -} - -void -ir_expression_flattening_visitor::handle_rvalue(ir_rvalue **rvalue) -{ - ir_variable *var; - ir_assignment *assign; - ir_rvalue *ir = *rvalue; - - if (!ir || !this->predicate(ir)) - return; - - void *ctx = ralloc_parent(ir); - - var = new(ctx) ir_variable(ir->type, "flattening_tmp", ir_var_temporary, precision_from_ir(ir)); - base_ir->insert_before(var); - - assign = new(ctx) ir_assignment(new(ctx) ir_dereference_variable(var), - ir, - NULL); - base_ir->insert_before(assign); - - *rvalue = new(ctx) ir_dereference_variable(var); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_expression_flattening.h b/3rdparty/glsl-optimizer/src/glsl/ir_expression_flattening.h deleted file mode 100644 index 2eda15900..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_expression_flattening.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - - -/** - * \file ir_expression_flattening.h - * - * Takes the leaves of expression trees and makes them dereferences of - * assignments of the leaves to temporaries, according to a predicate. - * - * This is used for automatic function inlining, where we want to take - * an expression containing a call and move the call out to its own - * assignment so that we can inline it at the appropriate place in the - * instruction stream. - */ - -void do_expression_flattening(exec_list *instructions, - bool (*predicate)(ir_instruction *ir)); diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_function.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_function.cpp deleted file mode 100644 index 2b2643c64..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_function.cpp +++ /dev/null @@ -1,401 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "glsl_types.h" -#include "ir.h" -#include "glsl_parser_extras.h" -#include "main/errors.h" - -typedef enum { - PARAMETER_LIST_NO_MATCH, - PARAMETER_LIST_EXACT_MATCH, - PARAMETER_LIST_INEXACT_MATCH /*< Match requires implicit conversion. */ -} parameter_list_match_t; - -/** - * \brief Check if two parameter lists match. - * - * \param list_a Parameters of the function definition. - * \param list_b Actual parameters passed to the function. - * \see matching_signature() - */ -static parameter_list_match_t -parameter_lists_match(_mesa_glsl_parse_state *state, - const exec_list *list_a, const exec_list *list_b) -{ - const exec_node *node_a = list_a->head; - const exec_node *node_b = list_b->head; - - /* This is set to true if there is an inexact match requiring an implicit - * conversion. */ - bool inexact_match = false; - - for (/* empty */ - ; !node_a->is_tail_sentinel() - ; node_a = node_a->next, node_b = node_b->next) { - /* If all of the parameters from the other parameter list have been - * exhausted, the lists have different length and, by definition, - * do not match. - */ - if (node_b->is_tail_sentinel()) - return PARAMETER_LIST_NO_MATCH; - - - const ir_variable *const param = (ir_variable *) node_a; - const ir_rvalue *const actual = (ir_rvalue *) node_b; - - if (param->type == actual->type) - continue; - - /* Try to find an implicit conversion from actual to param. */ - inexact_match = true; - switch ((enum ir_variable_mode)(param->data.mode)) { - case ir_var_auto: - case ir_var_uniform: - case ir_var_temporary: - /* These are all error conditions. It is invalid for a parameter to - * a function to be declared as auto (not in, out, or inout) or - * as uniform. - */ - assert(0); - return PARAMETER_LIST_NO_MATCH; - - case ir_var_const_in: - case ir_var_function_in: - if (!actual->type->can_implicitly_convert_to(param->type, state)) - return PARAMETER_LIST_NO_MATCH; - break; - - case ir_var_function_out: - if (!param->type->can_implicitly_convert_to(actual->type, state)) - return PARAMETER_LIST_NO_MATCH; - break; - - case ir_var_function_inout: - /* Since there are no bi-directional automatic conversions (e.g., - * there is int -> float but no float -> int), inout parameters must - * be exact matches. - */ - return PARAMETER_LIST_NO_MATCH; - - default: - assert(false); - return PARAMETER_LIST_NO_MATCH; - } - } - - /* If all of the parameters from the other parameter list have been - * exhausted, the lists have different length and, by definition, do not - * match. - */ - if (!node_b->is_tail_sentinel()) - return PARAMETER_LIST_NO_MATCH; - - if (inexact_match) - return PARAMETER_LIST_INEXACT_MATCH; - else - return PARAMETER_LIST_EXACT_MATCH; -} - - -/* Classes of parameter match, sorted (mostly) best matches first. - * See is_better_parameter_match() below for the exceptions. - * */ -typedef enum { - PARAMETER_EXACT_MATCH, - PARAMETER_FLOAT_TO_DOUBLE, - PARAMETER_INT_TO_FLOAT, - PARAMETER_INT_TO_DOUBLE, - PARAMETER_OTHER_CONVERSION, -} parameter_match_t; - - -static parameter_match_t -get_parameter_match_type(const ir_variable *param, - const ir_rvalue *actual) -{ - const glsl_type *from_type; - const glsl_type *to_type; - - if (param->data.mode == ir_var_function_out) { - from_type = param->type; - to_type = actual->type; - } else { - from_type = actual->type; - to_type = param->type; - } - - if (from_type == to_type) - return PARAMETER_EXACT_MATCH; - - /* XXX: When ARB_gpu_shader_fp64 support is added, check for float->double, - * and int/uint->double conversions - */ - - if (to_type->base_type == GLSL_TYPE_FLOAT) - return PARAMETER_INT_TO_FLOAT; - - /* int -> uint and any other oddball conversions */ - return PARAMETER_OTHER_CONVERSION; -} - - -static bool -is_better_parameter_match(parameter_match_t a_match, - parameter_match_t b_match) -{ - /* From section 6.1 of the GLSL 4.00 spec (and the ARB_gpu_shader5 spec): - * - * 1. An exact match is better than a match involving any implicit - * conversion. - * - * 2. A match involving an implicit conversion from float to double - * is better than match involving any other implicit conversion. - * - * [XXX: Not in GLSL 4.0: Only in ARB_gpu_shader5: - * 3. A match involving an implicit conversion from either int or uint - * to float is better than a match involving an implicit conversion - * from either int or uint to double.] - * - * If none of the rules above apply to a particular pair of conversions, - * neither conversion is considered better than the other. - * - * -- - * - * Notably, the int->uint conversion is *not* considered to be better - * or worse than int/uint->float or int/uint->double. - */ - - if (a_match >= PARAMETER_INT_TO_FLOAT && b_match == PARAMETER_OTHER_CONVERSION) - return false; - - return a_match < b_match; -} - - -static bool -is_best_inexact_overload(const exec_list *actual_parameters, - ir_function_signature **matches, - int num_matches, - ir_function_signature *sig) -{ - /* From section 6.1 of the GLSL 4.00 spec (and the ARB_gpu_shader5 spec): - * - * "A function definition A is considered a better - * match than function definition B if: - * - * * for at least one function argument, the conversion for that argument - * in A is better than the corresponding conversion in B; and - * - * * there is no function argument for which the conversion in B is better - * than the corresponding conversion in A. - * - * If a single function definition is considered a better match than every - * other matching function definition, it will be used. Otherwise, a - * semantic error occurs and the shader will fail to compile." - */ - for (ir_function_signature **other = matches; - other < matches + num_matches; other++) { - if (*other == sig) - continue; - - const exec_node *node_a = sig->parameters.head; - const exec_node *node_b = (*other)->parameters.head; - const exec_node *node_p = actual_parameters->head; - - bool better_for_some_parameter = false; - - for (/* empty */ - ; !node_a->is_tail_sentinel() - ; node_a = node_a->next, - node_b = node_b->next, - node_p = node_p->next) { - parameter_match_t a_match = get_parameter_match_type( - (const ir_variable *)node_a, - (const ir_rvalue *)node_p); - parameter_match_t b_match = get_parameter_match_type( - (const ir_variable *)node_b, - (const ir_rvalue *)node_p); - - if (is_better_parameter_match(a_match, b_match)) - better_for_some_parameter = true; - - if (is_better_parameter_match(b_match, a_match)) - return false; /* B is better for this parameter */ - } - - if (!better_for_some_parameter) - return false; /* A must be better than B for some parameter */ - - } - - return true; -} - - -static ir_function_signature * -choose_best_inexact_overload(_mesa_glsl_parse_state *state, - const exec_list *actual_parameters, - ir_function_signature **matches, - int num_matches) -{ - if (num_matches == 0) - return NULL; - - if (num_matches == 1) - return *matches; - - /* Without GLSL 4.0 / ARB_gpu_shader5, there is no overload resolution - * among multiple inexact matches. Note that state may be NULL here if - * called from the linker; in that case we assume everything supported in - * any GLSL version is available. */ - if (!state || state->is_version(400, 0) || state->ARB_gpu_shader5_enable) { - for (ir_function_signature **sig = matches; sig < matches + num_matches; sig++) { - if (is_best_inexact_overload(actual_parameters, matches, num_matches, *sig)) - return *sig; - } - } - - return NULL; /* no best candidate */ -} - - -ir_function_signature * -ir_function::matching_signature(_mesa_glsl_parse_state *state, - const exec_list *actual_parameters, - bool allow_builtins) -{ - bool is_exact; - return matching_signature(state, actual_parameters, allow_builtins, - &is_exact); -} - -ir_function_signature * -ir_function::matching_signature(_mesa_glsl_parse_state *state, - const exec_list *actual_parameters, - bool allow_builtins, - bool *is_exact) -{ - ir_function_signature **inexact_matches = NULL; - ir_function_signature **inexact_matches_temp; - ir_function_signature *match = NULL; - int num_inexact_matches = 0; - - /* From page 42 (page 49 of the PDF) of the GLSL 1.20 spec: - * - * "If an exact match is found, the other signatures are ignored, and - * the exact match is used. Otherwise, if no exact match is found, then - * the implicit conversions in Section 4.1.10 "Implicit Conversions" will - * be applied to the calling arguments if this can make their types match - * a signature. In this case, it is a semantic error if there are - * multiple ways to apply these conversions to the actual arguments of a - * call such that the call can be made to match multiple signatures." - */ - foreach_in_list(ir_function_signature, sig, &this->signatures) { - /* Skip over any built-ins that aren't available in this shader. */ - if (sig->is_builtin() && (!allow_builtins || - !sig->is_builtin_available(state))) - continue; - - switch (parameter_lists_match(state, & sig->parameters, actual_parameters)) { - case PARAMETER_LIST_EXACT_MATCH: - *is_exact = true; - free(inexact_matches); - return sig; - case PARAMETER_LIST_INEXACT_MATCH: - inexact_matches_temp = (ir_function_signature **) - realloc(inexact_matches, - sizeof(*inexact_matches) * - (num_inexact_matches + 1)); - if (inexact_matches_temp == NULL) { - _mesa_error_no_memory(__func__); - free(inexact_matches); - return NULL; - } - inexact_matches = inexact_matches_temp; - inexact_matches[num_inexact_matches++] = sig; - continue; - case PARAMETER_LIST_NO_MATCH: - continue; - default: - assert(false); - return NULL; - } - } - - /* There is no exact match (we would have returned it by now). If there - * are multiple inexact matches, the call is ambiguous, which is an error. - * - * FINISHME: Report a decent error. Returning NULL will likely result in - * FINISHME: a "no matching signature" error; it should report that the - * FINISHME: call is ambiguous. But reporting errors from here is hard. - */ - *is_exact = false; - - match = choose_best_inexact_overload(state, actual_parameters, - inexact_matches, num_inexact_matches); - - free(inexact_matches); - return match; -} - - -static bool -parameter_lists_match_exact(const exec_list *list_a, const exec_list *list_b) -{ - const exec_node *node_a = list_a->head; - const exec_node *node_b = list_b->head; - - for (/* empty */ - ; !node_a->is_tail_sentinel() && !node_b->is_tail_sentinel() - ; node_a = node_a->next, node_b = node_b->next) { - ir_variable *a = (ir_variable *) node_a; - ir_variable *b = (ir_variable *) node_b; - - /* If the types of the parameters do not match, the parameters lists - * are different. - */ - if (a->type != b->type) - return false; - } - - /* Unless both lists are exhausted, they differ in length and, by - * definition, do not match. - */ - return (node_a->is_tail_sentinel() == node_b->is_tail_sentinel()); -} - -ir_function_signature * -ir_function::exact_matching_signature(_mesa_glsl_parse_state *state, - const exec_list *actual_parameters) -{ - foreach_in_list(ir_function_signature, sig, &this->signatures) { - /* Skip over any built-ins that aren't available in this shader. */ - if (sig->is_builtin() && !sig->is_builtin_available(state)) - continue; - - if (parameter_lists_match_exact(&sig->parameters, actual_parameters)) - return sig; - } - return NULL; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_function_can_inline.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_function_can_inline.cpp deleted file mode 100644 index 7b15d5df1..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_function_can_inline.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file ir_function_can_inline.cpp - * - * Determines if we can inline a function call using ir_function_inlining.cpp. - * - * The primary restriction is that we can't return from the function - * other than as the last instruction. We could potentially work - * around this for some constructs by flattening control flow and - * moving the return to the end, or by using breaks from a do {} while - * (0) loop surrounding the function body. - */ - -#include "ir.h" - -class ir_function_can_inline_visitor : public ir_hierarchical_visitor { -public: - ir_function_can_inline_visitor() - { - this->num_returns = 0; - } - - virtual ir_visitor_status visit_enter(ir_return *); - - int num_returns; -}; - -ir_visitor_status -ir_function_can_inline_visitor::visit_enter(ir_return *ir) -{ - (void) ir; - this->num_returns++; - return visit_continue; -} - -bool -can_inline(ir_call *call) -{ - ir_function_can_inline_visitor v; - const ir_function_signature *callee = call->callee; - if (!callee->is_defined) - return false; - - v.run((exec_list *) &callee->body); - - /* If the function is empty (no last instruction) or does not end with a - * return statement, we need to count the implicit return. - */ - ir_instruction *last = (ir_instruction *)callee->body.get_tail(); - if (last == NULL || !last->as_return()) - v.num_returns++; - - return v.num_returns == 1; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_function_detect_recursion.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_function_detect_recursion.cpp deleted file mode 100644 index b2334d2e4..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_function_detect_recursion.cpp +++ /dev/null @@ -1,358 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file ir_function_detect_recursion.cpp - * Determine whether a shader contains static recursion. - * - * Consider the (possibly disjoint) graph of function calls in a shader. If a - * program contains recursion, this graph will contain a cycle. If a function - * is part of a cycle, it will have a caller and it will have a callee (it - * calls another function). - * - * To detect recursion, the function call graph is constructed. The graph is - * repeatedly reduced by removing any function that either has no callees - * (leaf functions) or has no caller. Eventually the only functions that - * remain will be the functions in the cycles. - * - * The GLSL spec is a bit wishy-washy about recursion. - * - * From page 39 (page 45 of the PDF) of the GLSL 1.10 spec: - * - * "Behavior is undefined if recursion is used. Recursion means having any - * function appearing more than once at any one time in the run-time stack - * of function calls. That is, a function may not call itself either - * directly or indirectly. Compilers may give diagnostic messages when - * this is detectable at compile time, but not all such cases can be - * detected at compile time." - * - * From page 79 (page 85 of the PDF): - * - * "22) Should recursion be supported? - * - * DISCUSSION: Probably not necessary, but another example of limiting - * the language based on how it would directly map to hardware. One - * thought is that recursion would benefit ray tracing shaders. On the - * other hand, many recursion operations can also be implemented with the - * user managing the recursion through arrays. RenderMan doesn't support - * recursion. This could be added at a later date, if it proved to be - * necessary. - * - * RESOLVED on September 10, 2002: Implementations are not required to - * support recursion. - * - * CLOSED on September 10, 2002." - * - * From page 79 (page 85 of the PDF): - * - * "56) Is it an error for an implementation to support recursion if the - * specification says recursion is not supported? - * - * ADDED on September 10, 2002. - * - * DISCUSSION: This issues is related to Issue (22). If we say that - * recursion (or some other piece of functionality) is not supported, is - * it an error for an implementation to support it? Perhaps the - * specification should remain silent on these kind of things so that they - * could be gracefully added later as an extension or as part of the - * standard. - * - * RESOLUTION: Languages, in general, have programs that are not - * well-formed in ways a compiler cannot detect. Portability is only - * ensured for well-formed programs. Detecting recursion is an example of - * this. The language will say a well-formed program may not recurse, but - * compilers are not forced to detect that recursion may happen. - * - * CLOSED: November 29, 2002." - * - * In GLSL 1.10 the behavior of recursion is undefined. Compilers don't have - * to reject shaders (at compile-time or link-time) that contain recursion. - * Instead they could work, or crash, or kill a kitten. - * - * From page 44 (page 50 of the PDF) of the GLSL 1.20 spec: - * - * "Recursion is not allowed, not even statically. Static recursion is - * present if the static function call graph of the program contains - * cycles." - * - * This langauge clears things up a bit, but it still leaves a lot of - * questions unanswered. - * - * - Is the error generated at compile-time or link-time? - * - * - Is it an error to have a recursive function that is never statically - * called by main or any function called directly or indirectly by main? - * Technically speaking, such a function is not in the "static function - * call graph of the program" at all. - * - * \bug - * If a shader has multiple cycles, this algorithm may erroneously complain - * about functions that aren't in any cycle, but are in the part of the call - * tree that connects them. For example, if the call graph consists of a - * cycle between A and B, and a cycle between D and E, and B also calls C - * which calls D, then this algorithm will report C as a function which "has - * static recursion" even though it is not part of any cycle. - * - * A better algorithm for cycle detection that doesn't have this drawback can - * be found here: - * - * http://en.wikipedia.org/wiki/Tarjan%E2%80%99s_strongly_connected_components_algorithm - * - * \author Ian Romanick - */ -#include "main/core.h" -#include "ir.h" -#include "glsl_parser_extras.h" -#include "linker.h" -#include "program/hash_table.h" -#include "program.h" - -namespace { - -struct call_node : public exec_node { - class function *func; -}; - -class function { -public: - function(ir_function_signature *sig) - : sig(sig) - { - /* empty */ - } - - DECLARE_RALLOC_CXX_OPERATORS(function) - - ir_function_signature *sig; - - /** List of functions called by this function. */ - exec_list callees; - - /** List of functions that call this function. */ - exec_list callers; -}; - -class has_recursion_visitor : public ir_hierarchical_visitor { -public: - has_recursion_visitor() - : current(NULL) - { - progress = false; - this->mem_ctx = ralloc_context(NULL); - this->function_hash = hash_table_ctor(0, hash_table_pointer_hash, - hash_table_pointer_compare); - } - - ~has_recursion_visitor() - { - hash_table_dtor(this->function_hash); - ralloc_free(this->mem_ctx); - } - - function *get_function(ir_function_signature *sig) - { - function *f = (function *) hash_table_find(this->function_hash, sig); - if (f == NULL) { - f = new(mem_ctx) function(sig); - hash_table_insert(this->function_hash, f, sig); - } - - return f; - } - - virtual ir_visitor_status visit_enter(ir_function_signature *sig) - { - this->current = this->get_function(sig); - return visit_continue; - } - - virtual ir_visitor_status visit_leave(ir_function_signature *sig) - { - (void) sig; - this->current = NULL; - return visit_continue; - } - - virtual ir_visitor_status visit_enter(ir_call *call) - { - /* At global scope this->current will be NULL. Since there is no way to - * call global scope, it can never be part of a cycle. Don't bother - * adding calls from global scope to the graph. - */ - if (this->current == NULL) - return visit_continue; - - function *const target = this->get_function(call->callee); - - /* Create a link from the caller to the callee. - */ - call_node *node = new(mem_ctx) call_node; - node->func = target; - this->current->callees.push_tail(node); - - /* Create a link from the callee to the caller. - */ - node = new(mem_ctx) call_node; - node->func = this->current; - target->callers.push_tail(node); - return visit_continue; - } - - function *current; - struct hash_table *function_hash; - void *mem_ctx; - bool progress; -}; - -} /* anonymous namespace */ - -static void -destroy_links(exec_list *list, function *f) -{ - foreach_in_list_safe(call_node, node, list) { - /* If this is the right function, remove it. Note that the loop cannot - * terminate now. There can be multiple links to a function if it is - * either called multiple times or calls multiple times. - */ - if (node->func == f) - node->remove(); - } -} - - -/** - * Remove a function if it has either no in or no out links - */ -static void -remove_unlinked_functions(const void *key, void *data, void *closure) -{ - has_recursion_visitor *visitor = (has_recursion_visitor *) closure; - function *f = (function *) data; - - if (f->callers.is_empty() || f->callees.is_empty()) { - while (!f->callers.is_empty()) { - struct call_node *n = (struct call_node *) f->callers.pop_head(); - destroy_links(& n->func->callees, f); - } - - while (!f->callees.is_empty()) { - struct call_node *n = (struct call_node *) f->callees.pop_head(); - destroy_links(& n->func->callers, f); - } - - hash_table_remove(visitor->function_hash, key); - visitor->progress = true; - } -} - - -static void -emit_errors_unlinked(const void *key, void *data, void *closure) -{ - struct _mesa_glsl_parse_state *state = - (struct _mesa_glsl_parse_state *) closure; - function *f = (function *) data; - YYLTYPE loc; - - (void) key; - - char *proto = prototype_string(f->sig->return_type, - f->sig->function_name(), - &f->sig->parameters); - - memset(&loc, 0, sizeof(loc)); - _mesa_glsl_error(&loc, state, - "function `%s' has static recursion", - proto); - ralloc_free(proto); -} - - -static void -emit_errors_linked(const void *key, void *data, void *closure) -{ - struct gl_shader_program *prog = - (struct gl_shader_program *) closure; - function *f = (function *) data; - - (void) key; - - char *proto = prototype_string(f->sig->return_type, - f->sig->function_name(), - &f->sig->parameters); - - linker_error(prog, "function `%s' has static recursion.\n", proto); - ralloc_free(proto); -} - - -void -detect_recursion_unlinked(struct _mesa_glsl_parse_state *state, - exec_list *instructions) -{ - has_recursion_visitor v; - - /* Collect all of the information about which functions call which other - * functions. - */ - v.run(instructions); - - /* Remove from the set all of the functions that either have no caller or - * call no other functions. Repeat until no functions are removed. - */ - do { - v.progress = false; - hash_table_call_foreach(v.function_hash, remove_unlinked_functions, & v); - } while (v.progress); - - - /* At this point any functions still in the hash must be part of a cycle. - */ - hash_table_call_foreach(v.function_hash, emit_errors_unlinked, state); -} - - -void -detect_recursion_linked(struct gl_shader_program *prog, - exec_list *instructions) -{ - has_recursion_visitor v; - - /* Collect all of the information about which functions call which other - * functions. - */ - v.run(instructions); - - /* Remove from the set all of the functions that either have no caller or - * call no other functions. Repeat until no functions are removed. - */ - do { - v.progress = false; - hash_table_call_foreach(v.function_hash, remove_unlinked_functions, & v); - } while (v.progress); - - - /* At this point any functions still in the hash must be part of a cycle. - */ - hash_table_call_foreach(v.function_hash, emit_errors_linked, prog); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_function_inlining.h b/3rdparty/glsl-optimizer/src/glsl/ir_function_inlining.h deleted file mode 100644 index 6db011bbc..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_function_inlining.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file ir_function_inlining.h - * - * Replaces calls to functions with the body of the function. - */ - -bool can_inline(ir_call *call); diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_hierarchical_visitor.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_hierarchical_visitor.cpp deleted file mode 100644 index 69965bcf6..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_hierarchical_visitor.cpp +++ /dev/null @@ -1,392 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "ir.h" -#include "ir_hierarchical_visitor.h" - -ir_hierarchical_visitor::ir_hierarchical_visitor() -{ - this->base_ir = NULL; - this->callback_enter = NULL; - this->callback_leave = NULL; - this->data_enter = NULL; - this->data_leave = NULL; - this->in_assignee = false; -} - -ir_visitor_status -ir_hierarchical_visitor::visit(ir_rvalue *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit(ir_variable *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit(ir_constant *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit(ir_loop_jump *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit(ir_precision_statement *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit(ir_typedecl_statement *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit(ir_dereference_variable *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_enter(ir_loop *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_leave(ir_loop *ir) -{ - if (this->callback_leave != NULL) - this->callback_leave(ir, this->data_leave); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_enter(ir_function_signature *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_leave(ir_function_signature *ir) -{ - if (this->callback_leave != NULL) - this->callback_leave(ir, this->data_leave); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_enter(ir_function *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_leave(ir_function *ir) -{ - if (this->callback_leave != NULL) - this->callback_leave(ir, this->data_leave); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_enter(ir_expression *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_leave(ir_expression *ir) -{ - if (this->callback_leave != NULL) - this->callback_leave(ir, this->data_leave); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_enter(ir_texture *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_leave(ir_texture *ir) -{ - if (this->callback_leave != NULL) - this->callback_leave(ir, this->data_leave); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_enter(ir_swizzle *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_leave(ir_swizzle *ir) -{ - if (this->callback_leave != NULL) - this->callback_leave(ir, this->data_leave); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_enter(ir_dereference_array *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_leave(ir_dereference_array *ir) -{ - if (this->callback_leave != NULL) - this->callback_leave(ir, this->data_leave); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_enter(ir_dereference_record *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_leave(ir_dereference_record *ir) -{ - if (this->callback_leave != NULL) - this->callback_leave(ir, this->data_leave); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_enter(ir_assignment *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_leave(ir_assignment *ir) -{ - if (this->callback_leave != NULL) - this->callback_leave(ir, this->data_leave); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_enter(ir_call *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_leave(ir_call *ir) -{ - if (this->callback_leave != NULL) - this->callback_leave(ir, this->data_leave); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_enter(ir_return *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_leave(ir_return *ir) -{ - if (this->callback_leave != NULL) - this->callback_leave(ir, this->data_leave); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_enter(ir_discard *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_leave(ir_discard *ir) -{ - if (this->callback_leave != NULL) - this->callback_leave(ir, this->data_leave); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_enter(ir_if *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_leave(ir_if *ir) -{ - if (this->callback_leave != NULL) - this->callback_leave(ir, this->data_leave); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_enter(ir_emit_vertex *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_leave(ir_emit_vertex *ir) -{ - if (this->callback_leave != NULL) - this->callback_leave(ir, this->data_leave); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_enter(ir_end_primitive *ir) -{ - if (this->callback_enter != NULL) - this->callback_enter(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_hierarchical_visitor::visit_leave(ir_end_primitive *ir) -{ - if (this->callback_leave != NULL) - this->callback_leave(ir, this->data_leave); - - return visit_continue; -} - -void -ir_hierarchical_visitor::run(exec_list *instructions) -{ - visit_list_elements(this, instructions); -} - - -void -visit_tree(ir_instruction *ir, - void (*callback_enter)(class ir_instruction *ir, void *data), - void *data_enter, - void (*callback_leave)(class ir_instruction *ir, void *data), - void *data_leave) -{ - ir_hierarchical_visitor v; - - v.callback_enter = callback_enter; - v.callback_leave = callback_leave; - v.data_enter = data_enter; - v.data_leave = data_leave; - - ir->accept(&v); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_hierarchical_visitor.h b/3rdparty/glsl-optimizer/src/glsl/ir_hierarchical_visitor.h deleted file mode 100644 index c548336b0..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_hierarchical_visitor.h +++ /dev/null @@ -1,210 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef IR_HIERARCHICAL_VISITOR_H -#define IR_HIERARCHICAL_VISITOR_H - -/** - * Enumeration values returned by visit methods to guide processing - */ -enum ir_visitor_status { - visit_continue, /**< Continue visiting as normal. */ - visit_continue_with_parent, /**< Don't visit siblings, continue w/parent. */ - visit_stop /**< Stop visiting immediately. */ -}; - - -#ifdef __cplusplus -/** - * Base class of hierarchical visitors of IR instruction trees - * - * Hierarchical visitors differ from traditional visitors in a couple of - * important ways. Rather than having a single \c visit method for each - * subclass in the composite, there are three kinds of visit methods. - * Leaf-node classes have a traditional \c visit method. Internal-node - * classes have a \c visit_enter method, which is invoked just before - * processing child nodes, and a \c visit_leave method which is invoked just - * after processing child nodes. - * - * In addition, each visit method and the \c accept methods in the composite - * have a return value which guides the navigation. Any of the visit methods - * can choose to continue visiting the tree as normal (by returning \c - * visit_continue), terminate visiting any further nodes immediately (by - * returning \c visit_stop), or stop visiting sibling nodes (by returning \c - * visit_continue_with_parent). - * - * These two changes combine to allow nagivation of children to be implemented - * in the composite's \c accept method. The \c accept method for a leaf-node - * class will simply call the \c visit method, as usual, and pass its return - * value on. The \c accept method for internal-node classes will call the \c - * visit_enter method, call the \c accpet method of each child node, and, - * finally, call the \c visit_leave method. If any of these return a value - * other that \c visit_continue, the correct action must be taken. - * - * The final benefit is that the hierarchical visitor base class need not be - * abstract. Default implementations of every \c visit, \c visit_enter, and - * \c visit_leave method can be provided. By default each of these methods - * simply returns \c visit_continue. This allows a significant reduction in - * derived class code. - * - * For more information about hierarchical visitors, see: - * - * http://c2.com/cgi/wiki?HierarchicalVisitorPattern - * http://c2.com/cgi/wiki?HierarchicalVisitorDiscussion - */ - -class ir_hierarchical_visitor { -public: - ir_hierarchical_visitor(); - - /** - * \name Visit methods for leaf-node classes - */ - /*@{*/ - virtual ir_visitor_status visit(class ir_rvalue *); - virtual ir_visitor_status visit(class ir_variable *); - virtual ir_visitor_status visit(class ir_constant *); - virtual ir_visitor_status visit(class ir_loop_jump *); - virtual ir_visitor_status visit(class ir_precision_statement *); - virtual ir_visitor_status visit(class ir_typedecl_statement *); - - /** - * ir_dereference_variable isn't technically a leaf, but it is treated as a - * leaf here for a couple reasons. By not automatically visiting the one - * child ir_variable node from the ir_dereference_variable, ir_variable - * nodes can always be handled as variable declarations. Code that used - * non-hierarchical visitors had to set an "in a dereference" flag to - * determine how to handle an ir_variable. By forcing the visitor to - * handle the ir_variable within the ir_dereference_variable visitor, this - * kludge can be avoided. - * - * In addition, I can envision no use for having separate enter and leave - * methods. Anything that could be done in the enter and leave methods - * that couldn't just be done in the visit method. - */ - virtual ir_visitor_status visit(class ir_dereference_variable *); - /*@}*/ - - /** - * \name Visit methods for internal-node classes - */ - /*@{*/ - virtual ir_visitor_status visit_enter(class ir_loop *); - virtual ir_visitor_status visit_leave(class ir_loop *); - virtual ir_visitor_status visit_enter(class ir_function_signature *); - virtual ir_visitor_status visit_leave(class ir_function_signature *); - virtual ir_visitor_status visit_enter(class ir_function *); - virtual ir_visitor_status visit_leave(class ir_function *); - virtual ir_visitor_status visit_enter(class ir_expression *); - virtual ir_visitor_status visit_leave(class ir_expression *); - virtual ir_visitor_status visit_enter(class ir_texture *); - virtual ir_visitor_status visit_leave(class ir_texture *); - virtual ir_visitor_status visit_enter(class ir_swizzle *); - virtual ir_visitor_status visit_leave(class ir_swizzle *); - virtual ir_visitor_status visit_enter(class ir_dereference_array *); - virtual ir_visitor_status visit_leave(class ir_dereference_array *); - virtual ir_visitor_status visit_enter(class ir_dereference_record *); - virtual ir_visitor_status visit_leave(class ir_dereference_record *); - virtual ir_visitor_status visit_enter(class ir_assignment *); - virtual ir_visitor_status visit_leave(class ir_assignment *); - virtual ir_visitor_status visit_enter(class ir_call *); - virtual ir_visitor_status visit_leave(class ir_call *); - virtual ir_visitor_status visit_enter(class ir_return *); - virtual ir_visitor_status visit_leave(class ir_return *); - virtual ir_visitor_status visit_enter(class ir_discard *); - virtual ir_visitor_status visit_leave(class ir_discard *); - virtual ir_visitor_status visit_enter(class ir_if *); - virtual ir_visitor_status visit_leave(class ir_if *); - virtual ir_visitor_status visit_enter(class ir_emit_vertex *); - virtual ir_visitor_status visit_leave(class ir_emit_vertex *); - virtual ir_visitor_status visit_enter(class ir_end_primitive *); - virtual ir_visitor_status visit_leave(class ir_end_primitive *); - /*@}*/ - - - /** - * Utility function to process a linked list of instructions with a visitor - */ - void run(struct exec_list *instructions); - - /* Some visitors may need to insert new variable declarations and - * assignments for portions of a subtree, which means they need a - * pointer to the current instruction in the stream, not just their - * node in the tree rooted at that instruction. - * - * This is implemented by visit_list_elements -- if the visitor is - * not called by it, nothing good will happen. - */ - class ir_instruction *base_ir; - - /** - * Callback function that is invoked on entry to each node visited. - * - * \warning - * Visitor classes derived from \c ir_hierarchical_visitor \b may \b not - * invoke this function. This can be used, for example, to cause the - * callback to be invoked on every node type except one. - */ - void (*callback_enter)(class ir_instruction *ir, void *data); - - /** - * Callback function that is invoked on exit of each node visited. - * - * \warning - * Visitor classes derived from \c ir_hierarchical_visitor \b may \b not - * invoke this function. This can be used, for example, to cause the - * callback to be invoked on every node type except one. - */ - void (*callback_leave)(class ir_instruction *ir, void *data); - - /** - * Extra data parameter passed to the per-node callback_enter function - */ - void *data_enter; - - /** - * Extra data parameter passed to the per-node callback_leave function - */ - void *data_leave; - - /** - * Currently in the LHS of an assignment? - * - * This is set and cleared by the \c ir_assignment::accept method. - */ - bool in_assignee; -}; - -void visit_tree(ir_instruction *ir, - void (*callback_enter)(class ir_instruction *ir, void *data), - void *data_enter, - void (*callback_leave)(class ir_instruction *ir, void *data) = NULL, - void *data_leave = NULL); - -ir_visitor_status visit_list_elements(ir_hierarchical_visitor *v, exec_list *l, - bool statement_list = true); -#endif /* __cplusplus */ - -#endif /* IR_HIERARCHICAL_VISITOR_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_hv_accept.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_hv_accept.cpp deleted file mode 100644 index 1cdd16786..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_hv_accept.cpp +++ /dev/null @@ -1,430 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "ir.h" - -/** - * \file ir_hv_accept.cpp - * Implementations of all hierarchical visitor accept methods for IR - * instructions. - */ - -/** - * Process a list of nodes using a hierarchical vistor. - * - * If statement_list is true (the default), this is a list of statements, so - * v->base_ir will be set to point to each statement just before iterating - * over it, and restored after iteration is complete. If statement_list is - * false, this is a list that appears inside a statement (e.g. a parameter - * list), so v->base_ir will be left alone. - * - * \warning - * This function will operate correctly if a node being processed is removed - * from the list. However, if nodes are added to the list after the node being - * processed, some of the added nodes may not be processed. - */ -ir_visitor_status -visit_list_elements(ir_hierarchical_visitor *v, exec_list *l, - bool statement_list) -{ - ir_instruction *prev_base_ir = v->base_ir; - - foreach_in_list_safe(ir_instruction, ir, l) { - if (statement_list) - v->base_ir = ir; - ir_visitor_status s = ir->accept(v); - - if (s != visit_continue) - return s; - } - if (statement_list) - v->base_ir = prev_base_ir; - - return visit_continue; -} - - -ir_visitor_status -ir_rvalue::accept(ir_hierarchical_visitor *v) -{ - return v->visit(this); -} - - -ir_visitor_status -ir_variable::accept(ir_hierarchical_visitor *v) -{ - return v->visit(this); -} - - -ir_visitor_status -ir_loop::accept(ir_hierarchical_visitor *v) -{ - ir_visitor_status s = v->visit_enter(this); - - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - s = visit_list_elements(v, &this->body_instructions); - if (s == visit_stop) - return s; - - return v->visit_leave(this); -} - - -ir_visitor_status -ir_loop_jump::accept(ir_hierarchical_visitor *v) -{ - return v->visit(this); -} - - -ir_visitor_status -ir_function_signature::accept(ir_hierarchical_visitor *v) -{ - ir_visitor_status s = v->visit_enter(this); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - s = visit_list_elements(v, &this->parameters); - if (s == visit_stop) - return s; - - s = visit_list_elements(v, &this->body); - return (s == visit_stop) ? s : v->visit_leave(this); -} - - -ir_visitor_status -ir_function::accept(ir_hierarchical_visitor *v) -{ - ir_visitor_status s = v->visit_enter(this); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - s = visit_list_elements(v, &this->signatures, false); - return (s == visit_stop) ? s : v->visit_leave(this); -} - - -ir_visitor_status -ir_expression::accept(ir_hierarchical_visitor *v) -{ - ir_visitor_status s = v->visit_enter(this); - - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - for (unsigned i = 0; i < this->get_num_operands(); i++) { - switch (this->operands[i]->accept(v)) { - case visit_continue: - break; - - case visit_continue_with_parent: - // I wish for Java's labeled break-statement here. - goto done; - - case visit_stop: - return s; - } - } - -done: - return v->visit_leave(this); -} - -ir_visitor_status -ir_texture::accept(ir_hierarchical_visitor *v) -{ - ir_visitor_status s = v->visit_enter(this); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - s = this->sampler->accept(v); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - if (this->coordinate) { - s = this->coordinate->accept(v); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - } - - if (this->offset) { - s = this->offset->accept(v); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - } - - switch (this->op) { - case ir_tex: - case ir_lod: - case ir_query_levels: - break; - case ir_txb: - s = this->lod_info.bias->accept(v); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - break; - case ir_txl: - case ir_txf: - case ir_txs: - s = this->lod_info.lod->accept(v); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - break; - case ir_txf_ms: - s = this->lod_info.sample_index->accept(v); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - break; - case ir_txd: - s = this->lod_info.grad.dPdx->accept(v); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - s = this->lod_info.grad.dPdy->accept(v); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - break; - case ir_tg4: - s = this->lod_info.component->accept(v); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - break; - } - - return (s == visit_stop) ? s : v->visit_leave(this); -} - - -ir_visitor_status -ir_swizzle::accept(ir_hierarchical_visitor *v) -{ - ir_visitor_status s = v->visit_enter(this); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - s = this->val->accept(v); - return (s == visit_stop) ? s : v->visit_leave(this); -} - - -ir_visitor_status -ir_dereference_variable::accept(ir_hierarchical_visitor *v) -{ - return v->visit(this); -} - - -ir_visitor_status -ir_dereference_array::accept(ir_hierarchical_visitor *v) -{ - ir_visitor_status s = v->visit_enter(this); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - /* The array index is not the target of the assignment, so clear the - * 'in_assignee' flag. Restore it after returning from the array index. - */ - const bool was_in_assignee = v->in_assignee; - v->in_assignee = false; - s = this->array_index->accept(v); - v->in_assignee = was_in_assignee; - - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - s = this->array->accept(v); - return (s == visit_stop) ? s : v->visit_leave(this); -} - - -ir_visitor_status -ir_dereference_record::accept(ir_hierarchical_visitor *v) -{ - ir_visitor_status s = v->visit_enter(this); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - s = this->record->accept(v); - return (s == visit_stop) ? s : v->visit_leave(this); -} - - -ir_visitor_status -ir_assignment::accept(ir_hierarchical_visitor *v) -{ - ir_visitor_status s = v->visit_enter(this); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - v->in_assignee = true; - s = this->lhs->accept(v); - v->in_assignee = false; - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - s = this->rhs->accept(v); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - if (this->condition) - s = this->condition->accept(v); - - return (s == visit_stop) ? s : v->visit_leave(this); -} - - -ir_visitor_status -ir_constant::accept(ir_hierarchical_visitor *v) -{ - return v->visit(this); -} - - -ir_visitor_status -ir_call::accept(ir_hierarchical_visitor *v) -{ - ir_visitor_status s = v->visit_enter(this); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - if (this->return_deref != NULL) { - v->in_assignee = true; - s = this->return_deref->accept(v); - v->in_assignee = false; - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - } - - s = visit_list_elements(v, &this->actual_parameters, false); - if (s == visit_stop) - return s; - - return v->visit_leave(this); -} - - -ir_visitor_status -ir_return::accept(ir_hierarchical_visitor *v) -{ - ir_visitor_status s = v->visit_enter(this); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - ir_rvalue *val = this->get_value(); - if (val) { - s = val->accept(v); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - } - - return v->visit_leave(this); -} - - -ir_visitor_status -ir_discard::accept(ir_hierarchical_visitor *v) -{ - ir_visitor_status s = v->visit_enter(this); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - if (this->condition != NULL) { - s = this->condition->accept(v); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - } - - return v->visit_leave(this); -} - - -ir_visitor_status -ir_if::accept(ir_hierarchical_visitor *v) -{ - ir_visitor_status s = v->visit_enter(this); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - s = this->condition->accept(v); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - if (s != visit_continue_with_parent) { - s = visit_list_elements(v, &this->then_instructions); - if (s == visit_stop) - return s; - } - - if (s != visit_continue_with_parent) { - s = visit_list_elements(v, &this->else_instructions); - if (s == visit_stop) - return s; - } - - return v->visit_leave(this); -} - -ir_visitor_status -ir_precision_statement::accept(ir_hierarchical_visitor *v) -{ - return v->visit(this); -} - -ir_visitor_status -ir_typedecl_statement::accept(ir_hierarchical_visitor *v) -{ - return v->visit(this); -} - -ir_visitor_status -ir_emit_vertex::accept(ir_hierarchical_visitor *v) -{ - ir_visitor_status s = v->visit_enter(this); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - s = this->stream->accept(v); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - return (s == visit_stop) ? s : v->visit_leave(this); -} - -ir_visitor_status -ir_end_primitive::accept(ir_hierarchical_visitor *v) -{ - ir_visitor_status s = v->visit_enter(this); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - s = this->stream->accept(v); - if (s != visit_continue) - return (s == visit_continue_with_parent) ? visit_continue : s; - - return (s == visit_stop) ? s : v->visit_leave(this); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_import_prototypes.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_import_prototypes.cpp deleted file mode 100644 index b0429fbc3..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_import_prototypes.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file ir_import_prototypes.cpp - * Import function prototypes from one IR tree into another. - * - * \author Ian Romanick - */ -#include "ir.h" -#include "glsl_symbol_table.h" - -namespace { - -/** - * Visitor used to import function prototypes - * - * Normally the \c clone method of either \c ir_function or - * \c ir_function_signature could be used. However, we don't want a complete - * clone of the \c ir_function_signature. We want everything \b except the - * body of the function. - */ -class import_prototype_visitor : public ir_hierarchical_visitor { -public: - /** - */ - import_prototype_visitor(exec_list *list, glsl_symbol_table *symbols, - void *mem_ctx) - { - this->mem_ctx = mem_ctx; - this->list = list; - this->symbols = symbols; - this->function = NULL; - } - - virtual ir_visitor_status visit_enter(ir_function *ir) - { - assert(this->function == NULL); - - this->function = this->symbols->get_function(ir->name); - if (!this->function) { - this->function = new(this->mem_ctx) ir_function(ir->name); - - list->push_tail(this->function); - - /* Add the new function to the symbol table. - */ - this->symbols->add_function(this->function); - } - return visit_continue; - } - - virtual ir_visitor_status visit_leave(ir_function *ir) - { - (void) ir; - assert(this->function != NULL); - - this->function = NULL; - return visit_continue; - } - - ir_visitor_status visit_enter(ir_function_signature *ir) - { - assert(this->function != NULL); - - ir_function_signature *copy = ir->clone_prototype(mem_ctx, NULL); - - this->function->add_signature(copy); - - /* Do not process child nodes of the ir_function_signature. There can - * never be any nodes inside the ir_function_signature that we care - * about. Instead continue with the next sibling. - */ - return visit_continue_with_parent; - } - -private: - exec_list *list; - ir_function *function; - glsl_symbol_table *symbols; - void *mem_ctx; -}; - -} /* anonymous namespace */ - -/** - * Import function prototypes from one IR tree into another - * - * \param source Source instruction stream containing functions whose - * prototypes are to be imported - * \param dest Destination instruction stream where new \c ir_function and - * \c ir_function_signature nodes will be stored - * \param symbols Symbol table where new functions will be stored - * \param mem_ctx ralloc memory context used for new allocations - */ -void -import_prototypes(const exec_list *source, exec_list *dest, - glsl_symbol_table *symbols, void *mem_ctx) -{ - import_prototype_visitor v(dest, symbols, mem_ctx); - - /* Making source be const is just extra documentation. - */ - v.run(const_cast(source)); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_optimization.h b/3rdparty/glsl-optimizer/src/glsl/ir_optimization.h deleted file mode 100644 index c4f5465f8..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_optimization.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - - -/** - * \file ir_optimization.h - * - * Prototypes for optimization passes to be called by the compiler and drivers. - */ - -/* Operations for lower_instructions() */ -#define SUB_TO_ADD_NEG 0x01 -#define DIV_TO_MUL_RCP 0x02 -#define EXP_TO_EXP2 0x04 -#define POW_TO_EXP2 0x08 -#define LOG_TO_LOG2 0x10 -#define MOD_TO_FRACT 0x20 -#define INT_DIV_TO_MUL_RCP 0x40 -#define BITFIELD_INSERT_TO_BFM_BFI 0x80 -#define LDEXP_TO_ARITH 0x100 -#define CARRY_TO_ARITH 0x200 -#define BORROW_TO_ARITH 0x400 -#define SAT_TO_CLAMP 0x800 - -/** - * \see class lower_packing_builtins_visitor - */ -enum lower_packing_builtins_op { - LOWER_PACK_UNPACK_NONE = 0x0000, - - LOWER_PACK_SNORM_2x16 = 0x0001, - LOWER_UNPACK_SNORM_2x16 = 0x0002, - - LOWER_PACK_UNORM_2x16 = 0x0004, - LOWER_UNPACK_UNORM_2x16 = 0x0008, - - LOWER_PACK_HALF_2x16 = 0x0010, - LOWER_UNPACK_HALF_2x16 = 0x0020, - - LOWER_PACK_HALF_2x16_TO_SPLIT = 0x0040, - LOWER_UNPACK_HALF_2x16_TO_SPLIT = 0x0080, - - LOWER_PACK_SNORM_4x8 = 0x0100, - LOWER_UNPACK_SNORM_4x8 = 0x0200, - - LOWER_PACK_UNORM_4x8 = 0x0400, - LOWER_UNPACK_UNORM_4x8 = 0x0800 -}; - -bool do_common_optimization(exec_list *ir, bool linked, - bool uniform_locations_assigned, - const struct gl_shader_compiler_options *options, - bool native_integers); - -bool do_rebalance_tree(exec_list *instructions); -bool do_algebraic(exec_list *instructions, bool native_integers, - const struct gl_shader_compiler_options *options); -bool do_constant_folding(exec_list *instructions); -bool do_constant_variable(exec_list *instructions); -bool do_constant_variable_unlinked(exec_list *instructions); -bool do_copy_propagation(exec_list *instructions); -bool do_copy_propagation_elements(exec_list *instructions); -bool do_constant_propagation(exec_list *instructions); -bool do_cse(exec_list *instructions); -void do_dead_builtin_varyings(struct gl_context *ctx, - gl_shader *producer, gl_shader *consumer, - unsigned num_tfeedback_decls, - class tfeedback_decl *tfeedback_decls); -bool do_dead_code(exec_list *instructions, bool uniform_locations_assigned); -bool do_dead_code_local(exec_list *instructions); -bool do_dead_code_unlinked(exec_list *instructions); -bool do_dead_functions(exec_list *instructions); -bool opt_flip_matrices(exec_list *instructions); -bool do_function_inlining(exec_list *instructions); -bool do_lower_jumps(exec_list *instructions, bool pull_out_jumps = true, bool lower_sub_return = true, bool lower_main_return = false, bool lower_continue = false, bool lower_break = false); -bool do_if_simplification(exec_list *instructions); -bool opt_flatten_nested_if_blocks(exec_list *instructions); -bool do_discard_simplification(exec_list *instructions); -bool lower_if_to_cond_assign(exec_list *instructions, unsigned max_depth = 0); -bool do_mat_op_to_vec(exec_list *instructions); -bool do_minmax_prune(exec_list *instructions); -bool do_noop_swizzle(exec_list *instructions); -bool do_structure_splitting(exec_list *instructions); -bool do_swizzle_swizzle(exec_list *instructions); -bool do_vectorize(exec_list *instructions); -bool do_tree_grafting(exec_list *instructions); -bool do_vec_index_to_cond_assign(exec_list *instructions); -bool do_vec_index_to_swizzle(exec_list *instructions); -bool lower_discard(exec_list *instructions); -void lower_discard_flow(exec_list *instructions); -bool lower_instructions(exec_list *instructions, unsigned what_to_lower); -bool lower_noise(exec_list *instructions); -bool lower_variable_index_to_cond_assign(exec_list *instructions, - bool lower_input, bool lower_output, bool lower_temp, bool lower_uniform); -bool lower_quadop_vector(exec_list *instructions, bool dont_lower_swz); -bool lower_clip_distance(gl_shader *shader); -void lower_output_reads(exec_list *instructions); -bool lower_packing_builtins(exec_list *instructions, int op_mask); -void lower_ubo_reference(struct gl_shader *shader, exec_list *instructions); -void lower_packed_varyings(void *mem_ctx, - unsigned locations_used, ir_variable_mode mode, - unsigned gs_input_vertices, gl_shader *shader); -bool lower_vector_insert(exec_list *instructions, bool lower_nonconstant_index); -void lower_named_interface_blocks(void *mem_ctx, gl_shader *shader); -bool optimize_redundant_jumps(exec_list *instructions); - -bool optimize_split_arrays(exec_list *instructions, bool linked, bool split_shader_outputs); -bool lower_offset_arrays(exec_list *instructions); -void optimize_dead_builtin_variables(exec_list *instructions, - enum ir_variable_mode other); - -bool lower_vertex_id(gl_shader *shader); - -ir_rvalue * -compare_index_block(exec_list *instructions, ir_variable *index, - unsigned base, unsigned components, void *mem_ctx); diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.cpp deleted file mode 100644 index 0a7bdb7d4..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.cpp +++ /dev/null @@ -1,1789 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "ir_print_glsl_visitor.h" -#include "ir_visitor.h" -#include "glsl_types.h" -#include "glsl_parser_extras.h" -#include "ir_unused_structs.h" -#include "loop_analysis.h" -#include "program/hash_table.h" -#include -#include - - -static void print_type(string_buffer& buffer, const glsl_type *t, bool arraySize); -static void print_type_post(string_buffer& buffer, const glsl_type *t, bool arraySize); - -static inline const char* get_precision_string (glsl_precision p) -{ - switch (p) { - case glsl_precision_high: return "highp "; - case glsl_precision_medium: return "mediump "; - case glsl_precision_low: return "lowp "; - case glsl_precision_undefined: return ""; - } - assert(!"Should not get here."); - return ""; -} - -static const int tex_sampler_type_count = 7; -// [glsl_sampler_dim] -static const char* tex_sampler_dim_name[tex_sampler_type_count] = { - "1D", "2D", "3D", "Cube", "Rect", "Buf", "External", -}; -static int tex_sampler_dim_size[tex_sampler_type_count] = { - 1, 2, 3, 3, 2, 2, 2, -}; - -struct ga_entry : public exec_node -{ - ga_entry(ir_instruction* ir) - { - assert(ir); - this->ir = ir; - } - ir_instruction* ir; -}; - - -struct global_print_tracker { - global_print_tracker () { - mem_ctx = ralloc_context(0); - var_counter = 0; - var_hash = hash_table_ctor(0, hash_table_pointer_hash, hash_table_pointer_compare); - main_function_done = false; - } - - ~global_print_tracker() { - hash_table_dtor (var_hash); - ralloc_free(mem_ctx); - } - - unsigned var_counter; - hash_table* var_hash; - exec_list global_assignements; - void* mem_ctx; - bool main_function_done; -}; - -class ir_print_glsl_visitor : public ir_visitor { -public: - ir_print_glsl_visitor(string_buffer& buf, global_print_tracker* globals_, PrintGlslMode mode_, bool use_precision_, const _mesa_glsl_parse_state* state_) - : buffer(buf) - , loopstate(NULL) - , inside_loop_body(false) - , skipped_this_ir(false) - , previous_skipped(false) - , uses_texlod_impl(0) - , uses_texlodproj_impl(0) - { - indentation = 0; - expression_depth = 0; - globals = globals_; - mode = mode_; - use_precision = use_precision_; - state = state_; - } - - virtual ~ir_print_glsl_visitor() - { - } - - - void indent(void); - void newline_indent(); - void end_statement_line(); - void newline_deindent(); - void print_var_name (ir_variable* v); - void print_precision (ir_instruction* ir, const glsl_type* type); - - virtual void visit(ir_variable *); - virtual void visit(ir_function_signature *); - virtual void visit(ir_function *); - virtual void visit(ir_expression *); - virtual void visit(ir_texture *); - virtual void visit(ir_swizzle *); - virtual void visit(ir_dereference_variable *); - virtual void visit(ir_dereference_array *); - virtual void visit(ir_dereference_record *); - virtual void visit(ir_assignment *); - virtual void visit(ir_constant *); - virtual void visit(ir_call *); - virtual void visit(ir_return *); - virtual void visit(ir_discard *); - virtual void visit(ir_if *); - virtual void visit(ir_loop *); - virtual void visit(ir_loop_jump *); - virtual void visit(ir_precision_statement *); - virtual void visit(ir_typedecl_statement *); - virtual void visit(ir_emit_vertex *); - virtual void visit(ir_end_primitive *); - - void emit_assignment_part (ir_dereference* lhs, ir_rvalue* rhs, unsigned write_mask, ir_rvalue* dstIndex); - bool can_emit_canonical_for (loop_variable_state *ls); - bool emit_canonical_for (ir_loop* ir); - bool try_print_array_assignment (ir_dereference* lhs, ir_rvalue* rhs); - - int indentation; - int expression_depth; - string_buffer& buffer; - global_print_tracker* globals; - const _mesa_glsl_parse_state* state; - PrintGlslMode mode; - loop_state* loopstate; - bool use_precision; - bool inside_loop_body; - bool skipped_this_ir; - bool previous_skipped; - int uses_texlod_impl; // 3 bits per tex_dimension, bit set for each precision if any texture sampler needs the GLES2 lod workaround. - int uses_texlodproj_impl; // 3 bits per tex_dimension, bit set for each precision if any texture sampler needs the GLES2 lod workaround. -}; - -void print_texlod_workarounds(int usage_bitfield, int usage_proj_bitfield, string_buffer &str) -{ - static const char *precStrings[3] = {"lowp", "mediump", "highp"}; - static const char *precNameStrings[3] = { "low_", "medium_", "high_" }; - // Print out the texlod workarounds - for (int prec = 0; prec < 3; prec++) - { - const char *precString = precStrings[prec]; - const char *precName = precNameStrings[prec]; - - for (int dim = 0; dim < tex_sampler_type_count; dim++) - { - int mask = 1 << (dim + (prec * 8)); - if (usage_bitfield & mask) - { - str.asprintf_append("%s vec4 impl_%stexture%sLodEXT(%s sampler%s sampler, highp vec%d coord, mediump float lod)\n", precString, precName, tex_sampler_dim_name[dim], precString, tex_sampler_dim_name[dim], tex_sampler_dim_size[dim]); - str.asprintf_append("{\n"); - str.asprintf_append("#if defined(GL_EXT_shader_texture_lod)\n"); - str.asprintf_append("\treturn texture%sLodEXT(sampler, coord, lod);\n", tex_sampler_dim_name[dim]); - str.asprintf_append("#else\n"); - str.asprintf_append("\treturn texture%s(sampler, coord, lod);\n", tex_sampler_dim_name[dim]); - str.asprintf_append("#endif\n"); - str.asprintf_append("}\n\n"); - } - if (usage_proj_bitfield & mask) - { - // 2D projected read also has a vec4 UV variant - if (dim == GLSL_SAMPLER_DIM_2D) - { - str.asprintf_append("%s vec4 impl_%stexture2DProjLodEXT(%s sampler2D sampler, highp vec4 coord, mediump float lod)\n", precString, precName, precString); - str.asprintf_append("{\n"); - str.asprintf_append("#if defined(GL_EXT_shader_texture_lod)\n"); - str.asprintf_append("\treturn texture%sProjLodEXT(sampler, coord, lod);\n", tex_sampler_dim_name[dim]); - str.asprintf_append("#else\n"); - str.asprintf_append("\treturn texture%sProj(sampler, coord, lod);\n", tex_sampler_dim_name[dim]); - str.asprintf_append("#endif\n"); - str.asprintf_append("}\n\n"); - } - str.asprintf_append("%s vec4 impl_%stexture%sProjLodEXT(%s sampler%s sampler, highp vec%d coord, mediump float lod)\n", precString, precName, tex_sampler_dim_name[dim], precString, tex_sampler_dim_name[dim], tex_sampler_dim_size[dim] + 1); - str.asprintf_append("{\n"); - str.asprintf_append("#if defined(GL_EXT_shader_texture_lod)\n"); - str.asprintf_append("\treturn texture%sProjLodEXT(sampler, coord, lod);\n", tex_sampler_dim_name[dim]); - str.asprintf_append("#else\n"); - str.asprintf_append("\treturn texture%sProj(sampler, coord, lod);\n", tex_sampler_dim_name[dim]); - str.asprintf_append("#endif\n"); - str.asprintf_append("}\n\n"); - } - } - } -} - - -char* -_mesa_print_ir_glsl(exec_list *instructions, - struct _mesa_glsl_parse_state *state, - char* buffer, PrintGlslMode mode) -{ - string_buffer str(buffer); - string_buffer body(buffer); - - // print version & extensions - if (state) { - if (state->had_version_string) - { - str.asprintf_append ("#version %i", state->language_version); - if (state->es_shader && state->language_version >= 300) - str.asprintf_append (" es"); - str.asprintf_append ("\n"); - } - if (state->ARB_shader_texture_lod_enable) - str.asprintf_append ("#extension GL_ARB_shader_texture_lod : enable\n"); - if (state->ARB_draw_instanced_enable) - str.asprintf_append ("#extension GL_ARB_draw_instanced : enable\n"); - if (state->EXT_gpu_shader4_enable) - str.asprintf_append ("#extension GL_EXT_gpu_shader4 : enable\n"); - if (state->EXT_shader_texture_lod_enable) - str.asprintf_append ("#extension GL_EXT_shader_texture_lod : enable\n"); - if (state->OES_standard_derivatives_enable) - str.asprintf_append ("#extension GL_OES_standard_derivatives : enable\n"); - if (state->EXT_shadow_samplers_enable) - str.asprintf_append ("#extension GL_EXT_shadow_samplers : enable\n"); - if (state->EXT_frag_depth_enable) - str.asprintf_append ("#extension GL_EXT_frag_depth : enable\n"); - if (state->es_shader && state->language_version < 300) - { - if (state->EXT_draw_buffers_enable) - str.asprintf_append ("#extension GL_EXT_draw_buffers : enable\n"); - if (state->EXT_draw_instanced_enable) - str.asprintf_append ("#extension GL_EXT_draw_instanced : enable\n"); - } - if (state->EXT_shader_framebuffer_fetch_enable) - str.asprintf_append ("#extension GL_EXT_shader_framebuffer_fetch : enable\n"); - if (state->ARB_shader_bit_encoding_enable) - str.asprintf_append("#extension GL_ARB_shader_bit_encoding : enable\n"); - if (state->EXT_texture_array_enable) - str.asprintf_append ("#extension GL_EXT_texture_array : enable\n"); - } - - // remove unused struct declarations - do_remove_unused_typedecls(instructions); - - global_print_tracker gtracker; - int uses_texlod_impl = 0; - int uses_texlodproj_impl = 0; - - loop_state* ls = analyze_loop_variables(instructions); - if (ls->loop_found) - set_loop_controls(instructions, ls); - - foreach_in_list(ir_instruction, ir, instructions) - { - if (ir->ir_type == ir_type_variable) { - ir_variable *var = static_cast(ir); - if ((strstr(var->name, "gl_") == var->name) - && !var->data.invariant) - continue; - } - - ir_print_glsl_visitor v (body, >racker, mode, state->es_shader, state); - v.loopstate = ls; - - ir->accept(&v); - if (ir->ir_type != ir_type_function && !v.skipped_this_ir) - body.asprintf_append (";\n"); - - uses_texlod_impl |= v.uses_texlod_impl; - uses_texlodproj_impl |= v.uses_texlodproj_impl; - } - - delete ls; - -#if 0 // BK - disable LOD workarounds. - print_texlod_workarounds(uses_texlod_impl, uses_texlodproj_impl, str); -#endif // 0 - - // Add the optimized glsl code - str.asprintf_append("%s", body.c_str()); - - return ralloc_strdup(buffer, str.c_str()); -} - - -void ir_print_glsl_visitor::indent(void) -{ - if (previous_skipped) - return; - previous_skipped = false; - for (int i = 0; i < indentation; i++) - buffer.asprintf_append (" "); -} - -void ir_print_glsl_visitor::end_statement_line() -{ - if (!skipped_this_ir) - buffer.asprintf_append(";\n"); - previous_skipped = skipped_this_ir; - skipped_this_ir = false; -} - -void ir_print_glsl_visitor::newline_indent() -{ - if (expression_depth % 4 == 0) - { - ++indentation; - buffer.asprintf_append ("\n"); - indent(); - } -} -void ir_print_glsl_visitor::newline_deindent() -{ - if (expression_depth % 4 == 0) - { - --indentation; - buffer.asprintf_append ("\n"); - indent(); - } -} - - -void ir_print_glsl_visitor::print_var_name (ir_variable* v) -{ - uintptr_t id = (uintptr_t)hash_table_find (globals->var_hash, v); - if (!id && v->data.mode == ir_var_temporary) - { - id = ++globals->var_counter; - hash_table_insert (globals->var_hash, (void*)id, v); - } - if (id) - { - if (v->data.mode == ir_var_temporary) - buffer.asprintf_append ("tmpvar_%d", (int)id); - else - buffer.asprintf_append ("%s_%d", v->name, (int)id); - } - else - { - buffer.asprintf_append ("%s", v->name); - } -} - -void ir_print_glsl_visitor::print_precision (ir_instruction* ir, const glsl_type* type) -{ - if (!this->use_precision) - return; - if (type && - !type->is_float() && - !type->is_sampler() && - !type->is_integer() && - (!type->is_array() || !type->element_type()->is_float()) && - (!type->is_array() || !type->element_type()->is_integer()) - ) - { - return; - } - glsl_precision prec = precision_from_ir(ir); - - // In fragment shader, default float precision is undefined. - // We must thus always print it, when there was no default precision - // and for whatever reason our type ended up having undefined precision. - if (prec == glsl_precision_undefined && - type && type->is_float() && -// this->state->stage == MESA_SHADER_FRAGMENT && - !this->state->had_float_precision) - { - prec = glsl_precision_high; - } - if (type && type->is_integer()) - { - if (prec == glsl_precision_undefined && type && type->is_integer()) - { - // Default to highp on integers - prec = glsl_precision_high; - } - } - - // skip precision for samplers that end up being lowp (default anyway) or undefined; - // except always emit it for shadowmap samplers (some drivers don't implement - // default EXT_shadow_samplers precision) and 3D textures (they always require precision) - if (type && type->is_sampler() && !type->sampler_shadow && !(type->sampler_dimensionality > GLSL_SAMPLER_DIM_2D)) - { - if (prec == glsl_precision_low || prec == glsl_precision_undefined) - return; - } - - if (prec == glsl_precision_high || prec == glsl_precision_undefined) - { - if (ir->ir_type == ir_type_function_signature) - return; - } - buffer.asprintf_append ("%s", get_precision_string(prec)); -} - - -static void print_type(string_buffer& buffer, const glsl_type *t, bool arraySize) -{ - if (t->base_type == GLSL_TYPE_ARRAY) { - print_type(buffer, t->fields.array, true); - if (arraySize) - buffer.asprintf_append ("[%u]", t->length); - } else if ((t->base_type == GLSL_TYPE_STRUCT) - && (strncmp("gl_", t->name, 3) != 0)) { - buffer.asprintf_append ("%s", t->name); - } else { - buffer.asprintf_append ("%s", t->name); - } -} - -static void print_type_post(string_buffer& buffer, const glsl_type *t, bool arraySize) -{ - if (t->base_type == GLSL_TYPE_ARRAY) { - if (!arraySize) - buffer.asprintf_append ("[%u]", t->length); - } -} - - -void ir_print_glsl_visitor::visit(ir_variable *ir) -{ - const char *const cent = (ir->data.centroid) ? "centroid " : ""; - const char *const inv = (ir->data.invariant) ? "invariant " : ""; - const char *const mode[3][ir_var_mode_count] = - { - { "", "uniform ", "in ", "out ", "inout ", "in ", "out ", "inout ", "", "", "" }, - { "", "uniform ", "attribute ", "varying ", "inout ", "in ", "out ", "inout ", "", "", "" }, - { "", "uniform ", "varying ", "out ", "inout ", "in ", "out ", "inout ", "", "", "" }, - }; - - const char *const interp[] = { "", "smooth ", "flat ", "noperspective " }; - - bool built_in = (strstr(ir->name, "gl_") == ir->name); - - if (this->state->language_version >= 300 && ir->data.explicit_location && !built_in) - { - const int binding_base = (this->state->stage == MESA_SHADER_VERTEX ? (int)VERT_ATTRIB_GENERIC0 : (int)FRAG_RESULT_DATA0); - const int location = ir->data.location - binding_base; - buffer.asprintf_append ("layout(location=%d) ", location); - } - - int decormode = this->mode; - // GLSL 1.30 and up use "in" and "out" for everything - if (this->state->language_version >= 130) - { - decormode = 0; - } - - // give an id to any variable defined in a function that is not an uniform - if ((this->mode == kPrintGlslNone && ir->data.mode != ir_var_uniform)) - { - uintptr_t id = (uintptr_t)hash_table_find (globals->var_hash, ir); - if (id == 0) - { - id = ++globals->var_counter; - hash_table_insert (globals->var_hash, (void*)id, ir); - } - } - - // if this is a loop induction variable, do not print it - // (will be printed inside loop body) - if (!inside_loop_body) - { - loop_variable_state* inductor_state = loopstate->get_for_inductor(ir); - if (inductor_state && inductor_state->private_induction_variable_count == 1 && - can_emit_canonical_for(inductor_state)) - { - skipped_this_ir = true; - return; - } - } - - // keep invariant declaration for builtin variables - if (built_in) { - buffer.asprintf_append ("%s", inv); - print_var_name (ir); - return; - } - - buffer.asprintf_append ("%s%s%s%s", - cent, inv, interp[ir->data.interpolation], mode[decormode][ir->data.mode]); - print_precision (ir, ir->type); - print_type(buffer, ir->type, false); - buffer.asprintf_append (" "); - print_var_name (ir); - print_type_post(buffer, ir->type, false); - - if (ir->constant_value && - ir->data.mode != ir_var_shader_in && - ir->data.mode != ir_var_shader_out && - ir->data.mode != ir_var_shader_inout && - ir->data.mode != ir_var_function_in && - ir->data.mode != ir_var_function_out && - ir->data.mode != ir_var_function_inout) - { - buffer.asprintf_append (" = "); - visit (ir->constant_value); - } -} - - -void ir_print_glsl_visitor::visit(ir_function_signature *ir) -{ - print_precision (ir, ir->return_type); - print_type(buffer, ir->return_type, true); - buffer.asprintf_append (" %s (", ir->function_name()); - - if (!ir->parameters.is_empty()) - { - buffer.asprintf_append ("\n"); - - indentation++; previous_skipped = false; - bool first = true; - foreach_in_list(ir_variable, inst, &ir->parameters) { - if (!first) - buffer.asprintf_append (",\n"); - indent(); - inst->accept(this); - first = false; - } - indentation--; - - buffer.asprintf_append ("\n"); - indent(); - } - - if (ir->body.is_empty()) - { - buffer.asprintf_append (");\n"); - return; - } - - buffer.asprintf_append (")\n"); - - indent(); - buffer.asprintf_append ("{\n"); - indentation++; previous_skipped = false; - - // insert postponed global assigments - if (strcmp(ir->function()->name, "main") == 0) - { - assert (!globals->main_function_done); - globals->main_function_done = true; - foreach_in_list(ga_entry, node, &globals->global_assignements) - { - ir_instruction* as = node->ir; - as->accept(this); - buffer.asprintf_append(";\n"); - } - } - - foreach_in_list(ir_instruction, inst, &ir->body) { - indent(); - inst->accept(this); - end_statement_line(); - } - indentation--; - indent(); - buffer.asprintf_append ("}\n"); -} - -void ir_print_glsl_visitor::visit(ir_function *ir) -{ - bool found_non_builtin_proto = false; - - foreach_in_list(ir_function_signature, sig, &ir->signatures) { - if (!sig->is_builtin()) - found_non_builtin_proto = true; - } - if (!found_non_builtin_proto) - return; - - PrintGlslMode oldMode = this->mode; - this->mode = kPrintGlslNone; - - foreach_in_list(ir_function_signature, sig, &ir->signatures) { - indent(); - sig->accept(this); - buffer.asprintf_append ("\n"); - } - - this->mode = oldMode; - - indent(); -} - - -static const char *const operator_glsl_strs[] = { - "~", - "!", - "-", - "abs", - "sign", - "1.0/", - "inversesqrt", - "sqrt", - "normalize", - "exp", - "log", - "exp2", - "log2", - "int", // f2i - "int", // f2u - "float", // i2f - "bool", // f2b - "float", // b2f - "bool", // i2b - "int", // b2i - "float", // u2f - "int", // i2u - "int", // u2i - "intBitsToFloat", // bit i2f - "floatBitsToInt", // bit f2i - "uintBitsToFloat", // bit u2f - "floatBitsToUint", // bit f2u - "any", - "trunc", - "ceil", - "floor", - "fract", - "roundEven", - "sin", - "cos", - "sin", // reduced - "cos", // reduced - "dFdx", - "dFdxCoarse", - "dFdxFine", - "dFdy", - "dFdyCoarse", - "dFdyFine", - "packSnorm2x16", - "packSnorm4x8", - "packUnorm2x16", - "packUnorm4x8", - "packHalf2x16", - "unpackSnorm2x16", - "unpackSnorm4x8", - "unpackUnorm2x16", - "unpackUnorm4x8", - "unpackHalf2x16", - "unpackHalf2x16_splitX_TODO", - "unpackHalf2x16_splitY_TODO", - "bitfieldReverse", - "bitCount", - "findMSB", - "findLSB", - "saturate", - "noise", - "interpolateAtCentroid", - "+", - "-", - "*", - "*_imul_high_TODO", - "/", - "carry_TODO", - "borrow_TODO", - "mod", - "<", - ">", - "<=", - ">=", - "equal", - "notEqual", - "==", - "!=", - "<<", - ">>", - "&", - "^", - "|", - "&&", - "^^", - "||", - "dot", - "min", - "max", - "pow", - "packHalf2x16_split_TODO", - "bfm_TODO", - "uboloadTODO", - "ldexp_TODO", - "vectorExtract_TODO", - "interpolateAtOffset", - "interpolateAtSample", - "fma", - "clamp", - "mix", - "csel_TODO", - "bfi_TODO", - "bitfield_extract_TODO", - "vector_insert_TODO", - "bitfield_insert_TODO", - "vectorTODO", -}; - -static const char *const operator_vec_glsl_strs[] = { - "lessThan", - "greaterThan", - "lessThanEqual", - "greaterThanEqual", - "equal", - "notEqual", -}; - - -static bool is_binop_func_like(ir_expression_operation op, const glsl_type* type) -{ - if (op == ir_binop_equal || - op == ir_binop_nequal || - op == ir_binop_mod || - (op >= ir_binop_dot && op <= ir_binop_pow)) - return true; - if (type->is_vector() && (op >= ir_binop_less && op <= ir_binop_nequal)) - { - return true; - } - return false; -} - -void ir_print_glsl_visitor::visit(ir_expression *ir) -{ - ++this->expression_depth; - newline_indent(); - - if (ir->get_num_operands() == 1) { - if (ir->operation >= ir_unop_f2i && ir->operation <= ir_unop_u2i) { - print_type(buffer, ir->type, true); - buffer.asprintf_append ("("); - } else if (ir->operation == ir_unop_rcp) { - buffer.asprintf_append ("(1.0/("); - } else { - buffer.asprintf_append ("%s(", operator_glsl_strs[ir->operation]); - } - if (ir->operands[0]) - ir->operands[0]->accept(this); - buffer.asprintf_append (")"); - if (ir->operation == ir_unop_rcp) { - buffer.asprintf_append (")"); - } - } - else if (ir->operation == ir_triop_csel) - { - buffer.asprintf_append ("mix("); - ir->operands[2]->accept(this); - buffer.asprintf_append (", "); - ir->operands[1]->accept(this); - buffer.asprintf_append (", bvec%d(", ir->operands[1]->type->vector_elements); - ir->operands[0]->accept(this); - buffer.asprintf_append ("))"); - } - else if (ir->operation == ir_binop_vector_extract) - { - // a[b] - - if (ir->operands[0]) - ir->operands[0]->accept(this); - buffer.asprintf_append ("["); - if (ir->operands[1]) - ir->operands[1]->accept(this); - buffer.asprintf_append ("]"); - } - else if (is_binop_func_like(ir->operation, ir->type)) - { - if (ir->operation == ir_binop_mod) - { - buffer.asprintf_append ("("); - print_type(buffer, ir->type, true); - buffer.asprintf_append ("("); - } - if (ir->type->is_vector() && (ir->operation >= ir_binop_less && ir->operation <= ir_binop_nequal)) - buffer.asprintf_append ("%s (", operator_vec_glsl_strs[ir->operation-ir_binop_less]); - else - buffer.asprintf_append ("%s (", operator_glsl_strs[ir->operation]); - - if (ir->operands[0]) - ir->operands[0]->accept(this); - buffer.asprintf_append (", "); - if (ir->operands[1]) - ir->operands[1]->accept(this); - buffer.asprintf_append (")"); - if (ir->operation == ir_binop_mod) - buffer.asprintf_append ("))"); - } - else if (ir->get_num_operands() == 2) - { - buffer.asprintf_append ("("); - if (ir->operands[0]) - ir->operands[0]->accept(this); - - buffer.asprintf_append (" %s ", operator_glsl_strs[ir->operation]); - - if (ir->operands[1]) - ir->operands[1]->accept(this); - buffer.asprintf_append (")"); - } - else - { - // ternary op - buffer.asprintf_append ("%s (", operator_glsl_strs[ir->operation]); - if (ir->operands[0]) - ir->operands[0]->accept(this); - buffer.asprintf_append (", "); - if (ir->operands[1]) - ir->operands[1]->accept(this); - buffer.asprintf_append (", "); - if (ir->operands[2]) - ir->operands[2]->accept(this); - buffer.asprintf_append (")"); - } - - newline_deindent(); - --this->expression_depth; -} - -void ir_print_glsl_visitor::visit(ir_texture *ir) -{ - glsl_sampler_dim sampler_dim = (glsl_sampler_dim)ir->sampler->type->sampler_dimensionality; - const bool is_shadow = ir->sampler->type->sampler_shadow; - const bool is_array = ir->sampler->type->sampler_array; - const bool is_msaa = ir->op == ir_txf_ms; - - if (ir->op == ir_txs) - { - buffer.asprintf_append("textureSize ("); - ir->sampler->accept(this); - if (ir_texture::has_lod(ir->sampler->type)) - { - buffer.asprintf_append(", "); - ir->lod_info.lod->accept(this); - } - buffer.asprintf_append(")"); - return; - } - - const glsl_type* uv_type = ir->coordinate->type; - const int uv_dim = uv_type->vector_elements; - int sampler_uv_dim = tex_sampler_dim_size[sampler_dim]; - if (is_shadow) - sampler_uv_dim += 1; - if (is_array) - sampler_uv_dim += 1; - if (is_msaa) - sampler_uv_dim += 1; - const bool is_proj = ((ir->op == ir_tex || ir->op == ir_txb || ir->op == ir_txl || ir->op == ir_txd) && uv_dim > sampler_uv_dim); - const bool is_lod = (ir->op == ir_txl); - -#if 0 // BK - disable LOD workarounds. - if (is_lod && state->es_shader && state->language_version < 300 && state->stage == MESA_SHADER_FRAGMENT) - { - // Special workaround for GLES 2.0 LOD samplers to prevent a lot of debug spew. - const glsl_precision prec = ir->sampler->get_precision(); - const char *precString = ""; - // Sampler bitfield is 7 bits, so use 0-7 for lowp, 8-15 for mediump and 16-23 for highp. - int position = (int)sampler_dim; - switch (prec) - { - case glsl_precision_high: - position += 16; - precString = "_high_"; - break; - case glsl_precision_medium: - position += 8; - precString = "_medium_"; - break; - case glsl_precision_low: - default: - precString = "_low_"; - break; - } - buffer.asprintf_append("impl%s", precString); - if (is_proj) - uses_texlodproj_impl |= (1 << position); - else - uses_texlod_impl |= (1 << position); - } -#endif // 0 - - // texture function name - //ACS: shadow lookups and lookups with dimensionality included in the name were deprecated in 130 - if(state->language_version<130) - { - buffer.asprintf_append ("%s", is_shadow ? "shadow" : "texture"); - buffer.asprintf_append ("%s", tex_sampler_dim_name[sampler_dim]); - } - else - { - if (ir->op == ir_txf || ir->op == ir_txf_ms) - buffer.asprintf_append ("texelFetch"); - else - buffer.asprintf_append ("texture"); - } - - if (is_array && state->EXT_texture_array_enable) - { - if(state->language_version>=130) - { - buffer.asprintf_append ("%s", tex_sampler_dim_name[sampler_dim]); - } - buffer.asprintf_append ("Array"); - } - if ((ir->op == ir_tex || ir->op == ir_txl) && is_proj) - buffer.asprintf_append ("Proj"); - if (ir->op == ir_txl) - buffer.asprintf_append ("Lod"); - if (ir->op == ir_txd) - buffer.asprintf_append ("Grad"); - if (ir->offset != NULL) - buffer.asprintf_append ("Offset"); - - if (state->es_shader) - { - if ( (is_shadow && state->EXT_shadow_samplers_enable) || - (ir->op == ir_txl && state->EXT_shader_texture_lod_enable) ) - { - buffer.asprintf_append ("EXT"); - } - } - - if(ir->op == ir_txd) - { - if(state->es_shader && state->EXT_shader_texture_lod_enable) - buffer.asprintf_append ("EXT"); - else if(!state->es_shader && state->ARB_shader_texture_lod_enable) - buffer.asprintf_append ("ARB"); - } - - buffer.asprintf_append (" ("); - - // sampler - ir->sampler->accept(this); - buffer.asprintf_append (", "); - - // texture coordinate - ir->coordinate->accept(this); - - // lod - if (ir->op == ir_txl || ir->op == ir_txf) - { - buffer.asprintf_append (", "); - ir->lod_info.lod->accept(this); - } - - // sample index - if (ir->op == ir_txf_ms) - { - buffer.asprintf_append (", "); - ir->lod_info.sample_index->accept(this); - } - - // grad - if (ir->op == ir_txd) - { - buffer.asprintf_append (", "); - ir->lod_info.grad.dPdx->accept(this); - buffer.asprintf_append (", "); - ir->lod_info.grad.dPdy->accept(this); - } - - // texel offset - if (ir->offset != NULL) - { - buffer.asprintf_append (", "); - ir->offset->accept(this); - } - - // lod bias - if (ir->op == ir_txb) - { - buffer.asprintf_append (", "); - ir->lod_info.bias->accept(this); - } - - /* - - - if (ir->op != ir_txf) { - if (ir->projector) - ir->projector->accept(this); - else - buffer.asprintf_append ("1"); - - if (ir->shadow_comparitor) { - buffer.asprintf_append (" "); - ir->shadow_comparitor->accept(this); - } else { - buffer.asprintf_append (" ()"); - } - } - - buffer.asprintf_append (" "); - switch (ir->op) - { - case ir_tex: - break; - case ir_txb: - ir->lod_info.bias->accept(this); - break; - case ir_txl: - case ir_txf: - ir->lod_info.lod->accept(this); - break; - case ir_txd: - buffer.asprintf_append ("("); - ir->lod_info.grad.dPdx->accept(this); - buffer.asprintf_append (" "); - ir->lod_info.grad.dPdy->accept(this); - buffer.asprintf_append (")"); - break; - }; - */ - buffer.asprintf_append (")"); -} - - -void ir_print_glsl_visitor::visit(ir_swizzle *ir) -{ - const unsigned swiz[4] = { - ir->mask.x, - ir->mask.y, - ir->mask.z, - ir->mask.w, - }; - - if (ir->val->type == glsl_type::float_type || ir->val->type == glsl_type::int_type || ir->val->type == glsl_type::uint_type) - { - if (ir->mask.num_components != 1) - { - print_type(buffer, ir->type, true); - buffer.asprintf_append ("("); - } - } - - ir->val->accept(this); - - if (ir->val->type == glsl_type::float_type || ir->val->type == glsl_type::int_type || ir->val->type == glsl_type::uint_type) - { - if (ir->mask.num_components != 1) - { - buffer.asprintf_append (")"); - } - return; - } - - // Swizzling scalar types is not allowed so just return now. - if (ir->val->type->vector_elements == 1) - return; - - buffer.asprintf_append ("."); - for (unsigned i = 0; i < ir->mask.num_components; i++) { - buffer.asprintf_append ("%c", "xyzw"[swiz[i]]); - } -} - - -void ir_print_glsl_visitor::visit(ir_dereference_variable *ir) -{ - ir_variable *var = ir->variable_referenced(); - print_var_name (var); -} - - -void ir_print_glsl_visitor::visit(ir_dereference_array *ir) -{ - ir->array->accept(this); - buffer.asprintf_append ("["); - ir->array_index->accept(this); - buffer.asprintf_append ("]"); -} - - -void ir_print_glsl_visitor::visit(ir_dereference_record *ir) -{ - ir->record->accept(this); - buffer.asprintf_append (".%s", ir->field); -} - - -bool ir_print_glsl_visitor::try_print_array_assignment (ir_dereference* lhs, ir_rvalue* rhs) -{ - if (this->state->language_version >= 120) - return false; - ir_dereference_variable* rhsarr = rhs->as_dereference_variable(); - if (rhsarr == NULL) - return false; - const glsl_type* lhstype = lhs->type; - const glsl_type* rhstype = rhsarr->type; - if (!lhstype->is_array() || !rhstype->is_array()) - return false; - if (lhstype->array_size() != rhstype->array_size()) - return false; - if (lhstype->base_type != rhstype->base_type) - return false; - - const unsigned size = rhstype->array_size(); - for (unsigned i = 0; i < size; i++) - { - lhs->accept(this); - buffer.asprintf_append ("[%d]=", i); - rhs->accept(this); - buffer.asprintf_append ("[%d]", i); - if (i != size-1) - buffer.asprintf_append (";"); - } - return true; -} - -void ir_print_glsl_visitor::emit_assignment_part (ir_dereference* lhs, ir_rvalue* rhs, unsigned write_mask, ir_rvalue* dstIndex) -{ - lhs->accept(this); - - if (dstIndex) - { - // if dst index is a constant, then emit a swizzle - ir_constant* dstConst = dstIndex->as_constant(); - if (dstConst) - { - const char* comps = "xyzw"; - char comp = comps[dstConst->get_int_component(0)]; - buffer.asprintf_append (".%c", comp); - } - else - { - buffer.asprintf_append ("["); - dstIndex->accept(this); - buffer.asprintf_append ("]"); - } - } - - char mask[5]; - unsigned j = 0; - const glsl_type* lhsType = lhs->type; - const glsl_type* rhsType = rhs->type; - if (!dstIndex && lhsType->matrix_columns <= 1 && lhsType->vector_elements > 1 && write_mask != (1<vector_elements)-1) - { - for (unsigned i = 0; i < 4; i++) { - if ((write_mask & (1 << i)) != 0) { - mask[j] = "xyzw"[i]; - j++; - } - } - lhsType = glsl_type::get_instance(lhsType->base_type, j, 1); - } - mask[j] = '\0'; - bool hasWriteMask = false; - if (mask[0]) - { - buffer.asprintf_append (".%s", mask); - hasWriteMask = true; - } - - buffer.asprintf_append (" = "); - - bool typeMismatch = !dstIndex && (lhsType != rhsType); - const bool addSwizzle = hasWriteMask && typeMismatch; - if (typeMismatch) - { - if (!addSwizzle) - print_type(buffer, lhsType, true); - buffer.asprintf_append ("("); - } - - rhs->accept(this); - - if (typeMismatch) - { - buffer.asprintf_append (")"); - if (addSwizzle) - buffer.asprintf_append (".%s", mask); - } -} - - -// Try to print (X = X + const) as (X += const), mostly to satisfy -// OpenGL ES 2.0 loop syntax restrictions. -static bool try_print_increment (ir_print_glsl_visitor* vis, ir_assignment* ir) -{ - if (ir->condition) - return false; - - // Needs to be + on rhs - ir_expression* rhsOp = ir->rhs->as_expression(); - if (!rhsOp || rhsOp->operation != ir_binop_add) - return false; - - // Needs to write to whole variable - ir_variable* lhsVar = ir->whole_variable_written(); - if (lhsVar == NULL) - return false; - - // Types must match - if (ir->lhs->type != ir->rhs->type) - return false; - - // Type must be scalar - if (!ir->lhs->type->is_scalar()) - return false; - - // rhs0 must be variable deref, same one as lhs - ir_dereference_variable* rhsDeref = rhsOp->operands[0]->as_dereference_variable(); - if (rhsDeref == NULL) - return false; - if (lhsVar != rhsDeref->var) - return false; - - // rhs1 must be a constant - ir_constant* rhsConst = rhsOp->operands[1]->as_constant(); - if (!rhsConst) - return false; - - // print variable name - ir->lhs->accept (vis); - - // print ++ or +=const - if (ir->lhs->type->base_type <= GLSL_TYPE_INT && rhsConst->is_one()) - { - vis->buffer.asprintf_append ("++"); - } - else - { - vis->buffer.asprintf_append(" += "); - rhsConst->accept (vis); - } - - return true; -} - - -void ir_print_glsl_visitor::visit(ir_assignment *ir) -{ - // if this is a loop induction variable initial assignment, and we aren't inside loop body: - // do not print it (will be printed when inside loop body) - if (!inside_loop_body) - { - ir_variable* whole_var = ir->whole_variable_written(); - if (!ir->condition && whole_var) - { - loop_variable_state* inductor_state = loopstate->get_for_inductor(whole_var); - if (inductor_state && inductor_state->private_induction_variable_count == 1 && - can_emit_canonical_for(inductor_state)) - { - skipped_this_ir = true; - return; - } - } - } - - // assignments in global scope are postponed to main function - if (this->mode != kPrintGlslNone) - { - assert (!this->globals->main_function_done); - this->globals->global_assignements.push_tail (new(this->globals->mem_ctx) ga_entry(ir)); - buffer.asprintf_append ("//"); // for the ; that will follow (ugly, I know) - return; - } - - // if RHS is ir_triop_vector_insert, then we have to do some special dance. If source expression is: - // dst = vector_insert (a, b, idx) - // then emit it like: - // dst = a; - // dst.idx = b; - ir_expression* rhsOp = ir->rhs->as_expression(); - if (rhsOp && rhsOp->operation == ir_triop_vector_insert) - { - // skip assignment if lhs and rhs would be the same - bool skip_assign = false; - ir_dereference_variable* lhsDeref = ir->lhs->as_dereference_variable(); - ir_dereference_variable* rhsDeref = rhsOp->operands[0]->as_dereference_variable(); - if (lhsDeref && rhsDeref) - { - if (lhsDeref->var == rhsDeref->var) - skip_assign = true; - } - - if (!skip_assign) - { - emit_assignment_part(ir->lhs, rhsOp->operands[0], ir->write_mask, NULL); - buffer.asprintf_append ("; "); - } - emit_assignment_part(ir->lhs, rhsOp->operands[1], ir->write_mask, rhsOp->operands[2]); - return; - } - - if (try_print_increment (this, ir)) - return; - - if (try_print_array_assignment (ir->lhs, ir->rhs)) - return; - - if (ir->condition) - { - ir->condition->accept(this); - buffer.asprintf_append (" "); - } - - emit_assignment_part (ir->lhs, ir->rhs, ir->write_mask, NULL); -} - - -#ifdef _MSC_VER -#define isnan(x) _isnan(x) -#define isinf(x) (!_finite(x)) -#endif - -#define fpcheck(x) (isnan(x) || isinf(x)) - -void print_float (string_buffer& buffer, float f) -{ - // Kind of roundabout way, but this is to satisfy two things: - // * MSVC and gcc-based compilers differ a bit in how they treat float - // widht/precision specifiers. Want to match for tests. - // * GLSL (early version at least) require floats to have ".0" or - // exponential notation. - char tmp[64]; - snprintf(tmp, 64, "%.7g", f); - - char* posE = NULL; - posE = strchr(tmp, 'e'); - if (!posE) - posE = strchr(tmp, 'E'); - - // snprintf formats infinity as inf.0 or -inf.0, which isn't useful here. - // GLSL has no infinity constant so print an equivalent expression instead. - if (f == std::numeric_limits::infinity()) - strcpy(tmp, "(1.0/0.0)"); - - if (f == -std::numeric_limits::infinity()) - strcpy(tmp, "(-1.0/0.0)"); - - // Do similar thing for NaN - if (f != f) - strcpy(tmp, "(0.0/0.0)"); - - #if defined(_MSC_VER) - // While gcc would print something like 1.0e+07, MSVC will print 1.0e+007 - - // only for exponential notation, it seems, will add one extra useless zero. Let's try to remove - // that so compiler output matches. - if (posE != NULL) - { - if((posE[1] == '+' || posE[1] == '-') && posE[2] == '0' && posE[3] == '0') - { - char* p = posE+2; - while (p[0]) - { - p[0] = p[1]; - ++p; - } - } - } - #endif - - buffer.asprintf_append ("%s", tmp); - - // need to append ".0"? - if (!strchr(tmp,'.') && (posE == NULL)) - buffer.asprintf_append(".0"); -} - -void ir_print_glsl_visitor::visit(ir_constant *ir) -{ - const glsl_type* type = ir->type; - - if (type == glsl_type::float_type) - { - if (fpcheck(ir->value.f[0])) - { - // Non-printable float. If we have bit conversions, we're fine. otherwise do hand-wavey things in print_float(). - if ((state->es_shader && (state->language_version >= 300)) - || (state->language_version >= 330) - || (state->ARB_shader_bit_encoding_enable)) - { - buffer.asprintf_append("uintBitsToFloat(%uu)", ir->value.u[0]); - return; - } - } - - print_float (buffer, ir->value.f[0]); - return; - } - else if (type == glsl_type::int_type) - { - // Need special handling for INT_MIN - if (ir->value.u[0] == 0x80000000) - buffer.asprintf_append("int(0x%X)", ir->value.i[0]); - else - buffer.asprintf_append ("%d", ir->value.i[0]); - return; - } - else if (type == glsl_type::uint_type) - { - // ES 2.0 doesn't support uints, neither does GLSL < 130 - if ((state->es_shader && (state->language_version < 300)) - || (state->language_version < 130)) - buffer.asprintf_append("%u", ir->value.u[0]); - else - { - // Old Adreno drivers try to be smart with '0u' and treat that as 'const int'. Sigh. - if (ir->value.u[0] == 0) - buffer.asprintf_append("uint(0)"); - else - buffer.asprintf_append("%uu", ir->value.u[0]); - } - return; - } - - const glsl_type *const base_type = ir->type->get_base_type(); - - print_type(buffer, type, true); - buffer.asprintf_append ("("); - - if (ir->type->is_array()) { - for (unsigned i = 0; i < ir->type->length; i++) - { - if (i != 0) - buffer.asprintf_append (", "); - ir->get_array_element(i)->accept(this); - } - } else if (ir->type->is_record()) { - bool first = true; - foreach_in_list(ir_constant, inst, &ir->components) { - if (!first) - buffer.asprintf_append (", "); - first = false; - inst->accept(this); - } - }else { - bool first = true; - for (unsigned i = 0; i < ir->type->components(); i++) { - if (!first) - buffer.asprintf_append (", "); - first = false; - switch (base_type->base_type) { - case GLSL_TYPE_UINT: - { - // ES 2.0 doesn't support uints, neither does GLSL < 130 - if ((state->es_shader && (state->language_version < 300)) - || (state->language_version < 130)) - buffer.asprintf_append("%u", ir->value.u[i]); - else - buffer.asprintf_append("%uu", ir->value.u[i]); - break; - } - case GLSL_TYPE_INT: - { - // Need special handling for INT_MIN - if (ir->value.u[i] == 0x80000000) - buffer.asprintf_append("int(0x%X)", ir->value.i[i]); - else - buffer.asprintf_append("%d", ir->value.i[i]); - break; - } - case GLSL_TYPE_FLOAT: print_float(buffer, ir->value.f[i]); break; - case GLSL_TYPE_BOOL: buffer.asprintf_append ("%d", ir->value.b[i]); break; - default: assert(0); - } - } - } - buffer.asprintf_append (")"); -} - - -void -ir_print_glsl_visitor::visit(ir_call *ir) -{ - // calls in global scope are postponed to main function - if (this->mode != kPrintGlslNone) - { - assert (!this->globals->main_function_done); - this->globals->global_assignements.push_tail (new(this->globals->mem_ctx) ga_entry(ir)); - buffer.asprintf_append ("//"); // for the ; that will follow (ugly, I know) - return; - } - - if (ir->return_deref) - { - visit(ir->return_deref); - buffer.asprintf_append (" = "); - } - - buffer.asprintf_append ("%s (", ir->callee_name()); - bool first = true; - foreach_in_list(ir_instruction, inst, &ir->actual_parameters) { - if (!first) - buffer.asprintf_append (", "); - inst->accept(this); - first = false; - } - buffer.asprintf_append (")"); -} - - -void -ir_print_glsl_visitor::visit(ir_return *ir) -{ - buffer.asprintf_append ("return"); - - ir_rvalue *const value = ir->get_value(); - if (value) { - buffer.asprintf_append (" "); - value->accept(this); - } -} - - -void -ir_print_glsl_visitor::visit(ir_discard *ir) -{ - buffer.asprintf_append ("discard"); - - if (ir->condition != NULL) { - buffer.asprintf_append (" TODO "); - ir->condition->accept(this); - } -} - - -void -ir_print_glsl_visitor::visit(ir_if *ir) -{ - buffer.asprintf_append ("if ("); - ir->condition->accept(this); - - buffer.asprintf_append (") {\n"); - indentation++; previous_skipped = false; - - - foreach_in_list(ir_instruction, inst, &ir->then_instructions) { - indent(); - inst->accept(this); - end_statement_line(); - } - - indentation--; - indent(); - buffer.asprintf_append ("}"); - - if (!ir->else_instructions.is_empty()) - { - buffer.asprintf_append (" else {\n"); - indentation++; previous_skipped = false; - - foreach_in_list(ir_instruction, inst, &ir->else_instructions) { - indent(); - inst->accept(this); - end_statement_line(); - } - indentation--; - indent(); - buffer.asprintf_append ("}"); - } -} - -bool ir_print_glsl_visitor::can_emit_canonical_for (loop_variable_state *ls) -{ - if (ls == NULL) - return false; - - if (ls->induction_variables.is_empty()) - return false; - - if (ls->terminators.is_empty()) - return false; - - // only support for loops with one terminator condition - int terminatorCount = ls->terminators.length(); - if (terminatorCount != 1) - return false; - - return true; -} - -bool ir_print_glsl_visitor::emit_canonical_for (ir_loop* ir) -{ - loop_variable_state* const ls = this->loopstate->get(ir); - - if (!can_emit_canonical_for(ls)) - return false; - - hash_table* terminator_hash = hash_table_ctor(0, hash_table_pointer_hash, hash_table_pointer_compare); - hash_table* induction_hash = hash_table_ctor(0, hash_table_pointer_hash, hash_table_pointer_compare); - - buffer.asprintf_append("for ("); - inside_loop_body = true; - - // emit loop induction variable declarations. - // only for loops with single induction variable, to avoid cases of different types of them - if (ls->private_induction_variable_count == 1) - { - foreach_in_list(loop_variable, indvar, &ls->induction_variables) - { - if (!this->loopstate->get_for_inductor(indvar->var)) - continue; - - ir_variable* var = indvar->var; - print_precision (var, var->type); - print_type(buffer, var->type, false); - buffer.asprintf_append (" "); - print_var_name (var); - print_type_post(buffer, var->type, false); - if (indvar->initial_value) - { - buffer.asprintf_append (" = "); - // if the var is an array add the proper initializer - if(var->type->is_vector()) - { - print_type(buffer, var->type, false); - buffer.asprintf_append ("("); - } - indvar->initial_value->accept(this); - if(var->type->is_vector()) - { - buffer.asprintf_append (")"); - } - } - } - } - buffer.asprintf_append("; "); - - // emit loop terminating conditions - foreach_in_list(loop_terminator, term, &ls->terminators) - { - hash_table_insert(terminator_hash, term, term->ir); - - // IR has conditions in the form of "if (x) break", - // whereas for loop needs them negated, in the form - // if "while (x) continue the loop". - // See if we can print them using syntax that reads nice. - bool handled = false; - ir_expression* term_expr = term->ir->condition->as_expression(); - if (term_expr) - { - // Binary comparison conditions - const char* termOp = NULL; - switch (term_expr->operation) - { - case ir_binop_less: termOp = ">="; break; - case ir_binop_greater: termOp = "<="; break; - case ir_binop_lequal: termOp = ">"; break; - case ir_binop_gequal: termOp = "<"; break; - case ir_binop_equal: termOp = "!="; break; - case ir_binop_nequal: termOp = "=="; break; - default: break; - } - if (termOp != NULL) - { - term_expr->operands[0]->accept(this); - buffer.asprintf_append(" %s ", termOp); - term_expr->operands[1]->accept(this); - handled = true; - } - - // Unary logic not - if (!handled && term_expr->operation == ir_unop_logic_not) - { - term_expr->operands[0]->accept(this); - handled = true; - } - } - - // More complex condition, print as "!(x)" - if (!handled) - { - buffer.asprintf_append("!("); - term->ir->condition->accept(this); - buffer.asprintf_append(")"); - } - } - buffer.asprintf_append("; "); - - // emit loop induction variable updates - bool first = true; - foreach_in_list(loop_variable, indvar, &ls->induction_variables) - { - hash_table_insert(induction_hash, indvar, indvar->first_assignment); - if (!first) - buffer.asprintf_append(", "); - visit(indvar->first_assignment); - first = false; - } - buffer.asprintf_append(") {\n"); - - inside_loop_body = false; - - // emit loop body - indentation++; previous_skipped = false; - foreach_in_list(ir_instruction, inst, &ir->body_instructions) { - - // skip termination & induction statements, - // they are part of "for" clause - if (hash_table_find(terminator_hash, inst)) - continue; - if (hash_table_find(induction_hash, inst)) - continue; - - indent(); - inst->accept(this); - end_statement_line(); - } - indentation--; - - indent(); - buffer.asprintf_append("}"); - - hash_table_dtor (terminator_hash); - hash_table_dtor (induction_hash); - - return true; -} - - -void -ir_print_glsl_visitor::visit(ir_loop *ir) -{ - if (emit_canonical_for(ir)) - return; - - buffer.asprintf_append ("while (true) {\n"); - indentation++; previous_skipped = false; - foreach_in_list(ir_instruction, inst, &ir->body_instructions) { - indent(); - inst->accept(this); - end_statement_line(); - } - indentation--; - indent(); - buffer.asprintf_append ("}"); -} - - -void -ir_print_glsl_visitor::visit(ir_loop_jump *ir) -{ - buffer.asprintf_append ("%s", ir->is_break() ? "break" : "continue"); -} - -void -ir_print_glsl_visitor::visit(ir_precision_statement *ir) -{ - buffer.asprintf_append ("%s", ir->precision_statement); -} - -void -ir_print_glsl_visitor::visit(ir_typedecl_statement *ir) -{ - const glsl_type *const s = ir->type_decl; - buffer.asprintf_append ("struct %s {\n", s->name); - - for (unsigned j = 0; j < s->length; j++) { - buffer.asprintf_append (" "); - if (state->es_shader) - buffer.asprintf_append ("%s", get_precision_string(s->fields.structure[j].precision)); - print_type(buffer, s->fields.structure[j].type, false); - buffer.asprintf_append (" %s", s->fields.structure[j].name); - print_type_post(buffer, s->fields.structure[j].type, false); - buffer.asprintf_append (";\n"); - } - buffer.asprintf_append ("}"); -} - -void -ir_print_glsl_visitor::visit(ir_emit_vertex *ir) -{ - buffer.asprintf_append ("emit-vertex-TODO"); -} - -void -ir_print_glsl_visitor::visit(ir_end_primitive *ir) -{ - buffer.asprintf_append ("end-primitive-TODO"); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.h b/3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.h deleted file mode 100644 index 827cf2876..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.h +++ /dev/null @@ -1,105 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef IR_PRINT_GLSL_VISITOR_H -#define IR_PRINT_GLSL_VISITOR_H - -#include "ir.h" - -enum PrintGlslMode { - kPrintGlslNone = 0, - kPrintGlslVertex, - kPrintGlslFragment, -}; - -extern char* _mesa_print_ir_glsl(exec_list *instructions, - struct _mesa_glsl_parse_state *state, - char* buf, PrintGlslMode mode); - - - -class string_buffer -{ -public: - string_buffer(void* mem_ctx) - { - m_Capacity = 512; - m_Ptr = (char*)ralloc_size(mem_ctx, m_Capacity); - m_Size = 0; - m_Ptr[0] = 0; - } - - ~string_buffer() - { - ralloc_free(m_Ptr); - } - - bool empty() const { return m_Size == 0; } - - const char* c_str() const { return m_Ptr; } - - void asprintf_append(const char *fmt, ...) PRINTFLIKE(2, 3) - { - va_list args; - va_start(args, fmt); - vasprintf_append(fmt, args); - va_end(args); - } - - void vasprintf_append(const char *fmt, va_list args) - { - assert (m_Ptr != NULL); - vasprintf_rewrite_tail (&m_Size, fmt, args); - } - - void vasprintf_rewrite_tail (size_t *start, const char *fmt, va_list args) - { - assert (m_Ptr != NULL); - - size_t new_length = printf_length(fmt, args); - size_t needed_length = m_Size + new_length + 1; - - if (m_Capacity < needed_length) - { - m_Capacity = MAX2 (m_Capacity + m_Capacity/2, needed_length); - m_Ptr = (char*)reralloc_size(ralloc_parent(m_Ptr), m_Ptr, m_Capacity); - } - - vsnprintf(m_Ptr + m_Size, new_length+1, fmt, args); - m_Size += new_length; - assert (m_Capacity >= m_Size); - } - -private: - char* m_Ptr; - size_t m_Size; - size_t m_Capacity; -}; - - -extern void print_float (string_buffer& buffer, float f); - - -#endif /* IR_PRINT_GLSL_VISITOR_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_print_metal_visitor.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_print_metal_visitor.cpp deleted file mode 100644 index 027e42f73..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_print_metal_visitor.cpp +++ /dev/null @@ -1,2039 +0,0 @@ -/* - * Copyright © 2014 Unity Technologies - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "ir_print_metal_visitor.h" -#include "ir_visitor.h" -#include "glsl_types.h" -#include "glsl_parser_extras.h" -#include "ir_unused_structs.h" -#include "loop_analysis.h" -#include "program/hash_table.h" -#include - - -static void print_type(string_buffer& buffer, ir_instruction* ir, const glsl_type *t, bool arraySize); -static void print_type_post(string_buffer& buffer, const glsl_type *t, bool arraySize); - - -struct ga_entry_metal : public exec_node -{ - ga_entry_metal(ir_instruction* ir) - { - assert(ir); - this->ir = ir; - } - ir_instruction* ir; -}; -struct gconst_entry_metal : public exec_node -{ - gconst_entry_metal(ir_constant* ir, unsigned id) - { - assert(ir); - this->ir = ir; - this->id = id; - } - ir_constant* ir; - unsigned id; -}; - - -struct global_print_tracker_metal -{ - global_print_tracker_metal () - { - mem_ctx = ralloc_context(0); - var_counter = 0; - var_hash = hash_table_ctor(0, hash_table_pointer_hash, hash_table_pointer_compare); - const_counter = 0; - const_hash = hash_table_ctor(0, hash_table_pointer_hash, hash_table_pointer_compare); - main_function_done = false; - } - - ~global_print_tracker_metal() - { - hash_table_dtor (var_hash); - hash_table_dtor (const_hash); - ralloc_free(mem_ctx); - } - - unsigned var_counter; - hash_table* var_hash; - exec_list global_assignements; - - unsigned const_counter; - hash_table* const_hash; - exec_list global_constants; - - void* mem_ctx; - bool main_function_done; -}; - - -struct metal_print_context -{ - metal_print_context(char* buffer) - : str(buffer) - , prefixStr(ralloc_strdup(buffer, "")) - , inputStr(ralloc_strdup(buffer, "")) - , outputStr(ralloc_strdup(buffer, "")) - , inoutStr(ralloc_strdup(buffer, "")) - , uniformStr(ralloc_strdup(buffer, "")) - , paramsStr(ralloc_strdup(buffer, "")) - , typedeclStr(ralloc_strdup(buffer, "")) - , writingParams(false) - , matrixCastsDone(false) - , matrixConstructorsDone(false) - , shadowSamplerDone(false) - , textureCounter(0) - , attributeCounter(0) - , uniformLocationCounter(0) - , colorCounter(0) - { - } - - string_buffer str; - string_buffer prefixStr; - string_buffer inputStr; - string_buffer outputStr; - string_buffer inoutStr; - string_buffer uniformStr; - string_buffer paramsStr; - string_buffer typedeclStr; - bool writingParams; - bool matrixCastsDone; - bool matrixConstructorsDone; - bool shadowSamplerDone; - int textureCounter; - int attributeCounter; - int uniformLocationCounter; - int colorCounter; -}; - - -class ir_print_metal_visitor : public ir_visitor { -public: - ir_print_metal_visitor(metal_print_context& ctx_, string_buffer& buf, global_print_tracker_metal* globals_, PrintGlslMode mode_, const _mesa_glsl_parse_state* state_) - : ctx(ctx_) - , buffer(buf) - , loopstate(NULL) - , inside_loop_body(false) - , inside_lhs(false) - , skipped_this_ir(false) - , previous_skipped(false) - , mode_whole(mode_) - { - indentation = 0; - expression_depth = 0; - globals = globals_; - mode = mode_; - state = state_; - } - - virtual ~ir_print_metal_visitor() - { - } - - - void indent(void); - void newline_indent(); - void end_statement_line(); - void newline_deindent(); - void print_var_name (ir_variable* v); - - virtual void visit(ir_variable *); - virtual void visit(ir_function_signature *); - virtual void visit(ir_function *); - virtual void visit(ir_expression *); - virtual void visit(ir_texture *); - virtual void visit(ir_swizzle *); - virtual void visit(ir_dereference_variable *); - virtual void visit(ir_dereference_array *); - virtual void visit(ir_dereference_record *); - virtual void visit(ir_assignment *); - virtual void visit(ir_constant *); - virtual void visit(ir_call *); - virtual void visit(ir_return *); - virtual void visit(ir_discard *); - virtual void visit(ir_if *); - virtual void visit(ir_loop *); - virtual void visit(ir_loop_jump *); - virtual void visit(ir_precision_statement *); - virtual void visit(ir_typedecl_statement *); - virtual void visit(ir_emit_vertex *); - virtual void visit(ir_end_primitive *); - - void emit_assignment_part (ir_dereference* lhs, ir_rvalue* rhs, unsigned write_mask, ir_rvalue* dstIndex); - bool can_emit_canonical_for (loop_variable_state *ls); - bool emit_canonical_for (ir_loop* ir); - - metal_print_context& ctx; - int indentation; - int expression_depth; - string_buffer& buffer; - global_print_tracker_metal* globals; - const _mesa_glsl_parse_state* state; - PrintGlslMode mode; - const PrintGlslMode mode_whole; - loop_state* loopstate; - bool inside_loop_body; - bool inside_lhs; - bool skipped_this_ir; - bool previous_skipped; -}; - - -char* -_mesa_print_ir_metal(exec_list *instructions, - struct _mesa_glsl_parse_state *state, - char* buffer, PrintGlslMode mode, int* outUniformsSize) -{ - metal_print_context ctx(buffer); - - // includes, prefix etc. - ctx.prefixStr.asprintf_append ("#include \n"); - ctx.prefixStr.asprintf_append ("#pragma clang diagnostic ignored \"-Wparentheses-equality\"\n"); - ctx.prefixStr.asprintf_append ("using namespace metal;\n"); - - ctx.inputStr.asprintf_append("struct xlatMtlShaderInput {\n"); - ctx.outputStr.asprintf_append("struct xlatMtlShaderOutput {\n"); - ctx.uniformStr.asprintf_append("struct xlatMtlShaderUniform {\n"); - - // remove unused struct declarations - do_remove_unused_typedecls(instructions); - - global_print_tracker_metal gtracker; - - loop_state* ls = analyze_loop_variables(instructions); - if (ls->loop_found) - set_loop_controls(instructions, ls); - - foreach_in_list(ir_instruction, ir, instructions) - { - string_buffer* strOut = &ctx.str; - ctx.writingParams = false; - if (ir->ir_type == ir_type_variable) - { - ir_variable *var = static_cast(ir); - - // skip gl_ variables if they aren't used/assigned - if (strstr(var->name, "gl_") == var->name) - { - if (NULL == strstr(var->name, "gl_FragData_") ) { - if (!var->data.used && !var->data.assigned) - continue; - } - } - - // - if (var->data.mode == ir_var_uniform) - { - if (var->type->is_sampler()) - { - strOut = &ctx.paramsStr; - ctx.writingParams = true; - strOut->asprintf_append ("\n , "); - } - else - strOut = &ctx.uniformStr; - } - if (var->data.mode == ir_var_system_value) - { - strOut = &ctx.paramsStr; - ctx.writingParams = true; - strOut->asprintf_append ("\n , "); - } - if (var->data.mode == ir_var_shader_in) - strOut = &ctx.inputStr; - if (var->data.mode == ir_var_shader_out) - strOut = &ctx.outputStr; - if (var->data.mode == ir_var_shader_inout) - strOut = &ctx.inoutStr; - } - - if (ir->ir_type == ir_type_typedecl) { - strOut = &ctx.typedeclStr; - } - - ir_print_metal_visitor v (ctx, *strOut, >racker, mode, state); - v.loopstate = ls; - - ir->accept(&v); - if (ir->ir_type != ir_type_function && !v.skipped_this_ir) - { - if (!ctx.writingParams) - strOut->asprintf_append (";\n"); - } - } - - delete ls; - - // append inout variables to both input & output structs - if (!ctx.inoutStr.empty()) - { - ctx.inputStr.asprintf_append("%s", ctx.inoutStr.c_str()); - ctx.outputStr.asprintf_append("%s", ctx.inoutStr.c_str()); - } - ctx.inputStr.asprintf_append("};\n"); - ctx.outputStr.asprintf_append("};\n"); - ctx.uniformStr.asprintf_append("};\n"); - - // emit global array/struct constants - - ctx.prefixStr.asprintf_append("%s", ctx.typedeclStr.c_str()); - foreach_in_list_safe(gconst_entry_metal, node, >racker.global_constants) - { - ir_constant* c = node->ir; - - ir_print_metal_visitor v (ctx, ctx.prefixStr, >racker, mode, state); - - v.buffer.asprintf_append ("constant "); - print_type(v.buffer, c, c->type, false); - v.buffer.asprintf_append (" _xlat_mtl_const%i", (int)((gconst_entry_metal*)node)->id); - print_type_post(v.buffer, c->type, false); - v.buffer.asprintf_append (" = {"); - - if (c->type->is_array()) - { - for (unsigned i = 0; i < c->type->length; i++) - { - if (i != 0) - v.buffer.asprintf_append (", "); - c->get_array_element(i)->accept(&v); - } - } - else - { - assert(c->type->is_record()); - bool first = true; - foreach_in_list(ir_constant, inst, &c->components) - { - if (!first) - v.buffer.asprintf_append (", "); - first = false; - inst->accept(&v); - } - } - v.buffer.asprintf_append ("};\n"); - } - - - ctx.prefixStr.asprintf_append("%s", ctx.inputStr.c_str()); - ctx.prefixStr.asprintf_append("%s", ctx.outputStr.c_str()); - ctx.prefixStr.asprintf_append("%s", ctx.uniformStr.c_str()); - ctx.prefixStr.asprintf_append("%s", ctx.str.c_str()); - - *outUniformsSize = ctx.uniformLocationCounter; - - return ralloc_strdup(buffer, ctx.prefixStr.c_str()); -} - - -void ir_print_metal_visitor::indent(void) -{ - if (previous_skipped) - return; - previous_skipped = false; - for (int i = 0; i < indentation; i++) - buffer.asprintf_append (" "); -} - -void ir_print_metal_visitor::end_statement_line() -{ - if (!skipped_this_ir) - buffer.asprintf_append(";\n"); - previous_skipped = skipped_this_ir; - skipped_this_ir = false; -} - -void ir_print_metal_visitor::newline_indent() -{ - if (expression_depth % 4 == 0) - { - ++indentation; - buffer.asprintf_append ("\n"); - indent(); - } -} -void ir_print_metal_visitor::newline_deindent() -{ - if (expression_depth % 4 == 0) - { - --indentation; - buffer.asprintf_append ("\n"); - indent(); - } -} - - -void ir_print_metal_visitor::print_var_name (ir_variable* v) -{ - uintptr_t id = (uintptr_t)hash_table_find (globals->var_hash, v); - if (!id && v->data.mode == ir_var_temporary) - { - id = ++globals->var_counter; - hash_table_insert (globals->var_hash, (void*)id, v); - } - if (id) - { - if (v->data.mode == ir_var_temporary) - buffer.asprintf_append ("tmpvar_%d", (int)id); - else - buffer.asprintf_append ("%s_%d", v->name, (int)id); - } - else - { - buffer.asprintf_append ("%s", v->name); - } -} - - - -static void print_type_precision(string_buffer& buffer, const glsl_type *t, glsl_precision prec, bool arraySize) -{ - const bool halfPrec = (prec == glsl_precision_medium || prec == glsl_precision_low); - - const char* typeName = t->name; - // scalars - if (!strcmp(typeName, "float")) - typeName = halfPrec ? "half" : "float"; - else if (!strcmp(typeName, "int")) - typeName = halfPrec ? "short" : "int"; - // vectors - else if (!strcmp(typeName, "vec2")) - typeName = halfPrec ? "half2" : "float2"; - else if (!strcmp(typeName, "vec3")) - typeName = halfPrec ? "half3" : "float3"; - else if (!strcmp(typeName, "vec4")) - typeName = halfPrec ? "half4" : "float4"; - else if (!strcmp(typeName, "ivec2")) - typeName = halfPrec ? "short2" : "int2"; - else if (!strcmp(typeName, "ivec3")) - typeName = halfPrec ? "short3" : "int3"; - else if (!strcmp(typeName, "ivec4")) - typeName = halfPrec ? "short4" : "int4"; - else if (!strcmp(typeName, "bvec2")) - typeName = "bool2"; - else if (!strcmp(typeName, "bvec3")) - typeName = "bool3"; - else if (!strcmp(typeName, "bvec4")) - typeName = "bool4"; - // matrices - else if (!strcmp(typeName, "mat2")) - typeName = halfPrec ? "half2x2" : "float2x2"; - else if (!strcmp(typeName, "mat3")) - typeName = halfPrec ? "half3x3" : "float3x3"; - else if (!strcmp(typeName, "mat4")) - typeName = halfPrec ? "half4x4" : "float4x4"; - // non-square matrices - else if (!strcmp(typeName, "mat2x2")) - typeName = halfPrec ? "half2x2" : "float2x2"; - else if (!strcmp(typeName, "mat2x3")) - typeName = halfPrec ? "half2x3" : "float2x3"; - else if (!strcmp(typeName, "mat2x4")) - typeName = halfPrec ? "half2x4" : "float2x4"; - else if (!strcmp(typeName, "mat3x2")) - typeName = halfPrec ? "half3x2" : "float3x2"; - else if (!strcmp(typeName, "mat3x3")) - typeName = halfPrec ? "half3x3" : "float3x3"; - else if (!strcmp(typeName, "mat3x4")) - typeName = halfPrec ? "half3x4" : "float3x4"; - else if (!strcmp(typeName, "mat4x2")) - typeName = halfPrec ? "half4x2" : "float4x2"; - else if (!strcmp(typeName, "mat4x3")) - typeName = halfPrec ? "half4x3" : "float4x3"; - else if (!strcmp(typeName, "mat4x4")) - typeName = halfPrec ? "half4x4" : "float4x4"; - // samplers - else if (!strcmp(typeName, "sampler2D")) - typeName = halfPrec ? "texture2d" : "texture2d"; - else if (!strcmp(typeName, "samplerCube")) - typeName = halfPrec ? "texturecube" : "texturecube"; - else if (!strcmp(typeName, "sampler3D")) - typeName = halfPrec ? "texture3d" : "texture3d"; - else if (!strcmp(typeName, "sampler2DShadow")) - typeName = "depth2d"; // depth type must always be float - else if (!strcmp(typeName, "samplerCubeShadow")) - typeName = "depthcube"; // depth type must always be float - else if (!strcmp(typeName, "sampler2DArray")) - typeName = halfPrec ? "texture2d_array" : "texture2d_array"; - - if (t->base_type == GLSL_TYPE_ARRAY) { - print_type_precision(buffer, t->fields.array, prec, true); - if (arraySize) - buffer.asprintf_append ("[%u]", t->length); - } else if ((t->base_type == GLSL_TYPE_STRUCT) - && (strncmp("gl_", typeName, 3) != 0)) { - buffer.asprintf_append ("%s", typeName); - } else { - buffer.asprintf_append ("%s", typeName); - } -} - - -static void print_type(string_buffer& buffer, ir_instruction* ir, const glsl_type *t, bool arraySize) -{ - glsl_precision prec = precision_from_ir(ir); - if (prec == glsl_precision_low) - prec = glsl_precision_medium; // Metal does not have low precision; treat as medium - print_type_precision(buffer, t, prec, arraySize); -} - - -static void print_type_post(string_buffer& buffer, const glsl_type *t, bool arraySize) -{ - if (t->base_type == GLSL_TYPE_ARRAY) { - if (!arraySize) - buffer.asprintf_append ("[%u]", t->length); - } -} - -static void get_metal_type_size(const glsl_type* type, glsl_precision prec, int& size, int& alignment) -{ - if (prec == glsl_precision_undefined) - prec = glsl_precision_high; - if (prec == glsl_precision_low) - prec = glsl_precision_medium; - const bool half = (prec == glsl_precision_medium); - - const int asize = type->is_array() ? type->length : 1; - if (type->is_array()) - type = type->element_type(); - - if (type->base_type == GLSL_TYPE_UINT || type->base_type == GLSL_TYPE_INT || type->base_type == GLSL_TYPE_FLOAT) - { - size = half ? 2 : 4; - } - else if (type->base_type == GLSL_TYPE_BOOL) - { - size = 1; - } - else - { - size = 0; - } - alignment = MAX2(size,1); - - int vsize = type->vector_elements; - // float3 etc in Metal has both sizeof and alignment same as float4 - if (vsize == 3) - vsize = 4; - - size *= vsize; - alignment *= vsize; - - const int msize = type->matrix_columns; - size *= msize; - - size *= asize; -} - -void ir_print_metal_visitor::visit(ir_variable *ir) -{ - const char *const cent = (ir->data.centroid) ? "centroid " : ""; - const char *const inv = (ir->data.invariant) ? "invariant " : ""; - const char *const mode[ir_var_mode_count] = { "", " ", " ", " ", " ", "in ", "out ", "inout ", "", "", "" }; - - const char *const interp[] = { "", "smooth ", "flat ", "noperspective " }; - - // give an id to any variable defined in a function that is not an uniform - if ((this->mode == kPrintGlslNone && ir->data.mode != ir_var_uniform)) - { - uintptr_t id = (uintptr_t)hash_table_find (globals->var_hash, ir); - if (id == 0) - { - id = ++globals->var_counter; - hash_table_insert (globals->var_hash, (void*)id, ir); - } - } - - // auto/temp variables in global scope are postponed to main function - if (this->mode != kPrintGlslNone && (ir->data.mode == ir_var_auto || ir->data.mode == ir_var_temporary)) - { - assert (!this->globals->main_function_done); - this->globals->global_assignements.push_tail (new(this->globals->mem_ctx) ga_entry_metal(ir)); - skipped_this_ir = true; - return; - } - - // if this is a loop induction variable, do not print it - // (will be printed inside loop body) - if (!inside_loop_body) - { - loop_variable_state* inductor_state = loopstate->get_for_inductor(ir); - if (inductor_state && inductor_state->private_induction_variable_count == 1 && - can_emit_canonical_for(inductor_state)) - { - skipped_this_ir = true; - return; - } - } - - buffer.asprintf_append ("%s%s%s%s", - cent, inv, interp[ir->data.interpolation], mode[ir->data.mode]); - print_type(buffer, ir, ir->type, false); - buffer.asprintf_append (" "); - print_var_name (ir); - print_type_post(buffer, ir->type, false); - - // special built-in variables - if (!strcmp(ir->name, "gl_FragDepth")) - buffer.asprintf_append (" [[depth(any)]]"); - else if (!strcmp(ir->name, "gl_FragCoord")) - buffer.asprintf_append (" [[position]]"); - else if (!strcmp(ir->name, "gl_FrontFacing")) - buffer.asprintf_append (" [[front_facing]]"); - else if (!strcmp(ir->name, "gl_PointCoord")) - buffer.asprintf_append (" [[point_coord]]"); - else if (!strcmp(ir->name, "gl_PointSize")) - buffer.asprintf_append (" [[point_size]]"); - else if (!strcmp(ir->name, "gl_Position")) - buffer.asprintf_append (" [[position]]"); - else if (!strcmp(ir->name, "gl_VertexID")) - buffer.asprintf_append (" [[vertex_id]]"); - else if (!strcmp(ir->name, "gl_InstanceID")) - buffer.asprintf_append (" [[instance_id]]"); - - // vertex shader input attribute? - if (this->mode_whole == kPrintGlslVertex && ir->data.mode == ir_var_shader_in) - { - buffer.asprintf_append (" [[attribute(%i)]]", ctx.attributeCounter); - ir->data.explicit_location = 1; - ir->data.location = ctx.attributeCounter; - ++ctx.attributeCounter; - } - - // fragment shader output? - if (this->mode_whole == kPrintGlslFragment && (ir->data.mode == ir_var_shader_out || ir->data.mode == ir_var_shader_inout)) - { - if (!ir->data.explicit_location) - { - ir->data.explicit_location = 1; - ir->data.location = FRAG_RESULT_DATA0 + ctx.colorCounter; - ++ctx.colorCounter; - } - - if (ir->data.explicit_location) - { - const int binding_base = (int)FRAG_RESULT_DATA0; - const int location = ir->data.location - binding_base; - if (location >= 0 && !ir->type->is_array()) - buffer.asprintf_append (" [[color(%d)]]", location); - } - } - - // uniform texture? - if (ir->data.mode == ir_var_uniform && ctx.writingParams) - { - buffer.asprintf_append (" [[texture(%i)]]", ctx.textureCounter); - buffer.asprintf_append (", sampler _mtlsmp_%s [[sampler(%i)]]", ir->name, ctx.textureCounter); - ir->data.explicit_location = 1; - ir->data.location = ctx.textureCounter; - ++ctx.textureCounter; - } - // regular uniform? - if (ir->data.mode == ir_var_uniform && !ctx.writingParams) - { - int size, align; - get_metal_type_size(ir->type, (glsl_precision)ir->data.precision, size, align); - - int loc = ctx.uniformLocationCounter; - loc = (loc + align-1) & ~(align-1); // align it - - ir->data.explicit_location = 1; - ir->data.location = loc; - - loc += size; - ctx.uniformLocationCounter = loc; - } - - if (ir->constant_value && - ir->data.mode != ir_var_shader_in && - ir->data.mode != ir_var_shader_out && - ir->data.mode != ir_var_shader_inout && - ir->data.mode != ir_var_function_in && - ir->data.mode != ir_var_function_out && - ir->data.mode != ir_var_function_inout) - { - buffer.asprintf_append (" = "); - visit (ir->constant_value); - } - - if ((ir->data.mode == ir_var_auto || ir->data.mode == ir_var_temporary) && (ir->type->matrix_columns == 1)) { - switch (ir->type->base_type) { - case GLSL_TYPE_INT: - case GLSL_TYPE_FLOAT: - buffer.asprintf_append (" = 0"); - break; - case GLSL_TYPE_BOOL: - buffer.asprintf_append (" = false"); - break; - default: - break; - } - } -} - - -void ir_print_metal_visitor::visit(ir_function_signature *ir) -{ - const bool isMain = (strcmp(ir->function()->name, "main") == 0); - - if (!isMain) - { - print_type(buffer, ir, ir->return_type, true); - buffer.asprintf_append (" %s (", ir->function_name()); - - if (!ir->parameters.is_empty()) - { - buffer.asprintf_append ("\n"); - - indentation++; previous_skipped = false; - bool first = true; - foreach_in_list(ir_variable, inst, &ir->parameters) - { - if (!first) - buffer.asprintf_append (",\n"); - indent(); - inst->accept(this); - first = false; - } - indentation--; - - buffer.asprintf_append ("\n"); - indent(); - } - } - else - { - if (this->mode_whole == kPrintGlslFragment) - buffer.asprintf_append ("fragment "); - if (this->mode_whole == kPrintGlslVertex) - buffer.asprintf_append ("vertex "); - buffer.asprintf_append ("xlatMtlShaderOutput xlatMtlMain (xlatMtlShaderInput _mtl_i [[stage_in]], constant xlatMtlShaderUniform& _mtl_u [[buffer(0)]]"); - if (!ctx.paramsStr.empty()) - { - buffer.asprintf_append ("%s", ctx.paramsStr.c_str()); - } - } - - if (ir->body.is_empty()) - { - buffer.asprintf_append (");\n"); - return; - } - - buffer.asprintf_append (")\n"); - - indent(); - buffer.asprintf_append ("{\n"); - indentation++; previous_skipped = false; - - if (isMain) - { - // output struct - indent(); buffer.asprintf_append ("xlatMtlShaderOutput _mtl_o;\n"); - - // insert postponed global assigments and variable declarations - assert (!globals->main_function_done); - globals->main_function_done = true; - foreach_in_list(ga_entry_metal, node, &globals->global_assignements) - { - ir_instruction* as = node->ir; - as->accept(this); - buffer.asprintf_append(";\n"); - } - } - - foreach_in_list(ir_instruction, inst, &ir->body) { - indent(); - inst->accept(this); - end_statement_line(); - } - - if (isMain) - { - // return stuff - indent(); buffer.asprintf_append ("return _mtl_o;\n"); - } - - indentation--; - indent(); - buffer.asprintf_append ("}\n"); -} - -void ir_print_metal_visitor::visit(ir_function *ir) -{ - bool found_non_builtin_proto = false; - - foreach_in_list(ir_function_signature, sig, &ir->signatures) { - if (!sig->is_builtin()) - found_non_builtin_proto = true; - } - if (!found_non_builtin_proto) - return; - - PrintGlslMode oldMode = this->mode; - this->mode = kPrintGlslNone; - - foreach_in_list(ir_function_signature, sig, &ir->signatures) { - indent(); - sig->accept(this); - buffer.asprintf_append ("\n"); - } - - this->mode = oldMode; - - indent(); -} - - -static const char *const operator_glsl_strs[] = { - "~", - "!", - "-", - "abs", - "sign", - "1.0/", - "rsqrt", - "sqrt", - "normalize", - "exp", - "log", - "exp2", - "log2", - "int", // f2i - "int", // f2u - "float", // i2f - "bool", // f2b - "float", // b2f - "bool", // i2b - "int", // b2i - "float", // u2f - "int", // i2u - "int", // u2i - "as_type_", // bit i2f - "as_type_", // bit f2i - "as_type_", // bit u2f - "as_type_", // bit f2u - "any", - "trunc", - "ceil", - "floor", - "fract", - "rint", - "sin", - "cos", - "fast::sin", // reduced - "fast::cos", // reduced - "dfdx", - "dfdx", // coarse - "dfdx", // fine - "dfdy", - "dfdy", // coarse - "dfdy", // fine - "packSnorm2x16", - "packSnorm4x8", - "packUnorm2x16", - "packUnorm4x8", - "packHalf2x16", - "unpackSnorm2x16", - "unpackSnorm4x8", - "unpackUnorm2x16", - "unpackUnorm4x8", - "unpackHalf2x16", - "unpackHalf2x16_splitX_TODO", - "unpackHalf2x16_splitY_TODO", - "bitfieldReverse", - "bitCount", - "findMSB", - "findLSB", - "saturate", - "noise", - "interpolateAtCentroid_TODO", - "+", - "-", - "*", - "*_imul_high_TODO", - "/", - "carry_TODO", - "borrow_TODO", - "fmod", - "<", - ">", - "<=", - ">=", - "==", - "!=", - "==", - "!=", - "<<", - ">>", - "&", - "^", - "|", - "&&", - "^^", - "||", - "dot", - "min", - "max", - "pow", - "packHalf2x16_split_TODO", - "bfm_TODO", - "uboloadTODO", - "ldexp_TODO", - "vectorExtract_TODO", - "interpolateAtOffset_TODO", - "interpolateAtSample_TODO", - "fma", - "clamp", - "mix", - "csel_TODO", - "bfi_TODO", - "bitfield_extract_TODO", - "vector_insert_TODO", - "bitfield_insert_TODO", - "vectorTODO", -}; - - -static bool is_binop_func_like(ir_expression_operation op, const glsl_type* type) -{ - if (op == ir_binop_mod || - (op >= ir_binop_dot && op <= ir_binop_pow)) - return true; - return false; -} - - -static bool is_different_precision(glsl_precision a, glsl_precision b) -{ - // Tread "undefined" as high precision - if (a == glsl_precision_undefined) - a = glsl_precision_high; - if (b == glsl_precision_undefined) - b = glsl_precision_high; - // Metal does not have "low" precision; treat as medium - if (a == glsl_precision_low) - a = glsl_precision_medium; - if (b == glsl_precision_low) - b = glsl_precision_medium; - - return a != b; -} - - -static void print_cast(string_buffer& buffer, glsl_precision prec, ir_rvalue* ir) -{ - buffer.asprintf_append ("("); - print_type_precision(buffer, ir->type, prec, false); - buffer.asprintf_append (")"); -} - - -void ir_print_metal_visitor::visit(ir_expression *ir) -{ - ++this->expression_depth; - newline_indent(); - - glsl_precision arg_prec = glsl_precision_undefined; - if (ir->operands[0]) - arg_prec = higher_precision(arg_prec, ir->operands[0]->get_precision()); - if (ir->operands[1]) - arg_prec = higher_precision(arg_prec, ir->operands[1]->get_precision()); - if (ir->operands[2]) - arg_prec = higher_precision(arg_prec, ir->operands[2]->get_precision()); - glsl_precision res_prec = ir->get_precision(); - - bool op0cast = ir->operands[0] && is_different_precision(arg_prec, ir->operands[0]->get_precision()); - bool op1cast = ir->operands[1] && is_different_precision(arg_prec, ir->operands[1]->get_precision()); - bool op2cast = ir->operands[2] && is_different_precision(arg_prec, ir->operands[2]->get_precision()); - const bool op0matrix = ir->operands[0] && ir->operands[0]->type->is_matrix(); - const bool op1matrix = ir->operands[1] && ir->operands[1]->type->is_matrix(); - bool op0castTo1 = false; - bool op1castTo0 = false; - - // Metal does not support matrix precision casts, so when any of the arguments is a matrix, - // take precision from it. This isn't fully robust now, but oh well. - if (op0cast && op0matrix && !op1cast) - { - op0cast = false; - arg_prec = ir->operands[0]->get_precision(); - op1cast = ir->operands[1] && is_different_precision(arg_prec, ir->operands[1]->get_precision()); - } - if (op1cast && op1matrix && !op0cast) - { - op1cast = false; - arg_prec = ir->operands[1]->get_precision(); - op0cast = ir->operands[0] && is_different_precision(arg_prec, ir->operands[0]->get_precision()); - } - - // Metal does not have matrix+scalar and matrix-scalar operations; we need to create matrices - // out of the non-matrix argument. - if (ir->operation == ir_binop_add || ir->operation == ir_binop_sub) - { - if (op0matrix && !op1matrix) - { - op1cast = true; - op1castTo0 = true; - } - if (op1matrix && !op0matrix) - { - op0cast = true; - op0castTo1 = true; - } - if (op1castTo0 || op0castTo1) - { - if (!ctx.matrixConstructorsDone) - { - ctx.prefixStr.asprintf_append( - "inline float4x4 _xlinit_float4x4(float v) { return float4x4(float4(v), float4(v), float4(v), float4(v)); }\n" - "inline float3x3 _xlinit_float3x3(float v) { return float3x3(float3(v), float3(v), float3(v)); }\n" - "inline float2x2 _xlinit_float2x2(float v) { return float2x2(float2(v), float2(v)); }\n" - "inline half4x4 _xlinit_half4x4(half v) { return half4x4(half4(v), half4(v), half4(v), half4(v)); }\n" - "inline half3x3 _xlinit_half3x3(half v) { return half3x3(half3(v), half3(v), half3(v)); }\n" - "inline half2x2 _xlinit_half2x2(half v) { return half2x2(half2(v), half2(v)); }\n" - ); - ctx.matrixConstructorsDone = true; - } - } - } - - const bool rescast = is_different_precision(arg_prec, res_prec) && !ir->type->is_boolean(); - if (rescast) - { - buffer.asprintf_append ("("); - print_cast (buffer, res_prec, ir); - } - - if (ir->get_num_operands() == 1) - { - if (op0cast) - print_cast (buffer, arg_prec, ir->operands[0]); - if (ir->operation >= ir_unop_f2i && ir->operation <= ir_unop_u2i) { - print_type(buffer, ir, ir->type, true); - buffer.asprintf_append ("("); - } else if (ir->operation >= ir_unop_bitcast_i2f && ir->operation <= ir_unop_bitcast_f2u) { - buffer.asprintf_append("as_type<"); - print_type(buffer, ir, ir->type, true); - buffer.asprintf_append(">("); - } else if (ir->operation == ir_unop_rcp) { - const bool halfCast = (arg_prec == glsl_precision_medium || arg_prec == glsl_precision_low); - buffer.asprintf_append (halfCast ? "((half)1.0/(" : "(1.0/("); - } else { - switch(ir->operation) { - case ir_unop_dFdy: - case ir_unop_dFdy_coarse: - case ir_unop_dFdy_fine: - buffer.asprintf_append ("%s(-", operator_glsl_strs[ir->operation]); - break; - - default: - buffer.asprintf_append ("%s(", operator_glsl_strs[ir->operation]); - break; - } - } - if (ir->operands[0]) - ir->operands[0]->accept(this); - buffer.asprintf_append (")"); - if (ir->operation == ir_unop_rcp) { - buffer.asprintf_append (")"); - } - } - else if (ir->operation == ir_binop_vector_extract) - { - // a[b] - - if (ir->operands[0]) - ir->operands[0]->accept(this); - buffer.asprintf_append ("["); - if (ir->operands[1]) - ir->operands[1]->accept(this); - buffer.asprintf_append ("]"); - } - else if (is_binop_func_like(ir->operation, ir->type)) - { - // binary operation that must be printed like a function, "foo(a,b)" - if (ir->operation == ir_binop_mod) - { - buffer.asprintf_append ("("); - print_type(buffer, ir, ir->type, true); - buffer.asprintf_append ("("); - } - buffer.asprintf_append ("%s (", operator_glsl_strs[ir->operation]); - - if (ir->operands[0]) - { - if (op0cast) - print_cast (buffer, arg_prec, ir->operands[0]); - ir->operands[0]->accept(this); - } - buffer.asprintf_append (", "); - if (ir->operands[1]) - { - if (op1cast) - print_cast (buffer, arg_prec, ir->operands[1]); - ir->operands[1]->accept(this); - } - buffer.asprintf_append (")"); - if (ir->operation == ir_binop_mod) - buffer.asprintf_append ("))"); - } - else if (ir->get_num_operands() == 2 && ir->operation == ir_binop_div && op0matrix && !op1matrix) - { - // "matrix/scalar" - Metal does not have it, so print multiply by inverse instead - buffer.asprintf_append ("("); - ir->operands[0]->accept(this); - const bool halfCast = (arg_prec == glsl_precision_medium || arg_prec == glsl_precision_low); - buffer.asprintf_append (halfCast ? " * (1.0h/half(" : " * (1.0/("); - ir->operands[1]->accept(this); - buffer.asprintf_append (")))"); - } - else if (ir->get_num_operands() == 2) - { - // regular binary operator - buffer.asprintf_append ("("); - if (ir->operands[0]) - { - if (op0castTo1) - { - buffer.asprintf_append ("_xlinit_"); - print_type_precision(buffer, ir->operands[1]->type, arg_prec, false); - buffer.asprintf_append ("("); - } - else if (op0cast) - { - print_cast (buffer, arg_prec, ir->operands[0]); - buffer.asprintf_append ("("); - } - ir->operands[0]->accept(this); - if (op0castTo1 || op0cast) - { - buffer.asprintf_append (")"); - } - } - - buffer.asprintf_append (" %s ", operator_glsl_strs[ir->operation]); - - if (ir->operands[1]) - { - if (op1castTo0) - { - buffer.asprintf_append ("_xlinit_"); - print_type_precision(buffer, ir->operands[0]->type, arg_prec, false); - buffer.asprintf_append ("("); - } - else if (op1cast) - { - print_cast (buffer, arg_prec, ir->operands[1]); - buffer.asprintf_append ("("); - } - ir->operands[1]->accept(this); - if (op1castTo0 || op1cast) - { - buffer.asprintf_append (")"); - } - } - buffer.asprintf_append (")"); - } - else - { - // ternary op - buffer.asprintf_append ("%s (", operator_glsl_strs[ir->operation]); - if (ir->operands[0]) - { - if (op0cast) - print_cast (buffer, arg_prec, ir->operands[0]); - ir->operands[0]->accept(this); - } - buffer.asprintf_append (", "); - if (ir->operands[1]) - { - if (op1cast) - print_cast (buffer, arg_prec, ir->operands[1]); - ir->operands[1]->accept(this); - } - buffer.asprintf_append (", "); - if (ir->operands[2]) - { - if (op2cast) - print_cast (buffer, arg_prec, ir->operands[2]); - ir->operands[2]->accept(this); - } - buffer.asprintf_append (")"); - } - - if (rescast) - { - buffer.asprintf_append (")"); - } - - - newline_deindent(); - --this->expression_depth; -} - -static int tex_sampler_dim_size[] = { - 1, 2, 3, 3, 2, 2, 2, -}; - - -static void print_texture_uv (ir_print_metal_visitor* vis, ir_texture* ir, bool is_shadow, bool is_proj, bool is_array, int uv_dim, int sampler_uv_dim) -{ - if (!is_shadow) - { - if (!is_proj && !is_array) - { - // regular UV - vis->buffer.asprintf_append (sampler_uv_dim == 3 ? "(float3)(" : "(float2)("); - ir->coordinate->accept(vis); - vis->buffer.asprintf_append (")"); - } - else if (is_array) - { - // array sample - vis->buffer.asprintf_append ("(float2)(("); - ir->coordinate->accept(vis); - vis->buffer.asprintf_append (").xy), (uint)(("); - ir->coordinate->accept(vis); - vis->buffer.asprintf_append (").z)"); - } - else - { - // regular projected - vis->buffer.asprintf_append (sampler_uv_dim == 3 ? "((float3)(" : "((float2)("); - ir->coordinate->accept(vis); - vis->buffer.asprintf_append (sampler_uv_dim == 3 ? ").xyz / (float)(" : ").xy / (float)("); - ir->coordinate->accept(vis); - vis->buffer.asprintf_append (uv_dim == 4 ? ").w)" : ").z)"); - } - } - else if (is_shadow) - { - // Note that on metal sample_compare works differently than shadow2DEXT on GLES: - // it does not clamp neither the pixel value nor compare value to the [0.0, 1.0] range. To - // preserve same behavior we're clamping the argument explicitly. - if (!is_proj) - { - // regular shadow - vis->buffer.asprintf_append (uv_dim == 4 ? "(float3)(" : "(float2)("); - ir->coordinate->accept(vis); - vis->buffer.asprintf_append (uv_dim == 4 ? ").xyz, (" : ").xy, saturate((float)("); - ir->coordinate->accept(vis); - vis->buffer.asprintf_append (uv_dim == 4 ? ").w" : ").z)"); - } - else - { - // projected shadow - vis->buffer.asprintf_append ("(float2)("); - ir->coordinate->accept(vis); - vis->buffer.asprintf_append (").xy / (float)("); - ir->coordinate->accept(vis); - vis->buffer.asprintf_append (").w, saturate((float)("); - ir->coordinate->accept(vis); - vis->buffer.asprintf_append (").z / (float)("); - ir->coordinate->accept(vis); - vis->buffer.asprintf_append (").w)"); - } - } -} - -void ir_print_metal_visitor::visit(ir_texture *ir) -{ - if (ir->op == ir_txs) - { - ir->sampler->accept(this); - buffer.asprintf_append (".get_width("); - ir->lod_info.lod->accept(this); - buffer.asprintf_append ("), "); - ir->sampler->accept(this); - buffer.asprintf_append (".get_height("); - ir->lod_info.lod->accept(this); - buffer.asprintf_append (")"); - return; - } - glsl_sampler_dim sampler_dim = (glsl_sampler_dim)ir->sampler->type->sampler_dimensionality; - const bool is_shadow = ir->sampler->type->sampler_shadow; - const bool is_array = ir->sampler->type->sampler_array; - const glsl_type* uv_type = ir->coordinate->type; - const int uv_dim = uv_type->vector_elements; - int sampler_uv_dim = tex_sampler_dim_size[sampler_dim]; - if (is_shadow) - sampler_uv_dim += 1; - const bool is_proj = (uv_dim > sampler_uv_dim) && !is_array; - - // Construct as the expected return type of shadow2D as sample_compare returns a scalar - if (is_shadow) - { - buffer.asprintf_append("float4("); - } - - // texture name & call to sample - ir->sampler->accept(this); - if (is_shadow) - { - // For shadow sampling, Metal right now needs a hardcoded sampler state :| - if (!ctx.shadowSamplerDone) - { - ctx.prefixStr.asprintf_append("constexpr sampler _mtl_xl_shadow_sampler(address::clamp_to_edge, filter::linear, compare_func::less_equal);\n"); - ctx.shadowSamplerDone = true; - } - buffer.asprintf_append (".sample_compare(_mtl_xl_shadow_sampler"); - } - else - { - buffer.asprintf_append (".sample(_mtlsmp_"); - ir->sampler->accept(this); - } - buffer.asprintf_append (", "); - - // texture coordinate - print_texture_uv (this, ir, is_shadow, is_proj, is_array, uv_dim, sampler_uv_dim); - - // lod bias - if (ir->op == ir_txb) - { - buffer.asprintf_append (", bias("); - ir->lod_info.bias->accept(this); - buffer.asprintf_append (")"); - } - - // lod - if (ir->op == ir_txl) - { - buffer.asprintf_append (", level("); - ir->lod_info.lod->accept(this); - buffer.asprintf_append (")"); - } - - // grad - if (ir->op == ir_txd) - { - if (sampler_dim == GLSL_SAMPLER_DIM_CUBE) - buffer.asprintf_append (", gradientcube((float3)("); - else - buffer.asprintf_append (", gradient2d((float2)("); - - ir->lod_info.grad.dPdx->accept(this); - - if (sampler_dim == GLSL_SAMPLER_DIM_CUBE) - buffer.asprintf_append ("), (float3)("); - else - buffer.asprintf_append ("), (float2)("); - - ir->lod_info.grad.dPdy->accept(this); - buffer.asprintf_append ("))"); - } - - //@TODO: texelFetch - //@TODO: projected - //@TODO: shadowmaps - //@TODO: pixel offsets - - buffer.asprintf_append (")"); - - // Close float4 cast - if (is_shadow) - { - buffer.asprintf_append(")"); - } -} - - -void ir_print_metal_visitor::visit(ir_swizzle *ir) -{ - const unsigned swiz[4] = { - ir->mask.x, - ir->mask.y, - ir->mask.z, - ir->mask.w, - }; - - if (ir->val->type == glsl_type::float_type || ir->val->type == glsl_type::int_type) - { - if (ir->mask.num_components != 1) - { - print_type(buffer, ir, ir->type, true); - buffer.asprintf_append ("("); - } - } - - ir->val->accept(this); - - if (ir->val->type == glsl_type::float_type || ir->val->type == glsl_type::int_type) - { - if (ir->mask.num_components != 1) - { - buffer.asprintf_append (")"); - } - return; - } - - buffer.asprintf_append ("."); - for (unsigned i = 0; i < ir->mask.num_components; i++) { - buffer.asprintf_append ("%c", "xyzw"[swiz[i]]); - } -} - -static void print_var_inout (string_buffer& buf, ir_variable* var, bool insideLHS) -{ - if (var->data.mode == ir_var_shader_in) - buf.asprintf_append ("_mtl_i."); - if (var->data.mode == ir_var_shader_out) - buf.asprintf_append ("_mtl_o."); - if (var->data.mode == ir_var_uniform && !var->type->is_sampler()) - buf.asprintf_append ("_mtl_u."); - if (var->data.mode == ir_var_shader_inout) - buf.asprintf_append (insideLHS ? "_mtl_o." : "_mtl_i."); -} - -void ir_print_metal_visitor::visit(ir_dereference_variable *ir) -{ - ir_variable *var = ir->variable_referenced(); - print_var_inout(buffer, var, this->inside_lhs); - print_var_name (var); -} - - -void ir_print_metal_visitor::visit(ir_dereference_array *ir) -{ - ir->array->accept(this); - buffer.asprintf_append ("["); - ir->array_index->accept(this); - buffer.asprintf_append ("]"); -} - - -void ir_print_metal_visitor::visit(ir_dereference_record *ir) -{ - ir->record->accept(this); - buffer.asprintf_append (".%s", ir->field); -} - - - - -void ir_print_metal_visitor::emit_assignment_part (ir_dereference* lhs, ir_rvalue* rhs, unsigned write_mask, ir_rvalue* dstIndex) -{ - const bool prev_lhs_flag = this->inside_lhs; - this->inside_lhs = true; - - lhs->accept(this); - - this->inside_lhs = prev_lhs_flag; - - const glsl_type* lhsType = lhs->type; - if (dstIndex) - { - // if dst index is a constant, then emit a swizzle - ir_constant* dstConst = dstIndex->as_constant(); - if (dstConst) - { - const char* comps = "xyzw"; - char comp = comps[dstConst->get_int_component(0)]; - buffer.asprintf_append (".%c", comp); - } - else - { - buffer.asprintf_append ("["); - dstIndex->accept(this); - buffer.asprintf_append ("]"); - } - - if (lhsType->matrix_columns <= 1 && lhsType->vector_elements > 1) - lhsType = glsl_type::get_instance(lhsType->base_type, 1, 1); - } - - char mask[5]; - unsigned j = 0; - const glsl_type* rhsType = rhs->type; - if (!dstIndex && lhsType->matrix_columns <= 1 && lhsType->vector_elements > 1 && write_mask != (1<vector_elements)-1) - { - for (unsigned i = 0; i < 4; i++) { - if ((write_mask & (1 << i)) != 0) { - mask[j] = "xyzw"[i]; - j++; - } - } - lhsType = glsl_type::get_instance(lhsType->base_type, j, 1); - } - mask[j] = '\0'; - bool hasWriteMask = false; - if (mask[0]) - { - buffer.asprintf_append (".%s", mask); - hasWriteMask = true; - } - - buffer.asprintf_append (" = "); - - const bool typeMismatch = !dstIndex && (lhsType != rhsType); - - const bool precMismatch = is_different_precision (lhs->get_precision(), rhs->get_precision()); - const bool addSwizzle = hasWriteMask && typeMismatch; - if (typeMismatch || precMismatch) - { - if (!addSwizzle) - { - if (lhsType->is_matrix()) - { - // Metal does not have matrix precision casts right now, so emit workaround - // functions that would do that. - if (!ctx.matrixCastsDone) - { - ctx.prefixStr.asprintf_append( - "inline float4x4 _xlcast_float4x4(half4x4 v) { return float4x4(float4(v[0]), float4(v[1]), float4(v[2]), float4(v[3])); }\n" - "inline float3x3 _xlcast_float3x3(half3x3 v) { return float3x3(float3(v[0]), float3(v[1]), float3(v[2])); }\n" - "inline float2x2 _xlcast_float2x2(half2x2 v) { return float2x2(float2(v[0]), float2(v[1])); }\n" - "inline half4x4 _xlcast_half4x4(float4x4 v) { return half4x4(half4(v[0]), half4(v[1]), half4(v[2]), half4(v[3])); }\n" - "inline half3x3 _xlcast_half3x3(float3x3 v) { return half3x3(half3(v[0]), half3(v[1]), half3(v[2])); }\n" - "inline half2x2 _xlcast_half2x2(float2x2 v) { return half2x2(half2(v[0]), half2(v[1])); }\n" - ); - ctx.matrixCastsDone = true; - } - buffer.asprintf_append ("_xlcast_"); - } - print_type(buffer, lhs, lhsType, true); - } - buffer.asprintf_append ("("); - } - - rhs->accept(this); - - if (typeMismatch || precMismatch) - { - buffer.asprintf_append (")"); - if (addSwizzle) - buffer.asprintf_append (".%s", mask); - } -} - - -// Try to print (X = X + const) as (X += const), mostly to satisfy -// OpenGL ES 2.0 loop syntax restrictions. -static bool try_print_increment (ir_print_metal_visitor* vis, ir_assignment* ir) -{ - if (ir->condition) - return false; - - // Needs to be + on rhs - ir_expression* rhsOp = ir->rhs->as_expression(); - if (!rhsOp || rhsOp->operation != ir_binop_add) - return false; - - // Needs to write to whole variable - ir_variable* lhsVar = ir->whole_variable_written(); - if (lhsVar == NULL) - return false; - - // Types must match - if (ir->lhs->type != ir->rhs->type) - return false; - - // Type must be scalar - if (!ir->lhs->type->is_scalar()) - return false; - - // rhs0 must be variable deref, same one as lhs - ir_dereference_variable* rhsDeref = rhsOp->operands[0]->as_dereference_variable(); - if (rhsDeref == NULL) - return false; - if (lhsVar != rhsDeref->var) - return false; - - // rhs1 must be a constant - ir_constant* rhsConst = rhsOp->operands[1]->as_constant(); - if (!rhsConst) - return false; - - // print variable name - const bool prev_lhs_flag = vis->inside_lhs; - vis->inside_lhs = true; - - ir->lhs->accept (vis); - - vis->inside_lhs = prev_lhs_flag; - - - // print ++ or +=const - if (ir->lhs->type->base_type <= GLSL_TYPE_INT && rhsConst->is_one()) - { - vis->buffer.asprintf_append ("++"); - } - else - { - vis->buffer.asprintf_append(" += "); - rhsConst->accept (vis); - } - - return true; -} - - -void ir_print_metal_visitor::visit(ir_assignment *ir) -{ - // if this is a loop induction variable initial assignment, and we aren't inside loop body: - // do not print it (will be printed when inside loop body) - if (!inside_loop_body) - { - ir_variable* whole_var = ir->whole_variable_written(); - if (!ir->condition && whole_var) - { - loop_variable_state* inductor_state = loopstate->get_for_inductor(whole_var); - if (inductor_state && inductor_state->private_induction_variable_count == 1 && - can_emit_canonical_for(inductor_state)) - { - skipped_this_ir = true; - return; - } - } - } - - // assignments in global scope are postponed to main function - if (this->mode != kPrintGlslNone) - { - assert (!this->globals->main_function_done); - this->globals->global_assignements.push_tail (new(this->globals->mem_ctx) ga_entry_metal(ir)); - buffer.asprintf_append ("//"); // for the ; that will follow (ugly, I know) - return; - } - - // if RHS is ir_triop_vector_insert, then we have to do some special dance. If source expression is: - // dst = vector_insert (a, b, idx) - // then emit it like: - // dst = a; - // dst.idx = b; - ir_expression* rhsOp = ir->rhs->as_expression(); - if (rhsOp && rhsOp->operation == ir_triop_vector_insert) - { - // skip assignment if lhs and rhs would be the same - bool skip_assign = false; - ir_dereference_variable* lhsDeref = ir->lhs->as_dereference_variable(); - ir_dereference_variable* rhsDeref = rhsOp->operands[0]->as_dereference_variable(); - if (lhsDeref && rhsDeref) - { - if (lhsDeref->var == rhsDeref->var) - skip_assign = true; - } - - if (!skip_assign) - { - emit_assignment_part(ir->lhs, rhsOp->operands[0], ir->write_mask, NULL); - buffer.asprintf_append ("; "); - } - emit_assignment_part(ir->lhs, rhsOp->operands[1], ir->write_mask, rhsOp->operands[2]); - return; - } - - if (try_print_increment (this, ir)) - return; - - if (ir->condition) - { - ir->condition->accept(this); - buffer.asprintf_append (" "); - } - - emit_assignment_part (ir->lhs, ir->rhs, ir->write_mask, NULL); -} - -void ir_print_metal_visitor::visit(ir_constant *ir) -{ - const glsl_type* type = ir->type; - - // hoist array & struct constants into global scope - if (type->is_array() || type->is_record()) - { - size_t id = (size_t)hash_table_find(globals->const_hash, ir); - if (id == 0) - { - id = ++globals->const_counter; - hash_table_insert (globals->const_hash, (void*)id, ir); - globals->global_constants.push_tail(new(globals->mem_ctx) gconst_entry_metal(ir,id)); - } - buffer.asprintf_append("_xlat_mtl_const%i", (int)id); - return; - } - - if (type == glsl_type::float_type) - { - print_float (buffer, ir->value.f[0]); - return; - } - else if (type == glsl_type::int_type) - { - buffer.asprintf_append ("%d", ir->value.i[0]); - return; - } - else if (type == glsl_type::uint_type) - { - buffer.asprintf_append ("%u", ir->value.u[0]); - return; - } - - const glsl_type *const base_type = ir->type->get_base_type(); - - print_type(buffer, ir, type, true); - buffer.asprintf_append ("("); - - // should be dealt with above - assert(!ir->type->is_array()); - assert(!ir->type->is_record()); - bool first = true; - - // Metal needs matrices to be constructed from vectors, not from a bunch of scalars. - // So instead of printing mat2(1,2,3,4) like in glsl, we have to print float2x2(float2(1,2), float2(3,4)) - // here. - const bool mtx = ir->type->is_matrix(); - const glsl_type* vec_type = NULL; // matrix column type - if (mtx) - vec_type = glsl_type::get_instance (ir->type->base_type, ir->type->vector_elements, 1); - - for (unsigned i = 0; i < ir->type->components(); i++) - { - if (!first) - { - if (mtx && (i % ir->type->matrix_columns == 0)) - buffer.asprintf_append (")"); - buffer.asprintf_append (", "); - } - first = false; - - if (mtx && (i % ir->type->matrix_columns == 0)) - { - print_type(buffer, ir, vec_type, true); - buffer.asprintf_append ("("); - } - - switch (base_type->base_type) { - case GLSL_TYPE_UINT: buffer.asprintf_append ("%u", ir->value.u[i]); break; - case GLSL_TYPE_INT: buffer.asprintf_append ("%d", ir->value.i[i]); break; - case GLSL_TYPE_FLOAT: print_float(buffer, ir->value.f[i]); break; - case GLSL_TYPE_BOOL: buffer.asprintf_append ("%d", ir->value.b[i]); break; - default: assert(0); - } - } - if (mtx) - buffer.asprintf_append (")"); - buffer.asprintf_append (")"); -} - - -void -ir_print_metal_visitor::visit(ir_call *ir) -{ - // calls in global scope are postponed to main function - if (this->mode != kPrintGlslNone) - { - assert (!this->globals->main_function_done); - this->globals->global_assignements.push_tail (new(this->globals->mem_ctx) ga_entry_metal(ir)); - buffer.asprintf_append ("//"); // for the ; that will follow (ugly, I know) - return; - } - - if (ir->return_deref) - { - visit(ir->return_deref); - buffer.asprintf_append (" = "); - } - - buffer.asprintf_append ("%s (", ir->callee_name()); - bool first = true; - foreach_in_list(ir_instruction, inst, &ir->actual_parameters) { - if (!first) - buffer.asprintf_append (", "); - inst->accept(this); - first = false; - } - buffer.asprintf_append (")"); -} - - -void -ir_print_metal_visitor::visit(ir_return *ir) -{ - buffer.asprintf_append ("return"); - - ir_rvalue *const value = ir->get_value(); - if (value) { - buffer.asprintf_append (" "); - value->accept(this); - } -} - - -void -ir_print_metal_visitor::visit(ir_discard *ir) -{ - buffer.asprintf_append ("discard_fragment()"); - - if (ir->condition != NULL) { - buffer.asprintf_append (" TODO "); - ir->condition->accept(this); - } -} - - -void -ir_print_metal_visitor::visit(ir_if *ir) -{ - buffer.asprintf_append ("if ("); - ir->condition->accept(this); - - buffer.asprintf_append (") {\n"); - indentation++; previous_skipped = false; - - - foreach_in_list(ir_instruction, inst, &ir->then_instructions) { - indent(); - inst->accept(this); - end_statement_line(); - } - - indentation--; - indent(); - buffer.asprintf_append ("}"); - - if (!ir->else_instructions.is_empty()) - { - buffer.asprintf_append (" else {\n"); - indentation++; previous_skipped = false; - - foreach_in_list(ir_instruction, inst, &ir->else_instructions) { - indent(); - inst->accept(this); - end_statement_line(); - } - indentation--; - indent(); - buffer.asprintf_append ("}"); - } -} - - -bool ir_print_metal_visitor::can_emit_canonical_for (loop_variable_state *ls) -{ - if (ls == NULL) - return false; - - if (ls->induction_variables.is_empty()) - return false; - - if (ls->terminators.is_empty()) - return false; - - // only support for loops with one terminator condition - int terminatorCount = ls->terminators.length(); - if (terminatorCount != 1) - return false; - - return true; -} - -bool ir_print_metal_visitor::emit_canonical_for (ir_loop* ir) -{ - loop_variable_state* const ls = this->loopstate->get(ir); - - if (!can_emit_canonical_for(ls)) - return false; - - hash_table* terminator_hash = hash_table_ctor(0, hash_table_pointer_hash, hash_table_pointer_compare); - hash_table* induction_hash = hash_table_ctor(0, hash_table_pointer_hash, hash_table_pointer_compare); - - buffer.asprintf_append("for ("); - inside_loop_body = true; - - // emit loop induction variable declarations. - // only for loops with single induction variable, to avoid cases of different types of them - if (ls->private_induction_variable_count == 1) - { - foreach_in_list(loop_variable, indvar, &ls->induction_variables) - { - if (!this->loopstate->get_for_inductor(indvar->var)) - continue; - - ir_variable* var = indvar->var; - print_type(buffer, var, var->type, false); - buffer.asprintf_append (" "); - print_var_inout(buffer, var, true); - print_var_name (var); - print_type_post(buffer, var->type, false); - if (indvar->initial_value) - { - buffer.asprintf_append (" = "); - indvar->initial_value->accept(this); - } - } - } - buffer.asprintf_append("; "); - - // emit loop terminating conditions - foreach_in_list(loop_terminator, term, &ls->terminators) - { - hash_table_insert(terminator_hash, term, term->ir); - - // IR has conditions in the form of "if (x) break", - // whereas for loop needs them negated, in the form - // if "while (x) continue the loop". - // See if we can print them using syntax that reads nice. - bool handled = false; - ir_expression* term_expr = term->ir->condition->as_expression(); - if (term_expr) - { - // Binary comparison conditions - const char* termOp = NULL; - switch (term_expr->operation) - { - case ir_binop_less: termOp = ">="; break; - case ir_binop_greater: termOp = "<="; break; - case ir_binop_lequal: termOp = ">"; break; - case ir_binop_gequal: termOp = "<"; break; - case ir_binop_equal: termOp = "!="; break; - case ir_binop_nequal: termOp = "=="; break; - default: break; - } - if (termOp != NULL) - { - term_expr->operands[0]->accept(this); - buffer.asprintf_append(" %s ", termOp); - term_expr->operands[1]->accept(this); - handled = true; - } - - // Unary logic not - if (!handled && term_expr->operation == ir_unop_logic_not) - { - term_expr->operands[0]->accept(this); - handled = true; - } - } - - // More complex condition, print as "!(x)" - if (!handled) - { - buffer.asprintf_append("!("); - term->ir->condition->accept(this); - buffer.asprintf_append(")"); - } - } - buffer.asprintf_append("; "); - - // emit loop induction variable updates - bool first = true; - foreach_in_list(loop_variable, indvar, &ls->induction_variables) - { - hash_table_insert(induction_hash, indvar, indvar->first_assignment); - if (!first) - buffer.asprintf_append(", "); - visit(indvar->first_assignment); - first = false; - } - buffer.asprintf_append(") {\n"); - - inside_loop_body = false; - - // emit loop body - indentation++; previous_skipped = false; - foreach_in_list(ir_instruction, inst, &ir->body_instructions) { - // skip termination & induction statements, - // they are part of "for" clause - if (hash_table_find(terminator_hash, inst)) - continue; - if (hash_table_find(induction_hash, inst)) - continue; - - indent(); - inst->accept(this); - end_statement_line(); - } - indentation--; - - indent(); - buffer.asprintf_append("}"); - - hash_table_dtor (terminator_hash); - hash_table_dtor (induction_hash); - - return true; -} - - -void -ir_print_metal_visitor::visit(ir_loop *ir) -{ - if (emit_canonical_for(ir)) - return; - - buffer.asprintf_append ("while (true) {\n"); - indentation++; previous_skipped = false; - foreach_in_list(ir_instruction, inst, &ir->body_instructions) { - indent(); - inst->accept(this); - end_statement_line(); - } - indentation--; - indent(); - buffer.asprintf_append ("}"); -} - - -void -ir_print_metal_visitor::visit(ir_loop_jump *ir) -{ - buffer.asprintf_append ("%s", ir->is_break() ? "break" : "continue"); -} - -void -ir_print_metal_visitor::visit(ir_precision_statement *ir) -{ -} - -void -ir_print_metal_visitor::visit(ir_typedecl_statement *ir) -{ - const glsl_type *const s = ir->type_decl; - buffer.asprintf_append ("struct %s {\n", s->name); - - for (unsigned j = 0; j < s->length; j++) { - buffer.asprintf_append (" "); - //if (state->es_shader) - // buffer.asprintf_append ("%s", get_precision_string(s->fields.structure[j].precision)); //@TODO - print_type_precision(buffer, s->fields.structure[j].type, s->fields.structure[j].precision, false); - buffer.asprintf_append (" %s", s->fields.structure[j].name); - print_type_post(buffer, s->fields.structure[j].type, false); - buffer.asprintf_append (";\n"); - } - buffer.asprintf_append ("}"); -} - -void -ir_print_metal_visitor::visit(ir_emit_vertex *ir) -{ - buffer.asprintf_append ("emit-vertex-TODO"); -} - -void -ir_print_metal_visitor::visit(ir_end_primitive *ir) -{ - buffer.asprintf_append ("end-primitive-TODO"); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_print_metal_visitor.h b/3rdparty/glsl-optimizer/src/glsl/ir_print_metal_visitor.h deleted file mode 100644 index 032edf36f..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_print_metal_visitor.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright © 2014 Unity Technologies - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef IR_PRINT_METAL_VISITOR_H -#define IR_PRINT_METAL_VISITOR_H - -#include "ir.h" -#include "ir_print_glsl_visitor.h" - -extern char* _mesa_print_ir_metal(exec_list *instructions, - struct _mesa_glsl_parse_state *state, - char* buf, PrintGlslMode mode, int* outUniformsSize); - -#endif /* IR_PRINT_GLSL_VISITOR_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_print_visitor.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_print_visitor.cpp deleted file mode 100644 index 22a9c82d1..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_print_visitor.cpp +++ /dev/null @@ -1,561 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "ir_print_visitor.h" -#include "glsl_types.h" -#include "glsl_parser_extras.h" -#include "main/macros.h" -#include "program/hash_table.h" - -static void print_type(FILE *f, const glsl_type *t); - -void -ir_instruction::print(void) const -{ - this->fprint(stdout); -} - -void -ir_instruction::fprint(FILE *f) const -{ - ir_instruction *deconsted = const_cast(this); - - ir_print_visitor v(f); - deconsted->accept(&v); -} - -extern "C" { -void -_mesa_print_ir(FILE *f, exec_list *instructions, - struct _mesa_glsl_parse_state *state) -{ - if (state) { - for (unsigned i = 0; i < state->num_user_structures; i++) { - const glsl_type *const s = state->user_structures[i]; - - fprintf(f, "(structure (%s) (%s@%p) (%u) (\n", - s->name, s->name, (void *) s, s->length); - - for (unsigned j = 0; j < s->length; j++) { - fprintf(f, "\t(("); - print_type(f, s->fields.structure[j].type); - fprintf(f, ")(%s))\n", s->fields.structure[j].name); - } - - fprintf(f, ")\n"); - } - } - - fprintf(f, "(\n"); - foreach_in_list(ir_instruction, ir, instructions) { - ir->fprint(f); - if (ir->ir_type != ir_type_function) - fprintf(f, "\n"); - } - fprintf(f, "\n)"); -} - -void -fprint_ir(FILE *f, const void *instruction) -{ - const ir_instruction *ir = (const ir_instruction *)instruction; - ir->fprint(f); -} - -} /* extern "C" */ - -ir_print_visitor::ir_print_visitor(FILE *f) - : f(f) -{ - indentation = 0; - printable_names = - hash_table_ctor(32, hash_table_pointer_hash, hash_table_pointer_compare); - symbols = _mesa_symbol_table_ctor(); - mem_ctx = ralloc_context(NULL); -} - -ir_print_visitor::~ir_print_visitor() -{ - hash_table_dtor(printable_names); - _mesa_symbol_table_dtor(symbols); - ralloc_free(mem_ctx); -} - -void ir_print_visitor::indent(void) -{ - for (int i = 0; i < indentation; i++) - fprintf(f, " "); -} - -const char * -ir_print_visitor::unique_name(ir_variable *var) -{ - /* var->name can be NULL in function prototypes when a type is given for a - * parameter but no name is given. In that case, just return an empty - * string. Don't worry about tracking the generated name in the printable - * names hash because this is the only scope where it can ever appear. - */ - if (var->name == NULL) { - static unsigned arg = 1; - return ralloc_asprintf(this->mem_ctx, "parameter@%u", arg++); - } - - /* Do we already have a name for this variable? */ - const char *name = (const char *) hash_table_find(this->printable_names, var); - if (name != NULL) - return name; - - /* If there's no conflict, just use the original name */ - if (_mesa_symbol_table_find_symbol(this->symbols, -1, var->name) == NULL) { - name = var->name; - } else { - static unsigned i = 1; - name = ralloc_asprintf(this->mem_ctx, "%s@%u", var->name, ++i); - } - hash_table_insert(this->printable_names, (void *) name, var); - _mesa_symbol_table_add_symbol(this->symbols, -1, name, var); - return name; -} - -static void -print_type(FILE *f, const glsl_type *t) -{ - if (t->base_type == GLSL_TYPE_ARRAY) { - fprintf(f, "(array "); - print_type(f, t->fields.array); - fprintf(f, " %u)", t->length); - } else if ((t->base_type == GLSL_TYPE_STRUCT) - && !is_gl_identifier(t->name)) { - fprintf(f, "%s@%p", t->name, (void *) t); - } else { - fprintf(f, "%s", t->name); - } -} - -void ir_print_visitor::visit(ir_rvalue *) -{ - fprintf(f, "error"); -} - -void ir_print_visitor::visit(ir_variable *ir) -{ - fprintf(f, "(declare "); - - const char *const cent = (ir->data.centroid) ? "centroid " : ""; - const char *const samp = (ir->data.sample) ? "sample " : ""; - const char *const inv = (ir->data.invariant) ? "invariant " : ""; - const char *const mode[] = { "", "uniform ", "shader_in ", "shader_out ", "shader_inout ", - "in ", "out ", "inout ", - "const_in ", "sys ", "temporary " }; - STATIC_ASSERT(ARRAY_SIZE(mode) == ir_var_mode_count); - const char *const stream [] = {"", "stream1 ", "stream2 ", "stream3 "}; - const char *const interp[] = { "", "smooth", "flat", "noperspective" }; - STATIC_ASSERT(ARRAY_SIZE(interp) == INTERP_QUALIFIER_COUNT); - - fprintf(f, "(%s%s%s%s%s%s) ", - cent, samp, inv, mode[ir->data.mode], - stream[ir->data.stream], - interp[ir->data.interpolation]); - - print_type(f, ir->type); - fprintf(f, " %s)", unique_name(ir)); -} - - -void ir_print_visitor::visit(ir_function_signature *ir) -{ - _mesa_symbol_table_push_scope(symbols); - fprintf(f, "(signature "); - indentation++; - - print_type(f, ir->return_type); - fprintf(f, "\n"); - indent(); - - fprintf(f, "(parameters\n"); - indentation++; - - foreach_in_list(ir_variable, inst, &ir->parameters) { - indent(); - inst->accept(this); - fprintf(f, "\n"); - } - indentation--; - - indent(); - fprintf(f, ")\n"); - - indent(); - - fprintf(f, "(\n"); - indentation++; - - foreach_in_list(ir_instruction, inst, &ir->body) { - indent(); - inst->accept(this); - fprintf(f, "\n"); - } - indentation--; - indent(); - fprintf(f, "))\n"); - indentation--; - _mesa_symbol_table_pop_scope(symbols); -} - - -void ir_print_visitor::visit(ir_function *ir) -{ - fprintf(f, "(function %s\n", ir->name); - indentation++; - foreach_in_list(ir_function_signature, sig, &ir->signatures) { - indent(); - sig->accept(this); - fprintf(f, "\n"); - } - indentation--; - indent(); - fprintf(f, ")\n\n"); -} - - -void ir_print_visitor::visit(ir_expression *ir) -{ - fprintf(f, "(expression "); - - print_type(f, ir->type); - - fprintf(f, " %s ", ir->operator_string()); - - for (unsigned i = 0; i < ir->get_num_operands(); i++) { - ir->operands[i]->accept(this); - } - - fprintf(f, ") "); -} - - -void ir_print_visitor::visit(ir_texture *ir) -{ - fprintf(f, "(%s ", ir->opcode_string()); - - print_type(f, ir->type); - fprintf(f, " "); - - ir->sampler->accept(this); - fprintf(f, " "); - - if (ir->op != ir_txs && ir->op != ir_query_levels) { - ir->coordinate->accept(this); - - fprintf(f, " "); - - if (ir->offset != NULL) { - ir->offset->accept(this); - } else { - fprintf(f, "0"); - } - - fprintf(f, " "); - } - - fprintf(f, " "); - switch (ir->op) - { - case ir_tex: - case ir_lod: - case ir_query_levels: - break; - case ir_txb: - ir->lod_info.bias->accept(this); - break; - case ir_txl: - case ir_txf: - case ir_txs: - ir->lod_info.lod->accept(this); - break; - case ir_txf_ms: - ir->lod_info.sample_index->accept(this); - break; - case ir_txd: - fprintf(f, "("); - ir->lod_info.grad.dPdx->accept(this); - fprintf(f, " "); - ir->lod_info.grad.dPdy->accept(this); - fprintf(f, ")"); - break; - case ir_tg4: - ir->lod_info.component->accept(this); - break; - }; - fprintf(f, ")"); -} - - -void ir_print_visitor::visit(ir_swizzle *ir) -{ - const unsigned swiz[4] = { - ir->mask.x, - ir->mask.y, - ir->mask.z, - ir->mask.w, - }; - - fprintf(f, "(swiz "); - for (unsigned i = 0; i < ir->mask.num_components; i++) { - fprintf(f, "%c", "xyzw"[swiz[i]]); - } - fprintf(f, " "); - ir->val->accept(this); - fprintf(f, ")"); -} - - -void ir_print_visitor::visit(ir_dereference_variable *ir) -{ - ir_variable *var = ir->variable_referenced(); - fprintf(f, "(var_ref %s) ", unique_name(var)); -} - - -void ir_print_visitor::visit(ir_dereference_array *ir) -{ - fprintf(f, "(array_ref "); - ir->array->accept(this); - ir->array_index->accept(this); - fprintf(f, ") "); -} - - -void ir_print_visitor::visit(ir_dereference_record *ir) -{ - fprintf(f, "(record_ref "); - ir->record->accept(this); - fprintf(f, " %s) ", ir->field); -} - - -void ir_print_visitor::visit(ir_assignment *ir) -{ - fprintf(f, "(assign "); - - if (ir->condition) - ir->condition->accept(this); - - char mask[5]; - unsigned j = 0; - - for (unsigned i = 0; i < 4; i++) { - if ((ir->write_mask & (1 << i)) != 0) { - mask[j] = "xyzw"[i]; - j++; - } - } - mask[j] = '\0'; - - fprintf(f, " (%s) ", mask); - - ir->lhs->accept(this); - - fprintf(f, " "); - - ir->rhs->accept(this); - fprintf(f, ") "); -} - - -void ir_print_visitor::visit(ir_constant *ir) -{ - fprintf(f, "(constant "); - print_type(f, ir->type); - fprintf(f, " ("); - - if (ir->type->is_array()) { - for (unsigned i = 0; i < ir->type->length; i++) - ir->get_array_element(i)->accept(this); - } else if (ir->type->is_record()) { - ir_constant *value = (ir_constant *) ir->components.get_head(); - for (unsigned i = 0; i < ir->type->length; i++) { - fprintf(f, "(%s ", ir->type->fields.structure[i].name); - value->accept(this); - fprintf(f, ")"); - - value = (ir_constant *) value->next; - } - } else { - for (unsigned i = 0; i < ir->type->components(); i++) { - if (i != 0) - fprintf(f, " "); - switch (ir->type->base_type) { - case GLSL_TYPE_UINT: fprintf(f, "%u", ir->value.u[i]); break; - case GLSL_TYPE_INT: fprintf(f, "%d", ir->value.i[i]); break; - case GLSL_TYPE_FLOAT: - if (ir->value.f[i] == 0.0f) - /* 0.0 == -0.0, so print with %f to get the proper sign. */ - fprintf(f, "%f", ir->value.f[i]); - else if (fabs(ir->value.f[i]) < 0.000001f) - fprintf(f, "%a", ir->value.f[i]); - else if (fabs(ir->value.f[i]) > 1000000.0f) - fprintf(f, "%e", ir->value.f[i]); - else - fprintf(f, "%f", ir->value.f[i]); - break; - case GLSL_TYPE_BOOL: fprintf(f, "%d", ir->value.b[i]); break; - default: assert(0); - } - } - } - fprintf(f, ")) "); -} - - -void -ir_print_visitor::visit(ir_call *ir) -{ - fprintf(f, "(call %s ", ir->callee_name()); - if (ir->return_deref) - ir->return_deref->accept(this); - fprintf(f, " ("); - foreach_in_list(ir_rvalue, param, &ir->actual_parameters) { - param->accept(this); - } - fprintf(f, "))\n"); -} - - -void -ir_print_visitor::visit(ir_return *ir) -{ - fprintf(f, "(return"); - - ir_rvalue *const value = ir->get_value(); - if (value) { - fprintf(f, " "); - value->accept(this); - } - - fprintf(f, ")"); -} - - -void -ir_print_visitor::visit(ir_discard *ir) -{ - fprintf(f, "(discard "); - - if (ir->condition != NULL) { - fprintf(f, " "); - ir->condition->accept(this); - } - - fprintf(f, ")"); -} - - -void -ir_print_visitor::visit(ir_if *ir) -{ - fprintf(f, "(if "); - ir->condition->accept(this); - - fprintf(f, "(\n"); - indentation++; - - foreach_in_list(ir_instruction, inst, &ir->then_instructions) { - indent(); - inst->accept(this); - fprintf(f, "\n"); - } - - indentation--; - indent(); - fprintf(f, ")\n"); - - indent(); - if (!ir->else_instructions.is_empty()) { - fprintf(f, "(\n"); - indentation++; - - foreach_in_list(ir_instruction, inst, &ir->else_instructions) { - indent(); - inst->accept(this); - fprintf(f, "\n"); - } - indentation--; - indent(); - fprintf(f, "))\n"); - } else { - fprintf(f, "())\n"); - } -} - - -void -ir_print_visitor::visit(ir_loop *ir) -{ - fprintf(f, "(loop (\n"); - indentation++; - - foreach_in_list(ir_instruction, inst, &ir->body_instructions) { - indent(); - inst->accept(this); - fprintf(f, "\n"); - } - indentation--; - indent(); - fprintf(f, "))\n"); -} - - -void -ir_print_visitor::visit(ir_loop_jump *ir) -{ - fprintf(f, "%s", ir->is_break() ? "break" : "continue"); -} - -void -ir_print_visitor::visit(ir_precision_statement *ir) -{ - //printf("%s", ir->precision_statement); -} - -void -ir_print_visitor::visit(ir_typedecl_statement *ir) -{ -} - -void -ir_print_visitor::visit(ir_emit_vertex *ir) -{ - fprintf(f, "(emit-vertex "); - ir->stream->accept(this); - fprintf(f, ")\n"); -} - -void -ir_print_visitor::visit(ir_end_primitive *ir) -{ - fprintf(f, "(end-primitive "); - ir->stream->accept(this); - fprintf(f, ")\n"); - -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_print_visitor.h b/3rdparty/glsl-optimizer/src/glsl/ir_print_visitor.h deleted file mode 100644 index a891d3c92..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_print_visitor.h +++ /dev/null @@ -1,97 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef IR_PRINT_VISITOR_H -#define IR_PRINT_VISITOR_H - -#include "ir.h" -#include "ir_visitor.h" - -extern "C" { -#include "program/symbol_table.h" -} - -/** - * Abstract base class of visitors of IR instruction trees - */ -class ir_print_visitor : public ir_visitor { -public: - ir_print_visitor(FILE *f); - virtual ~ir_print_visitor(); - - void indent(void); - - /** - * \name Visit methods - * - * As typical for the visitor pattern, there must be one \c visit method for - * each concrete subclass of \c ir_instruction. Virtual base classes within - * the hierarchy should not have \c visit methods. - */ - /*@{*/ - virtual void visit(ir_rvalue *); - virtual void visit(ir_variable *); - virtual void visit(ir_function_signature *); - virtual void visit(ir_function *); - virtual void visit(ir_expression *); - virtual void visit(ir_texture *); - virtual void visit(ir_swizzle *); - virtual void visit(ir_dereference_variable *); - virtual void visit(ir_dereference_array *); - virtual void visit(ir_dereference_record *); - virtual void visit(ir_assignment *); - virtual void visit(ir_constant *); - virtual void visit(ir_call *); - virtual void visit(ir_return *); - virtual void visit(ir_discard *); - virtual void visit(ir_if *); - virtual void visit(ir_loop *); - virtual void visit(ir_loop_jump *); - virtual void visit(ir_precision_statement *); - virtual void visit(ir_typedecl_statement *); - virtual void visit(ir_emit_vertex *); - virtual void visit(ir_end_primitive *); - /*@}*/ - -private: - /** - * Fetch/generate a unique name for ir_variable. - * - * GLSL IR permits multiple ir_variables to share the same name. This works - * fine until we try to print it, when we really need a unique one. - */ - const char *unique_name(ir_variable *var); - - /** A mapping from ir_variable * -> unique printable names. */ - hash_table *printable_names; - _mesa_symbol_table *symbols; - - void *mem_ctx; - FILE *f; - - int indentation; -}; - -#endif /* IR_PRINT_VISITOR_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_rvalue_visitor.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_rvalue_visitor.cpp deleted file mode 100644 index 81cfc8943..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_rvalue_visitor.cpp +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file ir_rvalue_visitor.cpp - * - * Generic class to implement the common pattern we have of wanting to - * visit each ir_rvalue * and possibly change that node to a different - * class. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_rvalue_visitor.h" -#include "glsl_types.h" - -ir_visitor_status -ir_rvalue_base_visitor::rvalue_visit(ir_expression *ir) -{ - unsigned int operand; - - for (operand = 0; operand < ir->get_num_operands(); operand++) { - handle_rvalue(&ir->operands[operand]); - } - - return visit_continue; -} - -ir_visitor_status -ir_rvalue_base_visitor::rvalue_visit(ir_texture *ir) -{ - handle_rvalue(&ir->coordinate); - handle_rvalue(&ir->offset); - - switch (ir->op) { - case ir_tex: - case ir_lod: - case ir_query_levels: - break; - case ir_txb: - handle_rvalue(&ir->lod_info.bias); - break; - case ir_txf: - case ir_txl: - case ir_txs: - handle_rvalue(&ir->lod_info.lod); - break; - case ir_txf_ms: - handle_rvalue(&ir->lod_info.sample_index); - break; - case ir_txd: - handle_rvalue(&ir->lod_info.grad.dPdx); - handle_rvalue(&ir->lod_info.grad.dPdy); - break; - case ir_tg4: - handle_rvalue(&ir->lod_info.component); - break; - } - - return visit_continue; -} - -ir_visitor_status -ir_rvalue_base_visitor::rvalue_visit(ir_swizzle *ir) -{ - handle_rvalue(&ir->val); - return visit_continue; -} - -ir_visitor_status -ir_rvalue_base_visitor::rvalue_visit(ir_dereference_array *ir) -{ - /* The array index is not the target of the assignment, so clear the - * 'in_assignee' flag. Restore it after returning from the array index. - */ - const bool was_in_assignee = this->in_assignee; - this->in_assignee = false; - handle_rvalue(&ir->array_index); - this->in_assignee = was_in_assignee; - - handle_rvalue(&ir->array); - return visit_continue; -} - -ir_visitor_status -ir_rvalue_base_visitor::rvalue_visit(ir_dereference_record *ir) -{ - handle_rvalue(&ir->record); - return visit_continue; -} - -ir_visitor_status -ir_rvalue_base_visitor::rvalue_visit(ir_assignment *ir) -{ - handle_rvalue(&ir->rhs); - handle_rvalue(&ir->condition); - - return visit_continue; -} - -ir_visitor_status -ir_rvalue_base_visitor::rvalue_visit(ir_call *ir) -{ - foreach_in_list_safe(ir_rvalue, param, &ir->actual_parameters) { - ir_rvalue *new_param = param; - handle_rvalue(&new_param); - - if (new_param != param) { - param->replace_with(new_param); - } - } - return visit_continue; -} - -ir_visitor_status -ir_rvalue_base_visitor::rvalue_visit(ir_return *ir) -{ - handle_rvalue(&ir->value);; - return visit_continue; -} - -ir_visitor_status -ir_rvalue_base_visitor::rvalue_visit(ir_if *ir) -{ - handle_rvalue(&ir->condition); - return visit_continue; -} - -ir_visitor_status -ir_rvalue_base_visitor::rvalue_visit(ir_emit_vertex *ir) -{ - handle_rvalue(&ir->stream); - return visit_continue; -} - -ir_visitor_status -ir_rvalue_base_visitor::rvalue_visit(ir_end_primitive *ir) -{ - handle_rvalue(&ir->stream); - return visit_continue; -} - -ir_visitor_status -ir_rvalue_visitor::visit_leave(ir_expression *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_visitor::visit_leave(ir_texture *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_visitor::visit_leave(ir_swizzle *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_visitor::visit_leave(ir_dereference_array *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_visitor::visit_leave(ir_dereference_record *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_visitor::visit_leave(ir_assignment *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_visitor::visit_leave(ir_call *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_visitor::visit_leave(ir_return *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_visitor::visit_leave(ir_if *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_visitor::visit_leave(ir_emit_vertex *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_visitor::visit_leave(ir_end_primitive *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_enter_visitor::visit_enter(ir_expression *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_enter_visitor::visit_enter(ir_texture *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_enter_visitor::visit_enter(ir_swizzle *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_enter_visitor::visit_enter(ir_dereference_array *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_enter_visitor::visit_enter(ir_dereference_record *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_enter_visitor::visit_enter(ir_assignment *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_enter_visitor::visit_enter(ir_call *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_enter_visitor::visit_enter(ir_return *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_enter_visitor::visit_enter(ir_if *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_enter_visitor::visit_enter(ir_emit_vertex *ir) -{ - return rvalue_visit(ir); -} - -ir_visitor_status -ir_rvalue_enter_visitor::visit_enter(ir_end_primitive *ir) -{ - return rvalue_visit(ir); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_rvalue_visitor.h b/3rdparty/glsl-optimizer/src/glsl/ir_rvalue_visitor.h deleted file mode 100644 index 04ec0fa39..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_rvalue_visitor.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file ir_rvalue_visitor.h - * - * Generic class to implement the common pattern we have of wanting to - * visit each ir_rvalue * and possibly change that node to a different - * class. Just implement handle_rvalue() and you will be called with - * a pointer to each rvalue in the tree. - */ - -class ir_rvalue_base_visitor : public ir_hierarchical_visitor { -public: - ir_visitor_status rvalue_visit(ir_assignment *); - ir_visitor_status rvalue_visit(ir_call *); - ir_visitor_status rvalue_visit(ir_dereference_array *); - ir_visitor_status rvalue_visit(ir_dereference_record *); - ir_visitor_status rvalue_visit(ir_expression *); - ir_visitor_status rvalue_visit(ir_if *); - ir_visitor_status rvalue_visit(ir_return *); - ir_visitor_status rvalue_visit(ir_swizzle *); - ir_visitor_status rvalue_visit(ir_texture *); - ir_visitor_status rvalue_visit(ir_emit_vertex *); - ir_visitor_status rvalue_visit(ir_end_primitive *); - - virtual void handle_rvalue(ir_rvalue **rvalue) = 0; -}; - -class ir_rvalue_visitor : public ir_rvalue_base_visitor { -public: - - virtual ir_visitor_status visit_leave(ir_assignment *); - virtual ir_visitor_status visit_leave(ir_call *); - virtual ir_visitor_status visit_leave(ir_dereference_array *); - virtual ir_visitor_status visit_leave(ir_dereference_record *); - virtual ir_visitor_status visit_leave(ir_expression *); - virtual ir_visitor_status visit_leave(ir_if *); - virtual ir_visitor_status visit_leave(ir_return *); - virtual ir_visitor_status visit_leave(ir_swizzle *); - virtual ir_visitor_status visit_leave(ir_texture *); - virtual ir_visitor_status visit_leave(ir_emit_vertex *); - virtual ir_visitor_status visit_leave(ir_end_primitive *); -}; - -class ir_rvalue_enter_visitor : public ir_rvalue_base_visitor { -public: - - virtual ir_visitor_status visit_enter(ir_assignment *); - virtual ir_visitor_status visit_enter(ir_call *); - virtual ir_visitor_status visit_enter(ir_dereference_array *); - virtual ir_visitor_status visit_enter(ir_dereference_record *); - virtual ir_visitor_status visit_enter(ir_expression *); - virtual ir_visitor_status visit_enter(ir_if *); - virtual ir_visitor_status visit_enter(ir_return *); - virtual ir_visitor_status visit_enter(ir_swizzle *); - virtual ir_visitor_status visit_enter(ir_texture *); - virtual ir_visitor_status visit_enter(ir_emit_vertex *); - virtual ir_visitor_status visit_enter(ir_end_primitive *); -}; diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_stats.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_stats.cpp deleted file mode 100644 index ecd0b1b2e..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_stats.cpp +++ /dev/null @@ -1,64 +0,0 @@ -#include "ir.h" -#include "ir_visitor.h" -#include "ir_unused_structs.h" -#include "glsl_types.h" - -struct ir_stats_counter_visitor : public ir_hierarchical_visitor { - ir_stats_counter_visitor() - : math(0), tex(0), flow(0) - { - } - - virtual ir_visitor_status visit_leave(class ir_loop *) - { - ++flow; - return visit_continue; - } - virtual ir_visitor_status visit_leave(class ir_expression *) - { - ++math; - return visit_continue; - } - virtual ir_visitor_status visit_leave(class ir_texture *) - { - ++tex; - return visit_continue; - } - virtual ir_visitor_status visit_leave(ir_assignment *ir) - { - if (ir && ir->rhs) - { - if (ir->rhs->as_constant()) - ++math; - } - return visit_continue; - } - virtual ir_visitor_status visit_leave(class ir_return *) - { - ++flow; - return visit_continue; - } - virtual ir_visitor_status visit_leave(class ir_discard *) - { - ++tex; - return visit_continue; - } - virtual ir_visitor_status visit_leave(class ir_if *) - { - ++flow; - return visit_continue; - } - - int math; - int tex; - int flow; -}; - -void calculate_shader_stats(exec_list* instructions, int* outMath, int* outTex, int* outFlow) -{ - ir_stats_counter_visitor v; - v.run (instructions); - *outMath = v.math; - *outTex = v.tex; - *outFlow = v.flow; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_stats.h b/3rdparty/glsl-optimizer/src/glsl/ir_stats.h deleted file mode 100644 index 4b6da7c47..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_stats.h +++ /dev/null @@ -1,3 +0,0 @@ -#include "ir.h" - -void calculate_shader_stats(exec_list* instructions, int* outMath, int* outTex, int* outFlow); diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_uniform.h b/3rdparty/glsl-optimizer/src/glsl/ir_uniform.h deleted file mode 100644 index 2f7352825..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_uniform.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef IR_UNIFORM_H -#define IR_UNIFORM_H - - -/* stdbool.h is necessary because this file is included in both C and C++ code. - */ -#include - -#include "program/prog_parameter.h" /* For union gl_constant_value. */ - -/** - * Used by GL_ARB_explicit_uniform_location extension code in the linker - * and glUniform* functions to identify inactive explicit uniform locations. - */ -#define INACTIVE_UNIFORM_EXPLICIT_LOCATION ((gl_uniform_storage *) -1) - -#ifdef __cplusplus -extern "C" { -#endif - -enum PACKED gl_uniform_driver_format { - uniform_native = 0, /**< Store data in the native format. */ - uniform_int_float, /**< Store integer data as floats. */ - uniform_bool_float, /**< Store boolean data as floats. */ - - /** - * Store boolean data as integer using 1 for \c true. - */ - uniform_bool_int_0_1, - - /** - * Store boolean data as integer using ~0 for \c true. - */ - uniform_bool_int_0_not0 -}; - -struct gl_uniform_driver_storage { - /** - * Number of bytes from one array element to the next. - */ - uint8_t element_stride; - - /** - * Number of bytes from one vector in a matrix to the next. - */ - uint8_t vector_stride; - - /** - * Base format of the stored data. - */ - enum gl_uniform_driver_format format; - - /** - * Pointer to the base of the data. - */ - void *data; -}; - -struct gl_opaque_uniform_index { - /** - * Base opaque uniform index - * - * If \c gl_uniform_storage::base_type is an opaque type, this - * represents its uniform index. If \c - * gl_uniform_storage::array_elements is not zero, the array will - * use opaque uniform indices \c index through \c index + \c - * gl_uniform_storage::array_elements - 1, inclusive. - * - * Note that the index may be different in each shader stage. - */ - uint8_t index; - - /** - * Whether this opaque uniform is used in this shader stage. - */ - bool active; -}; - -struct gl_uniform_storage { - char *name; - /** Type of this uniform data stored. - * - * In the case of an array, it's the type of a single array element. - */ - const struct glsl_type *type; - - /** - * The number of elements in this uniform. - * - * For non-arrays, this is always 0. For arrays, the value is the size of - * the array. - */ - unsigned array_elements; - - /** - * Has this uniform ever been set? - */ - bool initialized; - - struct gl_opaque_uniform_index sampler[MESA_SHADER_STAGES]; - - struct gl_opaque_uniform_index image[MESA_SHADER_STAGES]; - - /** - * Storage used by the driver for the uniform - */ - unsigned num_driver_storage; - struct gl_uniform_driver_storage *driver_storage; - - /** - * Storage used by Mesa for the uniform - * - * This form of the uniform is used by Mesa's implementation of \c - * glGetUniform. It can also be used by drivers to obtain the value of the - * uniform if the \c ::driver_storage interface is not used. - */ - union gl_constant_value *storage; - - /** Fields for GL_ARB_uniform_buffer_object - * @{ - */ - - /** - * GL_UNIFORM_BLOCK_INDEX: index of the uniform block containing - * the uniform, or -1 for the default uniform block. Note that the - * index is into the linked program's UniformBlocks[] array, not - * the linked shader's. - */ - int block_index; - - /** GL_UNIFORM_OFFSET: byte offset within the uniform block, or -1. */ - int offset; - - /** - * GL_UNIFORM_MATRIX_STRIDE: byte stride between columns or rows of - * a matrix. Set to 0 for non-matrices in UBOs, or -1 for uniforms - * in the default uniform block. - */ - int matrix_stride; - - /** - * GL_UNIFORM_ARRAY_STRIDE: byte stride between elements of the - * array. Set to zero for non-arrays in UBOs, or -1 for uniforms - * in the default uniform block. - */ - int array_stride; - - /** GL_UNIFORM_ROW_MAJOR: true iff it's a row-major matrix in a UBO */ - bool row_major; - - /** @} */ - - /** - * Index within gl_shader_program::AtomicBuffers[] of the atomic - * counter buffer this uniform is stored in, or -1 if this is not - * an atomic counter. - */ - int atomic_buffer_index; - - /** - * The 'base location' for this uniform in the uniform remap table. For - * arrays this is the first element in the array. - */ - unsigned remap_location; -}; - -#ifdef __cplusplus -} -#endif - -#endif /* IR_UNIFORM_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_unused_structs.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_unused_structs.cpp deleted file mode 100644 index 8f16432a5..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_unused_structs.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_unused_structs.h" -#include "glsl_types.h" - - -class ir_struct_usage_visitor : public ir_hierarchical_visitor { -public: - ir_struct_usage_visitor(); - ~ir_struct_usage_visitor(void); - - virtual ir_visitor_status visit(ir_dereference_variable *); - - bool has_struct_entry(const glsl_type *t) const; - - exec_list struct_list; - void *mem_ctx; -}; - -class ir_decl_removal_visitor : public ir_hierarchical_visitor { -public: - ir_decl_removal_visitor(ir_struct_usage_visitor* used_structs) - : used_structs(used_structs) - { - } - - virtual ir_visitor_status visit(ir_typedecl_statement* ir) - { - if (!used_structs->has_struct_entry(ir->type_decl)) - { - ir->remove(); - } - return visit_continue; - } - - ir_struct_usage_visitor* used_structs; -}; - - -struct struct_entry : public exec_node -{ - struct_entry(const glsl_type *type_) : type(type_) { } - const glsl_type *type; -}; - - -bool -ir_struct_usage_visitor::has_struct_entry(const glsl_type *t) const -{ - assert(t); - foreach_in_list(struct_entry, entry, &this->struct_list) { - if (entry->type == t) - return true; - } - return false; -} - - -ir_visitor_status -ir_struct_usage_visitor::visit(ir_dereference_variable *ir) -{ - const glsl_type* t = ir->type; - if (t->base_type == GLSL_TYPE_STRUCT) - { - if (!has_struct_entry (t)) - { - struct_entry *entry = new(mem_ctx) struct_entry(t); - this->struct_list.push_tail (entry); - } - } - return visit_continue; -} - -static void visit_variable (ir_instruction* ir, void* data) -{ - ir_variable* var = ir->as_variable(); - if (!var) - return; - ir_struct_usage_visitor* self = reinterpret_cast(data); - const glsl_type* t = var->type; - if (t->base_type == GLSL_TYPE_ARRAY) - t = t->fields.array; // handle array of structs case - if (t->base_type == GLSL_TYPE_STRUCT) - { - if (!self->has_struct_entry (t)) - { - struct_entry *entry = new(self->mem_ctx) struct_entry(t); - self->struct_list.push_tail (entry); - } - } - -} - -ir_struct_usage_visitor::ir_struct_usage_visitor() -{ - this->mem_ctx = ralloc_context(NULL); - this->struct_list.make_empty(); - this->callback_enter = visit_variable; - this->data_enter = this; -} - -ir_struct_usage_visitor::~ir_struct_usage_visitor(void) -{ - ralloc_free(mem_ctx); -} - - - -void do_remove_unused_typedecls(exec_list* instructions) -{ - ir_struct_usage_visitor v; - v.run (instructions); - - ir_decl_removal_visitor v2(&v); - v2.run (instructions); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_unused_structs.h b/3rdparty/glsl-optimizer/src/glsl/ir_unused_structs.h deleted file mode 100644 index 3c1bb5ec6..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_unused_structs.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "ir.h" - -void do_remove_unused_typedecls(exec_list* instructions); diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_validate.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_validate.cpp deleted file mode 100644 index 9c50576f0..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_validate.cpp +++ /dev/null @@ -1,859 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file ir_validate.cpp - * - * Attempts to verify that various invariants of the IR tree are true. - * - * In particular, at the moment it makes sure that no single - * ir_instruction node except for ir_variable appears multiple times - * in the ir tree. ir_variable does appear multiple times: Once as a - * declaration in an exec_list, and multiple times as the endpoint of - * a dereference chain. - */ - -#include "ir.h" -#include "ir_hierarchical_visitor.h" -#include "program/hash_table.h" -#include "glsl_types.h" - -namespace { - -class ir_validate : public ir_hierarchical_visitor { -public: - ir_validate() - { - this->ht = hash_table_ctor(0, hash_table_pointer_hash, - hash_table_pointer_compare); - - this->current_function = NULL; - - this->callback_enter = ir_validate::validate_ir; - this->data_enter = ht; - } - - ~ir_validate() - { - hash_table_dtor(this->ht); - } - - virtual ir_visitor_status visit(ir_variable *v); - virtual ir_visitor_status visit(ir_dereference_variable *ir); - - virtual ir_visitor_status visit_enter(ir_if *ir); - - virtual ir_visitor_status visit_enter(ir_function *ir); - virtual ir_visitor_status visit_leave(ir_function *ir); - virtual ir_visitor_status visit_enter(ir_function_signature *ir); - - virtual ir_visitor_status visit_leave(ir_expression *ir); - virtual ir_visitor_status visit_leave(ir_swizzle *ir); - - virtual ir_visitor_status visit_enter(class ir_dereference_array *); - - virtual ir_visitor_status visit_enter(ir_assignment *ir); - virtual ir_visitor_status visit_enter(ir_call *ir); - - static void validate_ir(ir_instruction *ir, void *data); - - ir_function *current_function; - - struct hash_table *ht; -}; - -} /* anonymous namespace */ - -ir_visitor_status -ir_validate::visit(ir_dereference_variable *ir) -{ - if ((ir->var == NULL) || (ir->var->as_variable() == NULL)) { - printf("ir_dereference_variable @ %p does not specify a variable %p\n", - (void *) ir, (void *) ir->var); - abort(); - } - - if (hash_table_find(ht, ir->var) == NULL) { - printf("ir_dereference_variable @ %p specifies undeclared variable " - "`%s' @ %p\n", - (void *) ir, ir->var->name, (void *) ir->var); - abort(); - } - - this->validate_ir(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_validate::visit_enter(class ir_dereference_array *ir) -{ - if (!ir->array->type->is_array() && !ir->array->type->is_matrix()) { - printf("ir_dereference_array @ %p does not specify an array or a " - "matrix\n", - (void *) ir); - ir->print(); - printf("\n"); - abort(); - } - - if (!ir->array_index->type->is_scalar()) { - printf("ir_dereference_array @ %p does not have scalar index: %s\n", - (void *) ir, ir->array_index->type->name); - abort(); - } - - if (!ir->array_index->type->is_integer()) { - printf("ir_dereference_array @ %p does not have integer index: %s\n", - (void *) ir, ir->array_index->type->name); - abort(); - } - - return visit_continue; -} - -ir_visitor_status -ir_validate::visit_enter(ir_if *ir) -{ - if (ir->condition->type != glsl_type::bool_type) { - printf("ir_if condition %s type instead of bool.\n", - ir->condition->type->name); - ir->print(); - printf("\n"); - abort(); - } - - return visit_continue; -} - - -ir_visitor_status -ir_validate::visit_enter(ir_function *ir) -{ - /* Function definitions cannot be nested. - */ - if (this->current_function != NULL) { - printf("Function definition nested inside another function " - "definition:\n"); - printf("%s %p inside %s %p\n", - ir->name, (void *) ir, - this->current_function->name, (void *) this->current_function); - abort(); - } - - /* Store the current function hierarchy being traversed. This is used - * by the function signature visitor to ensure that the signatures are - * linked with the correct functions. - */ - this->current_function = ir; - - this->validate_ir(ir, this->data_enter); - - /* Verify that all of the things stored in the list of signatures are, - * in fact, function signatures. - */ - foreach_in_list(ir_instruction, sig, &ir->signatures) { - if (sig->ir_type != ir_type_function_signature) { - printf("Non-signature in signature list of function `%s'\n", - ir->name); - abort(); - } - } - - return visit_continue; -} - -ir_visitor_status -ir_validate::visit_leave(ir_function *ir) -{ - assert(ralloc_parent(ir->name) == ir); - - this->current_function = NULL; - return visit_continue; -} - -ir_visitor_status -ir_validate::visit_enter(ir_function_signature *ir) -{ - if (this->current_function != ir->function()) { - printf("Function signature nested inside wrong function " - "definition:\n"); - printf("%p inside %s %p instead of %s %p\n", - (void *) ir, - this->current_function->name, (void *) this->current_function, - ir->function_name(), (void *) ir->function()); - abort(); - } - - if (ir->return_type == NULL) { - printf("Function signature %p for function %s has NULL return type.\n", - (void *) ir, ir->function_name()); - abort(); - } - - this->validate_ir(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_validate::visit_leave(ir_expression *ir) -{ - switch (ir->operation) { - case ir_triop_clamp: - break; - case ir_unop_bit_not: - assert(ir->operands[0]->type == ir->type); - break; - case ir_unop_logic_not: - assert(ir->type->base_type == GLSL_TYPE_BOOL); - assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL); - break; - - case ir_unop_neg: - case ir_unop_abs: - case ir_unop_sign: - case ir_unop_rcp: - case ir_unop_rsq: - case ir_unop_sqrt: - case ir_unop_normalize: - assert(ir->type == ir->operands[0]->type); - break; - - case ir_unop_exp: - case ir_unop_log: - case ir_unop_exp2: - case ir_unop_log2: - case ir_unop_saturate: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); - assert(ir->type == ir->operands[0]->type); - break; - - case ir_unop_f2i: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); - assert(ir->type->base_type == GLSL_TYPE_INT); - break; - case ir_unop_f2u: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); - assert(ir->type->base_type == GLSL_TYPE_UINT); - break; - case ir_unop_i2f: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT); - assert(ir->type->base_type == GLSL_TYPE_FLOAT); - break; - case ir_unop_f2b: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); - assert(ir->type->base_type == GLSL_TYPE_BOOL); - break; - case ir_unop_b2f: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL); - assert(ir->type->base_type == GLSL_TYPE_FLOAT); - break; - case ir_unop_i2b: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT); - assert(ir->type->base_type == GLSL_TYPE_BOOL); - break; - case ir_unop_b2i: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL); - assert(ir->type->base_type == GLSL_TYPE_INT); - break; - case ir_unop_u2f: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT); - assert(ir->type->base_type == GLSL_TYPE_FLOAT); - break; - case ir_unop_i2u: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT); - assert(ir->type->base_type == GLSL_TYPE_UINT); - break; - case ir_unop_u2i: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT); - assert(ir->type->base_type == GLSL_TYPE_INT); - break; - case ir_unop_bitcast_i2f: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT); - assert(ir->type->base_type == GLSL_TYPE_FLOAT); - break; - case ir_unop_bitcast_f2i: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); - assert(ir->type->base_type == GLSL_TYPE_INT); - break; - case ir_unop_bitcast_u2f: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT); - assert(ir->type->base_type == GLSL_TYPE_FLOAT); - break; - case ir_unop_bitcast_f2u: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); - assert(ir->type->base_type == GLSL_TYPE_UINT); - break; - - case ir_unop_any: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL); - assert(ir->type == glsl_type::bool_type); - break; - - case ir_unop_trunc: - case ir_unop_round_even: - case ir_unop_ceil: - case ir_unop_floor: - case ir_unop_fract: - case ir_unop_sin: - case ir_unop_cos: - case ir_unop_sin_reduced: - case ir_unop_cos_reduced: - case ir_unop_dFdx: - case ir_unop_dFdx_coarse: - case ir_unop_dFdx_fine: - case ir_unop_dFdy: - case ir_unop_dFdy_coarse: - case ir_unop_dFdy_fine: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); - assert(ir->operands[0]->type == ir->type); - break; - - case ir_unop_pack_snorm_2x16: - case ir_unop_pack_unorm_2x16: - case ir_unop_pack_half_2x16: - assert(ir->type == glsl_type::uint_type); - assert(ir->operands[0]->type == glsl_type::vec2_type); - break; - - case ir_unop_pack_snorm_4x8: - case ir_unop_pack_unorm_4x8: - assert(ir->type == glsl_type::uint_type); - assert(ir->operands[0]->type == glsl_type::vec4_type); - break; - - case ir_unop_unpack_snorm_2x16: - case ir_unop_unpack_unorm_2x16: - case ir_unop_unpack_half_2x16: - assert(ir->type == glsl_type::vec2_type); - assert(ir->operands[0]->type == glsl_type::uint_type); - break; - - case ir_unop_unpack_snorm_4x8: - case ir_unop_unpack_unorm_4x8: - assert(ir->type == glsl_type::vec4_type); - assert(ir->operands[0]->type == glsl_type::uint_type); - break; - - case ir_unop_unpack_half_2x16_split_x: - case ir_unop_unpack_half_2x16_split_y: - assert(ir->type == glsl_type::float_type); - assert(ir->operands[0]->type == glsl_type::uint_type); - break; - - case ir_unop_bitfield_reverse: - assert(ir->operands[0]->type == ir->type); - assert(ir->type->is_integer()); - break; - - case ir_unop_bit_count: - case ir_unop_find_msb: - case ir_unop_find_lsb: - assert(ir->operands[0]->type->vector_elements == ir->type->vector_elements); - assert(ir->operands[0]->type->is_integer()); - assert(ir->type->base_type == GLSL_TYPE_INT); - break; - - case ir_unop_noise: - /* XXX what can we assert here? */ - break; - - case ir_unop_interpolate_at_centroid: - assert(ir->operands[0]->type == ir->type); - assert(ir->operands[0]->type->is_float()); - break; - - case ir_binop_add: - case ir_binop_sub: - case ir_binop_mul: - case ir_binop_div: - case ir_binop_mod: - case ir_binop_min: - case ir_binop_max: - case ir_binop_pow: - assert(ir->operands[0]->type->base_type == - ir->operands[1]->type->base_type); - - if (ir->operands[0]->type->is_scalar()) - assert(ir->operands[1]->type == ir->type); - else if (ir->operands[1]->type->is_scalar()) - assert(ir->operands[0]->type == ir->type); - else if (ir->operands[0]->type->is_vector() && - ir->operands[1]->type->is_vector()) { - assert(ir->operands[0]->type == ir->operands[1]->type); - assert(ir->operands[0]->type == ir->type); - } - break; - - case ir_binop_imul_high: - assert(ir->type == ir->operands[0]->type); - assert(ir->type == ir->operands[1]->type); - assert(ir->type->is_integer()); - break; - - case ir_binop_carry: - case ir_binop_borrow: - assert(ir->type == ir->operands[0]->type); - assert(ir->type == ir->operands[1]->type); - assert(ir->type->base_type == GLSL_TYPE_UINT); - break; - - case ir_binop_less: - case ir_binop_greater: - case ir_binop_lequal: - case ir_binop_gequal: - case ir_binop_equal: - case ir_binop_nequal: - /* The semantics of the IR operators differ from the GLSL <, >, <=, >=, - * ==, and != operators. The IR operators perform a component-wise - * comparison on scalar or vector types and return a boolean scalar or - * vector type of the same size. - */ - assert(ir->type->base_type == GLSL_TYPE_BOOL); - assert(ir->operands[0]->type == ir->operands[1]->type); - assert(ir->operands[0]->type->is_vector() - || ir->operands[0]->type->is_scalar()); - assert(ir->operands[0]->type->vector_elements - == ir->type->vector_elements); - break; - - case ir_binop_all_equal: - case ir_binop_any_nequal: - /* GLSL == and != operate on scalars, vectors, matrices and arrays, and - * return a scalar boolean. The IR matches that. - */ - assert(ir->type == glsl_type::bool_type); - assert(ir->operands[0]->type == ir->operands[1]->type); - break; - - case ir_binop_lshift: - case ir_binop_rshift: - assert(ir->operands[0]->type->is_integer() && - ir->operands[1]->type->is_integer()); - if (ir->operands[0]->type->is_scalar()) { - assert(ir->operands[1]->type->is_scalar()); - } - if (ir->operands[0]->type->is_vector() && - ir->operands[1]->type->is_vector()) { - assert(ir->operands[0]->type->components() == - ir->operands[1]->type->components()); - } - assert(ir->type == ir->operands[0]->type); - break; - - case ir_binop_bit_and: - case ir_binop_bit_xor: - case ir_binop_bit_or: - assert(ir->operands[0]->type->base_type == - ir->operands[1]->type->base_type); - assert(ir->type->is_integer()); - if (ir->operands[0]->type->is_vector() && - ir->operands[1]->type->is_vector()) { - assert(ir->operands[0]->type->vector_elements == - ir->operands[1]->type->vector_elements); - } - break; - - case ir_binop_logic_and: - case ir_binop_logic_xor: - case ir_binop_logic_or: - assert(ir->type == glsl_type::bool_type); - assert(ir->operands[0]->type == glsl_type::bool_type); - assert(ir->operands[1]->type == glsl_type::bool_type); - break; - - case ir_binop_dot: - assert(ir->type == glsl_type::float_type); - assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); - assert(ir->operands[0]->type->is_vector()); - assert(ir->operands[0]->type == ir->operands[1]->type); - break; - - case ir_binop_pack_half_2x16_split: - assert(ir->type == glsl_type::uint_type); - assert(ir->operands[0]->type == glsl_type::float_type); - assert(ir->operands[1]->type == glsl_type::float_type); - break; - - case ir_binop_bfm: - assert(ir->type->is_integer()); - assert(ir->operands[0]->type->is_integer()); - assert(ir->operands[1]->type->is_integer()); - break; - - case ir_binop_ubo_load: - assert(ir->operands[0]->type == glsl_type::uint_type); - - assert(ir->operands[1]->type == glsl_type::uint_type); - break; - - case ir_binop_ldexp: - assert(ir->operands[0]->type == ir->type); - assert(ir->operands[0]->type->is_float()); - assert(ir->operands[1]->type->base_type == GLSL_TYPE_INT); - assert(ir->operands[0]->type->components() == - ir->operands[1]->type->components()); - break; - - case ir_binop_vector_extract: - assert(ir->operands[0]->type->is_vector()); - assert(ir->operands[1]->type->is_scalar() - && ir->operands[1]->type->is_integer()); - break; - - case ir_binop_interpolate_at_offset: - assert(ir->operands[0]->type == ir->type); - assert(ir->operands[0]->type->is_float()); - assert(ir->operands[1]->type->components() == 2); - assert(ir->operands[1]->type->is_float()); - break; - - case ir_binop_interpolate_at_sample: - assert(ir->operands[0]->type == ir->type); - assert(ir->operands[0]->type->is_float()); - assert(ir->operands[1]->type == glsl_type::int_type); - break; - - case ir_triop_fma: - assert(ir->type->base_type == GLSL_TYPE_FLOAT); - assert(ir->type == ir->operands[0]->type); - assert(ir->type == ir->operands[1]->type); - assert(ir->type == ir->operands[2]->type); - break; - - case ir_triop_lrp: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); - assert(ir->operands[0]->type == ir->operands[1]->type); - assert(ir->operands[2]->type == ir->operands[0]->type || ir->operands[2]->type == glsl_type::float_type); - break; - - case ir_triop_csel: - assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL); - assert(ir->type->vector_elements == ir->operands[0]->type->vector_elements); - assert(ir->type == ir->operands[1]->type); - assert(ir->type == ir->operands[2]->type); - break; - - case ir_triop_bfi: - assert(ir->operands[0]->type->is_integer()); - assert(ir->operands[1]->type == ir->operands[2]->type); - assert(ir->operands[1]->type == ir->type); - break; - - case ir_triop_bitfield_extract: - assert(ir->operands[0]->type == ir->type); - assert(ir->operands[1]->type == glsl_type::int_type); - assert(ir->operands[2]->type == glsl_type::int_type); - break; - - case ir_triop_vector_insert: - assert(ir->operands[0]->type->is_vector()); - assert(ir->operands[1]->type->is_scalar()); - assert(ir->operands[0]->type->base_type == ir->operands[1]->type->base_type); - assert(ir->operands[2]->type->is_scalar() - && ir->operands[2]->type->is_integer()); - assert(ir->type == ir->operands[0]->type); - break; - - case ir_quadop_bitfield_insert: - assert(ir->operands[0]->type == ir->type); - assert(ir->operands[1]->type == ir->type); - assert(ir->operands[2]->type == glsl_type::int_type); - assert(ir->operands[3]->type == glsl_type::int_type); - break; - - case ir_quadop_vector: - /* The vector operator collects some number of scalars and generates a - * vector from them. - * - * - All of the operands must be scalar. - * - Number of operands must matche the size of the resulting vector. - * - Base type of the operands must match the base type of the result. - */ - assert(ir->type->is_vector()); - switch (ir->type->vector_elements) { - case 2: - assert(ir->operands[0]->type->is_scalar()); - assert(ir->operands[0]->type->base_type == ir->type->base_type); - assert(ir->operands[1]->type->is_scalar()); - assert(ir->operands[1]->type->base_type == ir->type->base_type); - assert(ir->operands[2] == NULL); - assert(ir->operands[3] == NULL); - break; - case 3: - assert(ir->operands[0]->type->is_scalar()); - assert(ir->operands[0]->type->base_type == ir->type->base_type); - assert(ir->operands[1]->type->is_scalar()); - assert(ir->operands[1]->type->base_type == ir->type->base_type); - assert(ir->operands[2]->type->is_scalar()); - assert(ir->operands[2]->type->base_type == ir->type->base_type); - assert(ir->operands[3] == NULL); - break; - case 4: - assert(ir->operands[0]->type->is_scalar()); - assert(ir->operands[0]->type->base_type == ir->type->base_type); - assert(ir->operands[1]->type->is_scalar()); - assert(ir->operands[1]->type->base_type == ir->type->base_type); - assert(ir->operands[2]->type->is_scalar()); - assert(ir->operands[2]->type->base_type == ir->type->base_type); - assert(ir->operands[3]->type->is_scalar()); - assert(ir->operands[3]->type->base_type == ir->type->base_type); - break; - default: - /* The is_vector assertion above should prevent execution from ever - * getting here. - */ - assert(!"Should not get here."); - break; - } - } - - return visit_continue; -} - -ir_visitor_status -ir_validate::visit_leave(ir_swizzle *ir) -{ - unsigned int chans[4] = {ir->mask.x, ir->mask.y, ir->mask.z, ir->mask.w}; - - for (unsigned int i = 0; i < ir->type->vector_elements; i++) { - if (chans[i] >= ir->val->type->vector_elements) { - printf("ir_swizzle @ %p specifies a channel not present " - "in the value.\n", (void *) ir); - ir->print(); - abort(); - } - } - - return visit_continue; -} - -ir_visitor_status -ir_validate::visit(ir_variable *ir) -{ - /* An ir_variable is the one thing that can (and will) appear multiple times - * in an IR tree. It is added to the hashtable so that it can be used - * in the ir_dereference_variable handler to ensure that a variable is - * declared before it is dereferenced. - */ - if (ir->name && ir->is_name_ralloced()) - assert(ralloc_parent(ir->name) == ir); - - hash_table_insert(ht, ir, ir); - - - /* If a variable is an array, verify that the maximum array index is in - * bounds. There was once an error in AST-to-HIR conversion that set this - * to be out of bounds. - */ - if (ir->type->array_size() > 0) { - if (ir->data.max_array_access >= ir->type->length) { - printf("ir_variable has maximum access out of bounds (%d vs %d)\n", - ir->data.max_array_access, ir->type->length - 1); - ir->print(); - abort(); - } - } - - /* If a variable is an interface block (or an array of interface blocks), - * verify that the maximum array index for each interface member is in - * bounds. - */ - if (ir->is_interface_instance()) { - const glsl_struct_field *fields = - ir->get_interface_type()->fields.structure; - for (unsigned i = 0; i < ir->get_interface_type()->length; i++) { - if (fields[i].type->array_size() > 0) { - const unsigned *const max_ifc_array_access = - ir->get_max_ifc_array_access(); - - assert(max_ifc_array_access != NULL); - - if (max_ifc_array_access[i] >= fields[i].type->length) { - printf("ir_variable has maximum access out of bounds for " - "field %s (%d vs %d)\n", fields[i].name, - max_ifc_array_access[i], fields[i].type->length); - ir->print(); - abort(); - } - } - } - } - - if (ir->constant_initializer != NULL && !ir->data.has_initializer) { - printf("ir_variable didn't have an initializer, but has a constant " - "initializer value.\n"); - ir->print(); - abort(); - } - - if (ir->data.mode == ir_var_uniform - && strncmp(ir->name, "gl_", 3) == 0 - && ir->get_state_slots() == NULL) { - printf("built-in uniform has no state\n"); - ir->print(); - abort(); - } - - return visit_continue; -} - -ir_visitor_status -ir_validate::visit_enter(ir_assignment *ir) -{ - const ir_dereference *const lhs = ir->lhs; - if (lhs->type->is_scalar() || lhs->type->is_vector()) { - if (ir->write_mask == 0) { - printf("Assignment LHS is %s, but write mask is 0:\n", - lhs->type->is_scalar() ? "scalar" : "vector"); - ir->print(); - abort(); - } - - int lhs_components = 0; - for (int i = 0; i < 4; i++) { - if (ir->write_mask & (1 << i)) - lhs_components++; - } - - if (lhs_components != ir->rhs->type->vector_elements) { - printf("Assignment count of LHS write mask channels enabled not\n" - "matching RHS vector size (%d LHS, %d RHS).\n", - lhs_components, ir->rhs->type->vector_elements); - ir->print(); - abort(); - } - } - - this->validate_ir(ir, this->data_enter); - - return visit_continue; -} - -ir_visitor_status -ir_validate::visit_enter(ir_call *ir) -{ - ir_function_signature *const callee = ir->callee; - - if (callee->ir_type != ir_type_function_signature) { - printf("IR called by ir_call is not ir_function_signature!\n"); - abort(); - } - - if (ir->return_deref) { - if (ir->return_deref->type != callee->return_type) { - printf("callee type %s does not match return storage type %s\n", - callee->return_type->name, ir->return_deref->type->name); - abort(); - } - } else if (callee->return_type != glsl_type::void_type) { - printf("ir_call has non-void callee but no return storage\n"); - abort(); - } - - const exec_node *formal_param_node = callee->parameters.head; - const exec_node *actual_param_node = ir->actual_parameters.head; - while (true) { - if (formal_param_node->is_tail_sentinel() - != actual_param_node->is_tail_sentinel()) { - printf("ir_call has the wrong number of parameters:\n"); - goto dump_ir; - } - if (formal_param_node->is_tail_sentinel()) { - break; - } - const ir_variable *formal_param - = (const ir_variable *) formal_param_node; - const ir_rvalue *actual_param - = (const ir_rvalue *) actual_param_node; - if (formal_param->type != actual_param->type) { - printf("ir_call parameter type mismatch:\n"); - goto dump_ir; - } - if (formal_param->data.mode == ir_var_function_out - || formal_param->data.mode == ir_var_function_inout) { - if (!actual_param->is_lvalue()) { - printf("ir_call out/inout parameters must be lvalues:\n"); - goto dump_ir; - } - } - formal_param_node = formal_param_node->next; - actual_param_node = actual_param_node->next; - } - - return visit_continue; - -dump_ir: - ir->print(); - printf("callee:\n"); - callee->print(); - abort(); - return visit_stop; -} - -void -ir_validate::validate_ir(ir_instruction *ir, void *data) -{ - struct hash_table *ht = (struct hash_table *) data; - - if (hash_table_find(ht, ir)) { - printf("Instruction node present twice in ir tree:\n"); - ir->print(); - printf("\n"); - abort(); - } - hash_table_insert(ht, ir, ir); -} - -void -check_node_type(ir_instruction *ir, void *data) -{ - (void) data; - - if (ir->ir_type >= ir_type_max) { - printf("Instruction node with unset type\n"); - ir->print(); printf("\n"); - } - ir_rvalue *value = ir->as_rvalue(); - if (value != NULL) - assert(value->type != glsl_type::error_type); -} - -void -validate_ir_tree(exec_list *instructions) -{ - /* We shouldn't have any reason to validate IR in a release build, - * and it's half composed of assert()s anyway which wouldn't do - * anything. - */ -#ifdef DEBUG - ir_validate v; - - v.run(instructions); - - foreach_in_list(ir_instruction, ir, instructions) { - visit_tree(ir, check_node_type, NULL); - } -#endif -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_variable_refcount.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_variable_refcount.cpp deleted file mode 100644 index 679ddd4fe..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_variable_refcount.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file ir_variable_refcount.cpp - * - * Provides a visitor which produces a list of variables referenced, - * how many times they were referenced and assigned, and whether they - * were defined in the scope. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_variable_refcount.h" -#include "glsl_types.h" -#include "util/hash_table.h" - -ir_variable_refcount_visitor::ir_variable_refcount_visitor() -{ - this->mem_ctx = ralloc_context(NULL); - this->ht = _mesa_hash_table_create(NULL, _mesa_key_pointer_equal); - this->current_lhs = NULL; -} - -static void -free_entry(struct hash_entry *entry) -{ - ir_variable_refcount_entry *ivre = (ir_variable_refcount_entry *) entry->data; - delete ivre; -} - -ir_variable_refcount_visitor::~ir_variable_refcount_visitor() -{ - ralloc_free(this->mem_ctx); - _mesa_hash_table_destroy(this->ht, free_entry); -} - -// constructor -ir_variable_refcount_entry::ir_variable_refcount_entry(ir_variable *var) -{ - this->var = var; - assign = NULL; - assigned_count = 0; - declaration = false; - referenced_count = 0; - referenced_count_noself = 0; -} - - -ir_variable_refcount_entry * -ir_variable_refcount_visitor::get_variable_entry(ir_variable *var) -{ - assert(var); - - struct hash_entry *e = _mesa_hash_table_search(this->ht, - _mesa_hash_pointer(var), - var); - if (e) - return (ir_variable_refcount_entry *)e->data; - - ir_variable_refcount_entry *entry = new ir_variable_refcount_entry(var); - assert(entry->referenced_count == 0); - _mesa_hash_table_insert(this->ht, _mesa_hash_pointer(var), var, entry); - - return entry; -} - -ir_variable_refcount_entry * -ir_variable_refcount_visitor::find_variable_entry(ir_variable *var) -{ - assert(var); - struct hash_entry *e = _mesa_hash_table_search(this->ht, - _mesa_hash_pointer(var), - var); - if (e) - return (ir_variable_refcount_entry *)e->data; - - return NULL; -} - - - -ir_visitor_status -ir_variable_refcount_visitor::visit(ir_variable *ir) -{ - ir_variable_refcount_entry *entry = this->get_variable_entry(ir); - if (entry) - entry->declaration = true; - - return visit_continue; -} - - -ir_visitor_status -ir_variable_refcount_visitor::visit(ir_dereference_variable *ir) -{ - ir_variable *const var = ir->variable_referenced(); - ir_variable_refcount_entry *entry = this->get_variable_entry(var); - if (entry) { - entry->referenced_count++; - if (this->in_assignee || var != this->current_lhs) - entry->referenced_count_noself++; - } - return visit_continue; -} - - -ir_visitor_status -ir_variable_refcount_visitor::visit_enter(ir_function_signature *ir) -{ - /* We don't want to descend into the function parameters and - * dead-code eliminate them, so just accept the body here. - */ - visit_list_elements(this, &ir->body); - return visit_continue_with_parent; -} - -ir_visitor_status -ir_variable_refcount_visitor::visit_enter(ir_assignment *ir) -{ - assert(this->current_lhs == NULL); - this->current_lhs = ir->lhs->variable_referenced(); - return visit_continue; -} - - -ir_visitor_status -ir_variable_refcount_visitor::visit_leave(ir_assignment *ir) -{ - this->current_lhs = NULL; - ir_variable_refcount_entry *entry; - entry = this->get_variable_entry(ir->lhs->variable_referenced()); - if (entry) { - entry->assigned_count++; - if (entry->assign == NULL) - entry->assign = ir; - } - - return visit_continue; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_variable_refcount.h b/3rdparty/glsl-optimizer/src/glsl/ir_variable_refcount.h deleted file mode 100644 index 56cdbe0dc..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_variable_refcount.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file ir_variable_refcount.h - * - * Provides a visitor which produces a list of variables referenced, - * how many times they were referenced and assigned, and whether they - * were defined in the scope. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "glsl_types.h" - -class ir_variable_refcount_entry -{ -public: - ir_variable_refcount_entry(ir_variable *var); - - ir_variable *var; /* The key: the variable's pointer. */ - ir_assignment *assign; /* An assignment to the variable, if any */ - - /** Number of times the variable is referenced, including assignments. */ - unsigned referenced_count; - - /** Number of times the variable was referenced, excluding cases when it was on RHS - * of assignment of the same variable. */ - unsigned referenced_count_noself; - - /** Number of times the variable is assigned. */ - unsigned assigned_count; - - bool declaration; /* If the variable had a decl in the instruction stream */ -}; - -class ir_variable_refcount_visitor : public ir_hierarchical_visitor { -public: - ir_variable_refcount_visitor(void); - ~ir_variable_refcount_visitor(void); - - virtual ir_visitor_status visit(ir_variable *); - virtual ir_visitor_status visit(ir_dereference_variable *); - - virtual ir_visitor_status visit_enter(ir_function_signature *); - virtual ir_visitor_status visit_enter(ir_assignment *); - virtual ir_visitor_status visit_leave(ir_assignment *); - - ir_variable_refcount_entry *get_variable_entry(ir_variable *var); - ir_variable_refcount_entry *find_variable_entry(ir_variable *var); - - struct hash_table *ht; - ir_variable* current_lhs; - - void *mem_ctx; -}; diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_visitor.h b/3rdparty/glsl-optimizer/src/glsl/ir_visitor.h deleted file mode 100644 index dc31797e2..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/ir_visitor.h +++ /dev/null @@ -1,93 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef IR_VISITOR_H -#define IR_VISITOR_H - -#ifdef __cplusplus -/** - * Abstract base class of visitors of IR instruction trees - */ -class ir_visitor { -public: - virtual ~ir_visitor() - { - /* empty */ - } - - /** - * \name Visit methods - * - * As typical for the visitor pattern, there must be one \c visit method for - * each concrete subclass of \c ir_instruction. Virtual base classes within - * the hierarchy should not have \c visit methods. - */ - /*@{*/ - virtual void visit(class ir_rvalue *) { assert(!"unhandled error_type"); } - virtual void visit(class ir_variable *) = 0; - virtual void visit(class ir_function_signature *) = 0; - virtual void visit(class ir_function *) = 0; - virtual void visit(class ir_expression *) = 0; - virtual void visit(class ir_texture *) = 0; - virtual void visit(class ir_swizzle *) = 0; - virtual void visit(class ir_dereference_variable *) = 0; - virtual void visit(class ir_dereference_array *) = 0; - virtual void visit(class ir_dereference_record *) = 0; - virtual void visit(class ir_assignment *) = 0; - virtual void visit(class ir_constant *) = 0; - virtual void visit(class ir_call *) = 0; - virtual void visit(class ir_return *) = 0; - virtual void visit(class ir_discard *) = 0; - virtual void visit(class ir_if *) = 0; - virtual void visit(class ir_loop *) = 0; - virtual void visit(class ir_loop_jump *) = 0; - virtual void visit(class ir_precision_statement *) = 0; - virtual void visit(class ir_typedecl_statement *) = 0; - virtual void visit(class ir_emit_vertex *) = 0; - virtual void visit(class ir_end_primitive *) = 0; - /*@}*/ -}; - -/* NOTE: function calls may never return due to discards inside them - * This is usually not an issue, but if it is, keep it in mind - */ -class ir_control_flow_visitor : public ir_visitor { -public: - virtual void visit(class ir_variable *) {} - virtual void visit(class ir_expression *) {} - virtual void visit(class ir_texture *) {} - virtual void visit(class ir_swizzle *) {} - virtual void visit(class ir_dereference_variable *) {} - virtual void visit(class ir_dereference_array *) {} - virtual void visit(class ir_dereference_record *) {} - virtual void visit(class ir_assignment *) {} - virtual void visit(class ir_constant *) {} - virtual void visit(class ir_call *) {} - virtual void visit(class ir_emit_vertex *) {} - virtual void visit(class ir_end_primitive *) {} -}; -#endif /* __cplusplus */ - -#endif /* IR_VISITOR_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/link_atomics.cpp b/3rdparty/glsl-optimizer/src/glsl/link_atomics.cpp deleted file mode 100644 index cc0c86c1b..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/link_atomics.cpp +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright © 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "glsl_parser_extras.h" -#include "ir.h" -#include "ir_uniform.h" -#include "linker.h" -#include "program/hash_table.h" -#include "main/errors.h" -#include "main/macros.h" - -namespace { - /* - * Atomic counter as seen by the program. - */ - struct active_atomic_counter { - unsigned id; - ir_variable *var; - }; - - /* - * Atomic counter buffer referenced by the program. There is a one - * to one correspondence between these and the objects that can be - * queried using glGetActiveAtomicCounterBufferiv(). - */ - struct active_atomic_buffer { - active_atomic_buffer() - : counters(0), num_counters(0), stage_references(), size(0) - {} - - ~active_atomic_buffer() - { - free(counters); - } - - void push_back(unsigned id, ir_variable *var) - { - active_atomic_counter *new_counters; - - new_counters = (active_atomic_counter *) - realloc(counters, sizeof(active_atomic_counter) * - (num_counters + 1)); - - if (new_counters == NULL) { - _mesa_error_no_memory(__func__); - return; - } - - counters = new_counters; - counters[num_counters].id = id; - counters[num_counters].var = var; - num_counters++; - } - - active_atomic_counter *counters; - unsigned num_counters; - unsigned stage_references[MESA_SHADER_STAGES]; - unsigned size; - }; - - int - cmp_actives(const void *a, const void *b) - { - const active_atomic_counter *const first = (active_atomic_counter *) a; - const active_atomic_counter *const second = (active_atomic_counter *) b; - - return int(first->var->data.atomic.offset) - int(second->var->data.atomic.offset); - } - - bool - check_atomic_counters_overlap(const ir_variable *x, const ir_variable *y) - { - return ((x->data.atomic.offset >= y->data.atomic.offset && - x->data.atomic.offset < y->data.atomic.offset + y->type->atomic_size()) || - (y->data.atomic.offset >= x->data.atomic.offset && - y->data.atomic.offset < x->data.atomic.offset + x->type->atomic_size())); - } - - active_atomic_buffer * - find_active_atomic_counters(struct gl_context *ctx, - struct gl_shader_program *prog, - unsigned *num_buffers) - { - active_atomic_buffer *const buffers = - new active_atomic_buffer[ctx->Const.MaxAtomicBufferBindings]; - - *num_buffers = 0; - - for (unsigned i = 0; i < MESA_SHADER_STAGES; ++i) { - struct gl_shader *sh = prog->_LinkedShaders[i]; - if (sh == NULL) - continue; - - foreach_in_list(ir_instruction, node, sh->ir) { - ir_variable *var = node->as_variable(); - - if (var && var->type->contains_atomic()) { - unsigned id = 0; - bool found = prog->UniformHash->get(id, var->name); - assert(found); - (void) found; - active_atomic_buffer *buf = &buffers[var->data.binding]; - - /* If this is the first time the buffer is used, increment - * the counter of buffers used. - */ - if (buf->size == 0) - (*num_buffers)++; - - buf->push_back(id, var); - - buf->stage_references[i]++; - buf->size = MAX2(buf->size, var->data.atomic.offset + - var->type->atomic_size()); - } - } - } - - for (unsigned i = 0; i < ctx->Const.MaxAtomicBufferBindings; i++) { - if (buffers[i].size == 0) - continue; - - qsort(buffers[i].counters, buffers[i].num_counters, - sizeof(active_atomic_counter), - cmp_actives); - - for (unsigned j = 1; j < buffers[i].num_counters; j++) { - /* If an overlapping counter found, it must be a reference to the - * same counter from a different shader stage. - */ - if (check_atomic_counters_overlap(buffers[i].counters[j-1].var, - buffers[i].counters[j].var) - && strcmp(buffers[i].counters[j-1].var->name, - buffers[i].counters[j].var->name) != 0) { - linker_error(prog, "Atomic counter %s declared at offset %d " - "which is already in use.", - buffers[i].counters[j].var->name, - buffers[i].counters[j].var->data.atomic.offset); - } - } - } - return buffers; - } -} - -void -link_assign_atomic_counter_resources(struct gl_context *ctx, - struct gl_shader_program *prog) -{ - unsigned num_buffers; - active_atomic_buffer *abs = - find_active_atomic_counters(ctx, prog, &num_buffers); - - prog->AtomicBuffers = rzalloc_array(prog, gl_active_atomic_buffer, - num_buffers); - prog->NumAtomicBuffers = num_buffers; - - unsigned i = 0; - for (unsigned binding = 0; - binding < ctx->Const.MaxAtomicBufferBindings; - binding++) { - - /* If the binding was not used, skip. - */ - if (abs[binding].size == 0) - continue; - - active_atomic_buffer &ab = abs[binding]; - gl_active_atomic_buffer &mab = prog->AtomicBuffers[i]; - - /* Assign buffer-specific fields. */ - mab.Binding = binding; - mab.MinimumSize = ab.size; - mab.Uniforms = rzalloc_array(prog->AtomicBuffers, GLuint, - ab.num_counters); - mab.NumUniforms = ab.num_counters; - - /* Assign counter-specific fields. */ - for (unsigned j = 0; j < ab.num_counters; j++) { - ir_variable *const var = ab.counters[j].var; - const unsigned id = ab.counters[j].id; - gl_uniform_storage *const storage = &prog->UniformStorage[id]; - - mab.Uniforms[j] = id; - if (!var->data.explicit_binding) - var->data.binding = i; - - storage->atomic_buffer_index = i; - storage->offset = var->data.atomic.offset; - storage->array_stride = (var->type->is_array() ? - var->type->element_type()->atomic_size() : 0); - } - - /* Assign stage-specific fields. */ - for (unsigned j = 0; j < MESA_SHADER_STAGES; ++j) - mab.StageReferences[j] = - (ab.stage_references[j] ? GL_TRUE : GL_FALSE); - - i++; - } - - delete [] abs; - assert(i == num_buffers); -} - -void -link_check_atomic_counter_resources(struct gl_context *ctx, - struct gl_shader_program *prog) -{ - unsigned num_buffers; - active_atomic_buffer *const abs = - find_active_atomic_counters(ctx, prog, &num_buffers); - unsigned atomic_counters[MESA_SHADER_STAGES] = {}; - unsigned atomic_buffers[MESA_SHADER_STAGES] = {}; - unsigned total_atomic_counters = 0; - unsigned total_atomic_buffers = 0; - - /* Sum the required resources. Note that this counts buffers and - * counters referenced by several shader stages multiple times - * against the combined limit -- That's the behavior the spec - * requires. - */ - for (unsigned i = 0; i < ctx->Const.MaxAtomicBufferBindings; i++) { - if (abs[i].size == 0) - continue; - - for (unsigned j = 0; j < MESA_SHADER_STAGES; ++j) { - const unsigned n = abs[i].stage_references[j]; - - if (n) { - atomic_counters[j] += n; - total_atomic_counters += n; - atomic_buffers[j]++; - total_atomic_buffers++; - } - } - } - - /* Check that they are within the supported limits. */ - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - if (atomic_counters[i] > ctx->Const.Program[i].MaxAtomicCounters) - linker_error(prog, "Too many %s shader atomic counters", - _mesa_shader_stage_to_string(i)); - - if (atomic_buffers[i] > ctx->Const.Program[i].MaxAtomicBuffers) - linker_error(prog, "Too many %s shader atomic counter buffers", - _mesa_shader_stage_to_string(i)); - } - - if (total_atomic_counters > ctx->Const.MaxCombinedAtomicCounters) - linker_error(prog, "Too many combined atomic counters"); - - if (total_atomic_buffers > ctx->Const.MaxCombinedAtomicBuffers) - linker_error(prog, "Too many combined atomic buffers"); - - delete [] abs; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/link_functions.cpp b/3rdparty/glsl-optimizer/src/glsl/link_functions.cpp deleted file mode 100644 index b01709760..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/link_functions.cpp +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "main/core.h" -#include "glsl_symbol_table.h" -#include "glsl_parser_extras.h" -#include "ir.h" -#include "program.h" -#include "program/hash_table.h" -#include "linker.h" - -static ir_function_signature * -find_matching_signature(const char *name, const exec_list *actual_parameters, - gl_shader **shader_list, unsigned num_shaders, - bool use_builtin); - -namespace { - -class call_link_visitor : public ir_hierarchical_visitor { -public: - call_link_visitor(gl_shader_program *prog, gl_shader *linked, - gl_shader **shader_list, unsigned num_shaders) - { - this->prog = prog; - this->shader_list = shader_list; - this->num_shaders = num_shaders; - this->success = true; - this->linked = linked; - - this->locals = hash_table_ctor(0, hash_table_pointer_hash, - hash_table_pointer_compare); - } - - ~call_link_visitor() - { - hash_table_dtor(this->locals); - } - - virtual ir_visitor_status visit(ir_variable *ir) - { - hash_table_insert(locals, ir, ir); - return visit_continue; - } - - virtual ir_visitor_status visit_enter(ir_call *ir) - { - /* If ir is an ir_call from a function that was imported from another - * shader callee will point to an ir_function_signature in the original - * shader. In this case the function signature MUST NOT BE MODIFIED. - * Doing so will modify the original shader. This may prevent that - * shader from being linkable in other programs. - */ - const ir_function_signature *const callee = ir->callee; - assert(callee != NULL); - const char *const name = callee->function_name(); - - /* Determine if the requested function signature already exists in the - * final linked shader. If it does, use it as the target of the call. - */ - ir_function_signature *sig = - find_matching_signature(name, &callee->parameters, &linked, 1, - ir->use_builtin); - if (sig != NULL) { - ir->callee = sig; - return visit_continue; - } - - /* Try to find the signature in one of the other shaders that is being - * linked. If it's not found there, return an error. - */ - sig = find_matching_signature(name, &ir->actual_parameters, shader_list, - num_shaders, ir->use_builtin); - if (sig == NULL) { - /* FINISHME: Log the full signature of unresolved function. - */ - linker_error(this->prog, "unresolved reference to function `%s'\n", - name); - this->success = false; - return visit_stop; - } - - /* Find the prototype information in the linked shader. Generate any - * details that may be missing. - */ - ir_function *f = linked->symbols->get_function(name); - if (f == NULL) { - f = new(linked) ir_function(name); - - /* Add the new function to the linked IR. Put it at the end - * so that it comes after any global variable declarations - * that it refers to. - */ - linked->symbols->add_function(f); - linked->ir->push_tail(f); - } - - ir_function_signature *linked_sig = - f->exact_matching_signature(NULL, &callee->parameters); - if ((linked_sig == NULL) - || ((linked_sig != NULL) - && (linked_sig->is_builtin() != ir->use_builtin))) { - linked_sig = new(linked) ir_function_signature(callee->return_type, callee->precision); - f->add_signature(linked_sig); - } - - /* At this point linked_sig and called may be the same. If ir is an - * ir_call from linked then linked_sig and callee will be - * ir_function_signatures that have no definitions (is_defined is false). - */ - assert(!linked_sig->is_defined); - assert(linked_sig->body.is_empty()); - - /* Create an in-place clone of the function definition. This multistep - * process introduces some complexity here, but it has some advantages. - * The parameter list and the and function body are cloned separately. - * The clone of the parameter list is used to prime the hashtable used - * to replace variable references in the cloned body. - * - * The big advantage is that the ir_function_signature does not change. - * This means that we don't have to process the rest of the IR tree to - * patch ir_call nodes. In addition, there is no way to remove or - * replace signature stored in a function. One could easily be added, - * but this avoids the need. - */ - struct hash_table *ht = hash_table_ctor(0, hash_table_pointer_hash, - hash_table_pointer_compare); - exec_list formal_parameters; - foreach_in_list(const ir_instruction, original, &sig->parameters) { - assert(const_cast(original)->as_variable()); - - ir_instruction *copy = original->clone(linked, ht); - formal_parameters.push_tail(copy); - } - - linked_sig->replace_parameters(&formal_parameters); - - linked_sig->is_intrinsic = sig->is_intrinsic; - - if (sig->is_defined) { - foreach_in_list(const ir_instruction, original, &sig->body) { - ir_instruction *copy = original->clone(linked, ht); - linked_sig->body.push_tail(copy); - } - - linked_sig->is_defined = true; - } - - hash_table_dtor(ht); - - /* Patch references inside the function to things outside the function - * (i.e., function calls and global variables). - */ - linked_sig->accept(this); - - ir->callee = linked_sig; - - return visit_continue; - } - - virtual ir_visitor_status visit_leave(ir_call *ir) - { - /* Traverse list of function parameters, and for array parameters - * propagate max_array_access. Otherwise arrays that are only referenced - * from inside functions via function parameters will be incorrectly - * optimized. This will lead to incorrect code being generated (or worse). - * Do it when leaving the node so the children would propagate their - * array accesses first. - */ - - const exec_node *formal_param_node = ir->callee->parameters.get_head(); - if (formal_param_node) { - const exec_node *actual_param_node = ir->actual_parameters.get_head(); - while (!actual_param_node->is_tail_sentinel()) { - ir_variable *formal_param = (ir_variable *) formal_param_node; - ir_rvalue *actual_param = (ir_rvalue *) actual_param_node; - - formal_param_node = formal_param_node->get_next(); - actual_param_node = actual_param_node->get_next(); - - if (formal_param->type->is_array()) { - ir_dereference_variable *deref = actual_param->as_dereference_variable(); - if (deref && deref->var && deref->var->type->is_array()) { - deref->var->data.max_array_access = - MAX2(formal_param->data.max_array_access, - deref->var->data.max_array_access); - } - } - } - } - return visit_continue; - } - - virtual ir_visitor_status visit(ir_dereference_variable *ir) - { - if (hash_table_find(locals, ir->var) == NULL) { - /* The non-function variable must be a global, so try to find the - * variable in the shader's symbol table. If the variable is not - * found, then it's a global that *MUST* be defined in the original - * shader. - */ - ir_variable *var = linked->symbols->get_variable(ir->var->name); - if (var == NULL) { - /* Clone the ir_variable that the dereference already has and add - * it to the linked shader. - */ - var = ir->var->clone(linked, NULL); - linked->symbols->add_variable(var); - linked->ir->push_head(var); - } else { - if (var->type->is_array()) { - /* It is possible to have a global array declared in multiple - * shaders without a size. The array is implicitly sized by - * the maximal access to it in *any* shader. Because of this, - * we need to track the maximal access to the array as linking - * pulls more functions in that access the array. - */ - var->data.max_array_access = - MAX2(var->data.max_array_access, - ir->var->data.max_array_access); - - if (var->type->length == 0 && ir->var->type->length != 0) - var->type = ir->var->type; - } - if (var->is_interface_instance()) { - /* Similarly, we need implicit sizes of arrays within interface - * blocks to be sized by the maximal access in *any* shader. - */ - unsigned *const linked_max_ifc_array_access = - var->get_max_ifc_array_access(); - unsigned *const ir_max_ifc_array_access = - ir->var->get_max_ifc_array_access(); - - assert(linked_max_ifc_array_access != NULL); - assert(ir_max_ifc_array_access != NULL); - - for (unsigned i = 0; i < var->get_interface_type()->length; - i++) { - linked_max_ifc_array_access[i] = - MAX2(linked_max_ifc_array_access[i], - ir_max_ifc_array_access[i]); - } - } - } - - ir->var = var; - } - - return visit_continue; - } - - /** Was function linking successful? */ - bool success; - -private: - /** - * Shader program being linked - * - * This is only used for logging error messages. - */ - gl_shader_program *prog; - - /** List of shaders available for linking. */ - gl_shader **shader_list; - - /** Number of shaders available for linking. */ - unsigned num_shaders; - - /** - * Final linked shader - * - * This is used two ways. It is used to find global variables in the - * linked shader that are accessed by the function. It is also used to add - * global variables from the shader where the function originated. - */ - gl_shader *linked; - - /** - * Table of variables local to the function. - */ - hash_table *locals; -}; - -} /* anonymous namespace */ - -/** - * Searches a list of shaders for a particular function definition - */ -ir_function_signature * -find_matching_signature(const char *name, const exec_list *actual_parameters, - gl_shader **shader_list, unsigned num_shaders, - bool use_builtin) -{ - for (unsigned i = 0; i < num_shaders; i++) { - ir_function *const f = shader_list[i]->symbols->get_function(name); - - if (f == NULL) - continue; - - ir_function_signature *sig = - f->matching_signature(NULL, actual_parameters, use_builtin); - - if ((sig == NULL) || - (!sig->is_defined && !sig->is_intrinsic)) - continue; - - /* If this function expects to bind to a built-in function and the - * signature that we found isn't a built-in, keep looking. Also keep - * looking if we expect a non-built-in but found a built-in. - */ - if (use_builtin != sig->is_builtin()) - continue; - - return sig; - } - - return NULL; -} - - -bool -link_function_calls(gl_shader_program *prog, gl_shader *main, - gl_shader **shader_list, unsigned num_shaders) -{ - call_link_visitor v(prog, main, shader_list, num_shaders); - - v.run(main->ir); - return v.success; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/link_interface_blocks.cpp b/3rdparty/glsl-optimizer/src/glsl/link_interface_blocks.cpp deleted file mode 100644 index 0ce502d4f..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/link_interface_blocks.cpp +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Copyright © 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file link_interface_blocks.cpp - * Linker support for GLSL's interface blocks. - */ - -#include "ir.h" -#include "glsl_symbol_table.h" -#include "linker.h" -#include "main/macros.h" -#include "program/hash_table.h" - - -namespace { - -/** - * Information about a single interface block definition that we need to keep - * track of in order to check linkage rules. - * - * Note: this class is expected to be short lived, so it doesn't make copies - * of the strings it references; it simply borrows the pointers from the - * ir_variable class. - */ -struct interface_block_definition -{ - /** - * Extract an interface block definition from an ir_variable that - * represents either the interface instance (for named interfaces), or a - * member of the interface (for unnamed interfaces). - */ - explicit interface_block_definition(const ir_variable *var) - : type(var->get_interface_type()), - instance_name(NULL), - array_size(-1) - { - if (var->is_interface_instance()) { - instance_name = var->name; - if (var->type->is_array()) - array_size = var->type->length; - } - explicitly_declared = (var->data.how_declared != ir_var_declared_implicitly); - } - - /** - * Interface block type - */ - const glsl_type *type; - - /** - * For a named interface block, the instance name. Otherwise NULL. - */ - const char *instance_name; - - /** - * For an interface block array, the array size (or 0 if unsized). - * Otherwise -1. - */ - int array_size; - - /** - * True if this interface block was explicitly declared in the shader; - * false if it was an implicitly declared built-in interface block. - */ - bool explicitly_declared; -}; - - -/** - * Check if two interfaces match, according to intrastage interface matching - * rules. If they do, and the first interface uses an unsized array, it will - * be updated to reflect the array size declared in the second interface. - */ -bool -intrastage_match(interface_block_definition *a, - const interface_block_definition *b, - ir_variable_mode mode) -{ - /* Types must match. */ - if (a->type != b->type) { - /* Exception: if both the interface blocks are implicitly declared, - * don't force their types to match. They might mismatch due to the two - * shaders using different GLSL versions, and that's ok. - */ - if (a->explicitly_declared || b->explicitly_declared) - return false; - } - - /* Presence/absence of interface names must match. */ - if ((a->instance_name == NULL) != (b->instance_name == NULL)) - return false; - - /* For uniforms, instance names need not match. For shader ins/outs, - * it's not clear from the spec whether they need to match, but - * Mesa's implementation relies on them matching. - */ - if (a->instance_name != NULL && mode != ir_var_uniform && - strcmp(a->instance_name, b->instance_name) != 0) { - return false; - } - - /* Array vs. nonarray must be consistent, and sizes must be - * consistent, with the exception that unsized arrays match sized - * arrays. - */ - if ((a->array_size == -1) != (b->array_size == -1)) - return false; - if (b->array_size != 0) { - if (a->array_size == 0) - a->array_size = b->array_size; - else if (a->array_size != b->array_size) - return false; - } - - return true; -} - - -/** - * Check if two interfaces match, according to interstage (in/out) interface - * matching rules. - * - * If \c extra_array_level is true, then vertex-to-geometry shader matching - * rules are enforced (i.e. a successful match requires the consumer interface - * to be an array and the producer interface to be a non-array). - */ -bool -interstage_match(const interface_block_definition *producer, - const interface_block_definition *consumer, - bool extra_array_level) -{ - /* Unsized arrays should not occur during interstage linking. They - * should have all been assigned a size by link_intrastage_shaders. - */ - assert(consumer->array_size != 0); - assert(producer->array_size != 0); - - /* Types must match. */ - if (consumer->type != producer->type) { - /* Exception: if both the interface blocks are implicitly declared, - * don't force their types to match. They might mismatch due to the two - * shaders using different GLSL versions, and that's ok. - */ - if (consumer->explicitly_declared || producer->explicitly_declared) - return false; - } - if (extra_array_level) { - /* Consumer must be an array, and producer must not. */ - if (consumer->array_size == -1) - return false; - if (producer->array_size != -1) - return false; - } else { - /* Array vs. nonarray must be consistent, and sizes must be consistent. - * Since unsized arrays have been ruled out, we can check this by just - * making sure the sizes are equal. - */ - if (consumer->array_size != producer->array_size) - return false; - } - return true; -} - - -/** - * This class keeps track of a mapping from an interface block name to the - * necessary information about that interface block to determine whether to - * generate a link error. - * - * Note: this class is expected to be short lived, so it doesn't make copies - * of the strings it references; it simply borrows the pointers from the - * ir_variable class. - */ -class interface_block_definitions -{ -public: - interface_block_definitions() - : mem_ctx(ralloc_context(NULL)), - ht(hash_table_ctor(0, hash_table_string_hash, - hash_table_string_compare)) - { - } - - ~interface_block_definitions() - { - hash_table_dtor(ht); - ralloc_free(mem_ctx); - } - - /** - * Lookup the interface definition having the given block name. Return - * NULL if none is found. - */ - interface_block_definition *lookup(const char *block_name) - { - return (interface_block_definition *) hash_table_find(ht, block_name); - } - - /** - * Add a new interface definition. - */ - void store(const interface_block_definition &def) - { - interface_block_definition *hash_entry = - rzalloc(mem_ctx, interface_block_definition); - *hash_entry = def; - hash_table_insert(ht, hash_entry, def.type->name); - } - -private: - /** - * Ralloc context for data structures allocated by this class. - */ - void *mem_ctx; - - /** - * Hash table mapping interface block name to an \c - * interface_block_definition struct. interface_block_definition structs - * are allocated using \c mem_ctx. - */ - hash_table *ht; -}; - - -}; /* anonymous namespace */ - - -void -validate_intrastage_interface_blocks(struct gl_shader_program *prog, - const gl_shader **shader_list, - unsigned num_shaders) -{ - interface_block_definitions in_interfaces; - interface_block_definitions out_interfaces; - interface_block_definitions uniform_interfaces; - - for (unsigned int i = 0; i < num_shaders; i++) { - if (shader_list[i] == NULL) - continue; - - foreach_in_list(ir_instruction, node, shader_list[i]->ir) { - ir_variable *var = node->as_variable(); - if (!var) - continue; - - const glsl_type *iface_type = var->get_interface_type(); - - if (iface_type == NULL) - continue; - - interface_block_definitions *definitions; - switch (var->data.mode) { - case ir_var_shader_in: - definitions = &in_interfaces; - break; - case ir_var_shader_out: - definitions = &out_interfaces; - break; - case ir_var_uniform: - definitions = &uniform_interfaces; - break; - default: - /* Only in, out, and uniform interfaces are legal, so we should - * never get here. - */ - assert(!"illegal interface type"); - continue; - } - - const interface_block_definition def(var); - interface_block_definition *prev_def = - definitions->lookup(iface_type->name); - - if (prev_def == NULL) { - /* This is the first time we've seen the interface, so save - * it into the appropriate data structure. - */ - definitions->store(def); - } else if (!intrastage_match(prev_def, &def, - (ir_variable_mode) var->data.mode)) { - linker_error(prog, "definitions of interface block `%s' do not" - " match\n", iface_type->name); - return; - } - } - } -} - -void -validate_interstage_inout_blocks(struct gl_shader_program *prog, - const gl_shader *producer, - const gl_shader *consumer) -{ - interface_block_definitions definitions; - const bool extra_array_level = consumer->Stage == MESA_SHADER_GEOMETRY; - - /* Add input interfaces from the consumer to the symbol table. */ - foreach_in_list(ir_instruction, node, consumer->ir) { - ir_variable *var = node->as_variable(); - if (!var || !var->get_interface_type() || var->data.mode != ir_var_shader_in) - continue; - - definitions.store(interface_block_definition(var)); - } - - /* Verify that the producer's output interfaces match. */ - foreach_in_list(ir_instruction, node, producer->ir) { - ir_variable *var = node->as_variable(); - if (!var || !var->get_interface_type() || var->data.mode != ir_var_shader_out) - continue; - - interface_block_definition *consumer_def = - definitions.lookup(var->get_interface_type()->name); - - /* The consumer doesn't use this output block. Ignore it. */ - if (consumer_def == NULL) - continue; - - const interface_block_definition producer_def(var); - - if (!interstage_match(&producer_def, consumer_def, extra_array_level)) { - linker_error(prog, "definitions of interface block `%s' do not " - "match\n", var->get_interface_type()->name); - return; - } - } -} - - -void -validate_interstage_uniform_blocks(struct gl_shader_program *prog, - gl_shader **stages, int num_stages) -{ - interface_block_definitions definitions; - - for (int i = 0; i < num_stages; i++) { - if (stages[i] == NULL) - continue; - - const gl_shader *stage = stages[i]; - foreach_in_list(ir_instruction, node, stage->ir) { - ir_variable *var = node->as_variable(); - if (!var || !var->get_interface_type() || var->data.mode != ir_var_uniform) - continue; - - interface_block_definition *old_def = - definitions.lookup(var->get_interface_type()->name); - const interface_block_definition new_def(var); - if (old_def == NULL) { - definitions.store(new_def); - } else { - /* Interstage uniform matching rules are the same as intrastage - * uniform matchin rules (for uniforms, it is as though all - * shaders are in the same shader stage). - */ - if (!intrastage_match(old_def, &new_def, ir_var_uniform)) { - linker_error(prog, "definitions of interface block `%s' do not " - "match\n", var->get_interface_type()->name); - return; - } - } - } - } -} diff --git a/3rdparty/glsl-optimizer/src/glsl/link_uniform_block_active_visitor.cpp b/3rdparty/glsl-optimizer/src/glsl/link_uniform_block_active_visitor.cpp deleted file mode 100644 index 9da6a4bba..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/link_uniform_block_active_visitor.cpp +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright © 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "link_uniform_block_active_visitor.h" -#include "program.h" - -link_uniform_block_active * -process_block(void *mem_ctx, struct hash_table *ht, ir_variable *var) -{ - const uint32_t h = _mesa_hash_string(var->get_interface_type()->name); - const hash_entry *const existing_block = - _mesa_hash_table_search(ht, h, var->get_interface_type()->name); - - const glsl_type *const block_type = var->is_interface_instance() - ? var->type : var->get_interface_type(); - - - /* If a block with this block-name has not previously been seen, add it. - * If a block with this block-name has been seen, it must be identical to - * the block currently being examined. - */ - if (existing_block == NULL) { - link_uniform_block_active *const b = - rzalloc(mem_ctx, struct link_uniform_block_active); - - b->type = block_type; - b->has_instance_name = var->is_interface_instance(); - - if (var->data.explicit_binding) { - b->has_binding = true; - b->binding = var->data.binding; - } else { - b->has_binding = false; - b->binding = 0; - } - - _mesa_hash_table_insert(ht, h, var->get_interface_type()->name, - (void *) b); - return b; - } else { - link_uniform_block_active *const b = - (link_uniform_block_active *) existing_block->data; - - if (b->type != block_type - || b->has_instance_name != var->is_interface_instance()) - return NULL; - else - return b; - } - - assert(!"Should not get here."); - return NULL; -} - -ir_visitor_status -link_uniform_block_active_visitor::visit(ir_variable *var) -{ - if (!var->is_in_uniform_block()) - return visit_continue; - - const glsl_type *const block_type = var->is_interface_instance() - ? var->type : var->get_interface_type(); - - /* Section 2.11.6 (Uniform Variables) of the OpenGL ES 3.0.3 spec says: - * - * "All members of a named uniform block declared with a shared or - * std140 layout qualifier are considered active, even if they are not - * referenced in any shader in the program. The uniform block itself is - * also considered active, even if no member of the block is - * referenced." - */ - if (block_type->interface_packing == GLSL_INTERFACE_PACKING_PACKED) - return visit_continue; - - /* Process the block. Bail if there was an error. - */ - link_uniform_block_active *const b = - process_block(this->mem_ctx, this->ht, var); - if (b == NULL) { - linker_error(this->prog, - "uniform block `%s' has mismatching definitions", - var->get_interface_type()->name); - this->success = false; - return visit_stop; - } - - assert(b->num_array_elements == 0); - assert(b->array_elements == NULL); - assert(b->type != NULL); - - return visit_continue; -} - -ir_visitor_status -link_uniform_block_active_visitor::visit_enter(ir_dereference_array *ir) -{ - ir_dereference_variable *const d = ir->array->as_dereference_variable(); - ir_variable *const var = (d == NULL) ? NULL : d->var; - - /* If the r-value being dereferenced is not a variable (e.g., a field of a - * structure) or is not a uniform block instance, continue. - * - * WARNING: It is not enough for the variable to be part of uniform block. - * It must represent the entire block. Arrays (or matrices) inside blocks - * that lack an instance name are handled by the ir_dereference_variable - * function. - */ - if (var == NULL - || !var->is_in_uniform_block() - || !var->is_interface_instance()) - return visit_continue; - - /* Process the block. Bail if there was an error. - */ - link_uniform_block_active *const b = - process_block(this->mem_ctx, this->ht, var); - if (b == NULL) { - linker_error(prog, - "uniform block `%s' has mismatching definitions", - var->get_interface_type()->name); - this->success = false; - return visit_stop; - } - - /* Block arrays must be declared with an instance name. - */ - assert(b->has_instance_name); - assert((b->num_array_elements == 0) == (b->array_elements == NULL)); - assert(b->type != NULL); - - ir_constant *c = ir->array_index->as_constant(); - - if (c) { - /* Index is a constant, so mark just that element used, if not already */ - const unsigned idx = c->get_uint_component(0); - - unsigned i; - for (i = 0; i < b->num_array_elements; i++) { - if (b->array_elements[i] == idx) - break; - } - - assert(i <= b->num_array_elements); - - if (i == b->num_array_elements) { - b->array_elements = reralloc(this->mem_ctx, - b->array_elements, - unsigned, - b->num_array_elements + 1); - - b->array_elements[b->num_array_elements] = idx; - - b->num_array_elements++; - } - } else { - /* The array index is not a constant, so mark the entire array used. */ - assert(b->type->is_array()); - if (b->num_array_elements < b->type->length) { - b->num_array_elements = b->type->length; - b->array_elements = reralloc(this->mem_ctx, - b->array_elements, - unsigned, - b->num_array_elements); - - for (unsigned i = 0; i < b->num_array_elements; i++) { - b->array_elements[i] = i; - } - } - } - - return visit_continue_with_parent; -} - -ir_visitor_status -link_uniform_block_active_visitor::visit(ir_dereference_variable *ir) -{ - ir_variable *var = ir->var; - - if (!var->is_in_uniform_block()) - return visit_continue; - - assert(!var->is_interface_instance() || !var->type->is_array()); - - /* Process the block. Bail if there was an error. - */ - link_uniform_block_active *const b = - process_block(this->mem_ctx, this->ht, var); - if (b == NULL) { - linker_error(this->prog, - "uniform block `%s' has mismatching definitions", - var->get_interface_type()->name); - this->success = false; - return visit_stop; - } - - assert(b->num_array_elements == 0); - assert(b->array_elements == NULL); - assert(b->type != NULL); - - return visit_continue; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/link_uniform_block_active_visitor.h b/3rdparty/glsl-optimizer/src/glsl/link_uniform_block_active_visitor.h deleted file mode 100644 index e5ea50155..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/link_uniform_block_active_visitor.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright © 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef LINK_UNIFORM_BLOCK_ACTIVE_VISITOR_H -#define LINK_UNIFORM_BLOCK_ACTIVE_VISITOR_H - -#include "ir.h" -#include "util/hash_table.h" - -struct link_uniform_block_active { - const glsl_type *type; - - unsigned *array_elements; - unsigned num_array_elements; - - unsigned binding; - - bool has_instance_name; - bool has_binding; -}; - -class link_uniform_block_active_visitor : public ir_hierarchical_visitor { -public: - link_uniform_block_active_visitor(void *mem_ctx, struct hash_table *ht, - struct gl_shader_program *prog) - : success(true), prog(prog), ht(ht), mem_ctx(mem_ctx) - { - /* empty */ - } - - virtual ir_visitor_status visit_enter(ir_dereference_array *); - virtual ir_visitor_status visit(ir_dereference_variable *); - virtual ir_visitor_status visit(ir_variable *); - - bool success; - -private: - struct gl_shader_program *prog; - struct hash_table *ht; - void *mem_ctx; -}; - -#endif /* LINK_UNIFORM_BLOCK_ACTIVE_VISITOR_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/link_uniform_blocks.cpp b/3rdparty/glsl-optimizer/src/glsl/link_uniform_blocks.cpp deleted file mode 100644 index 90101a80c..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/link_uniform_blocks.cpp +++ /dev/null @@ -1,363 +0,0 @@ -/* - * Copyright © 2012 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "main/core.h" -#include "main/errors.h" -#include "ir.h" -#include "linker.h" -#include "ir_uniform.h" -#include "link_uniform_block_active_visitor.h" -#include "util/hash_table.h" -#include "program.h" - -namespace { - -class ubo_visitor : public program_resource_visitor { -public: - ubo_visitor(void *mem_ctx, gl_uniform_buffer_variable *variables, - unsigned num_variables) - : index(0), offset(0), buffer_size(0), variables(variables), - num_variables(num_variables), mem_ctx(mem_ctx), is_array_instance(false) - { - /* empty */ - } - - void process(const glsl_type *type, const char *name) - { - this->offset = 0; - this->buffer_size = 0; - this->is_array_instance = strchr(name, ']') != NULL; - this->program_resource_visitor::process(type, name); - } - - unsigned index; - unsigned offset; - unsigned buffer_size; - gl_uniform_buffer_variable *variables; - unsigned num_variables; - void *mem_ctx; - bool is_array_instance; - -private: - virtual void visit_field(const glsl_type *type, const char *name, - bool row_major) - { - (void) type; - (void) name; - (void) row_major; - assert(!"Should not get here."); - } - - virtual void visit_field(const glsl_type *type, const char *name, - bool row_major, const glsl_type *record_type, - bool last_field) - { - assert(this->index < this->num_variables); - - gl_uniform_buffer_variable *v = &this->variables[this->index++]; - - v->Name = ralloc_strdup(mem_ctx, name); - v->Type = type; - v->RowMajor = type->without_array()->is_matrix() && row_major; - - if (this->is_array_instance) { - v->IndexName = ralloc_strdup(mem_ctx, name); - - char *open_bracket = strchr(v->IndexName, '['); - assert(open_bracket != NULL); - - char *close_bracket = strchr(open_bracket, ']'); - assert(close_bracket != NULL); - - /* Length of the tail without the ']' but with the NUL. - */ - unsigned len = strlen(close_bracket + 1) + 1; - - memmove(open_bracket, close_bracket + 1, len); - } else { - v->IndexName = v->Name; - } - - const unsigned alignment = record_type - ? record_type->std140_base_alignment(!!v->RowMajor) - : type->std140_base_alignment(!!v->RowMajor); - unsigned size = type->std140_size(!!v->RowMajor); - - this->offset = glsl_align(this->offset, alignment); - v->Offset = this->offset; - - /* If this is the last field of a structure, apply rule #9. The - * GL_ARB_uniform_buffer_object spec says: - * - * "The structure may have padding at the end; the base offset of - * the member following the sub-structure is rounded up to the next - * multiple of the base alignment of the structure." - * - * last_field won't be set if this is the last field of a UBO that is - * not a named instance. - */ - this->offset += size; - if (last_field) - this->offset = glsl_align(this->offset, 16); - - /* From the GL_ARB_uniform_buffer_object spec: - * - * "For uniform blocks laid out according to [std140] rules, the - * minimum buffer object size returned by the - * UNIFORM_BLOCK_DATA_SIZE query is derived by taking the offset of - * the last basic machine unit consumed by the last uniform of the - * uniform block (including any end-of-array or end-of-structure - * padding), adding one, and rounding up to the next multiple of - * the base alignment required for a vec4." - */ - this->buffer_size = glsl_align(this->offset, 16); - } - - virtual void visit_field(const glsl_struct_field *field) - { - /* FINISHME: When support for doubles (dvec4, etc.) is added to the - * FINISHME: compiler, this may be incorrect for a structure in a UBO - * FINISHME: like struct s { struct { float f } s1; dvec4 v; };. - */ - this->offset = glsl_align(this->offset, - field->type->std140_base_alignment(false)); - } -}; - -class count_block_size : public program_resource_visitor { -public: - count_block_size() : num_active_uniforms(0) - { - /* empty */ - } - - unsigned num_active_uniforms; - -private: - virtual void visit_field(const glsl_type *type, const char *name, - bool row_major) - { - (void) type; - (void) name; - (void) row_major; - this->num_active_uniforms++; - } -}; - -} /* anonymous namespace */ - -struct block { - const glsl_type *type; - bool has_instance_name; -}; - -unsigned -link_uniform_blocks(void *mem_ctx, - struct gl_shader_program *prog, - struct gl_shader **shader_list, - unsigned num_shaders, - struct gl_uniform_block **blocks_ret) -{ - /* This hash table will track all of the uniform blocks that have been - * encountered. Since blocks with the same block-name must be the same, - * the hash is organized by block-name. - */ - struct hash_table *block_hash = - _mesa_hash_table_create(mem_ctx, _mesa_key_string_equal); - - if (block_hash == NULL) { - _mesa_error_no_memory(__func__); - linker_error(prog, "out of memory\n"); - return 0; - } - - /* Determine which uniform blocks are active. - */ - link_uniform_block_active_visitor v(mem_ctx, block_hash, prog); - for (unsigned i = 0; i < num_shaders; i++) { - visit_list_elements(&v, shader_list[i]->ir); - } - - /* Count the number of active uniform blocks. Count the total number of - * active slots in those uniform blocks. - */ - unsigned num_blocks = 0; - unsigned num_variables = 0; - count_block_size block_size; - struct hash_entry *entry; - - hash_table_foreach (block_hash, entry) { - const struct link_uniform_block_active *const b = - (const struct link_uniform_block_active *) entry->data; - - const glsl_type *const block_type = - b->type->is_array() ? b->type->fields.array : b->type; - - assert((b->num_array_elements > 0) == b->type->is_array()); - - block_size.num_active_uniforms = 0; - block_size.process(block_type, ""); - - if (b->num_array_elements > 0) { - num_blocks += b->num_array_elements; - num_variables += b->num_array_elements - * block_size.num_active_uniforms; - } else { - num_blocks++; - num_variables += block_size.num_active_uniforms; - } - - } - - if (num_blocks == 0) { - assert(num_variables == 0); - _mesa_hash_table_destroy(block_hash, NULL); - return 0; - } - - assert(num_variables != 0); - - /* Allocate storage to hold all of the informatation related to uniform - * blocks that can be queried through the API. - */ - gl_uniform_block *blocks = - ralloc_array(mem_ctx, gl_uniform_block, num_blocks); - gl_uniform_buffer_variable *variables = - ralloc_array(blocks, gl_uniform_buffer_variable, num_variables); - - /* Add each variable from each uniform block to the API tracking - * structures. - */ - unsigned i = 0; - ubo_visitor parcel(blocks, variables, num_variables); - - STATIC_ASSERT(unsigned(GLSL_INTERFACE_PACKING_STD140) - == unsigned(ubo_packing_std140)); - STATIC_ASSERT(unsigned(GLSL_INTERFACE_PACKING_SHARED) - == unsigned(ubo_packing_shared)); - STATIC_ASSERT(unsigned(GLSL_INTERFACE_PACKING_PACKED) - == unsigned(ubo_packing_packed)); - - - hash_table_foreach (block_hash, entry) { - const struct link_uniform_block_active *const b = - (const struct link_uniform_block_active *) entry->data; - const glsl_type *block_type = b->type; - - if (b->num_array_elements > 0) { - const char *const name = block_type->fields.array->name; - - assert(b->has_instance_name); - for (unsigned j = 0; j < b->num_array_elements; j++) { - blocks[i].Name = ralloc_asprintf(blocks, "%s[%u]", name, - b->array_elements[j]); - blocks[i].Uniforms = &variables[parcel.index]; - - /* The GL_ARB_shading_language_420pack spec says: - * - * "If the binding identifier is used with a uniform block - * instanced as an array then the first element of the array - * takes the specified block binding and each subsequent - * element takes the next consecutive uniform block binding - * point." - */ - blocks[i].Binding = (b->has_binding) ? b->binding + j : 0; - - blocks[i].UniformBufferSize = 0; - blocks[i]._Packing = - gl_uniform_block_packing(block_type->interface_packing); - - parcel.process(block_type->fields.array, - blocks[i].Name); - - blocks[i].UniformBufferSize = parcel.buffer_size; - - blocks[i].NumUniforms = - (unsigned)(ptrdiff_t)(&variables[parcel.index] - blocks[i].Uniforms); - - i++; - } - } else { - blocks[i].Name = ralloc_strdup(blocks, block_type->name); - blocks[i].Uniforms = &variables[parcel.index]; - blocks[i].Binding = (b->has_binding) ? b->binding : 0; - blocks[i].UniformBufferSize = 0; - blocks[i]._Packing = - gl_uniform_block_packing(block_type->interface_packing); - - parcel.process(block_type, - b->has_instance_name ? block_type->name : ""); - - blocks[i].UniformBufferSize = parcel.buffer_size; - - blocks[i].NumUniforms = - (unsigned)(ptrdiff_t)(&variables[parcel.index] - blocks[i].Uniforms); - - i++; - } - } - - assert(parcel.index == num_variables); - - _mesa_hash_table_destroy(block_hash, NULL); - - *blocks_ret = blocks; - return num_blocks; -} - -bool -link_uniform_blocks_are_compatible(const gl_uniform_block *a, - const gl_uniform_block *b) -{ - assert(strcmp(a->Name, b->Name) == 0); - - /* Page 35 (page 42 of the PDF) in section 4.3.7 of the GLSL 1.50 spec says: - * - * "Matched block names within an interface (as defined above) must - * match in terms of having the same number of declarations with the - * same sequence of types and the same sequence of member names, as - * well as having the same member-wise layout qualification....if a - * matching block is declared as an array, then the array sizes must - * also match... Any mismatch will generate a link error." - * - * Arrays are not yet supported, so there is no check for that. - */ - if (a->NumUniforms != b->NumUniforms) - return false; - - if (a->_Packing != b->_Packing) - return false; - - for (unsigned i = 0; i < a->NumUniforms; i++) { - if (strcmp(a->Uniforms[i].Name, b->Uniforms[i].Name) != 0) - return false; - - if (a->Uniforms[i].Type != b->Uniforms[i].Type) - return false; - - if (a->Uniforms[i].RowMajor != b->Uniforms[i].RowMajor) - return false; - } - - return true; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/link_uniform_initializers.cpp b/3rdparty/glsl-optimizer/src/glsl/link_uniform_initializers.cpp deleted file mode 100644 index f6a60bce9..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/link_uniform_initializers.cpp +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright © 2012 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "main/core.h" -#include "ir.h" -#include "linker.h" -#include "ir_uniform.h" - -/* These functions are put in a "private" namespace instead of being marked - * static so that the unit tests can access them. See - * http://code.google.com/p/googletest/wiki/AdvancedGuide#Testing_Private_Code - */ -namespace linker { - -gl_uniform_storage * -get_storage(gl_uniform_storage *storage, unsigned num_storage, - const char *name) -{ - for (unsigned int i = 0; i < num_storage; i++) { - if (strcmp(name, storage[i].name) == 0) - return &storage[i]; - } - - return NULL; -} - -static unsigned -get_uniform_block_index(const gl_shader_program *shProg, - const char *uniformBlockName) -{ - for (unsigned i = 0; i < shProg->NumUniformBlocks; i++) { - if (!strcmp(shProg->UniformBlocks[i].Name, uniformBlockName)) - return i; - } - - return GL_INVALID_INDEX; -} - -void -copy_constant_to_storage(union gl_constant_value *storage, - const ir_constant *val, - const enum glsl_base_type base_type, - const unsigned int elements, - unsigned int boolean_true) -{ - for (unsigned int i = 0; i < elements; i++) { - switch (base_type) { - case GLSL_TYPE_UINT: - storage[i].u = val->value.u[i]; - break; - case GLSL_TYPE_INT: - case GLSL_TYPE_SAMPLER: - storage[i].i = val->value.i[i]; - break; - case GLSL_TYPE_FLOAT: - storage[i].f = val->value.f[i]; - break; - case GLSL_TYPE_BOOL: - storage[i].b = val->value.b[i] ? boolean_true : 0; - break; - case GLSL_TYPE_ARRAY: - case GLSL_TYPE_STRUCT: - case GLSL_TYPE_IMAGE: - case GLSL_TYPE_ATOMIC_UINT: - case GLSL_TYPE_INTERFACE: - case GLSL_TYPE_VOID: - case GLSL_TYPE_ERROR: - /* All other types should have already been filtered by other - * paths in the caller. - */ - assert(!"Should not get here."); - break; - } - } -} - -void -set_sampler_binding(gl_shader_program *prog, const char *name, int binding) -{ - struct gl_uniform_storage *const storage = - get_storage(prog->UniformStorage, prog->NumUserUniformStorage, name); - - if (storage == NULL) { - assert(storage != NULL); - return; - } - - const unsigned elements = MAX2(storage->array_elements, 1); - - /* Section 4.4.4 (Opaque-Uniform Layout Qualifiers) of the GLSL 4.20 spec - * says: - * - * "If the binding identifier is used with an array, the first element - * of the array takes the specified unit and each subsequent element - * takes the next consecutive unit." - */ - for (unsigned int i = 0; i < elements; i++) { - storage->storage[i].i = binding + i; - } - - for (int sh = 0; sh < MESA_SHADER_STAGES; sh++) { - gl_shader *shader = prog->_LinkedShaders[sh]; - - if (shader && storage->sampler[sh].active) { - for (unsigned i = 0; i < elements; i++) { - unsigned index = storage->sampler[sh].index + i; - - shader->SamplerUnits[index] = storage->storage[i].i; - } - } - } - - storage->initialized = true; -} - -void -set_block_binding(gl_shader_program *prog, const char *block_name, int binding) -{ - const unsigned block_index = get_uniform_block_index(prog, block_name); - - if (block_index == GL_INVALID_INDEX) { - assert(block_index != GL_INVALID_INDEX); - return; - } - - /* This is a field of a UBO. val is the binding index. */ - for (int i = 0; i < MESA_SHADER_STAGES; i++) { - int stage_index = prog->UniformBlockStageIndex[i][block_index]; - - if (stage_index != -1) { - struct gl_shader *sh = prog->_LinkedShaders[i]; - sh->UniformBlocks[stage_index].Binding = binding; - } - } -} - -void -set_uniform_initializer(void *mem_ctx, gl_shader_program *prog, - const char *name, const glsl_type *type, - ir_constant *val, unsigned int boolean_true) -{ - if (type->is_record()) { - ir_constant *field_constant; - - field_constant = (ir_constant *)val->components.get_head(); - - for (unsigned int i = 0; i < type->length; i++) { - const glsl_type *field_type = type->fields.structure[i].type; - const char *field_name = ralloc_asprintf(mem_ctx, "%s.%s", name, - type->fields.structure[i].name); - set_uniform_initializer(mem_ctx, prog, field_name, - field_type, field_constant, boolean_true); - field_constant = (ir_constant *)field_constant->next; - } - return; - } else if (type->is_array() && type->fields.array->is_record()) { - const glsl_type *const element_type = type->fields.array; - - for (unsigned int i = 0; i < type->length; i++) { - const char *element_name = ralloc_asprintf(mem_ctx, "%s[%d]", name, i); - - set_uniform_initializer(mem_ctx, prog, element_name, - element_type, val->array_elements[i], - boolean_true); - } - return; - } - - struct gl_uniform_storage *const storage = - get_storage(prog->UniformStorage, - prog->NumUserUniformStorage, - name); - if (storage == NULL) { - assert(storage != NULL); - return; - } - - if (val->type->is_array()) { - const enum glsl_base_type base_type = - val->array_elements[0]->type->base_type; - const unsigned int elements = val->array_elements[0]->type->components(); - unsigned int idx = 0; - - assert(val->type->length >= storage->array_elements); - for (unsigned int i = 0; i < storage->array_elements; i++) { - copy_constant_to_storage(& storage->storage[idx], - val->array_elements[i], - base_type, - elements, - boolean_true); - - idx += elements; - } - } else { - copy_constant_to_storage(storage->storage, - val, - val->type->base_type, - val->type->components(), - boolean_true); - - if (storage->type->is_sampler()) { - for (int sh = 0; sh < MESA_SHADER_STAGES; sh++) { - gl_shader *shader = prog->_LinkedShaders[sh]; - - if (shader && storage->sampler[sh].active) { - unsigned index = storage->sampler[sh].index; - - shader->SamplerUnits[index] = storage->storage[0].i; - } - } - } - } - - storage->initialized = true; -} -} - -void -link_set_uniform_initializers(struct gl_shader_program *prog, - unsigned int boolean_true) -{ - void *mem_ctx = NULL; - - for (unsigned int i = 0; i < MESA_SHADER_STAGES; i++) { - struct gl_shader *shader = prog->_LinkedShaders[i]; - - if (shader == NULL) - continue; - - foreach_in_list(ir_instruction, node, shader->ir) { - ir_variable *const var = node->as_variable(); - - if (!var || var->data.mode != ir_var_uniform) - continue; - - if (!mem_ctx) - mem_ctx = ralloc_context(NULL); - - if (var->data.explicit_binding) { - const glsl_type *const type = var->type; - - if (type->without_array()->is_sampler()) { - linker::set_sampler_binding(prog, var->name, var->data.binding); - } else if (var->is_in_uniform_block()) { - const glsl_type *const iface_type = var->get_interface_type(); - - /* If the variable is an array and it is an interface instance, - * we need to set the binding for each array element. Just - * checking that the variable is an array is not sufficient. - * The variable could be an array element of a uniform block - * that lacks an instance name. For example: - * - * uniform U { - * float f[4]; - * }; - * - * In this case "f" would pass is_in_uniform_block (above) and - * type->is_array(), but it will fail is_interface_instance(). - */ - if (var->is_interface_instance() && var->type->is_array()) { - for (unsigned i = 0; i < var->type->length; i++) { - const char *name = - ralloc_asprintf(mem_ctx, "%s[%u]", iface_type->name, i); - - /* Section 4.4.3 (Uniform Block Layout Qualifiers) of the - * GLSL 4.20 spec says: - * - * "If the binding identifier is used with a uniform - * block instanced as an array then the first element - * of the array takes the specified block binding and - * each subsequent element takes the next consecutive - * uniform block binding point." - */ - linker::set_block_binding(prog, name, - var->data.binding + i); - } - } else { - linker::set_block_binding(prog, iface_type->name, - var->data.binding); - } - } else if (type->contains_atomic()) { - /* we don't actually need to do anything. */ - } else { - assert(!"Explicit binding not on a sampler, UBO or atomic."); - } - } else if (var->constant_value) { - linker::set_uniform_initializer(mem_ctx, prog, var->name, - var->type, var->constant_value, - boolean_true); - } - } - } - - ralloc_free(mem_ctx); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/link_uniforms.cpp b/3rdparty/glsl-optimizer/src/glsl/link_uniforms.cpp deleted file mode 100644 index 832c73b53..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/link_uniforms.cpp +++ /dev/null @@ -1,988 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "main/core.h" -#include "ir.h" -#include "linker.h" -#include "ir_uniform.h" -#include "glsl_symbol_table.h" -#include "program/hash_table.h" -#include "program.h" - -/** - * \file link_uniforms.cpp - * Assign locations for GLSL uniforms. - * - * \author Ian Romanick - */ - -/** - * Used by linker to indicate uniforms that have no location set. - */ -#define UNMAPPED_UNIFORM_LOC ~0u - -/** - * Count the backing storage requirements for a type - */ -static unsigned -values_for_type(const glsl_type *type) -{ - if (type->is_sampler()) { - return 1; - } else if (type->is_array() && type->fields.array->is_sampler()) { - return type->array_size(); - } else { - return type->component_slots(); - } -} - -void -program_resource_visitor::process(const glsl_type *type, const char *name) -{ - assert(type->without_array()->is_record() - || type->without_array()->is_interface()); - - char *name_copy = ralloc_strdup(NULL, name); - recursion(type, &name_copy, strlen(name), false, NULL, false); - ralloc_free(name_copy); -} - -void -program_resource_visitor::process(ir_variable *var) -{ - const glsl_type *t = var->type; - const bool row_major = - var->data.matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR; - - /* false is always passed for the row_major parameter to the other - * processing functions because no information is available to do - * otherwise. See the warning in linker.h. - */ - - /* Only strdup the name if we actually will need to modify it. */ - if (var->data.from_named_ifc_block_array) { - /* lower_named_interface_blocks created this variable by lowering an - * interface block array to an array variable. For example if the - * original source code was: - * - * out Blk { vec4 bar } foo[3]; - * - * Then the variable is now: - * - * out vec4 bar[3]; - * - * We need to visit each array element using the names constructed like - * so: - * - * Blk[0].bar - * Blk[1].bar - * Blk[2].bar - */ - assert(t->is_array()); - const glsl_type *ifc_type = var->get_interface_type(); - char *name = ralloc_strdup(NULL, ifc_type->name); - size_t name_length = strlen(name); - for (unsigned i = 0; i < t->length; i++) { - size_t new_length = name_length; - ralloc_asprintf_rewrite_tail(&name, &new_length, "[%u].%s", i, - var->name); - /* Note: row_major is only meaningful for uniform blocks, and - * lowering is only applied to non-uniform interface blocks, so we - * can safely pass false for row_major. - */ - recursion(var->type, &name, new_length, row_major, NULL, false); - } - ralloc_free(name); - } else if (var->data.from_named_ifc_block_nonarray) { - /* lower_named_interface_blocks created this variable by lowering a - * named interface block (non-array) to an ordinary variable. For - * example if the original source code was: - * - * out Blk { vec4 bar } foo; - * - * Then the variable is now: - * - * out vec4 bar; - * - * We need to visit this variable using the name: - * - * Blk.bar - */ - const glsl_type *ifc_type = var->get_interface_type(); - char *name = ralloc_asprintf(NULL, "%s.%s", ifc_type->name, var->name); - /* Note: row_major is only meaningful for uniform blocks, and lowering - * is only applied to non-uniform interface blocks, so we can safely - * pass false for row_major. - */ - recursion(var->type, &name, strlen(name), row_major, NULL, false); - ralloc_free(name); - } else if (t->without_array()->is_record()) { - char *name = ralloc_strdup(NULL, var->name); - recursion(var->type, &name, strlen(name), row_major, NULL, false); - ralloc_free(name); - } else if (t->is_interface()) { - char *name = ralloc_strdup(NULL, var->type->name); - recursion(var->type, &name, strlen(name), row_major, NULL, false); - ralloc_free(name); - } else if (t->is_array() && t->fields.array->is_interface()) { - char *name = ralloc_strdup(NULL, var->type->fields.array->name); - recursion(var->type, &name, strlen(name), row_major, NULL, false); - ralloc_free(name); - } else { - this->visit_field(t, var->name, row_major, NULL, false); - } -} - -void -program_resource_visitor::recursion(const glsl_type *t, char **name, - size_t name_length, bool row_major, - const glsl_type *record_type, - bool last_field) -{ - /* Records need to have each field processed individually. - * - * Arrays of records need to have each array element processed - * individually, then each field of the resulting array elements processed - * individually. - */ - if (t->is_record() || t->is_interface()) { - if (record_type == NULL && t->is_record()) - record_type = t; - - for (unsigned i = 0; i < t->length; i++) { - const char *field = t->fields.structure[i].name; - size_t new_length = name_length; - - if (t->fields.structure[i].type->is_record()) - this->visit_field(&t->fields.structure[i]); - - /* Append '.field' to the current variable name. */ - if (name_length == 0) { - ralloc_asprintf_rewrite_tail(name, &new_length, "%s", field); - } else { - ralloc_asprintf_rewrite_tail(name, &new_length, ".%s", field); - } - - /* The layout of structures at the top level of the block is set - * during parsing. For matrices contained in multiple levels of - * structures in the block, the inner structures have no layout. - * These cases must potentially inherit the layout from the outer - * levels. - */ - bool field_row_major = row_major; - const enum glsl_matrix_layout matrix_layout = - glsl_matrix_layout(t->fields.structure[i].matrix_layout); - if (matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR) { - field_row_major = true; - } else if (matrix_layout == GLSL_MATRIX_LAYOUT_COLUMN_MAJOR) { - field_row_major = false; - } - - recursion(t->fields.structure[i].type, name, new_length, - field_row_major, - record_type, - (i + 1) == t->length); - - /* Only the first leaf-field of the record gets called with the - * record type pointer. - */ - record_type = NULL; - } - } else if (t->is_array() && (t->fields.array->is_record() - || t->fields.array->is_interface())) { - if (record_type == NULL && t->fields.array->is_record()) - record_type = t->fields.array; - - for (unsigned i = 0; i < t->length; i++) { - size_t new_length = name_length; - - /* Append the subscript to the current variable name */ - ralloc_asprintf_rewrite_tail(name, &new_length, "[%u]", i); - - recursion(t->fields.array, name, new_length, row_major, - record_type, - (i + 1) == t->length); - - /* Only the first leaf-field of the record gets called with the - * record type pointer. - */ - record_type = NULL; - } - } else { - this->visit_field(t, *name, row_major, record_type, last_field); - } -} - -void -program_resource_visitor::visit_field(const glsl_type *type, const char *name, - bool row_major, - const glsl_type *, - bool /* last_field */) -{ - visit_field(type, name, row_major); -} - -void -program_resource_visitor::visit_field(const glsl_struct_field *field) -{ - (void) field; - /* empty */ -} - -namespace { - -/** - * Class to help calculate the storage requirements for a set of uniforms - * - * As uniforms are added to the active set the number of active uniforms and - * the storage requirements for those uniforms are accumulated. The active - * uniforms are added to the hash table supplied to the constructor. - * - * If the same uniform is added multiple times (i.e., once for each shader - * target), it will only be accounted once. - */ -class count_uniform_size : public program_resource_visitor { -public: - count_uniform_size(struct string_to_uint_map *map) - : num_active_uniforms(0), num_values(0), num_shader_samplers(0), - num_shader_images(0), num_shader_uniform_components(0), - is_ubo_var(false), map(map) - { - /* empty */ - } - - void start_shader() - { - this->num_shader_samplers = 0; - this->num_shader_images = 0; - this->num_shader_uniform_components = 0; - } - - void process(ir_variable *var) - { - this->is_ubo_var = var->is_in_uniform_block(); - if (var->is_interface_instance()) - program_resource_visitor::process(var->get_interface_type(), - var->get_interface_type()->name); - else - program_resource_visitor::process(var); - } - - /** - * Total number of active uniforms counted - */ - unsigned num_active_uniforms; - - /** - * Number of data values required to back the storage for the active uniforms - */ - unsigned num_values; - - /** - * Number of samplers used - */ - unsigned num_shader_samplers; - - /** - * Number of images used - */ - unsigned num_shader_images; - - /** - * Number of uniforms used in the current shader - */ - unsigned num_shader_uniform_components; - - bool is_ubo_var; - -private: - virtual void visit_field(const glsl_type *type, const char *name, - bool row_major) - { - assert(!type->without_array()->is_record()); - assert(!type->without_array()->is_interface()); - - (void) row_major; - - /* Count the number of samplers regardless of whether the uniform is - * already in the hash table. The hash table prevents adding the same - * uniform for multiple shader targets, but in this case we want to - * count it for each shader target. - */ - const unsigned values = values_for_type(type); - if (type->contains_sampler()) { - this->num_shader_samplers += values; - } else if (type->contains_image()) { - this->num_shader_images += values; - - /* As drivers are likely to represent image uniforms as - * scalar indices, count them against the limit of uniform - * components in the default block. The spec allows image - * uniforms to use up no more than one scalar slot. - */ - this->num_shader_uniform_components += values; - } else { - /* Accumulate the total number of uniform slots used by this shader. - * Note that samplers do not count against this limit because they - * don't use any storage on current hardware. - */ - if (!is_ubo_var) - this->num_shader_uniform_components += values; - } - - /* If the uniform is already in the map, there's nothing more to do. - */ - unsigned id; - if (this->map->get(id, name)) - return; - - this->map->put(this->num_active_uniforms, name); - - /* Each leaf uniform occupies one entry in the list of active - * uniforms. - */ - this->num_active_uniforms++; - this->num_values += values; - } - - struct string_to_uint_map *map; -}; - -} /* anonymous namespace */ - -/** - * Class to help parcel out pieces of backing storage to uniforms - * - * Each uniform processed has some range of the \c gl_constant_value - * structures associated with it. The association is done by finding - * the uniform in the \c string_to_uint_map and using the value from - * the map to connect that slot in the \c gl_uniform_storage table - * with the next available slot in the \c gl_constant_value array. - * - * \warning - * This class assumes that every uniform that will be processed is - * already in the \c string_to_uint_map. In addition, it assumes that - * the \c gl_uniform_storage and \c gl_constant_value arrays are "big - * enough." - */ -class parcel_out_uniform_storage : public program_resource_visitor { -public: - parcel_out_uniform_storage(struct string_to_uint_map *map, - struct gl_uniform_storage *uniforms, - union gl_constant_value *values) - : map(map), uniforms(uniforms), values(values) - { - } - - void start_shader(gl_shader_stage shader_type) - { - assert(shader_type < MESA_SHADER_STAGES); - this->shader_type = shader_type; - - this->shader_samplers_used = 0; - this->shader_shadow_samplers = 0; - this->next_sampler = 0; - this->next_image = 0; - memset(this->targets, 0, sizeof(this->targets)); - } - - void set_and_process(struct gl_shader_program *prog, - ir_variable *var) - { - current_var = var; - field_counter = 0; - - ubo_block_index = -1; - if (var->is_in_uniform_block()) { - if (var->is_interface_instance() && var->type->is_array()) { - unsigned l = strlen(var->get_interface_type()->name); - - for (unsigned i = 0; i < prog->NumUniformBlocks; i++) { - if (strncmp(var->get_interface_type()->name, - prog->UniformBlocks[i].Name, - l) == 0 - && prog->UniformBlocks[i].Name[l] == '[') { - ubo_block_index = i; - break; - } - } - } else { - for (unsigned i = 0; i < prog->NumUniformBlocks; i++) { - if (strcmp(var->get_interface_type()->name, - prog->UniformBlocks[i].Name) == 0) { - ubo_block_index = i; - break; - } - } - } - assert(ubo_block_index != -1); - - /* Uniform blocks that were specified with an instance name must be - * handled a little bit differently. The name of the variable is the - * name used to reference the uniform block instead of being the name - * of a variable within the block. Therefore, searching for the name - * within the block will fail. - */ - if (var->is_interface_instance()) { - ubo_byte_offset = 0; - } else { - const struct gl_uniform_block *const block = - &prog->UniformBlocks[ubo_block_index]; - - assert(var->data.location != -1); - - const struct gl_uniform_buffer_variable *const ubo_var = - &block->Uniforms[var->data.location]; - - ubo_byte_offset = ubo_var->Offset; - } - - if (var->is_interface_instance()) - process(var->get_interface_type(), - var->get_interface_type()->name); - else - process(var); - } else - process(var); - } - - int ubo_block_index; - int ubo_byte_offset; - gl_shader_stage shader_type; - -private: - void handle_samplers(const glsl_type *base_type, - struct gl_uniform_storage *uniform) - { - if (base_type->is_sampler()) { - uniform->sampler[shader_type].index = this->next_sampler; - uniform->sampler[shader_type].active = true; - - /* Increment the sampler by 1 for non-arrays and by the number of - * array elements for arrays. - */ - this->next_sampler += - MAX2(1, uniform->array_elements); - - const gl_texture_index target = base_type->sampler_index(); - const unsigned shadow = base_type->sampler_shadow; - for (unsigned i = uniform->sampler[shader_type].index; - i < MIN2(this->next_sampler, MAX_SAMPLERS); - i++) { - this->targets[i] = target; - this->shader_samplers_used |= 1U << i; - this->shader_shadow_samplers |= shadow << i; - } - } else { - uniform->sampler[shader_type].index = ~0; - uniform->sampler[shader_type].active = false; - } - } - - void handle_images(const glsl_type *base_type, - struct gl_uniform_storage *uniform) - { - if (base_type->is_image()) { - uniform->image[shader_type].index = this->next_image; - uniform->image[shader_type].active = true; - - /* Increment the image index by 1 for non-arrays and by the - * number of array elements for arrays. - */ - this->next_image += MAX2(1, uniform->array_elements); - - } else { - uniform->image[shader_type].index = ~0; - uniform->image[shader_type].active = false; - } - } - - virtual void visit_field(const glsl_type *type, const char *name, - bool row_major) - { - (void) type; - (void) name; - (void) row_major; - assert(!"Should not get here."); - } - - virtual void visit_field(const glsl_type *type, const char *name, - bool row_major, const glsl_type *record_type, - bool last_field) - { - assert(!type->without_array()->is_record()); - assert(!type->without_array()->is_interface()); - - unsigned id; - bool found = this->map->get(id, name); - assert(found); - - if (!found) - return; - - const glsl_type *base_type; - if (type->is_array()) { - this->uniforms[id].array_elements = type->length; - base_type = type->fields.array; - } else { - this->uniforms[id].array_elements = 0; - base_type = type; - } - - /* This assigns uniform indices to sampler and image uniforms. */ - handle_samplers(base_type, &this->uniforms[id]); - handle_images(base_type, &this->uniforms[id]); - - /* If there is already storage associated with this uniform, it means - * that it was set while processing an earlier shader stage. For - * example, we may be processing the uniform in the fragment shader, but - * the uniform was already processed in the vertex shader. - */ - if (this->uniforms[id].storage != NULL) { - return; - } - - /* Assign explicit locations. */ - if (current_var->data.explicit_location) { - /* Set sequential locations for struct fields. */ - if (record_type != NULL) { - const unsigned entries = MAX2(1, this->uniforms[id].array_elements); - this->uniforms[id].remap_location = - current_var->data.location + field_counter; - field_counter += entries; - } else { - this->uniforms[id].remap_location = current_var->data.location; - } - } else { - /* Initialize to to indicate that no location is set */ - this->uniforms[id].remap_location = UNMAPPED_UNIFORM_LOC; - } - - this->uniforms[id].name = ralloc_strdup(this->uniforms, name); - this->uniforms[id].type = base_type; - this->uniforms[id].initialized = 0; - this->uniforms[id].num_driver_storage = 0; - this->uniforms[id].driver_storage = NULL; - this->uniforms[id].storage = this->values; - this->uniforms[id].atomic_buffer_index = -1; - if (this->ubo_block_index != -1) { - this->uniforms[id].block_index = this->ubo_block_index; - - const unsigned alignment = record_type - ? record_type->std140_base_alignment(row_major) - : type->std140_base_alignment(row_major); - this->ubo_byte_offset = glsl_align(this->ubo_byte_offset, alignment); - this->uniforms[id].offset = this->ubo_byte_offset; - this->ubo_byte_offset += type->std140_size(row_major); - - if (last_field) - this->ubo_byte_offset = glsl_align(this->ubo_byte_offset, 16); - - if (type->is_array()) { - this->uniforms[id].array_stride = - glsl_align(type->fields.array->std140_size(row_major), 16); - } else { - this->uniforms[id].array_stride = 0; - } - - if (type->without_array()->is_matrix()) { - this->uniforms[id].matrix_stride = 16; - this->uniforms[id].row_major = row_major; - } else { - this->uniforms[id].matrix_stride = 0; - this->uniforms[id].row_major = false; - } - } else { - this->uniforms[id].block_index = -1; - this->uniforms[id].offset = -1; - this->uniforms[id].array_stride = -1; - this->uniforms[id].matrix_stride = -1; - this->uniforms[id].row_major = false; - } - - this->values += values_for_type(type); - } - - struct string_to_uint_map *map; - - struct gl_uniform_storage *uniforms; - unsigned next_sampler; - unsigned next_image; - -public: - union gl_constant_value *values; - - gl_texture_index targets[MAX_SAMPLERS]; - - /** - * Current variable being processed. - */ - ir_variable *current_var; - - /** - * Field counter is used to take care that uniform structures - * with explicit locations get sequential locations. - */ - unsigned field_counter; - - /** - * Mask of samplers used by the current shader stage. - */ - unsigned shader_samplers_used; - - /** - * Mask of samplers used by the current shader stage for shadows. - */ - unsigned shader_shadow_samplers; -}; - -/** - * Merges a uniform block into an array of uniform blocks that may or - * may not already contain a copy of it. - * - * Returns the index of the new block in the array. - */ -int -link_cross_validate_uniform_block(void *mem_ctx, - struct gl_uniform_block **linked_blocks, - unsigned int *num_linked_blocks, - struct gl_uniform_block *new_block) -{ - for (unsigned int i = 0; i < *num_linked_blocks; i++) { - struct gl_uniform_block *old_block = &(*linked_blocks)[i]; - - if (strcmp(old_block->Name, new_block->Name) == 0) - return link_uniform_blocks_are_compatible(old_block, new_block) - ? i : -1; - } - - *linked_blocks = reralloc(mem_ctx, *linked_blocks, - struct gl_uniform_block, - *num_linked_blocks + 1); - int linked_block_index = (*num_linked_blocks)++; - struct gl_uniform_block *linked_block = &(*linked_blocks)[linked_block_index]; - - memcpy(linked_block, new_block, sizeof(*new_block)); - linked_block->Uniforms = ralloc_array(*linked_blocks, - struct gl_uniform_buffer_variable, - linked_block->NumUniforms); - - memcpy(linked_block->Uniforms, - new_block->Uniforms, - sizeof(*linked_block->Uniforms) * linked_block->NumUniforms); - - for (unsigned int i = 0; i < linked_block->NumUniforms; i++) { - struct gl_uniform_buffer_variable *ubo_var = - &linked_block->Uniforms[i]; - - if (ubo_var->Name == ubo_var->IndexName) { - ubo_var->Name = ralloc_strdup(*linked_blocks, ubo_var->Name); - ubo_var->IndexName = ubo_var->Name; - } else { - ubo_var->Name = ralloc_strdup(*linked_blocks, ubo_var->Name); - ubo_var->IndexName = ralloc_strdup(*linked_blocks, ubo_var->IndexName); - } - } - - return linked_block_index; -} - -/** - * Walks the IR and update the references to uniform blocks in the - * ir_variables to point at linked shader's list (previously, they - * would point at the uniform block list in one of the pre-linked - * shaders). - */ -static void -link_update_uniform_buffer_variables(struct gl_shader *shader) -{ - foreach_in_list(ir_instruction, node, shader->ir) { - ir_variable *const var = node->as_variable(); - - if ((var == NULL) || !var->is_in_uniform_block()) - continue; - - assert(var->data.mode == ir_var_uniform); - - if (var->is_interface_instance()) { - var->data.location = 0; - continue; - } - - bool found = false; - char sentinel = '\0'; - - if (var->type->is_record()) { - sentinel = '.'; - } else if (var->type->is_array() - && var->type->fields.array->is_record()) { - sentinel = '['; - } - - const unsigned l = strlen(var->name); - for (unsigned i = 0; i < shader->NumUniformBlocks; i++) { - for (unsigned j = 0; j < shader->UniformBlocks[i].NumUniforms; j++) { - if (sentinel) { - const char *begin = shader->UniformBlocks[i].Uniforms[j].Name; - const char *end = strchr(begin, sentinel); - - if (end == NULL) - continue; - - if ((ptrdiff_t) l != (end - begin)) - continue; - - if (strncmp(var->name, begin, l) == 0) { - found = true; - var->data.location = j; - break; - } - } else if (!strcmp(var->name, - shader->UniformBlocks[i].Uniforms[j].Name)) { - found = true; - var->data.location = j; - break; - } - } - if (found) - break; - } - assert(found); - } -} - - -/** - * Scan the program for image uniforms and store image unit access - * information into the gl_shader data structure. - */ -static void -link_set_image_access_qualifiers(struct gl_shader_program *prog) -{ - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - gl_shader *sh = prog->_LinkedShaders[i]; - - if (sh == NULL) - continue; - - foreach_in_list(ir_instruction, node, sh->ir) { - ir_variable *var = node->as_variable(); - - if (var && var->data.mode == ir_var_uniform && - var->type->contains_image()) { - unsigned id = 0; - bool found = prog->UniformHash->get(id, var->name); - assert(found); - (void) found; - const gl_uniform_storage *storage = &prog->UniformStorage[id]; - const unsigned index = storage->image[i].index; - const GLenum access = (var->data.image_read_only ? GL_READ_ONLY : - var->data.image_write_only ? GL_WRITE_ONLY : - GL_READ_WRITE); - - for (unsigned j = 0; j < MAX2(1, storage->array_elements); ++j) - sh->ImageAccess[index + j] = access; - } - } - } -} - -void -link_assign_uniform_locations(struct gl_shader_program *prog, - unsigned int boolean_true) -{ - ralloc_free(prog->UniformStorage); - prog->UniformStorage = NULL; - prog->NumUserUniformStorage = 0; - - if (prog->UniformHash != NULL) { - prog->UniformHash->clear(); - } else { - prog->UniformHash = new string_to_uint_map; - } - - /* First pass: Count the uniform resources used by the user-defined - * uniforms. While this happens, each active uniform will have an index - * assigned to it. - * - * Note: this is *NOT* the index that is returned to the application by - * glGetUniformLocation. - */ - count_uniform_size uniform_size(prog->UniformHash); - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - struct gl_shader *sh = prog->_LinkedShaders[i]; - - if (sh == NULL) - continue; - - /* Uniforms that lack an initializer in the shader code have an initial - * value of zero. This includes sampler uniforms. - * - * Page 24 (page 30 of the PDF) of the GLSL 1.20 spec says: - * - * "The link time initial value is either the value of the variable's - * initializer, if present, or 0 if no initializer is present. Sampler - * types cannot have initializers." - */ - memset(sh->SamplerUnits, 0, sizeof(sh->SamplerUnits)); - memset(sh->ImageUnits, 0, sizeof(sh->ImageUnits)); - - link_update_uniform_buffer_variables(sh); - - /* Reset various per-shader target counts. - */ - uniform_size.start_shader(); - - foreach_in_list(ir_instruction, node, sh->ir) { - ir_variable *const var = node->as_variable(); - - if ((var == NULL) || (var->data.mode != ir_var_uniform)) - continue; - - /* FINISHME: Update code to process built-in uniforms! - */ - if (is_gl_identifier(var->name)) { - uniform_size.num_shader_uniform_components += - var->type->component_slots(); - continue; - } - - uniform_size.process(var); - } - - sh->num_samplers = uniform_size.num_shader_samplers; - sh->NumImages = uniform_size.num_shader_images; - sh->num_uniform_components = uniform_size.num_shader_uniform_components; - - sh->num_combined_uniform_components = sh->num_uniform_components; - for (unsigned i = 0; i < sh->NumUniformBlocks; i++) { - sh->num_combined_uniform_components += - sh->UniformBlocks[i].UniformBufferSize / 4; - } - } - - const unsigned num_user_uniforms = uniform_size.num_active_uniforms; - const unsigned num_data_slots = uniform_size.num_values; - - /* On the outside chance that there were no uniforms, bail out. - */ - if (num_user_uniforms == 0) - return; - - struct gl_uniform_storage *uniforms = - rzalloc_array(prog, struct gl_uniform_storage, num_user_uniforms); - union gl_constant_value *data = - rzalloc_array(uniforms, union gl_constant_value, num_data_slots); -#ifndef NDEBUG - union gl_constant_value *data_end = &data[num_data_slots]; -#endif - - parcel_out_uniform_storage parcel(prog->UniformHash, uniforms, data); - - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - if (prog->_LinkedShaders[i] == NULL) - continue; - - parcel.start_shader((gl_shader_stage)i); - - foreach_in_list(ir_instruction, node, prog->_LinkedShaders[i]->ir) { - ir_variable *const var = node->as_variable(); - - if ((var == NULL) || (var->data.mode != ir_var_uniform)) - continue; - - /* FINISHME: Update code to process built-in uniforms! - */ - if (is_gl_identifier(var->name)) - continue; - - parcel.set_and_process(prog, var); - } - - prog->_LinkedShaders[i]->active_samplers = parcel.shader_samplers_used; - prog->_LinkedShaders[i]->shadow_samplers = parcel.shader_shadow_samplers; - - STATIC_ASSERT(sizeof(prog->_LinkedShaders[i]->SamplerTargets) == sizeof(parcel.targets)); - memcpy(prog->_LinkedShaders[i]->SamplerTargets, parcel.targets, - sizeof(prog->_LinkedShaders[i]->SamplerTargets)); - } - - /* Reserve all the explicit locations of the active uniforms. */ - for (unsigned i = 0; i < num_user_uniforms; i++) { - if (uniforms[i].remap_location != UNMAPPED_UNIFORM_LOC) { - /* How many new entries for this uniform? */ - const unsigned entries = MAX2(1, uniforms[i].array_elements); - - /* Set remap table entries point to correct gl_uniform_storage. */ - for (unsigned j = 0; j < entries; j++) { - unsigned element_loc = uniforms[i].remap_location + j; - assert(prog->UniformRemapTable[element_loc] == - INACTIVE_UNIFORM_EXPLICIT_LOCATION); - prog->UniformRemapTable[element_loc] = &uniforms[i]; - } - } - } - - /* Reserve locations for rest of the uniforms. */ - for (unsigned i = 0; i < num_user_uniforms; i++) { - - /* Explicit ones have been set already. */ - if (uniforms[i].remap_location != UNMAPPED_UNIFORM_LOC) - continue; - - /* how many new entries for this uniform? */ - const unsigned entries = MAX2(1, uniforms[i].array_elements); - - /* resize remap table to fit new entries */ - prog->UniformRemapTable = - reralloc(prog, - prog->UniformRemapTable, - gl_uniform_storage *, - prog->NumUniformRemapTable + entries); - - /* set pointers for this uniform */ - for (unsigned j = 0; j < entries; j++) - prog->UniformRemapTable[prog->NumUniformRemapTable+j] = &uniforms[i]; - - /* set the base location in remap table for the uniform */ - uniforms[i].remap_location = prog->NumUniformRemapTable; - - prog->NumUniformRemapTable += entries; - } - -#ifndef NDEBUG - for (unsigned i = 0; i < num_user_uniforms; i++) { - assert(uniforms[i].storage != NULL); - } - - assert(parcel.values == data_end); -#endif - - prog->NumUserUniformStorage = num_user_uniforms; - prog->UniformStorage = uniforms; - - link_set_image_access_qualifiers(prog); - link_set_uniform_initializers(prog, boolean_true); - - return; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/link_varyings.cpp b/3rdparty/glsl-optimizer/src/glsl/link_varyings.cpp deleted file mode 100644 index c2541b099..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/link_varyings.cpp +++ /dev/null @@ -1,1582 +0,0 @@ -/* - * Copyright © 2012 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file link_varyings.cpp - * - * Linker functions related specifically to linking varyings between shader - * stages. - */ - - -#include "main/errors.h" -#include "main/mtypes.h" -#include "glsl_symbol_table.h" -#include "glsl_parser_extras.h" -#include "ir_optimization.h" -#include "linker.h" -#include "link_varyings.h" -#include "main/macros.h" -#include "program/hash_table.h" -#include "program.h" - - -/** - * Validate the types and qualifiers of an output from one stage against the - * matching input to another stage. - */ -static void -cross_validate_types_and_qualifiers(struct gl_shader_program *prog, - const ir_variable *input, - const ir_variable *output, - gl_shader_stage consumer_stage, - gl_shader_stage producer_stage) -{ - /* Check that the types match between stages. - */ - const glsl_type *type_to_match = input->type; - if (consumer_stage == MESA_SHADER_GEOMETRY) { - assert(type_to_match->is_array()); /* Enforced by ast_to_hir */ - type_to_match = type_to_match->element_type(); - } - if (type_to_match != output->type) { - /* There is a bit of a special case for gl_TexCoord. This - * built-in is unsized by default. Applications that variable - * access it must redeclare it with a size. There is some - * language in the GLSL spec that implies the fragment shader - * and vertex shader do not have to agree on this size. Other - * driver behave this way, and one or two applications seem to - * rely on it. - * - * Neither declaration needs to be modified here because the array - * sizes are fixed later when update_array_sizes is called. - * - * From page 48 (page 54 of the PDF) of the GLSL 1.10 spec: - * - * "Unlike user-defined varying variables, the built-in - * varying variables don't have a strict one-to-one - * correspondence between the vertex language and the - * fragment language." - */ - if (!output->type->is_array() || !is_gl_identifier(output->name)) { - linker_error(prog, - "%s shader output `%s' declared as type `%s', " - "but %s shader input declared as type `%s'\n", - _mesa_shader_stage_to_string(producer_stage), - output->name, - output->type->name, - _mesa_shader_stage_to_string(consumer_stage), - input->type->name); - return; - } - } - - /* Check that all of the qualifiers match between stages. - */ - if (input->data.centroid != output->data.centroid) { - linker_error(prog, - "%s shader output `%s' %s centroid qualifier, " - "but %s shader input %s centroid qualifier\n", - _mesa_shader_stage_to_string(producer_stage), - output->name, - (output->data.centroid) ? "has" : "lacks", - _mesa_shader_stage_to_string(consumer_stage), - (input->data.centroid) ? "has" : "lacks"); - return; - } - - if (input->data.sample != output->data.sample) { - linker_error(prog, - "%s shader output `%s' %s sample qualifier, " - "but %s shader input %s sample qualifier\n", - _mesa_shader_stage_to_string(producer_stage), - output->name, - (output->data.sample) ? "has" : "lacks", - _mesa_shader_stage_to_string(consumer_stage), - (input->data.sample) ? "has" : "lacks"); - return; - } - - if (input->data.invariant != output->data.invariant) { - linker_error(prog, - "%s shader output `%s' %s invariant qualifier, " - "but %s shader input %s invariant qualifier\n", - _mesa_shader_stage_to_string(producer_stage), - output->name, - (output->data.invariant) ? "has" : "lacks", - _mesa_shader_stage_to_string(consumer_stage), - (input->data.invariant) ? "has" : "lacks"); - return; - } - - if (input->data.interpolation != output->data.interpolation) { - linker_error(prog, - "%s shader output `%s' specifies %s " - "interpolation qualifier, " - "but %s shader input specifies %s " - "interpolation qualifier\n", - _mesa_shader_stage_to_string(producer_stage), - output->name, - interpolation_string(output->data.interpolation), - _mesa_shader_stage_to_string(consumer_stage), - interpolation_string(input->data.interpolation)); - return; - } -} - -/** - * Validate front and back color outputs against single color input - */ -static void -cross_validate_front_and_back_color(struct gl_shader_program *prog, - const ir_variable *input, - const ir_variable *front_color, - const ir_variable *back_color, - gl_shader_stage consumer_stage, - gl_shader_stage producer_stage) -{ - if (front_color != NULL && front_color->data.assigned) - cross_validate_types_and_qualifiers(prog, input, front_color, - consumer_stage, producer_stage); - - if (back_color != NULL && back_color->data.assigned) - cross_validate_types_and_qualifiers(prog, input, back_color, - consumer_stage, producer_stage); -} - -/** - * Validate that outputs from one stage match inputs of another - */ -void -cross_validate_outputs_to_inputs(struct gl_shader_program *prog, - gl_shader *producer, gl_shader *consumer) -{ - glsl_symbol_table parameters; - ir_variable *explicit_locations[MAX_VARYING] = { NULL, }; - - /* Find all shader outputs in the "producer" stage. - */ - foreach_in_list(ir_instruction, node, producer->ir) { - ir_variable *const var = node->as_variable(); - - if ((var == NULL) || (var->data.mode != ir_var_shader_out)) - continue; - - if (!var->data.explicit_location - || var->data.location < VARYING_SLOT_VAR0) - parameters.add_variable(var); - else { - /* User-defined varyings with explicit locations are handled - * differently because they do not need to have matching names. - */ - const unsigned idx = var->data.location - VARYING_SLOT_VAR0; - - if (explicit_locations[idx] != NULL) { - linker_error(prog, - "%s shader has multiple outputs explicitly " - "assigned to location %d\n", - _mesa_shader_stage_to_string(producer->Stage), - idx); - return; - } - - explicit_locations[idx] = var; - } - } - - - /* Find all shader inputs in the "consumer" stage. Any variables that have - * matching outputs already in the symbol table must have the same type and - * qualifiers. - * - * Exception: if the consumer is the geometry shader, then the inputs - * should be arrays and the type of the array element should match the type - * of the corresponding producer output. - */ - foreach_in_list(ir_instruction, node, consumer->ir) { - ir_variable *const input = node->as_variable(); - - if ((input == NULL) || (input->data.mode != ir_var_shader_in)) - continue; - - if (strcmp(input->name, "gl_Color") == 0 && input->data.used) { - const ir_variable *const front_color = - parameters.get_variable("gl_FrontColor"); - - const ir_variable *const back_color = - parameters.get_variable("gl_BackColor"); - - cross_validate_front_and_back_color(prog, input, - front_color, back_color, - consumer->Stage, producer->Stage); - } else if (strcmp(input->name, "gl_SecondaryColor") == 0 && input->data.used) { - const ir_variable *const front_color = - parameters.get_variable("gl_FrontSecondaryColor"); - - const ir_variable *const back_color = - parameters.get_variable("gl_BackSecondaryColor"); - - cross_validate_front_and_back_color(prog, input, - front_color, back_color, - consumer->Stage, producer->Stage); - } else { - /* The rules for connecting inputs and outputs change in the presence - * of explicit locations. In this case, we no longer care about the - * names of the variables. Instead, we care only about the - * explicitly assigned location. - */ - ir_variable *output = NULL; - if (input->data.explicit_location - && input->data.location >= VARYING_SLOT_VAR0) { - output = explicit_locations[input->data.location - VARYING_SLOT_VAR0]; - - if (output == NULL) { - linker_error(prog, - "%s shader input `%s' with explicit location " - "has no matching output\n", - _mesa_shader_stage_to_string(consumer->Stage), - input->name); - } - } else { - output = parameters.get_variable(input->name); - } - - if (output != NULL) { - cross_validate_types_and_qualifiers(prog, input, output, - consumer->Stage, producer->Stage); - } - } - } -} - - -/** - * Initialize this object based on a string that was passed to - * glTransformFeedbackVaryings. - * - * If the input is mal-formed, this call still succeeds, but it sets - * this->var_name to a mal-formed input, so tfeedback_decl::find_output_var() - * will fail to find any matching variable. - */ -void -tfeedback_decl::init(struct gl_context *ctx, const void *mem_ctx, - const char *input) -{ - /* We don't have to be pedantic about what is a valid GLSL variable name, - * because any variable with an invalid name can't exist in the IR anyway. - */ - - this->location = -1; - this->orig_name = input; - this->is_clip_distance_mesa = false; - this->skip_components = 0; - this->next_buffer_separator = false; - this->matched_candidate = NULL; - this->stream_id = 0; - - if (ctx->Extensions.ARB_transform_feedback3) { - /* Parse gl_NextBuffer. */ - if (strcmp(input, "gl_NextBuffer") == 0) { - this->next_buffer_separator = true; - return; - } - - /* Parse gl_SkipComponents. */ - if (strcmp(input, "gl_SkipComponents1") == 0) - this->skip_components = 1; - else if (strcmp(input, "gl_SkipComponents2") == 0) - this->skip_components = 2; - else if (strcmp(input, "gl_SkipComponents3") == 0) - this->skip_components = 3; - else if (strcmp(input, "gl_SkipComponents4") == 0) - this->skip_components = 4; - - if (this->skip_components) - return; - } - - /* Parse a declaration. */ - const char *base_name_end; - long subscript = parse_program_resource_name(input, &base_name_end); - this->var_name = ralloc_strndup(mem_ctx, input, base_name_end - input); - if (this->var_name == NULL) { - _mesa_error_no_memory(__func__); - return; - } - - if (subscript >= 0) { - this->array_subscript = subscript; - this->is_subscripted = true; - } else { - this->is_subscripted = false; - } - - /* For drivers that lower gl_ClipDistance to gl_ClipDistanceMESA, this - * class must behave specially to account for the fact that gl_ClipDistance - * is converted from a float[8] to a vec4[2]. - */ - if (ctx->Const.ShaderCompilerOptions[MESA_SHADER_VERTEX].LowerClipDistance && - strcmp(this->var_name, "gl_ClipDistance") == 0) { - this->is_clip_distance_mesa = true; - } -} - - -/** - * Determine whether two tfeedback_decl objects refer to the same variable and - * array index (if applicable). - */ -bool -tfeedback_decl::is_same(const tfeedback_decl &x, const tfeedback_decl &y) -{ - assert(x.is_varying() && y.is_varying()); - - if (strcmp(x.var_name, y.var_name) != 0) - return false; - if (x.is_subscripted != y.is_subscripted) - return false; - if (x.is_subscripted && x.array_subscript != y.array_subscript) - return false; - return true; -} - - -/** - * Assign a location and stream ID for this tfeedback_decl object based on the - * transform feedback candidate found by find_candidate. - * - * If an error occurs, the error is reported through linker_error() and false - * is returned. - */ -bool -tfeedback_decl::assign_location(struct gl_context *ctx, - struct gl_shader_program *prog) -{ - assert(this->is_varying()); - - unsigned fine_location - = this->matched_candidate->toplevel_var->data.location * 4 - + this->matched_candidate->toplevel_var->data.location_frac - + this->matched_candidate->offset; - - if (this->matched_candidate->type->is_array()) { - /* Array variable */ - const unsigned matrix_cols = - this->matched_candidate->type->fields.array->matrix_columns; - const unsigned vector_elements = - this->matched_candidate->type->fields.array->vector_elements; - unsigned actual_array_size = this->is_clip_distance_mesa ? - prog->LastClipDistanceArraySize : - this->matched_candidate->type->array_size(); - - if (this->is_subscripted) { - /* Check array bounds. */ - if (this->array_subscript >= actual_array_size) { - linker_error(prog, "Transform feedback varying %s has index " - "%i, but the array size is %u.", - this->orig_name, this->array_subscript, - actual_array_size); - return false; - } - unsigned array_elem_size = this->is_clip_distance_mesa ? - 1 : vector_elements * matrix_cols; - fine_location += array_elem_size * this->array_subscript; - this->size = 1; - } else { - this->size = actual_array_size; - } - this->vector_elements = vector_elements; - this->matrix_columns = matrix_cols; - if (this->is_clip_distance_mesa) - this->type = GL_FLOAT; - else - this->type = this->matched_candidate->type->fields.array->gl_type; - } else { - /* Regular variable (scalar, vector, or matrix) */ - if (this->is_subscripted) { - linker_error(prog, "Transform feedback varying %s requested, " - "but %s is not an array.", - this->orig_name, this->var_name); - return false; - } - this->size = 1; - this->vector_elements = this->matched_candidate->type->vector_elements; - this->matrix_columns = this->matched_candidate->type->matrix_columns; - this->type = this->matched_candidate->type->gl_type; - } - this->location = fine_location / 4; - this->location_frac = fine_location % 4; - - /* From GL_EXT_transform_feedback: - * A program will fail to link if: - * - * * the total number of components to capture in any varying - * variable in is greater than the constant - * MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT and the - * buffer mode is SEPARATE_ATTRIBS_EXT; - */ - if (prog->TransformFeedback.BufferMode == GL_SEPARATE_ATTRIBS && - this->num_components() > - ctx->Const.MaxTransformFeedbackSeparateComponents) { - linker_error(prog, "Transform feedback varying %s exceeds " - "MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS.", - this->orig_name); - return false; - } - - /* Only transform feedback varyings can be assigned to non-zero streams, - * so assign the stream id here. - */ - this->stream_id = this->matched_candidate->toplevel_var->data.stream; - - return true; -} - - -unsigned -tfeedback_decl::get_num_outputs() const -{ - if (!this->is_varying()) { - return 0; - } - - return (this->num_components() + this->location_frac + 3)/4; -} - - -/** - * Update gl_transform_feedback_info to reflect this tfeedback_decl. - * - * If an error occurs, the error is reported through linker_error() and false - * is returned. - */ -bool -tfeedback_decl::store(struct gl_context *ctx, struct gl_shader_program *prog, - struct gl_transform_feedback_info *info, - unsigned buffer, const unsigned max_outputs) const -{ - assert(!this->next_buffer_separator); - - /* Handle gl_SkipComponents. */ - if (this->skip_components) { - info->BufferStride[buffer] += this->skip_components; - return true; - } - - /* From GL_EXT_transform_feedback: - * A program will fail to link if: - * - * * the total number of components to capture is greater than - * the constant MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT - * and the buffer mode is INTERLEAVED_ATTRIBS_EXT. - */ - if (prog->TransformFeedback.BufferMode == GL_INTERLEAVED_ATTRIBS && - info->BufferStride[buffer] + this->num_components() > - ctx->Const.MaxTransformFeedbackInterleavedComponents) { - linker_error(prog, "The MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS " - "limit has been exceeded."); - return false; - } - - unsigned location = this->location; - unsigned location_frac = this->location_frac; - unsigned num_components = this->num_components(); - while (num_components > 0) { - unsigned output_size = MIN2(num_components, 4 - location_frac); - assert(info->NumOutputs < max_outputs); - info->Outputs[info->NumOutputs].ComponentOffset = location_frac; - info->Outputs[info->NumOutputs].OutputRegister = location; - info->Outputs[info->NumOutputs].NumComponents = output_size; - info->Outputs[info->NumOutputs].StreamId = stream_id; - info->Outputs[info->NumOutputs].OutputBuffer = buffer; - info->Outputs[info->NumOutputs].DstOffset = info->BufferStride[buffer]; - ++info->NumOutputs; - info->BufferStride[buffer] += output_size; - num_components -= output_size; - location++; - location_frac = 0; - } - - info->Varyings[info->NumVarying].Name = ralloc_strdup(prog, this->orig_name); - info->Varyings[info->NumVarying].Type = this->type; - info->Varyings[info->NumVarying].Size = this->size; - info->NumVarying++; - - return true; -} - - -const tfeedback_candidate * -tfeedback_decl::find_candidate(gl_shader_program *prog, - hash_table *tfeedback_candidates) -{ - const char *name = this->is_clip_distance_mesa - ? "gl_ClipDistanceMESA" : this->var_name; - this->matched_candidate = (const tfeedback_candidate *) - hash_table_find(tfeedback_candidates, name); - if (!this->matched_candidate) { - /* From GL_EXT_transform_feedback: - * A program will fail to link if: - * - * * any variable name specified in the array is not - * declared as an output in the geometry shader (if present) or - * the vertex shader (if no geometry shader is present); - */ - linker_error(prog, "Transform feedback varying %s undeclared.", - this->orig_name); - } - return this->matched_candidate; -} - - -/** - * Parse all the transform feedback declarations that were passed to - * glTransformFeedbackVaryings() and store them in tfeedback_decl objects. - * - * If an error occurs, the error is reported through linker_error() and false - * is returned. - */ -bool -parse_tfeedback_decls(struct gl_context *ctx, struct gl_shader_program *prog, - const void *mem_ctx, unsigned num_names, - char **varying_names, tfeedback_decl *decls) -{ - for (unsigned i = 0; i < num_names; ++i) { - decls[i].init(ctx, mem_ctx, varying_names[i]); - - if (!decls[i].is_varying()) - continue; - - /* From GL_EXT_transform_feedback: - * A program will fail to link if: - * - * * any two entries in the array specify the same varying - * variable; - * - * We interpret this to mean "any two entries in the array - * specify the same varying variable and array index", since transform - * feedback of arrays would be useless otherwise. - */ - for (unsigned j = 0; j < i; ++j) { - if (!decls[j].is_varying()) - continue; - - if (tfeedback_decl::is_same(decls[i], decls[j])) { - linker_error(prog, "Transform feedback varying %s specified " - "more than once.", varying_names[i]); - return false; - } - } - } - return true; -} - - -/** - * Store transform feedback location assignments into - * prog->LinkedTransformFeedback based on the data stored in tfeedback_decls. - * - * If an error occurs, the error is reported through linker_error() and false - * is returned. - */ -bool -store_tfeedback_info(struct gl_context *ctx, struct gl_shader_program *prog, - unsigned num_tfeedback_decls, - tfeedback_decl *tfeedback_decls) -{ - bool separate_attribs_mode = - prog->TransformFeedback.BufferMode == GL_SEPARATE_ATTRIBS; - - ralloc_free(prog->LinkedTransformFeedback.Varyings); - ralloc_free(prog->LinkedTransformFeedback.Outputs); - - memset(&prog->LinkedTransformFeedback, 0, - sizeof(prog->LinkedTransformFeedback)); - - prog->LinkedTransformFeedback.Varyings = - rzalloc_array(prog, - struct gl_transform_feedback_varying_info, - num_tfeedback_decls); - - unsigned num_outputs = 0; - for (unsigned i = 0; i < num_tfeedback_decls; ++i) - num_outputs += tfeedback_decls[i].get_num_outputs(); - - prog->LinkedTransformFeedback.Outputs = - rzalloc_array(prog, - struct gl_transform_feedback_output, - num_outputs); - - unsigned num_buffers = 0; - - if (separate_attribs_mode) { - /* GL_SEPARATE_ATTRIBS */ - for (unsigned i = 0; i < num_tfeedback_decls; ++i) { - if (!tfeedback_decls[i].store(ctx, prog, &prog->LinkedTransformFeedback, - num_buffers, num_outputs)) - return false; - - num_buffers++; - } - } - else { - /* GL_INVERLEAVED_ATTRIBS */ - int buffer_stream_id = -1; - for (unsigned i = 0; i < num_tfeedback_decls; ++i) { - if (tfeedback_decls[i].is_next_buffer_separator()) { - num_buffers++; - buffer_stream_id = -1; - continue; - } else if (buffer_stream_id == -1) { - /* First varying writing to this buffer: remember its stream */ - buffer_stream_id = (int) tfeedback_decls[i].get_stream_id(); - } else if (buffer_stream_id != - (int) tfeedback_decls[i].get_stream_id()) { - /* Varying writes to the same buffer from a different stream */ - linker_error(prog, - "Transform feedback can't capture varyings belonging " - "to different vertex streams in a single buffer. " - "Varying %s writes to buffer from stream %u, other " - "varyings in the same buffer write from stream %u.", - tfeedback_decls[i].name(), - tfeedback_decls[i].get_stream_id(), - buffer_stream_id); - return false; - } - - if (!tfeedback_decls[i].store(ctx, prog, - &prog->LinkedTransformFeedback, - num_buffers, num_outputs)) - return false; - } - num_buffers++; - } - - assert(prog->LinkedTransformFeedback.NumOutputs == num_outputs); - - prog->LinkedTransformFeedback.NumBuffers = num_buffers; - return true; -} - -namespace { - -/** - * Data structure recording the relationship between outputs of one shader - * stage (the "producer") and inputs of another (the "consumer"). - */ -class varying_matches -{ -public: - varying_matches(bool disable_varying_packing, bool consumer_is_fs); - ~varying_matches(); - void record(ir_variable *producer_var, ir_variable *consumer_var); - unsigned assign_locations(); - void store_locations() const; - -private: - /** - * If true, this driver disables varying packing, so all varyings need to - * be aligned on slot boundaries, and take up a number of slots equal to - * their number of matrix columns times their array size. - */ - const bool disable_varying_packing; - - /** - * Enum representing the order in which varyings are packed within a - * packing class. - * - * Currently we pack vec4's first, then vec2's, then scalar values, then - * vec3's. This order ensures that the only vectors that are at risk of - * having to be "double parked" (split between two adjacent varying slots) - * are the vec3's. - */ - enum packing_order_enum { - PACKING_ORDER_VEC4, - PACKING_ORDER_VEC2, - PACKING_ORDER_SCALAR, - PACKING_ORDER_VEC3, - }; - - static unsigned compute_packing_class(const ir_variable *var); - static packing_order_enum compute_packing_order(const ir_variable *var); - static int match_comparator(const void *x_generic, const void *y_generic); - - /** - * Structure recording the relationship between a single producer output - * and a single consumer input. - */ - struct match { - /** - * Packing class for this varying, computed by compute_packing_class(). - */ - unsigned packing_class; - - /** - * Packing order for this varying, computed by compute_packing_order(). - */ - packing_order_enum packing_order; - unsigned num_components; - - /** - * The output variable in the producer stage. - */ - ir_variable *producer_var; - - /** - * The input variable in the consumer stage. - */ - ir_variable *consumer_var; - - /** - * The location which has been assigned for this varying. This is - * expressed in multiples of a float, with the first generic varying - * (i.e. the one referred to by VARYING_SLOT_VAR0) represented by the - * value 0. - */ - unsigned generic_location; - } *matches; - - /** - * The number of elements in the \c matches array that are currently in - * use. - */ - unsigned num_matches; - - /** - * The number of elements that were set aside for the \c matches array when - * it was allocated. - */ - unsigned matches_capacity; - - const bool consumer_is_fs; -}; - -} /* anonymous namespace */ - -varying_matches::varying_matches(bool disable_varying_packing, - bool consumer_is_fs) - : disable_varying_packing(disable_varying_packing), - consumer_is_fs(consumer_is_fs) -{ - /* Note: this initial capacity is rather arbitrarily chosen to be large - * enough for many cases without wasting an unreasonable amount of space. - * varying_matches::record() will resize the array if there are more than - * this number of varyings. - */ - this->matches_capacity = 8; - this->matches = (match *) - malloc(sizeof(*this->matches) * this->matches_capacity); - this->num_matches = 0; -} - - -varying_matches::~varying_matches() -{ - free(this->matches); -} - - -/** - * Record the given producer/consumer variable pair in the list of variables - * that should later be assigned locations. - * - * It is permissible for \c consumer_var to be NULL (this happens if a - * variable is output by the producer and consumed by transform feedback, but - * not consumed by the consumer). - * - * If \c producer_var has already been paired up with a consumer_var, or - * producer_var is part of fixed pipeline functionality (and hence already has - * a location assigned), this function has no effect. - * - * Note: as a side effect this function may change the interpolation type of - * \c producer_var, but only when the change couldn't possibly affect - * rendering. - */ -void -varying_matches::record(ir_variable *producer_var, ir_variable *consumer_var) -{ - assert(producer_var != NULL || consumer_var != NULL); - - if ((producer_var && !producer_var->data.is_unmatched_generic_inout) - || (consumer_var && !consumer_var->data.is_unmatched_generic_inout)) { - /* Either a location already exists for this variable (since it is part - * of fixed functionality), or it has already been recorded as part of a - * previous match. - */ - return; - } - - if ((consumer_var == NULL && producer_var->type->contains_integer()) || - !consumer_is_fs) { - /* Since this varying is not being consumed by the fragment shader, its - * interpolation type varying cannot possibly affect rendering. Also, - * this variable is non-flat and is (or contains) an integer. - * - * lower_packed_varyings requires all integer varyings to flat, - * regardless of where they appear. We can trivially satisfy that - * requirement by changing the interpolation type to flat here. - */ - producer_var->data.centroid = false; - producer_var->data.sample = false; - producer_var->data.interpolation = INTERP_QUALIFIER_FLAT; - - if (consumer_var) { - consumer_var->data.centroid = false; - consumer_var->data.sample = false; - consumer_var->data.interpolation = INTERP_QUALIFIER_FLAT; - } - } - - if (this->num_matches == this->matches_capacity) { - this->matches_capacity *= 2; - this->matches = (match *) - realloc(this->matches, - sizeof(*this->matches) * this->matches_capacity); - } - - const ir_variable *const var = (producer_var != NULL) - ? producer_var : consumer_var; - - this->matches[this->num_matches].packing_class - = this->compute_packing_class(var); - this->matches[this->num_matches].packing_order - = this->compute_packing_order(var); - if (this->disable_varying_packing) { - unsigned slots = var->type->is_array() - ? (var->type->length * var->type->fields.array->matrix_columns) - : var->type->matrix_columns; - this->matches[this->num_matches].num_components = 4 * slots; - } else { - this->matches[this->num_matches].num_components - = var->type->component_slots(); - } - this->matches[this->num_matches].producer_var = producer_var; - this->matches[this->num_matches].consumer_var = consumer_var; - this->num_matches++; - if (producer_var) - producer_var->data.is_unmatched_generic_inout = 0; - if (consumer_var) - consumer_var->data.is_unmatched_generic_inout = 0; -} - - -/** - * Choose locations for all of the variable matches that were previously - * passed to varying_matches::record(). - */ -unsigned -varying_matches::assign_locations() -{ - /* Sort varying matches into an order that makes them easy to pack. */ - qsort(this->matches, this->num_matches, sizeof(*this->matches), - &varying_matches::match_comparator); - - unsigned generic_location = 0; - - for (unsigned i = 0; i < this->num_matches; i++) { - /* Advance to the next slot if this varying has a different packing - * class than the previous one, and we're not already on a slot - * boundary. - */ - if (i > 0 && - this->matches[i - 1].packing_class - != this->matches[i].packing_class) { - generic_location = ALIGN(generic_location, 4); - } - - this->matches[i].generic_location = generic_location; - - generic_location += this->matches[i].num_components; - } - - return (generic_location + 3) / 4; -} - - -/** - * Update the producer and consumer shaders to reflect the locations - * assignments that were made by varying_matches::assign_locations(). - */ -void -varying_matches::store_locations() const -{ - for (unsigned i = 0; i < this->num_matches; i++) { - ir_variable *producer_var = this->matches[i].producer_var; - ir_variable *consumer_var = this->matches[i].consumer_var; - unsigned generic_location = this->matches[i].generic_location; - unsigned slot = generic_location / 4; - unsigned offset = generic_location % 4; - - if (producer_var) { - producer_var->data.location = VARYING_SLOT_VAR0 + slot; - producer_var->data.location_frac = offset; - } - - if (consumer_var) { - assert(consumer_var->data.location == -1); - consumer_var->data.location = VARYING_SLOT_VAR0 + slot; - consumer_var->data.location_frac = offset; - } - } -} - - -/** - * Compute the "packing class" of the given varying. This is an unsigned - * integer with the property that two variables in the same packing class can - * be safely backed into the same vec4. - */ -unsigned -varying_matches::compute_packing_class(const ir_variable *var) -{ - /* Without help from the back-end, there is no way to pack together - * variables with different interpolation types, because - * lower_packed_varyings must choose exactly one interpolation type for - * each packed varying it creates. - * - * However, we can safely pack together floats, ints, and uints, because: - * - * - varyings of base type "int" and "uint" must use the "flat" - * interpolation type, which can only occur in GLSL 1.30 and above. - * - * - On platforms that support GLSL 1.30 and above, lower_packed_varyings - * can store flat floats as ints without losing any information (using - * the ir_unop_bitcast_* opcodes). - * - * Therefore, the packing class depends only on the interpolation type. - */ - unsigned packing_class = var->data.centroid | (var->data.sample << 1); - packing_class *= 4; - packing_class += var->data.interpolation; - return packing_class; -} - - -/** - * Compute the "packing order" of the given varying. This is a sort key we - * use to determine when to attempt to pack the given varying relative to - * other varyings in the same packing class. - */ -varying_matches::packing_order_enum -varying_matches::compute_packing_order(const ir_variable *var) -{ - const glsl_type *element_type = var->type; - - while (element_type->base_type == GLSL_TYPE_ARRAY) { - element_type = element_type->fields.array; - } - - switch (element_type->component_slots() % 4) { - case 1: return PACKING_ORDER_SCALAR; - case 2: return PACKING_ORDER_VEC2; - case 3: return PACKING_ORDER_VEC3; - case 0: return PACKING_ORDER_VEC4; - default: - assert(!"Unexpected value of vector_elements"); - return PACKING_ORDER_VEC4; - } -} - - -/** - * Comparison function passed to qsort() to sort varyings by packing_class and - * then by packing_order. - */ -int -varying_matches::match_comparator(const void *x_generic, const void *y_generic) -{ - const match *x = (const match *) x_generic; - const match *y = (const match *) y_generic; - - if (x->packing_class != y->packing_class) - return x->packing_class - y->packing_class; - return x->packing_order - y->packing_order; -} - - -/** - * Is the given variable a varying variable to be counted against the - * limit in ctx->Const.MaxVarying? - * This includes variables such as texcoords, colors and generic - * varyings, but excludes variables such as gl_FrontFacing and gl_FragCoord. - */ -static bool -var_counts_against_varying_limit(gl_shader_stage stage, const ir_variable *var) -{ - /* Only fragment shaders will take a varying variable as an input */ - if (stage == MESA_SHADER_FRAGMENT && - var->data.mode == ir_var_shader_in) { - switch (var->data.location) { - case VARYING_SLOT_POS: - case VARYING_SLOT_FACE: - case VARYING_SLOT_PNTC: - return false; - default: - return true; - } - } - return false; -} - - -/** - * Visitor class that generates tfeedback_candidate structs describing all - * possible targets of transform feedback. - * - * tfeedback_candidate structs are stored in the hash table - * tfeedback_candidates, which is passed to the constructor. This hash table - * maps varying names to instances of the tfeedback_candidate struct. - */ -class tfeedback_candidate_generator : public program_resource_visitor -{ -public: - tfeedback_candidate_generator(void *mem_ctx, - hash_table *tfeedback_candidates) - : mem_ctx(mem_ctx), - tfeedback_candidates(tfeedback_candidates), - toplevel_var(NULL), - varying_floats(0) - { - } - - void process(ir_variable *var) - { - this->toplevel_var = var; - this->varying_floats = 0; - if (var->is_interface_instance()) - program_resource_visitor::process(var->get_interface_type(), - var->get_interface_type()->name); - else - program_resource_visitor::process(var); - } - -private: - virtual void visit_field(const glsl_type *type, const char *name, - bool row_major) - { - assert(!type->without_array()->is_record()); - assert(!type->without_array()->is_interface()); - - (void) row_major; - - tfeedback_candidate *candidate - = rzalloc(this->mem_ctx, tfeedback_candidate); - candidate->toplevel_var = this->toplevel_var; - candidate->type = type; - candidate->offset = this->varying_floats; - hash_table_insert(this->tfeedback_candidates, candidate, - ralloc_strdup(this->mem_ctx, name)); - this->varying_floats += type->component_slots(); - } - - /** - * Memory context used to allocate hash table keys and values. - */ - void * const mem_ctx; - - /** - * Hash table in which tfeedback_candidate objects should be stored. - */ - hash_table * const tfeedback_candidates; - - /** - * Pointer to the toplevel variable that is being traversed. - */ - ir_variable *toplevel_var; - - /** - * Total number of varying floats that have been visited so far. This is - * used to determine the offset to each varying within the toplevel - * variable. - */ - unsigned varying_floats; -}; - - -namespace linker { - -bool -populate_consumer_input_sets(void *mem_ctx, exec_list *ir, - hash_table *consumer_inputs, - hash_table *consumer_interface_inputs, - ir_variable *consumer_inputs_with_locations[VARYING_SLOT_MAX]) -{ - memset(consumer_inputs_with_locations, - 0, - sizeof(consumer_inputs_with_locations[0]) * VARYING_SLOT_MAX); - - foreach_in_list(ir_instruction, node, ir) { - ir_variable *const input_var = node->as_variable(); - - if ((input_var != NULL) && (input_var->data.mode == ir_var_shader_in)) { - if (input_var->type->is_interface()) - return false; - - if (input_var->data.explicit_location) { - /* assign_varying_locations only cares about finding the - * ir_variable at the start of a contiguous location block. - * - * - For !producer, consumer_inputs_with_locations isn't used. - * - * - For !consumer, consumer_inputs_with_locations is empty. - * - * For consumer && producer, if you were trying to set some - * ir_variable to the middle of a location block on the other side - * of producer/consumer, cross_validate_outputs_to_inputs() should - * be link-erroring due to either type mismatch or location - * overlaps. If the variables do match up, then they've got a - * matching data.location and you only looked at - * consumer_inputs_with_locations[var->data.location], not any - * following entries for the array/structure. - */ - consumer_inputs_with_locations[input_var->data.location] = - input_var; - } else if (input_var->get_interface_type() != NULL) { - char *const iface_field_name = - ralloc_asprintf(mem_ctx, "%s.%s", - input_var->get_interface_type()->name, - input_var->name); - hash_table_insert(consumer_interface_inputs, input_var, - iface_field_name); - } else { - hash_table_insert(consumer_inputs, input_var, - ralloc_strdup(mem_ctx, input_var->name)); - } - } - } - - return true; -} - -/** - * Find a variable from the consumer that "matches" the specified variable - * - * This function only finds inputs with names that match. There is no - * validation (here) that the types, etc. are compatible. - */ -ir_variable * -get_matching_input(void *mem_ctx, - const ir_variable *output_var, - hash_table *consumer_inputs, - hash_table *consumer_interface_inputs, - ir_variable *consumer_inputs_with_locations[VARYING_SLOT_MAX]) -{ - ir_variable *input_var; - - if (output_var->data.explicit_location) { - input_var = consumer_inputs_with_locations[output_var->data.location]; - } else if (output_var->get_interface_type() != NULL) { - char *const iface_field_name = - ralloc_asprintf(mem_ctx, "%s.%s", - output_var->get_interface_type()->name, - output_var->name); - input_var = - (ir_variable *) hash_table_find(consumer_interface_inputs, - iface_field_name); - } else { - input_var = - (ir_variable *) hash_table_find(consumer_inputs, output_var->name); - } - - return (input_var == NULL || input_var->data.mode != ir_var_shader_in) - ? NULL : input_var; -} - -} - -static int -io_variable_cmp(const void *_a, const void *_b) -{ - const ir_variable *const a = *(const ir_variable **) _a; - const ir_variable *const b = *(const ir_variable **) _b; - - if (a->data.explicit_location && b->data.explicit_location) - return b->data.location - a->data.location; - - if (a->data.explicit_location && !b->data.explicit_location) - return 1; - - if (!a->data.explicit_location && b->data.explicit_location) - return -1; - - return -strcmp(a->name, b->name); -} - -/** - * Sort the shader IO variables into canonical order - */ -static void -canonicalize_shader_io(exec_list *ir, enum ir_variable_mode io_mode) -{ - ir_variable *var_table[MAX_PROGRAM_OUTPUTS * 4]; - unsigned num_variables = 0; - - foreach_in_list(ir_instruction, node, ir) { - ir_variable *const var = node->as_variable(); - - if (var == NULL || var->data.mode != io_mode) - continue; - - /* If we have already encountered more I/O variables that could - * successfully link, bail. - */ - if (num_variables == ARRAY_SIZE(var_table)) - return; - - var_table[num_variables++] = var; - } - - if (num_variables == 0) - return; - - /* Sort the list in reverse order (io_variable_cmp handles this). Later - * we're going to push the variables on to the IR list as a stack, so we - * want the last variable (in canonical order) to be first in the list. - */ - qsort(var_table, num_variables, sizeof(var_table[0]), io_variable_cmp); - - /* Remove the variable from it's current location in the IR, and put it at - * the front. - */ - for (unsigned i = 0; i < num_variables; i++) { - var_table[i]->remove(); - ir->push_head(var_table[i]); - } -} - -/** - * Assign locations for all variables that are produced in one pipeline stage - * (the "producer") and consumed in the next stage (the "consumer"). - * - * Variables produced by the producer may also be consumed by transform - * feedback. - * - * \param num_tfeedback_decls is the number of declarations indicating - * variables that may be consumed by transform feedback. - * - * \param tfeedback_decls is a pointer to an array of tfeedback_decl objects - * representing the result of parsing the strings passed to - * glTransformFeedbackVaryings(). assign_location() will be called for - * each of these objects that matches one of the outputs of the - * producer. - * - * \param gs_input_vertices: if \c consumer is a geometry shader, this is the - * number of input vertices it accepts. Otherwise zero. - * - * When num_tfeedback_decls is nonzero, it is permissible for the consumer to - * be NULL. In this case, varying locations are assigned solely based on the - * requirements of transform feedback. - */ -bool -assign_varying_locations(struct gl_context *ctx, - void *mem_ctx, - struct gl_shader_program *prog, - gl_shader *producer, gl_shader *consumer, - unsigned num_tfeedback_decls, - tfeedback_decl *tfeedback_decls, - unsigned gs_input_vertices) -{ - varying_matches matches(!!ctx->Const.DisableVaryingPacking, - consumer && consumer->Stage == MESA_SHADER_FRAGMENT); - hash_table *tfeedback_candidates - = hash_table_ctor(0, hash_table_string_hash, hash_table_string_compare); - hash_table *consumer_inputs - = hash_table_ctor(0, hash_table_string_hash, hash_table_string_compare); - hash_table *consumer_interface_inputs - = hash_table_ctor(0, hash_table_string_hash, hash_table_string_compare); - ir_variable *consumer_inputs_with_locations[VARYING_SLOT_MAX] = { - NULL, - }; - - /* Operate in a total of four passes. - * - * 1. Sort inputs / outputs into a canonical order. This is necessary so - * that inputs / outputs of separable shaders will be assigned - * predictable locations regardless of the order in which declarations - * appeared in the shader source. - * - * 2. Assign locations for any matching inputs and outputs. - * - * 3. Mark output variables in the producer that do not have locations as - * not being outputs. This lets the optimizer eliminate them. - * - * 4. Mark input variables in the consumer that do not have locations as - * not being inputs. This lets the optimizer eliminate them. - */ - if (consumer) - canonicalize_shader_io(consumer->ir, ir_var_shader_in); - - if (producer) - canonicalize_shader_io(producer->ir, ir_var_shader_out); - - if (consumer - && !linker::populate_consumer_input_sets(mem_ctx, - consumer->ir, - consumer_inputs, - consumer_interface_inputs, - consumer_inputs_with_locations)) { - assert(!"populate_consumer_input_sets failed"); - hash_table_dtor(tfeedback_candidates); - hash_table_dtor(consumer_inputs); - hash_table_dtor(consumer_interface_inputs); - return false; - } - - if (producer) { - foreach_in_list(ir_instruction, node, producer->ir) { - ir_variable *const output_var = node->as_variable(); - - if ((output_var == NULL) || - (output_var->data.mode != ir_var_shader_out)) - continue; - - /* Only geometry shaders can use non-zero streams */ - assert(output_var->data.stream == 0 || - (output_var->data.stream < MAX_VERTEX_STREAMS && - producer->Stage == MESA_SHADER_GEOMETRY)); - - tfeedback_candidate_generator g(mem_ctx, tfeedback_candidates); - g.process(output_var); - - ir_variable *const input_var = - linker::get_matching_input(mem_ctx, output_var, consumer_inputs, - consumer_interface_inputs, - consumer_inputs_with_locations); - - /* If a matching input variable was found, add this ouptut (and the - * input) to the set. If this is a separable program and there is no - * consumer stage, add the output. - */ - if (input_var || (prog->SeparateShader && consumer == NULL)) { - matches.record(output_var, input_var); - } - - /* Only stream 0 outputs can be consumed in the next stage */ - if (input_var && output_var->data.stream != 0) { - linker_error(prog, "output %s is assigned to stream=%d but " - "is linked to an input, which requires stream=0", - output_var->name, output_var->data.stream); - return false; - } - } - } else { - /* If there's no producer stage, then this must be a separable program. - * For example, we may have a program that has just a fragment shader. - * Later this program will be used with some arbitrary vertex (or - * geometry) shader program. This means that locations must be assigned - * for all the inputs. - */ - foreach_in_list(ir_instruction, node, consumer->ir) { - ir_variable *const input_var = node->as_variable(); - - if ((input_var == NULL) || - (input_var->data.mode != ir_var_shader_in)) - continue; - - matches.record(NULL, input_var); - } - } - - for (unsigned i = 0; i < num_tfeedback_decls; ++i) { - if (!tfeedback_decls[i].is_varying()) - continue; - - const tfeedback_candidate *matched_candidate - = tfeedback_decls[i].find_candidate(prog, tfeedback_candidates); - - if (matched_candidate == NULL) { - hash_table_dtor(tfeedback_candidates); - hash_table_dtor(consumer_inputs); - hash_table_dtor(consumer_interface_inputs); - return false; - } - - if (matched_candidate->toplevel_var->data.is_unmatched_generic_inout) - matches.record(matched_candidate->toplevel_var, NULL); - } - - const unsigned slots_used = matches.assign_locations(); - matches.store_locations(); - - for (unsigned i = 0; i < num_tfeedback_decls; ++i) { - if (!tfeedback_decls[i].is_varying()) - continue; - - if (!tfeedback_decls[i].assign_location(ctx, prog)) { - hash_table_dtor(tfeedback_candidates); - hash_table_dtor(consumer_inputs); - hash_table_dtor(consumer_interface_inputs); - return false; - } - } - - hash_table_dtor(tfeedback_candidates); - hash_table_dtor(consumer_inputs); - hash_table_dtor(consumer_interface_inputs); - - if (ctx->Const.DisableVaryingPacking) { - /* Transform feedback code assumes varyings are packed, so if the driver - * has disabled varying packing, make sure it does not support transform - * feedback. - */ - assert(!ctx->Extensions.EXT_transform_feedback); - } else { - if (producer) { - lower_packed_varyings(mem_ctx, slots_used, ir_var_shader_out, - 0, producer); - } - if (consumer) { - lower_packed_varyings(mem_ctx, slots_used, ir_var_shader_in, - gs_input_vertices, consumer); - } - } - - if (consumer && producer) { - foreach_in_list(ir_instruction, node, consumer->ir) { - ir_variable *const var = node->as_variable(); - - if (var && var->data.mode == ir_var_shader_in && - var->data.is_unmatched_generic_inout) { - if (prog->IsES) { - /* - * On Page 91 (Page 97 of the PDF) of the GLSL ES 1.0 spec: - * - * If the vertex shader declares but doesn't write to a - * varying and the fragment shader declares and reads it, - * is this an error? - * - * RESOLUTION: No. - */ - linker_warning(prog, "%s shader varying %s not written " - "by %s shader\n.", - _mesa_shader_stage_to_string(consumer->Stage), - var->name, - _mesa_shader_stage_to_string(producer->Stage)); - } else if (prog->Version <= 120) { - /* On page 25 (page 31 of the PDF) of the GLSL 1.20 spec: - * - * Only those varying variables used (i.e. read) in - * the fragment shader executable must be written to - * by the vertex shader executable; declaring - * superfluous varying variables in a vertex shader is - * permissible. - * - * We interpret this text as meaning that the VS must - * write the variable for the FS to read it. See - * "glsl1-varying read but not written" in piglit. - */ - linker_error(prog, "%s shader varying %s not written " - "by %s shader\n.", - _mesa_shader_stage_to_string(consumer->Stage), - var->name, - _mesa_shader_stage_to_string(producer->Stage)); - } - - /* An 'in' variable is only really a shader input if its - * value is written by the previous stage. - */ - var->data.mode = ir_var_auto; - } - } - } - - return true; -} - -bool -check_against_output_limit(struct gl_context *ctx, - struct gl_shader_program *prog, - gl_shader *producer) -{ - unsigned output_vectors = 0; - - foreach_in_list(ir_instruction, node, producer->ir) { - ir_variable *const var = node->as_variable(); - - if (var && var->data.mode == ir_var_shader_out && - var_counts_against_varying_limit(producer->Stage, var)) { - output_vectors += var->type->count_attribute_slots(); - } - } - - assert(producer->Stage != MESA_SHADER_FRAGMENT); - unsigned max_output_components = - ctx->Const.Program[producer->Stage].MaxOutputComponents; - - const unsigned output_components = output_vectors * 4; - if (output_components > max_output_components) { - if (ctx->API == API_OPENGLES2 || prog->IsES) - linker_error(prog, "shader uses too many output vectors " - "(%u > %u)\n", - output_vectors, - max_output_components / 4); - else - linker_error(prog, "shader uses too many output components " - "(%u > %u)\n", - output_components, - max_output_components); - - return false; - } - - return true; -} - -bool -check_against_input_limit(struct gl_context *ctx, - struct gl_shader_program *prog, - gl_shader *consumer) -{ - unsigned input_vectors = 0; - - foreach_in_list(ir_instruction, node, consumer->ir) { - ir_variable *const var = node->as_variable(); - - if (var && var->data.mode == ir_var_shader_in && - var_counts_against_varying_limit(consumer->Stage, var)) { - input_vectors += var->type->count_attribute_slots(); - } - } - - assert(consumer->Stage != MESA_SHADER_VERTEX); - unsigned max_input_components = - ctx->Const.Program[consumer->Stage].MaxInputComponents; - - const unsigned input_components = input_vectors * 4; - if (input_components > max_input_components) { - if (ctx->API == API_OPENGLES2 || prog->IsES) - linker_error(prog, "shader uses too many input vectors " - "(%u > %u)\n", - input_vectors, - max_input_components / 4); - else - linker_error(prog, "shader uses too many input components " - "(%u > %u)\n", - input_components, - max_input_components); - - return false; - } - - return true; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/link_varyings.h b/3rdparty/glsl-optimizer/src/glsl/link_varyings.h deleted file mode 100644 index afc16a8ba..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/link_varyings.h +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright © 2012 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef GLSL_LINK_VARYINGS_H -#define GLSL_LINK_VARYINGS_H - -/** - * \file link_varyings.h - * - * Linker functions related specifically to linking varyings between shader - * stages. - */ - - -#include "main/glheader.h" - - -struct gl_shader_program; -struct gl_shader; -class ir_variable; - - -/** - * Data structure describing a varying which is available for use in transform - * feedback. - * - * For example, if the vertex shader contains: - * - * struct S { - * vec4 foo; - * float[3] bar; - * }; - * - * varying S[2] v; - * - * Then there would be tfeedback_candidate objects corresponding to the - * following varyings: - * - * v[0].foo - * v[0].bar - * v[1].foo - * v[1].bar - */ -struct tfeedback_candidate -{ - /** - * Toplevel variable containing this varying. In the above example, this - * would point to the declaration of the varying v. - */ - ir_variable *toplevel_var; - - /** - * Type of this varying. In the above example, this would point to the - * glsl_type for "vec4" or "float[3]". - */ - const glsl_type *type; - - /** - * Offset within the toplevel variable where this varying occurs (counted - * in multiples of the size of a float). - */ - unsigned offset; -}; - - -/** - * Data structure tracking information about a transform feedback declaration - * during linking. - */ -class tfeedback_decl -{ -public: - void init(struct gl_context *ctx, const void *mem_ctx, const char *input); - static bool is_same(const tfeedback_decl &x, const tfeedback_decl &y); - bool assign_location(struct gl_context *ctx, - struct gl_shader_program *prog); - unsigned get_num_outputs() const; - bool store(struct gl_context *ctx, struct gl_shader_program *prog, - struct gl_transform_feedback_info *info, unsigned buffer, - const unsigned max_outputs) const; - const tfeedback_candidate *find_candidate(gl_shader_program *prog, - hash_table *tfeedback_candidates); - - bool is_next_buffer_separator() const - { - return this->next_buffer_separator; - } - - bool is_varying() const - { - return !this->next_buffer_separator && !this->skip_components; - } - - const char *name() const - { - return this->orig_name; - } - - unsigned get_stream_id() const - { - return this->stream_id; - } - - /** - * The total number of varying components taken up by this variable. Only - * valid if assign_location() has been called. - */ - unsigned num_components() const - { - if (this->is_clip_distance_mesa) - return this->size; - else - return this->vector_elements * this->matrix_columns * this->size; - } - - unsigned get_location() const { - return this->location; - } - -private: - /** - * The name that was supplied to glTransformFeedbackVaryings. Used for - * error reporting and glGetTransformFeedbackVarying(). - */ - const char *orig_name; - - /** - * The name of the variable, parsed from orig_name. - */ - const char *var_name; - - /** - * True if the declaration in orig_name represents an array. - */ - bool is_subscripted; - - /** - * If is_subscripted is true, the subscript that was specified in orig_name. - */ - unsigned array_subscript; - - /** - * True if the variable is gl_ClipDistance and the driver lowers - * gl_ClipDistance to gl_ClipDistanceMESA. - */ - bool is_clip_distance_mesa; - - /** - * The vertex shader output location that the linker assigned for this - * variable. -1 if a location hasn't been assigned yet. - */ - int location; - - /** - * If non-zero, then this variable may be packed along with other variables - * into a single varying slot, so this offset should be applied when - * accessing components. For example, an offset of 1 means that the x - * component of this variable is actually stored in component y of the - * location specified by \c location. - * - * Only valid if location != -1. - */ - unsigned location_frac; - - /** - * If location != -1, the number of vector elements in this variable, or 1 - * if this variable is a scalar. - */ - unsigned vector_elements; - - /** - * If location != -1, the number of matrix columns in this variable, or 1 - * if this variable is not a matrix. - */ - unsigned matrix_columns; - - /** Type of the varying returned by glGetTransformFeedbackVarying() */ - GLenum type; - - /** - * If location != -1, the size that should be returned by - * glGetTransformFeedbackVarying(). - */ - unsigned size; - - /** - * How many components to skip. If non-zero, this is - * gl_SkipComponents{1,2,3,4} from ARB_transform_feedback3. - */ - unsigned skip_components; - - /** - * Whether this is gl_NextBuffer from ARB_transform_feedback3. - */ - bool next_buffer_separator; - - /** - * If find_candidate() has been called, pointer to the tfeedback_candidate - * data structure that was found. Otherwise NULL. - */ - const tfeedback_candidate *matched_candidate; - - /** - * StreamId assigned to this varying (defaults to 0). Can only be set to - * values other than 0 in geometry shaders that use the stream layout - * modifier. Accepted values must be in the range [0, MAX_VERTEX_STREAMS-1]. - */ - unsigned stream_id; -}; - - -void -cross_validate_outputs_to_inputs(struct gl_shader_program *prog, - gl_shader *producer, gl_shader *consumer); - -bool -parse_tfeedback_decls(struct gl_context *ctx, struct gl_shader_program *prog, - const void *mem_ctx, unsigned num_names, - char **varying_names, tfeedback_decl *decls); - -bool -store_tfeedback_info(struct gl_context *ctx, struct gl_shader_program *prog, - unsigned num_tfeedback_decls, - tfeedback_decl *tfeedback_decls); - -bool -assign_varying_locations(struct gl_context *ctx, - void *mem_ctx, - struct gl_shader_program *prog, - gl_shader *producer, gl_shader *consumer, - unsigned num_tfeedback_decls, - tfeedback_decl *tfeedback_decls, - unsigned gs_input_vertices); - -bool -check_against_output_limit(struct gl_context *ctx, - struct gl_shader_program *prog, - gl_shader *producer); - -bool -check_against_input_limit(struct gl_context *ctx, - struct gl_shader_program *prog, - gl_shader *consumer); - -#endif /* GLSL_LINK_VARYINGS_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/linker.cpp b/3rdparty/glsl-optimizer/src/glsl/linker.cpp deleted file mode 100644 index 1069268fb..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/linker.cpp +++ /dev/null @@ -1,2904 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file linker.cpp - * GLSL linker implementation - * - * Given a set of shaders that are to be linked to generate a final program, - * there are three distinct stages. - * - * In the first stage shaders are partitioned into groups based on the shader - * type. All shaders of a particular type (e.g., vertex shaders) are linked - * together. - * - * - Undefined references in each shader are resolve to definitions in - * another shader. - * - Types and qualifiers of uniforms, outputs, and global variables defined - * in multiple shaders with the same name are verified to be the same. - * - Initializers for uniforms and global variables defined - * in multiple shaders with the same name are verified to be the same. - * - * The result, in the terminology of the GLSL spec, is a set of shader - * executables for each processing unit. - * - * After the first stage is complete, a series of semantic checks are performed - * on each of the shader executables. - * - * - Each shader executable must define a \c main function. - * - Each vertex shader executable must write to \c gl_Position. - * - Each fragment shader executable must write to either \c gl_FragData or - * \c gl_FragColor. - * - * In the final stage individual shader executables are linked to create a - * complete exectuable. - * - * - Types of uniforms defined in multiple shader stages with the same name - * are verified to be the same. - * - Initializers for uniforms defined in multiple shader stages with the - * same name are verified to be the same. - * - Types and qualifiers of outputs defined in one stage are verified to - * be the same as the types and qualifiers of inputs defined with the same - * name in a later stage. - * - * \author Ian Romanick - */ - -#include "main/core.h" -#include "main/errors.h" -#include "glsl_symbol_table.h" -#include "glsl_parser_extras.h" -#include "ir.h" -#include "program.h" -#include "program/hash_table.h" -#include "linker.h" -#include "link_varyings.h" -#include "ir_optimization.h" -#include "ir_rvalue_visitor.h" -#include "ir_uniform.h" - -extern "C" { -#include "standalone_scaffolding.h" -} - -void linker_error(gl_shader_program *, const char *, ...); - -namespace { - -/** - * Visitor that determines whether or not a variable is ever written. - */ -class find_assignment_visitor : public ir_hierarchical_visitor { -public: - find_assignment_visitor(const char *name) - : name(name), found(false) - { - /* empty */ - } - - virtual ir_visitor_status visit_enter(ir_assignment *ir) - { - ir_variable *const var = ir->lhs->variable_referenced(); - - if (strcmp(name, var->name) == 0) { - found = true; - return visit_stop; - } - - return visit_continue_with_parent; - } - - virtual ir_visitor_status visit_enter(ir_call *ir) - { - foreach_two_lists(formal_node, &ir->callee->parameters, - actual_node, &ir->actual_parameters) { - ir_rvalue *param_rval = (ir_rvalue *) actual_node; - ir_variable *sig_param = (ir_variable *) formal_node; - - if (sig_param->data.mode == ir_var_function_out || - sig_param->data.mode == ir_var_function_inout) { - ir_variable *var = param_rval->variable_referenced(); - if (var && strcmp(name, var->name) == 0) { - found = true; - return visit_stop; - } - } - } - - if (ir->return_deref != NULL) { - ir_variable *const var = ir->return_deref->variable_referenced(); - - if (strcmp(name, var->name) == 0) { - found = true; - return visit_stop; - } - } - - return visit_continue_with_parent; - } - - bool variable_found() - { - return found; - } - -private: - const char *name; /**< Find writes to a variable with this name. */ - bool found; /**< Was a write to the variable found? */ -}; - - -/** - * Visitor that determines whether or not a variable is ever read. - */ -class find_deref_visitor : public ir_hierarchical_visitor { -public: - find_deref_visitor(const char *name) - : name(name), found(false) - { - /* empty */ - } - - virtual ir_visitor_status visit(ir_dereference_variable *ir) - { - if (strcmp(this->name, ir->var->name) == 0) { - this->found = true; - return visit_stop; - } - - return visit_continue; - } - - bool variable_found() const - { - return this->found; - } - -private: - const char *name; /**< Find writes to a variable with this name. */ - bool found; /**< Was a write to the variable found? */ -}; - - -class geom_array_resize_visitor : public ir_hierarchical_visitor { -public: - unsigned num_vertices; - gl_shader_program *prog; - - geom_array_resize_visitor(unsigned num_vertices, gl_shader_program *prog) - { - this->num_vertices = num_vertices; - this->prog = prog; - } - - virtual ~geom_array_resize_visitor() - { - /* empty */ - } - - virtual ir_visitor_status visit(ir_variable *var) - { - if (!var->type->is_array() || var->data.mode != ir_var_shader_in) - return visit_continue; - - unsigned size = var->type->length; - - /* Generate a link error if the shader has declared this array with an - * incorrect size. - */ - if (size && size != this->num_vertices) { - linker_error(this->prog, "size of array %s declared as %u, " - "but number of input vertices is %u\n", - var->name, size, this->num_vertices); - return visit_continue; - } - - /* Generate a link error if the shader attempts to access an input - * array using an index too large for its actual size assigned at link - * time. - */ - if (var->data.max_array_access >= this->num_vertices) { - linker_error(this->prog, "geometry shader accesses element %i of " - "%s, but only %i input vertices\n", - var->data.max_array_access, var->name, this->num_vertices); - return visit_continue; - } - - var->type = glsl_type::get_array_instance(var->type->element_type(), - this->num_vertices); - var->data.max_array_access = this->num_vertices - 1; - - return visit_continue; - } - - /* Dereferences of input variables need to be updated so that their type - * matches the newly assigned type of the variable they are accessing. */ - virtual ir_visitor_status visit(ir_dereference_variable *ir) - { - ir->type = ir->var->type; - return visit_continue; - } - - /* Dereferences of 2D input arrays need to be updated so that their type - * matches the newly assigned type of the array they are accessing. */ - virtual ir_visitor_status visit_leave(ir_dereference_array *ir) - { - const glsl_type *const vt = ir->array->type; - if (vt->is_array()) - ir->type = vt->element_type(); - return visit_continue; - } -}; - -/** - * Visitor that determines the highest stream id to which a (geometry) shader - * emits vertices. It also checks whether End{Stream}Primitive is ever called. - */ -class find_emit_vertex_visitor : public ir_hierarchical_visitor { -public: - find_emit_vertex_visitor(int max_allowed) - : max_stream_allowed(max_allowed), - invalid_stream_id(0), - invalid_stream_id_from_emit_vertex(false), - end_primitive_found(false), - uses_non_zero_stream(false) - { - /* empty */ - } - - virtual ir_visitor_status visit_leave(ir_emit_vertex *ir) - { - int stream_id = ir->stream_id(); - - if (stream_id < 0) { - invalid_stream_id = stream_id; - invalid_stream_id_from_emit_vertex = true; - return visit_stop; - } - - if (stream_id > max_stream_allowed) { - invalid_stream_id = stream_id; - invalid_stream_id_from_emit_vertex = true; - return visit_stop; - } - - if (stream_id != 0) - uses_non_zero_stream = true; - - return visit_continue; - } - - virtual ir_visitor_status visit_leave(ir_end_primitive *ir) - { - end_primitive_found = true; - - int stream_id = ir->stream_id(); - - if (stream_id < 0) { - invalid_stream_id = stream_id; - invalid_stream_id_from_emit_vertex = false; - return visit_stop; - } - - if (stream_id > max_stream_allowed) { - invalid_stream_id = stream_id; - invalid_stream_id_from_emit_vertex = false; - return visit_stop; - } - - if (stream_id != 0) - uses_non_zero_stream = true; - - return visit_continue; - } - - bool error() - { - return invalid_stream_id != 0; - } - - const char *error_func() - { - return invalid_stream_id_from_emit_vertex ? - "EmitStreamVertex" : "EndStreamPrimitive"; - } - - int error_stream() - { - return invalid_stream_id; - } - - bool uses_streams() - { - return uses_non_zero_stream; - } - - bool uses_end_primitive() - { - return end_primitive_found; - } - -private: - int max_stream_allowed; - int invalid_stream_id; - bool invalid_stream_id_from_emit_vertex; - bool end_primitive_found; - bool uses_non_zero_stream; -}; - -} /* anonymous namespace */ - -void -linker_error(gl_shader_program *prog, const char *fmt, ...) -{ - va_list ap; - - ralloc_strcat(&prog->InfoLog, "error: "); - va_start(ap, fmt); - ralloc_vasprintf_append(&prog->InfoLog, fmt, ap); - va_end(ap); - - prog->LinkStatus = false; -} - - -void -linker_warning(gl_shader_program *prog, const char *fmt, ...) -{ - va_list ap; - - ralloc_strcat(&prog->InfoLog, "warning: "); - va_start(ap, fmt); - ralloc_vasprintf_append(&prog->InfoLog, fmt, ap); - va_end(ap); - -} - - -/** - * Given a string identifying a program resource, break it into a base name - * and an optional array index in square brackets. - * - * If an array index is present, \c out_base_name_end is set to point to the - * "[" that precedes the array index, and the array index itself is returned - * as a long. - * - * If no array index is present (or if the array index is negative or - * mal-formed), \c out_base_name_end, is set to point to the null terminator - * at the end of the input string, and -1 is returned. - * - * Only the final array index is parsed; if the string contains other array - * indices (or structure field accesses), they are left in the base name. - * - * No attempt is made to check that the base name is properly formed; - * typically the caller will look up the base name in a hash table, so - * ill-formed base names simply turn into hash table lookup failures. - */ -long -parse_program_resource_name(const GLchar *name, - const GLchar **out_base_name_end) -{ - /* Section 7.3.1 ("Program Interfaces") of the OpenGL 4.3 spec says: - * - * "When an integer array element or block instance number is part of - * the name string, it will be specified in decimal form without a "+" - * or "-" sign or any extra leading zeroes. Additionally, the name - * string will not include white space anywhere in the string." - */ - - const size_t len = strlen(name); - *out_base_name_end = name + len; - - if (len == 0 || name[len-1] != ']') - return -1; - - /* Walk backwards over the string looking for a non-digit character. This - * had better be the opening bracket for an array index. - * - * Initially, i specifies the location of the ']'. Since the string may - * contain only the ']' charcater, walk backwards very carefully. - */ - unsigned i; - for (i = len - 1; (i > 0) && isdigit(name[i-1]); --i) - /* empty */ ; - - if ((i == 0) || name[i-1] != '[') - return -1; - - long array_index = strtol(&name[i], NULL, 10); - if (array_index < 0) - return -1; - - *out_base_name_end = name + (i - 1); - return array_index; -} - - -void -link_invalidate_variable_locations(exec_list *ir) -{ - foreach_in_list(ir_instruction, node, ir) { - ir_variable *const var = node->as_variable(); - - if (var == NULL) - continue; - - /* Only assign locations for variables that lack an explicit location. - * Explicit locations are set for all built-in variables, generic vertex - * shader inputs (via layout(location=...)), and generic fragment shader - * outputs (also via layout(location=...)). - */ - if (!var->data.explicit_location) { - var->data.location = -1; - var->data.location_frac = 0; - } - - /* ir_variable::is_unmatched_generic_inout is used by the linker while - * connecting outputs from one stage to inputs of the next stage. - * - * There are two implicit assumptions here. First, we assume that any - * built-in variable (i.e., non-generic in or out) will have - * explicit_location set. Second, we assume that any generic in or out - * will not have explicit_location set. - * - * This second assumption will only be valid until - * GL_ARB_separate_shader_objects is supported. When that extension is - * implemented, this function will need some modifications. - */ - if (!var->data.explicit_location) { - var->data.is_unmatched_generic_inout = 1; - } else { - var->data.is_unmatched_generic_inout = 0; - } - } -} - - -/** - * Set UsesClipDistance and ClipDistanceArraySize based on the given shader. - * - * Also check for errors based on incorrect usage of gl_ClipVertex and - * gl_ClipDistance. - * - * Return false if an error was reported. - */ -static void -analyze_clip_usage(struct gl_shader_program *prog, - struct gl_shader *shader, GLboolean *UsesClipDistance, - GLuint *ClipDistanceArraySize) -{ - *ClipDistanceArraySize = 0; - - if (!prog->IsES && prog->Version >= 130) { - /* From section 7.1 (Vertex Shader Special Variables) of the - * GLSL 1.30 spec: - * - * "It is an error for a shader to statically write both - * gl_ClipVertex and gl_ClipDistance." - * - * This does not apply to GLSL ES shaders, since GLSL ES defines neither - * gl_ClipVertex nor gl_ClipDistance. - */ - find_assignment_visitor clip_vertex("gl_ClipVertex"); - find_assignment_visitor clip_distance("gl_ClipDistance"); - - clip_vertex.run(shader->ir); - clip_distance.run(shader->ir); - if (clip_vertex.variable_found() && clip_distance.variable_found()) { - linker_error(prog, "%s shader writes to both `gl_ClipVertex' " - "and `gl_ClipDistance'\n", - _mesa_shader_stage_to_string(shader->Stage)); - return; - } - *UsesClipDistance = clip_distance.variable_found(); - ir_variable *clip_distance_var = - shader->symbols->get_variable("gl_ClipDistance"); - if (clip_distance_var) - *ClipDistanceArraySize = clip_distance_var->type->length; - } else { - *UsesClipDistance = false; - } -} - - -/** - * Verify that a vertex shader executable meets all semantic requirements. - * - * Also sets prog->Vert.UsesClipDistance and prog->Vert.ClipDistanceArraySize - * as a side effect. - * - * \param shader Vertex shader executable to be verified - */ -void -validate_vertex_shader_executable(struct gl_shader_program *prog, - struct gl_shader *shader) -{ - if (shader == NULL) - return; - - /* From the GLSL 1.10 spec, page 48: - * - * "The variable gl_Position is available only in the vertex - * language and is intended for writing the homogeneous vertex - * position. All executions of a well-formed vertex shader - * executable must write a value into this variable. [...] The - * variable gl_Position is available only in the vertex - * language and is intended for writing the homogeneous vertex - * position. All executions of a well-formed vertex shader - * executable must write a value into this variable." - * - * while in GLSL 1.40 this text is changed to: - * - * "The variable gl_Position is available only in the vertex - * language and is intended for writing the homogeneous vertex - * position. It can be written at any time during shader - * execution. It may also be read back by a vertex shader - * after being written. This value will be used by primitive - * assembly, clipping, culling, and other fixed functionality - * operations, if present, that operate on primitives after - * vertex processing has occurred. Its value is undefined if - * the vertex shader executable does not write gl_Position." - * - * All GLSL ES Versions are similar to GLSL 1.40--failing to write to - * gl_Position is not an error. - */ - if (prog->Version < (prog->IsES ? 300U : 140U)) { - find_assignment_visitor find("gl_Position"); - find.run(shader->ir); - if (!find.variable_found()) { - if (prog->IsES) { - linker_warning(prog, - "vertex shader does not write to `gl_Position'." - "It's value is undefined. \n"); - } else { - linker_error(prog, - "vertex shader does not write to `gl_Position'. \n"); - } - return; - } - } - - analyze_clip_usage(prog, shader, &prog->Vert.UsesClipDistance, - &prog->Vert.ClipDistanceArraySize); -} - - -/** - * Verify that a fragment shader executable meets all semantic requirements - * - * \param shader Fragment shader executable to be verified - */ -void -validate_fragment_shader_executable(struct gl_shader_program *prog, - struct gl_shader *shader) -{ - if (shader == NULL) - return; - - find_assignment_visitor frag_color("gl_FragColor"); - find_assignment_visitor frag_data("gl_FragData"); - - frag_color.run(shader->ir); - frag_data.run(shader->ir); - - if (frag_color.variable_found() && frag_data.variable_found()) { - linker_error(prog, "fragment shader writes to both " - "`gl_FragColor' and `gl_FragData'\n"); - } -} - -/** - * Verify that a geometry shader executable meets all semantic requirements - * - * Also sets prog->Geom.VerticesIn, prog->Geom.UsesClipDistance, and - * prog->Geom.ClipDistanceArraySize as a side effect. - * - * \param shader Geometry shader executable to be verified - */ -void -validate_geometry_shader_executable(struct gl_shader_program *prog, - struct gl_shader *shader) -{ - if (shader == NULL) - return; - - unsigned num_vertices = vertices_per_prim(prog->Geom.InputType); - prog->Geom.VerticesIn = num_vertices; - - analyze_clip_usage(prog, shader, &prog->Geom.UsesClipDistance, - &prog->Geom.ClipDistanceArraySize); -} - -/** - * Check if geometry shaders emit to non-zero streams and do corresponding - * validations. - */ -static void -validate_geometry_shader_emissions(struct gl_context *ctx, - struct gl_shader_program *prog) -{ - if (prog->_LinkedShaders[MESA_SHADER_GEOMETRY] != NULL) { - find_emit_vertex_visitor emit_vertex(ctx->Const.MaxVertexStreams - 1); - emit_vertex.run(prog->_LinkedShaders[MESA_SHADER_GEOMETRY]->ir); - if (emit_vertex.error()) { - linker_error(prog, "Invalid call %s(%d). Accepted values for the " - "stream parameter are in the range [0, %d].", - emit_vertex.error_func(), - emit_vertex.error_stream(), - ctx->Const.MaxVertexStreams - 1); - } - prog->Geom.UsesStreams = emit_vertex.uses_streams(); - prog->Geom.UsesEndPrimitive = emit_vertex.uses_end_primitive(); - - /* From the ARB_gpu_shader5 spec: - * - * "Multiple vertex streams are supported only if the output primitive - * type is declared to be "points". A program will fail to link if it - * contains a geometry shader calling EmitStreamVertex() or - * EndStreamPrimitive() if its output primitive type is not "points". - * - * However, in the same spec: - * - * "The function EmitVertex() is equivalent to calling EmitStreamVertex() - * with set to zero." - * - * And: - * - * "The function EndPrimitive() is equivalent to calling - * EndStreamPrimitive() with set to zero." - * - * Since we can call EmitVertex() and EndPrimitive() when we output - * primitives other than points, calling EmitStreamVertex(0) or - * EmitEndPrimitive(0) should not produce errors. This it also what Nvidia - * does. Currently we only set prog->Geom.UsesStreams to TRUE when - * EmitStreamVertex() or EmitEndPrimitive() are called with a non-zero - * stream. - */ - if (prog->Geom.UsesStreams && prog->Geom.OutputType != GL_POINTS) { - linker_error(prog, "EmitStreamVertex(n) and EndStreamPrimitive(n) " - "with n>0 requires point output"); - } - } -} - - -/** - * Perform validation of global variables used across multiple shaders - */ -void -cross_validate_globals(struct gl_shader_program *prog, - struct gl_shader **shader_list, - unsigned num_shaders, - bool uniforms_only) -{ - /* Examine all of the uniforms in all of the shaders and cross validate - * them. - */ - glsl_symbol_table variables; - for (unsigned i = 0; i < num_shaders; i++) { - if (shader_list[i] == NULL) - continue; - - foreach_in_list(ir_instruction, node, shader_list[i]->ir) { - ir_variable *const var = node->as_variable(); - - if (var == NULL) - continue; - - if (uniforms_only && (var->data.mode != ir_var_uniform)) - continue; - - /* Don't cross validate temporaries that are at global scope. These - * will eventually get pulled into the shaders 'main'. - */ - if (var->data.mode == ir_var_temporary) - continue; - - /* If a global with this name has already been seen, verify that the - * new instance has the same type. In addition, if the globals have - * initializers, the values of the initializers must be the same. - */ - ir_variable *const existing = variables.get_variable(var->name); - if (existing != NULL) { - if (var->type != existing->type) { - /* Consider the types to be "the same" if both types are arrays - * of the same type and one of the arrays is implicitly sized. - * In addition, set the type of the linked variable to the - * explicitly sized array. - */ - if (var->type->is_array() - && existing->type->is_array() - && (var->type->fields.array == existing->type->fields.array) - && ((var->type->length == 0) - || (existing->type->length == 0))) { - if (var->type->length != 0) { - existing->type = var->type; - } - } else if (var->type->is_record() - && existing->type->is_record() - && existing->type->record_compare(var->type)) { - existing->type = var->type; - } else { - linker_error(prog, "%s `%s' declared as type " - "`%s' and type `%s'\n", - mode_string(var), - var->name, var->type->name, - existing->type->name); - return; - } - } - - if (var->data.explicit_location) { - if (existing->data.explicit_location - && (var->data.location != existing->data.location)) { - linker_error(prog, "explicit locations for %s " - "`%s' have differing values\n", - mode_string(var), var->name); - return; - } - - existing->data.location = var->data.location; - existing->data.explicit_location = true; - } - - /* From the GLSL 4.20 specification: - * "A link error will result if two compilation units in a program - * specify different integer-constant bindings for the same - * opaque-uniform name. However, it is not an error to specify a - * binding on some but not all declarations for the same name" - */ - if (var->data.explicit_binding) { - if (existing->data.explicit_binding && - var->data.binding != existing->data.binding) { - linker_error(prog, "explicit bindings for %s " - "`%s' have differing values\n", - mode_string(var), var->name); - return; - } - - existing->data.binding = var->data.binding; - existing->data.explicit_binding = true; - } - - if (var->type->contains_atomic() && - var->data.atomic.offset != existing->data.atomic.offset) { - linker_error(prog, "offset specifications for %s " - "`%s' have differing values\n", - mode_string(var), var->name); - return; - } - - /* Validate layout qualifiers for gl_FragDepth. - * - * From the AMD/ARB_conservative_depth specs: - * - * "If gl_FragDepth is redeclared in any fragment shader in a - * program, it must be redeclared in all fragment shaders in - * that program that have static assignments to - * gl_FragDepth. All redeclarations of gl_FragDepth in all - * fragment shaders in a single program must have the same set - * of qualifiers." - */ - if (strcmp(var->name, "gl_FragDepth") == 0) { - bool layout_declared = var->data.depth_layout != ir_depth_layout_none; - bool layout_differs = - var->data.depth_layout != existing->data.depth_layout; - - if (layout_declared && layout_differs) { - linker_error(prog, - "All redeclarations of gl_FragDepth in all " - "fragment shaders in a single program must have " - "the same set of qualifiers."); - } - - if (var->data.used && layout_differs) { - linker_error(prog, - "If gl_FragDepth is redeclared with a layout " - "qualifier in any fragment shader, it must be " - "redeclared with the same layout qualifier in " - "all fragment shaders that have assignments to " - "gl_FragDepth"); - } - } - - /* Page 35 (page 41 of the PDF) of the GLSL 4.20 spec says: - * - * "If a shared global has multiple initializers, the - * initializers must all be constant expressions, and they - * must all have the same value. Otherwise, a link error will - * result. (A shared global having only one initializer does - * not require that initializer to be a constant expression.)" - * - * Previous to 4.20 the GLSL spec simply said that initializers - * must have the same value. In this case of non-constant - * initializers, this was impossible to determine. As a result, - * no vendor actually implemented that behavior. The 4.20 - * behavior matches the implemented behavior of at least one other - * vendor, so we'll implement that for all GLSL versions. - */ - if (var->constant_initializer != NULL) { - if (existing->constant_initializer != NULL) { - if (!var->constant_initializer->has_value(existing->constant_initializer)) { - linker_error(prog, "initializers for %s " - "`%s' have differing values\n", - mode_string(var), var->name); - return; - } - } else { - /* If the first-seen instance of a particular uniform did not - * have an initializer but a later instance does, copy the - * initializer to the version stored in the symbol table. - */ - /* FINISHME: This is wrong. The constant_value field should - * FINISHME: not be modified! Imagine a case where a shader - * FINISHME: without an initializer is linked in two different - * FINISHME: programs with shaders that have differing - * FINISHME: initializers. Linking with the first will - * FINISHME: modify the shader, and linking with the second - * FINISHME: will fail. - */ - existing->constant_initializer = - var->constant_initializer->clone(ralloc_parent(existing), - NULL); - } - } - - if (var->data.has_initializer) { - if (existing->data.has_initializer - && (var->constant_initializer == NULL - || existing->constant_initializer == NULL)) { - linker_error(prog, - "shared global variable `%s' has multiple " - "non-constant initializers.\n", - var->name); - return; - } - - /* Some instance had an initializer, so keep track of that. In - * this location, all sorts of initializers (constant or - * otherwise) will propagate the existence to the variable - * stored in the symbol table. - */ - existing->data.has_initializer = true; - } - - if (existing->data.invariant != var->data.invariant) { - linker_error(prog, "declarations for %s `%s' have " - "mismatching invariant qualifiers\n", - mode_string(var), var->name); - return; - } - if (existing->data.centroid != var->data.centroid) { - linker_error(prog, "declarations for %s `%s' have " - "mismatching centroid qualifiers\n", - mode_string(var), var->name); - return; - } - if (existing->data.sample != var->data.sample) { - linker_error(prog, "declarations for %s `%s` have " - "mismatching sample qualifiers\n", - mode_string(var), var->name); - return; - } - } else - variables.add_variable(var); - } - } -} - - -/** - * Perform validation of uniforms used across multiple shader stages - */ -void -cross_validate_uniforms(struct gl_shader_program *prog) -{ - cross_validate_globals(prog, prog->_LinkedShaders, - MESA_SHADER_STAGES, true); -} - -/** - * Accumulates the array of prog->UniformBlocks and checks that all - * definitons of blocks agree on their contents. - */ -static bool -interstage_cross_validate_uniform_blocks(struct gl_shader_program *prog) -{ - unsigned max_num_uniform_blocks = 0; - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - if (prog->_LinkedShaders[i]) - max_num_uniform_blocks += prog->_LinkedShaders[i]->NumUniformBlocks; - } - - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - struct gl_shader *sh = prog->_LinkedShaders[i]; - - prog->UniformBlockStageIndex[i] = ralloc_array(prog, int, - max_num_uniform_blocks); - for (unsigned int j = 0; j < max_num_uniform_blocks; j++) - prog->UniformBlockStageIndex[i][j] = -1; - - if (sh == NULL) - continue; - - for (unsigned int j = 0; j < sh->NumUniformBlocks; j++) { - int index = link_cross_validate_uniform_block(prog, - &prog->UniformBlocks, - &prog->NumUniformBlocks, - &sh->UniformBlocks[j]); - - if (index == -1) { - linker_error(prog, "uniform block `%s' has mismatching definitions", - sh->UniformBlocks[j].Name); - return false; - } - - prog->UniformBlockStageIndex[i][index] = j; - } - } - - return true; -} - - -/** - * Populates a shaders symbol table with all global declarations - */ -static void -populate_symbol_table(gl_shader *sh) -{ - sh->symbols = new(sh) glsl_symbol_table; - - foreach_in_list(ir_instruction, inst, sh->ir) { - ir_variable *var; - ir_function *func; - - if ((func = inst->as_function()) != NULL) { - sh->symbols->add_function(func); - } else if ((var = inst->as_variable()) != NULL) { - if (var->data.mode != ir_var_temporary) - sh->symbols->add_variable(var); - } - } -} - - -/** - * Remap variables referenced in an instruction tree - * - * This is used when instruction trees are cloned from one shader and placed in - * another. These trees will contain references to \c ir_variable nodes that - * do not exist in the target shader. This function finds these \c ir_variable - * references and replaces the references with matching variables in the target - * shader. - * - * If there is no matching variable in the target shader, a clone of the - * \c ir_variable is made and added to the target shader. The new variable is - * added to \b both the instruction stream and the symbol table. - * - * \param inst IR tree that is to be processed. - * \param symbols Symbol table containing global scope symbols in the - * linked shader. - * \param instructions Instruction stream where new variable declarations - * should be added. - */ -void -remap_variables(ir_instruction *inst, struct gl_shader *target, - hash_table *temps) -{ - class remap_visitor : public ir_hierarchical_visitor { - public: - remap_visitor(struct gl_shader *target, - hash_table *temps) - { - this->target = target; - this->symbols = target->symbols; - this->instructions = target->ir; - this->temps = temps; - } - - virtual ir_visitor_status visit(ir_dereference_variable *ir) - { - if (ir->var->data.mode == ir_var_temporary) { - ir_variable *var = (ir_variable *) hash_table_find(temps, ir->var); - - assert(var != NULL); - ir->var = var; - return visit_continue; - } - - ir_variable *const existing = - this->symbols->get_variable(ir->var->name); - if (existing != NULL) - ir->var = existing; - else { - ir_variable *copy = ir->var->clone(this->target, NULL); - - this->symbols->add_variable(copy); - this->instructions->push_head(copy); - ir->var = copy; - } - - return visit_continue; - } - - private: - struct gl_shader *target; - glsl_symbol_table *symbols; - exec_list *instructions; - hash_table *temps; - }; - - remap_visitor v(target, temps); - - inst->accept(&v); -} - - -/** - * Move non-declarations from one instruction stream to another - * - * The intended usage pattern of this function is to pass the pointer to the - * head sentinel of a list (i.e., a pointer to the list cast to an \c exec_node - * pointer) for \c last and \c false for \c make_copies on the first - * call. Successive calls pass the return value of the previous call for - * \c last and \c true for \c make_copies. - * - * \param instructions Source instruction stream - * \param last Instruction after which new instructions should be - * inserted in the target instruction stream - * \param make_copies Flag selecting whether instructions in \c instructions - * should be copied (via \c ir_instruction::clone) into the - * target list or moved. - * - * \return - * The new "last" instruction in the target instruction stream. This pointer - * is suitable for use as the \c last parameter of a later call to this - * function. - */ -exec_node * -move_non_declarations(exec_list *instructions, exec_node *last, - bool make_copies, gl_shader *target) -{ - hash_table *temps = NULL; - - if (make_copies) - temps = hash_table_ctor(0, hash_table_pointer_hash, - hash_table_pointer_compare); - - foreach_in_list_safe(ir_instruction, inst, instructions) { - if (inst->as_function()) - continue; - - if (inst->ir_type == ir_type_precision) - continue; - if (inst->ir_type == ir_type_typedecl) - continue; - - ir_variable *var = inst->as_variable(); - if ((var != NULL) && (var->data.mode != ir_var_temporary)) - continue; - - assert(inst->as_assignment() - || inst->as_call() - || inst->as_if() /* for initializers with the ?: operator */ - || ((var != NULL) && (var->data.mode == ir_var_temporary))); - - if (make_copies) { - inst = inst->clone(target, NULL); - - if (var != NULL) - hash_table_insert(temps, inst, var); - else - remap_variables(inst, target, temps); - } else { - inst->remove(); - } - - last->insert_after(inst); - last = inst; - } - - if (make_copies) - hash_table_dtor(temps); - - return last; -} - -/** - * Get the function signature for main from a shader - */ -ir_function_signature * -link_get_main_function_signature(gl_shader *sh) -{ - ir_function *const f = sh->symbols->get_function("main"); - if (f != NULL) { - exec_list void_parameters; - - /* Look for the 'void main()' signature and ensure that it's defined. - * This keeps the linker from accidentally pick a shader that just - * contains a prototype for main. - * - * We don't have to check for multiple definitions of main (in multiple - * shaders) because that would have already been caught above. - */ - ir_function_signature *sig = - f->matching_signature(NULL, &void_parameters, false); - if ((sig != NULL) && sig->is_defined) { - return sig; - } - } - - return NULL; -} - - -/** - * This class is only used in link_intrastage_shaders() below but declaring - * it inside that function leads to compiler warnings with some versions of - * gcc. - */ -class array_sizing_visitor : public ir_hierarchical_visitor { -public: - array_sizing_visitor() - : mem_ctx(ralloc_context(NULL)), - unnamed_interfaces(hash_table_ctor(0, hash_table_pointer_hash, - hash_table_pointer_compare)) - { - } - - ~array_sizing_visitor() - { - hash_table_dtor(this->unnamed_interfaces); - ralloc_free(this->mem_ctx); - } - - virtual ir_visitor_status visit(ir_variable *var) - { - fixup_type(&var->type, var->data.max_array_access); - if (var->type->is_interface()) { - if (interface_contains_unsized_arrays(var->type)) { - const glsl_type *new_type = - resize_interface_members(var->type, - var->get_max_ifc_array_access()); - var->type = new_type; - var->change_interface_type(new_type); - } - } else if (var->type->is_array() && - var->type->fields.array->is_interface()) { - if (interface_contains_unsized_arrays(var->type->fields.array)) { - const glsl_type *new_type = - resize_interface_members(var->type->fields.array, - var->get_max_ifc_array_access()); - var->change_interface_type(new_type); - var->type = - glsl_type::get_array_instance(new_type, var->type->length); - } - } else if (const glsl_type *ifc_type = var->get_interface_type()) { - /* Store a pointer to the variable in the unnamed_interfaces - * hashtable. - */ - ir_variable **interface_vars = (ir_variable **) - hash_table_find(this->unnamed_interfaces, ifc_type); - if (interface_vars == NULL) { - interface_vars = rzalloc_array(mem_ctx, ir_variable *, - ifc_type->length); - hash_table_insert(this->unnamed_interfaces, interface_vars, - ifc_type); - } - unsigned index = ifc_type->field_index(var->name); - assert(index < ifc_type->length); - assert(interface_vars[index] == NULL); - interface_vars[index] = var; - } - return visit_continue; - } - - /** - * For each unnamed interface block that was discovered while running the - * visitor, adjust the interface type to reflect the newly assigned array - * sizes, and fix up the ir_variable nodes to point to the new interface - * type. - */ - void fixup_unnamed_interface_types() - { - hash_table_call_foreach(this->unnamed_interfaces, - fixup_unnamed_interface_type, NULL); - } - -private: - /** - * If the type pointed to by \c type represents an unsized array, replace - * it with a sized array whose size is determined by max_array_access. - */ - static void fixup_type(const glsl_type **type, unsigned max_array_access) - { - if ((*type)->is_unsized_array()) { - *type = glsl_type::get_array_instance((*type)->fields.array, - max_array_access + 1); - assert(*type != NULL); - } - } - - /** - * Determine whether the given interface type contains unsized arrays (if - * it doesn't, array_sizing_visitor doesn't need to process it). - */ - static bool interface_contains_unsized_arrays(const glsl_type *type) - { - for (unsigned i = 0; i < type->length; i++) { - const glsl_type *elem_type = type->fields.structure[i].type; - if (elem_type->is_unsized_array()) - return true; - } - return false; - } - - /** - * Create a new interface type based on the given type, with unsized arrays - * replaced by sized arrays whose size is determined by - * max_ifc_array_access. - */ - static const glsl_type * - resize_interface_members(const glsl_type *type, - const unsigned *max_ifc_array_access) - { - unsigned num_fields = type->length; - glsl_struct_field *fields = new glsl_struct_field[num_fields]; - memcpy(fields, type->fields.structure, - num_fields * sizeof(*fields)); - for (unsigned i = 0; i < num_fields; i++) { - fixup_type(&fields[i].type, max_ifc_array_access[i]); - } - glsl_interface_packing packing = - (glsl_interface_packing) type->interface_packing; - const glsl_type *new_ifc_type = - glsl_type::get_interface_instance(fields, num_fields, - packing, type->name); - delete [] fields; - return new_ifc_type; - } - - static void fixup_unnamed_interface_type(const void *key, void *data, - void *) - { - const glsl_type *ifc_type = (const glsl_type *) key; - ir_variable **interface_vars = (ir_variable **) data; - unsigned num_fields = ifc_type->length; - glsl_struct_field *fields = new glsl_struct_field[num_fields]; - memcpy(fields, ifc_type->fields.structure, - num_fields * sizeof(*fields)); - bool interface_type_changed = false; - for (unsigned i = 0; i < num_fields; i++) { - if (interface_vars[i] != NULL && - fields[i].type != interface_vars[i]->type) { - fields[i].type = interface_vars[i]->type; - interface_type_changed = true; - } - } - if (!interface_type_changed) { - delete [] fields; - return; - } - glsl_interface_packing packing = - (glsl_interface_packing) ifc_type->interface_packing; - const glsl_type *new_ifc_type = - glsl_type::get_interface_instance(fields, num_fields, packing, - ifc_type->name); - delete [] fields; - for (unsigned i = 0; i < num_fields; i++) { - if (interface_vars[i] != NULL) - interface_vars[i]->change_interface_type(new_ifc_type); - } - } - - /** - * Memory context used to allocate the data in \c unnamed_interfaces. - */ - void *mem_ctx; - - /** - * Hash table from const glsl_type * to an array of ir_variable *'s - * pointing to the ir_variables constituting each unnamed interface block. - */ - hash_table *unnamed_interfaces; -}; - -/** - * Performs the cross-validation of layout qualifiers specified in - * redeclaration of gl_FragCoord for the attached fragment shaders, - * and propagates them to the linked FS and linked shader program. - */ -static void -link_fs_input_layout_qualifiers(struct gl_shader_program *prog, - struct gl_shader *linked_shader, - struct gl_shader **shader_list, - unsigned num_shaders) -{ - linked_shader->redeclares_gl_fragcoord = false; - linked_shader->uses_gl_fragcoord = false; - linked_shader->origin_upper_left = false; - linked_shader->pixel_center_integer = false; - - if (linked_shader->Stage != MESA_SHADER_FRAGMENT || - (prog->Version < 150 && !prog->ARB_fragment_coord_conventions_enable)) - return; - - for (unsigned i = 0; i < num_shaders; i++) { - struct gl_shader *shader = shader_list[i]; - /* From the GLSL 1.50 spec, page 39: - * - * "If gl_FragCoord is redeclared in any fragment shader in a program, - * it must be redeclared in all the fragment shaders in that program - * that have a static use gl_FragCoord." - * - * Exclude the case when one of the 'linked_shader' or 'shader' redeclares - * gl_FragCoord with no layout qualifiers but the other one doesn't - * redeclare it. If we strictly follow GLSL 1.50 spec's language, it - * should be a link error. But, generating link error for this case will - * be a wrong behaviour which spec didn't intend to do and it could also - * break some applications. - */ - if ((linked_shader->redeclares_gl_fragcoord - && !shader->redeclares_gl_fragcoord - && shader->uses_gl_fragcoord - && (linked_shader->origin_upper_left - || linked_shader->pixel_center_integer)) - || (shader->redeclares_gl_fragcoord - && !linked_shader->redeclares_gl_fragcoord - && linked_shader->uses_gl_fragcoord - && (shader->origin_upper_left - || shader->pixel_center_integer))) { - linker_error(prog, "fragment shader defined with conflicting " - "layout qualifiers for gl_FragCoord\n"); - } - - /* From the GLSL 1.50 spec, page 39: - * - * "All redeclarations of gl_FragCoord in all fragment shaders in a - * single program must have the same set of qualifiers." - */ - if (linked_shader->redeclares_gl_fragcoord && shader->redeclares_gl_fragcoord - && (shader->origin_upper_left != linked_shader->origin_upper_left - || shader->pixel_center_integer != linked_shader->pixel_center_integer)) { - linker_error(prog, "fragment shader defined with conflicting " - "layout qualifiers for gl_FragCoord\n"); - } - - /* Update the linked shader state.  Note that uses_gl_fragcoord should - * accumulate the results.  The other values should replace.  If there - * are multiple redeclarations, all the fields except uses_gl_fragcoord - * are already known to be the same. - */ - if (shader->redeclares_gl_fragcoord || shader->uses_gl_fragcoord) { - linked_shader->redeclares_gl_fragcoord = - shader->redeclares_gl_fragcoord; - linked_shader->uses_gl_fragcoord = linked_shader->uses_gl_fragcoord - || shader->uses_gl_fragcoord; - linked_shader->origin_upper_left = shader->origin_upper_left; - linked_shader->pixel_center_integer = shader->pixel_center_integer; - } - } -} - -/** - * Performs the cross-validation of geometry shader max_vertices and - * primitive type layout qualifiers for the attached geometry shaders, - * and propagates them to the linked GS and linked shader program. - */ -static void -link_gs_inout_layout_qualifiers(struct gl_shader_program *prog, - struct gl_shader *linked_shader, - struct gl_shader **shader_list, - unsigned num_shaders) -{ - linked_shader->Geom.VerticesOut = 0; - linked_shader->Geom.Invocations = 0; - linked_shader->Geom.InputType = PRIM_UNKNOWN; - linked_shader->Geom.OutputType = PRIM_UNKNOWN; - - /* No in/out qualifiers defined for anything but GLSL 1.50+ - * geometry shaders so far. - */ - if (linked_shader->Stage != MESA_SHADER_GEOMETRY || prog->Version < 150) - return; - - /* From the GLSL 1.50 spec, page 46: - * - * "All geometry shader output layout declarations in a program - * must declare the same layout and same value for - * max_vertices. There must be at least one geometry output - * layout declaration somewhere in a program, but not all - * geometry shaders (compilation units) are required to - * declare it." - */ - - for (unsigned i = 0; i < num_shaders; i++) { - struct gl_shader *shader = shader_list[i]; - - if (shader->Geom.InputType != PRIM_UNKNOWN) { - if (linked_shader->Geom.InputType != PRIM_UNKNOWN && - linked_shader->Geom.InputType != shader->Geom.InputType) { - linker_error(prog, "geometry shader defined with conflicting " - "input types\n"); - return; - } - linked_shader->Geom.InputType = shader->Geom.InputType; - } - - if (shader->Geom.OutputType != PRIM_UNKNOWN) { - if (linked_shader->Geom.OutputType != PRIM_UNKNOWN && - linked_shader->Geom.OutputType != shader->Geom.OutputType) { - linker_error(prog, "geometry shader defined with conflicting " - "output types\n"); - return; - } - linked_shader->Geom.OutputType = shader->Geom.OutputType; - } - - if (shader->Geom.VerticesOut != 0) { - if (linked_shader->Geom.VerticesOut != 0 && - linked_shader->Geom.VerticesOut != shader->Geom.VerticesOut) { - linker_error(prog, "geometry shader defined with conflicting " - "output vertex count (%d and %d)\n", - linked_shader->Geom.VerticesOut, - shader->Geom.VerticesOut); - return; - } - linked_shader->Geom.VerticesOut = shader->Geom.VerticesOut; - } - - if (shader->Geom.Invocations != 0) { - if (linked_shader->Geom.Invocations != 0 && - linked_shader->Geom.Invocations != shader->Geom.Invocations) { - linker_error(prog, "geometry shader defined with conflicting " - "invocation count (%d and %d)\n", - linked_shader->Geom.Invocations, - shader->Geom.Invocations); - return; - } - linked_shader->Geom.Invocations = shader->Geom.Invocations; - } - } - - /* Just do the intrastage -> interstage propagation right now, - * since we already know we're in the right type of shader program - * for doing it. - */ - if (linked_shader->Geom.InputType == PRIM_UNKNOWN) { - linker_error(prog, - "geometry shader didn't declare primitive input type\n"); - return; - } - prog->Geom.InputType = linked_shader->Geom.InputType; - - if (linked_shader->Geom.OutputType == PRIM_UNKNOWN) { - linker_error(prog, - "geometry shader didn't declare primitive output type\n"); - return; - } - prog->Geom.OutputType = linked_shader->Geom.OutputType; - - if (linked_shader->Geom.VerticesOut == 0) { - linker_error(prog, - "geometry shader didn't declare max_vertices\n"); - return; - } - prog->Geom.VerticesOut = linked_shader->Geom.VerticesOut; - - if (linked_shader->Geom.Invocations == 0) - linked_shader->Geom.Invocations = 1; - - prog->Geom.Invocations = linked_shader->Geom.Invocations; -} - - -/** - * Perform cross-validation of compute shader local_size_{x,y,z} layout - * qualifiers for the attached compute shaders, and propagate them to the - * linked CS and linked shader program. - */ -static void -link_cs_input_layout_qualifiers(struct gl_shader_program *prog, - struct gl_shader *linked_shader, - struct gl_shader **shader_list, - unsigned num_shaders) -{ - for (int i = 0; i < 3; i++) - linked_shader->Comp.LocalSize[i] = 0; - - /* This function is called for all shader stages, but it only has an effect - * for compute shaders. - */ - if (linked_shader->Stage != MESA_SHADER_COMPUTE) - return; - - /* From the ARB_compute_shader spec, in the section describing local size - * declarations: - * - * If multiple compute shaders attached to a single program object - * declare local work-group size, the declarations must be identical; - * otherwise a link-time error results. Furthermore, if a program - * object contains any compute shaders, at least one must contain an - * input layout qualifier specifying the local work sizes of the - * program, or a link-time error will occur. - */ - for (unsigned sh = 0; sh < num_shaders; sh++) { - struct gl_shader *shader = shader_list[sh]; - - if (shader->Comp.LocalSize[0] != 0) { - if (linked_shader->Comp.LocalSize[0] != 0) { - for (int i = 0; i < 3; i++) { - if (linked_shader->Comp.LocalSize[i] != - shader->Comp.LocalSize[i]) { - linker_error(prog, "compute shader defined with conflicting " - "local sizes\n"); - return; - } - } - } - for (int i = 0; i < 3; i++) - linked_shader->Comp.LocalSize[i] = shader->Comp.LocalSize[i]; - } - } - - /* Just do the intrastage -> interstage propagation right now, - * since we already know we're in the right type of shader program - * for doing it. - */ - if (linked_shader->Comp.LocalSize[0] == 0) { - linker_error(prog, "compute shader didn't declare local size\n"); - return; - } - for (int i = 0; i < 3; i++) - prog->Comp.LocalSize[i] = linked_shader->Comp.LocalSize[i]; -} - - -/** - * Combine a group of shaders for a single stage to generate a linked shader - * - * \note - * If this function is supplied a single shader, it is cloned, and the new - * shader is returned. - */ -struct gl_shader * -link_intrastage_shaders(void *mem_ctx, - struct gl_context *ctx, - struct gl_shader_program *prog, - struct gl_shader **shader_list, - unsigned num_shaders) -{ - struct gl_uniform_block *uniform_blocks = NULL; - - /* Check that global variables defined in multiple shaders are consistent. - */ - cross_validate_globals(prog, shader_list, num_shaders, false); - if (!prog->LinkStatus) - return NULL; - - /* Check that interface blocks defined in multiple shaders are consistent. - */ - validate_intrastage_interface_blocks(prog, (const gl_shader **)shader_list, - num_shaders); - if (!prog->LinkStatus) - return NULL; - - /* Link up uniform blocks defined within this stage. */ - const unsigned num_uniform_blocks = - link_uniform_blocks(mem_ctx, prog, shader_list, num_shaders, - &uniform_blocks); - if (!prog->LinkStatus) - return NULL; - - /* Check that there is only a single definition of each function signature - * across all shaders. - */ - for (unsigned i = 0; i < (num_shaders - 1); i++) { - foreach_in_list(ir_instruction, node, shader_list[i]->ir) { - ir_function *const f = node->as_function(); - - if (f == NULL) - continue; - - for (unsigned j = i + 1; j < num_shaders; j++) { - ir_function *const other = - shader_list[j]->symbols->get_function(f->name); - - /* If the other shader has no function (and therefore no function - * signatures) with the same name, skip to the next shader. - */ - if (other == NULL) - continue; - - foreach_in_list(ir_function_signature, sig, &f->signatures) { - if (!sig->is_defined || sig->is_builtin()) - continue; - - ir_function_signature *other_sig = - other->exact_matching_signature(NULL, &sig->parameters); - - if ((other_sig != NULL) && other_sig->is_defined - && !other_sig->is_builtin()) { - linker_error(prog, "function `%s' is multiply defined", - f->name); - return NULL; - } - } - } - } - } - - /* Find the shader that defines main, and make a clone of it. - * - * Starting with the clone, search for undefined references. If one is - * found, find the shader that defines it. Clone the reference and add - * it to the shader. Repeat until there are no undefined references or - * until a reference cannot be resolved. - */ - gl_shader *main = NULL; - for (unsigned i = 0; i < num_shaders; i++) { - if (link_get_main_function_signature(shader_list[i]) != NULL) { - main = shader_list[i]; - break; - } - } - - if (main == NULL) { - linker_error(prog, "%s shader lacks `main'\n", - _mesa_shader_stage_to_string(shader_list[0]->Stage)); - return NULL; - } - - gl_shader *linked = ctx->Driver.NewShader(NULL, 0, main->Type); - linked->ir = new(linked) exec_list; - clone_ir_list(mem_ctx, linked->ir, main->ir); - - linked->UniformBlocks = uniform_blocks; - linked->NumUniformBlocks = num_uniform_blocks; - ralloc_steal(linked, linked->UniformBlocks); - - link_fs_input_layout_qualifiers(prog, linked, shader_list, num_shaders); - link_gs_inout_layout_qualifiers(prog, linked, shader_list, num_shaders); - link_cs_input_layout_qualifiers(prog, linked, shader_list, num_shaders); - - populate_symbol_table(linked); - - /* The a pointer to the main function in the final linked shader (i.e., the - * copy of the original shader that contained the main function). - */ - ir_function_signature *const main_sig = - link_get_main_function_signature(linked); - - /* Move any instructions other than variable declarations, function - * declarations or precision statements into main. - */ - exec_node *insertion_point = - move_non_declarations(linked->ir, (exec_node *) &main_sig->body, false, - linked); - - for (unsigned i = 0; i < num_shaders; i++) { - if (shader_list[i] == main) - continue; - - insertion_point = move_non_declarations(shader_list[i]->ir, - insertion_point, true, linked); - } - - /* Check if any shader needs built-in functions. */ - bool need_builtins = false; - for (unsigned i = 0; i < num_shaders; i++) { - if (shader_list[i]->uses_builtin_functions) { - need_builtins = true; - break; - } - } - - bool ok; - if (need_builtins) { - /* Make a temporary array one larger than shader_list, which will hold - * the built-in function shader as well. - */ - gl_shader **linking_shaders = (gl_shader **) - calloc(num_shaders + 1, sizeof(gl_shader *)); - - ok = linking_shaders != NULL; - - if (ok) { - memcpy(linking_shaders, shader_list, num_shaders * sizeof(gl_shader *)); - linking_shaders[num_shaders] = _mesa_glsl_get_builtin_function_shader(); - - ok = link_function_calls(prog, linked, linking_shaders, num_shaders + 1); - - free(linking_shaders); - } else { - _mesa_error_no_memory(__func__); - } - } else { - ok = link_function_calls(prog, linked, shader_list, num_shaders); - } - - - if (!ok) { - ctx->Driver.DeleteShader(ctx, linked); - return NULL; - } - - /* At this point linked should contain all of the linked IR, so - * validate it to make sure nothing went wrong. - */ - validate_ir_tree(linked->ir); - - /* Set the size of geometry shader input arrays */ - if (linked->Stage == MESA_SHADER_GEOMETRY) { - unsigned num_vertices = vertices_per_prim(prog->Geom.InputType); - geom_array_resize_visitor input_resize_visitor(num_vertices, prog); - foreach_in_list(ir_instruction, ir, linked->ir) { - ir->accept(&input_resize_visitor); - } - } - - if (ctx->Const.VertexID_is_zero_based) - lower_vertex_id(linked); - - /* Make a pass over all variable declarations to ensure that arrays with - * unspecified sizes have a size specified. The size is inferred from the - * max_array_access field. - */ - array_sizing_visitor v; - v.run(linked->ir); - v.fixup_unnamed_interface_types(); - - return linked; -} - -/** - * Update the sizes of linked shader uniform arrays to the maximum - * array index used. - * - * From page 81 (page 95 of the PDF) of the OpenGL 2.1 spec: - * - * If one or more elements of an array are active, - * GetActiveUniform will return the name of the array in name, - * subject to the restrictions listed above. The type of the array - * is returned in type. The size parameter contains the highest - * array element index used, plus one. The compiler or linker - * determines the highest index used. There will be only one - * active uniform reported by the GL per uniform array. - - */ -static void -update_array_sizes(struct gl_shader_program *prog) -{ - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - if (prog->_LinkedShaders[i] == NULL) - continue; - - foreach_in_list(ir_instruction, node, prog->_LinkedShaders[i]->ir) { - ir_variable *const var = node->as_variable(); - - if ((var == NULL) || (var->data.mode != ir_var_uniform) || - !var->type->is_array()) - continue; - - /* GL_ARB_uniform_buffer_object says that std140 uniforms - * will not be eliminated. Since we always do std140, just - * don't resize arrays in UBOs. - * - * Atomic counters are supposed to get deterministic - * locations assigned based on the declaration ordering and - * sizes, array compaction would mess that up. - */ - if (var->is_in_uniform_block() || var->type->contains_atomic()) - continue; - - unsigned int size = var->data.max_array_access; - for (unsigned j = 0; j < MESA_SHADER_STAGES; j++) { - if (prog->_LinkedShaders[j] == NULL) - continue; - - foreach_in_list(ir_instruction, node2, prog->_LinkedShaders[j]->ir) { - ir_variable *other_var = node2->as_variable(); - if (!other_var) - continue; - - if (strcmp(var->name, other_var->name) == 0 && - other_var->data.max_array_access > size) { - size = other_var->data.max_array_access; - } - } - } - - if (size + 1 != var->type->length) { - /* If this is a built-in uniform (i.e., it's backed by some - * fixed-function state), adjust the number of state slots to - * match the new array size. The number of slots per array entry - * is not known. It seems safe to assume that the total number of - * slots is an integer multiple of the number of array elements. - * Determine the number of slots per array element by dividing by - * the old (total) size. - */ - const unsigned num_slots = var->get_num_state_slots(); - if (num_slots > 0) { - var->set_num_state_slots((size + 1) - * (num_slots / var->type->length)); - } - - var->type = glsl_type::get_array_instance(var->type->fields.array, - size + 1); - /* FINISHME: We should update the types of array - * dereferences of this variable now. - */ - } - } - } -} - -/** - * Find a contiguous set of available bits in a bitmask. - * - * \param used_mask Bits representing used (1) and unused (0) locations - * \param needed_count Number of contiguous bits needed. - * - * \return - * Base location of the available bits on success or -1 on failure. - */ -int -find_available_slots(unsigned used_mask, unsigned needed_count) -{ - unsigned needed_mask = (1 << needed_count) - 1; - const int max_bit_to_test = (8 * sizeof(used_mask)) - needed_count; - - /* The comparison to 32 is redundant, but without it GCC emits "warning: - * cannot optimize possibly infinite loops" for the loop below. - */ - if ((needed_count == 0) || (max_bit_to_test < 0) || (max_bit_to_test > 32)) - return -1; - - for (int i = 0; i <= max_bit_to_test; i++) { - if ((needed_mask & ~used_mask) == needed_mask) - return i; - - needed_mask <<= 1; - } - - return -1; -} - - -/** - * Assign locations for either VS inputs for FS outputs - * - * \param prog Shader program whose variables need locations assigned - * \param target_index Selector for the program target to receive location - * assignmnets. Must be either \c MESA_SHADER_VERTEX or - * \c MESA_SHADER_FRAGMENT. - * \param max_index Maximum number of generic locations. This corresponds - * to either the maximum number of draw buffers or the - * maximum number of generic attributes. - * - * \return - * If locations are successfully assigned, true is returned. Otherwise an - * error is emitted to the shader link log and false is returned. - */ -bool -assign_attribute_or_color_locations(gl_shader_program *prog, - unsigned target_index, - unsigned max_index) -{ - /* Mark invalid locations as being used. - */ - unsigned used_locations = (max_index >= 32) - ? ~0 : ~((1 << max_index) - 1); - - assert((target_index == MESA_SHADER_VERTEX) - || (target_index == MESA_SHADER_FRAGMENT)); - - gl_shader *const sh = prog->_LinkedShaders[target_index]; - if (sh == NULL) - return true; - - /* Operate in a total of four passes. - * - * 1. Invalidate the location assignments for all vertex shader inputs. - * - * 2. Assign locations for inputs that have user-defined (via - * glBindVertexAttribLocation) locations and outputs that have - * user-defined locations (via glBindFragDataLocation). - * - * 3. Sort the attributes without assigned locations by number of slots - * required in decreasing order. Fragmentation caused by attribute - * locations assigned by the application may prevent large attributes - * from having enough contiguous space. - * - * 4. Assign locations to any inputs without assigned locations. - */ - - const int generic_base = (target_index == MESA_SHADER_VERTEX) - ? (int) VERT_ATTRIB_GENERIC0 : (int) FRAG_RESULT_DATA0; - - const enum ir_variable_mode direction = - (target_index == MESA_SHADER_VERTEX) - ? ir_var_shader_in : ir_var_shader_out; - - - /* Temporary storage for the set of attributes that need locations assigned. - */ - struct temp_attr { - unsigned slots; - ir_variable *var; - - /* Used below in the call to qsort. */ - static int compare(const void *a, const void *b) - { - const temp_attr *const l = (const temp_attr *) a; - const temp_attr *const r = (const temp_attr *) b; - - /* Reversed because we want a descending order sort below. */ - return r->slots - l->slots; - } - } to_assign[16]; - - unsigned num_attr = 0; - - foreach_in_list(ir_instruction, node, sh->ir) { - ir_variable *const var = node->as_variable(); - - if ((var == NULL) || (var->data.mode != (unsigned) direction)) - continue; - - if (var->data.explicit_location) { - if ((var->data.location >= (int)(max_index + generic_base)) - || (var->data.location < 0)) { - linker_error(prog, - "invalid explicit location %d specified for `%s'\n", - (var->data.location < 0) - ? var->data.location - : var->data.location - generic_base, - var->name); - return false; - } - } else if (target_index == MESA_SHADER_VERTEX) { - unsigned binding; - - if (prog->AttributeBindings->get(binding, var->name)) { - assert(binding >= VERT_ATTRIB_GENERIC0); - var->data.location = binding; - var->data.is_unmatched_generic_inout = 0; - } - } else if (target_index == MESA_SHADER_FRAGMENT) { - unsigned binding; - unsigned index; - - if (prog->FragDataBindings->get(binding, var->name)) { - assert(binding >= FRAG_RESULT_DATA0); - var->data.location = binding; - var->data.is_unmatched_generic_inout = 0; - - if (prog->FragDataIndexBindings->get(index, var->name)) { - var->data.index = index; - } - } - } - - /* If the variable is not a built-in and has a location statically - * assigned in the shader (presumably via a layout qualifier), make sure - * that it doesn't collide with other assigned locations. Otherwise, - * add it to the list of variables that need linker-assigned locations. - */ - const unsigned slots = var->type->count_attribute_slots(); - if (var->data.location != -1) { - if (var->data.location >= generic_base && var->data.index < 1) { - /* From page 61 of the OpenGL 4.0 spec: - * - * "LinkProgram will fail if the attribute bindings assigned - * by BindAttribLocation do not leave not enough space to - * assign a location for an active matrix attribute or an - * active attribute array, both of which require multiple - * contiguous generic attributes." - * - * I think above text prohibits the aliasing of explicit and - * automatic assignments. But, aliasing is allowed in manual - * assignments of attribute locations. See below comments for - * the details. - * - * From OpenGL 4.0 spec, page 61: - * - * "It is possible for an application to bind more than one - * attribute name to the same location. This is referred to as - * aliasing. This will only work if only one of the aliased - * attributes is active in the executable program, or if no - * path through the shader consumes more than one attribute of - * a set of attributes aliased to the same location. A link - * error can occur if the linker determines that every path - * through the shader consumes multiple aliased attributes, - * but implementations are not required to generate an error - * in this case." - * - * From GLSL 4.30 spec, page 54: - * - * "A program will fail to link if any two non-vertex shader - * input variables are assigned to the same location. For - * vertex shaders, multiple input variables may be assigned - * to the same location using either layout qualifiers or via - * the OpenGL API. However, such aliasing is intended only to - * support vertex shaders where each execution path accesses - * at most one input per each location. Implementations are - * permitted, but not required, to generate link-time errors - * if they detect that every path through the vertex shader - * executable accesses multiple inputs assigned to any single - * location. For all shader types, a program will fail to link - * if explicit location assignments leave the linker unable - * to find space for other variables without explicit - * assignments." - * - * From OpenGL ES 3.0 spec, page 56: - * - * "Binding more than one attribute name to the same location - * is referred to as aliasing, and is not permitted in OpenGL - * ES Shading Language 3.00 vertex shaders. LinkProgram will - * fail when this condition exists. However, aliasing is - * possible in OpenGL ES Shading Language 1.00 vertex shaders. - * This will only work if only one of the aliased attributes - * is active in the executable program, or if no path through - * the shader consumes more than one attribute of a set of - * attributes aliased to the same location. A link error can - * occur if the linker determines that every path through the - * shader consumes multiple aliased attributes, but implemen- - * tations are not required to generate an error in this case." - * - * After looking at above references from OpenGL, OpenGL ES and - * GLSL specifications, we allow aliasing of vertex input variables - * in: OpenGL 2.0 (and above) and OpenGL ES 2.0. - * - * NOTE: This is not required by the spec but its worth mentioning - * here that we're not doing anything to make sure that no path - * through the vertex shader executable accesses multiple inputs - * assigned to any single location. - */ - - /* Mask representing the contiguous slots that will be used by - * this attribute. - */ - const unsigned attr = var->data.location - generic_base; - const unsigned use_mask = (1 << slots) - 1; - const char *const string = (target_index == MESA_SHADER_VERTEX) - ? "vertex shader input" : "fragment shader output"; - - /* Generate a link error if the requested locations for this - * attribute exceed the maximum allowed attribute location. - */ - if (attr + slots > max_index) { - linker_error(prog, - "insufficient contiguous locations " - "available for %s `%s' %d %d %d", string, - var->name, used_locations, use_mask, attr); - return false; - } - - /* Generate a link error if the set of bits requested for this - * attribute overlaps any previously allocated bits. - */ - if ((~(use_mask << attr) & used_locations) != used_locations) { - if (target_index == MESA_SHADER_FRAGMENT || - (prog->IsES && prog->Version >= 300)) { - linker_error(prog, - "overlapping location is assigned " - "to %s `%s' %d %d %d\n", string, - var->name, used_locations, use_mask, attr); - return false; - } else { - linker_warning(prog, - "overlapping location is assigned " - "to %s `%s' %d %d %d\n", string, - var->name, used_locations, use_mask, attr); - } - } - - used_locations |= (use_mask << attr); - } - - continue; - } - - to_assign[num_attr].slots = slots; - to_assign[num_attr].var = var; - num_attr++; - } - - /* If all of the attributes were assigned locations by the application (or - * are built-in attributes with fixed locations), return early. This should - * be the common case. - */ - if (num_attr == 0) - return true; - - qsort(to_assign, num_attr, sizeof(to_assign[0]), temp_attr::compare); - - if (target_index == MESA_SHADER_VERTEX) { - /* VERT_ATTRIB_GENERIC0 is a pseudo-alias for VERT_ATTRIB_POS. It can - * only be explicitly assigned by via glBindAttribLocation. Mark it as - * reserved to prevent it from being automatically allocated below. - */ - find_deref_visitor find("gl_Vertex"); - find.run(sh->ir); - if (find.variable_found()) - used_locations |= (1 << 0); - } - - for (unsigned i = 0; i < num_attr; i++) { - /* Mask representing the contiguous slots that will be used by this - * attribute. - */ - const unsigned use_mask = (1 << to_assign[i].slots) - 1; - - int location = find_available_slots(used_locations, to_assign[i].slots); - - if (location < 0) { - const char *const string = (target_index == MESA_SHADER_VERTEX) - ? "vertex shader input" : "fragment shader output"; - - linker_error(prog, - "insufficient contiguous locations " - "available for %s `%s'", - string, to_assign[i].var->name); - return false; - } - - to_assign[i].var->data.location = generic_base + location; - to_assign[i].var->data.is_unmatched_generic_inout = 0; - used_locations |= (use_mask << location); - } - - return true; -} - - -/** - * Demote shader inputs and outputs that are not used in other stages - */ -void -demote_shader_inputs_and_outputs(gl_shader *sh, enum ir_variable_mode mode) -{ - foreach_in_list(ir_instruction, node, sh->ir) { - ir_variable *const var = node->as_variable(); - - if ((var == NULL) || (var->data.mode != int(mode))) - continue; - - /* A shader 'in' or 'out' variable is only really an input or output if - * its value is used by other shader stages. This will cause the variable - * to have a location assigned. - */ - if (var->data.is_unmatched_generic_inout) { - assert(var->data.mode != ir_var_temporary); - var->data.mode = ir_var_auto; - } - } -} - - -/** - * Store the gl_FragDepth layout in the gl_shader_program struct. - */ -static void -store_fragdepth_layout(struct gl_shader_program *prog) -{ - if (prog->_LinkedShaders[MESA_SHADER_FRAGMENT] == NULL) { - return; - } - - struct exec_list *ir = prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->ir; - - /* We don't look up the gl_FragDepth symbol directly because if - * gl_FragDepth is not used in the shader, it's removed from the IR. - * However, the symbol won't be removed from the symbol table. - * - * We're only interested in the cases where the variable is NOT removed - * from the IR. - */ - foreach_in_list(ir_instruction, node, ir) { - ir_variable *const var = node->as_variable(); - - if (var == NULL || var->data.mode != ir_var_shader_out) { - continue; - } - - if (strcmp(var->name, "gl_FragDepth") == 0) { - switch (var->data.depth_layout) { - case ir_depth_layout_none: - prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_NONE; - return; - case ir_depth_layout_any: - prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_ANY; - return; - case ir_depth_layout_greater: - prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_GREATER; - return; - case ir_depth_layout_less: - prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_LESS; - return; - case ir_depth_layout_unchanged: - prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_UNCHANGED; - return; - default: - assert(0); - return; - } - } - } -} - -/** - * Validate the resources used by a program versus the implementation limits - */ -static void -check_resources(struct gl_context *ctx, struct gl_shader_program *prog) -{ - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - struct gl_shader *sh = prog->_LinkedShaders[i]; - - if (sh == NULL) - continue; - - if (sh->num_samplers > ctx->Const.Program[i].MaxTextureImageUnits) { - linker_error(prog, "Too many %s shader texture samplers", - _mesa_shader_stage_to_string(i)); - } - - if (sh->num_uniform_components > - ctx->Const.Program[i].MaxUniformComponents) { - if (ctx->Const.GLSLSkipStrictMaxUniformLimitCheck) { - linker_warning(prog, "Too many %s shader default uniform block " - "components, but the driver will try to optimize " - "them out; this is non-portable out-of-spec " - "behavior\n", - _mesa_shader_stage_to_string(i)); - } else { - linker_error(prog, "Too many %s shader default uniform block " - "components", - _mesa_shader_stage_to_string(i)); - } - } - - if (sh->num_combined_uniform_components > - ctx->Const.Program[i].MaxCombinedUniformComponents) { - if (ctx->Const.GLSLSkipStrictMaxUniformLimitCheck) { - linker_warning(prog, "Too many %s shader uniform components, " - "but the driver will try to optimize them out; " - "this is non-portable out-of-spec behavior\n", - _mesa_shader_stage_to_string(i)); - } else { - linker_error(prog, "Too many %s shader uniform components", - _mesa_shader_stage_to_string(i)); - } - } - } - - unsigned blocks[MESA_SHADER_STAGES] = {0}; - unsigned total_uniform_blocks = 0; - - for (unsigned i = 0; i < prog->NumUniformBlocks; i++) { - for (unsigned j = 0; j < MESA_SHADER_STAGES; j++) { - if (prog->UniformBlockStageIndex[j][i] != -1) { - blocks[j]++; - total_uniform_blocks++; - } - } - - if (total_uniform_blocks > ctx->Const.MaxCombinedUniformBlocks) { - linker_error(prog, "Too many combined uniform blocks (%d/%d)", - prog->NumUniformBlocks, - ctx->Const.MaxCombinedUniformBlocks); - } else { - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - const unsigned max_uniform_blocks = - ctx->Const.Program[i].MaxUniformBlocks; - if (blocks[i] > max_uniform_blocks) { - linker_error(prog, "Too many %s uniform blocks (%d/%d)", - _mesa_shader_stage_to_string(i), - blocks[i], - max_uniform_blocks); - break; - } - } - } - } -} - -/** - * Validate shader image resources. - */ -static void -check_image_resources(struct gl_context *ctx, struct gl_shader_program *prog) -{ - unsigned total_image_units = 0; - unsigned fragment_outputs = 0; - - if (!ctx->Extensions.ARB_shader_image_load_store) - return; - - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - struct gl_shader *sh = prog->_LinkedShaders[i]; - - if (sh) { - if (sh->NumImages > ctx->Const.Program[i].MaxImageUniforms) - linker_error(prog, "Too many %s shader image uniforms", - _mesa_shader_stage_to_string(i)); - - total_image_units += sh->NumImages; - - if (i == MESA_SHADER_FRAGMENT) { - foreach_in_list(ir_instruction, node, sh->ir) { - ir_variable *var = node->as_variable(); - if (var && var->data.mode == ir_var_shader_out) - fragment_outputs += var->type->count_attribute_slots(); - } - } - } - } - - if (total_image_units > ctx->Const.MaxCombinedImageUniforms) - linker_error(prog, "Too many combined image uniforms"); - - if (total_image_units + fragment_outputs > - ctx->Const.MaxCombinedImageUnitsAndFragmentOutputs) - linker_error(prog, "Too many combined image uniforms and fragment outputs"); -} - - -/** - * Initializes explicit location slots to INACTIVE_UNIFORM_EXPLICIT_LOCATION - * for a variable, checks for overlaps between other uniforms using explicit - * locations. - */ -static bool -reserve_explicit_locations(struct gl_shader_program *prog, - string_to_uint_map *map, ir_variable *var) -{ - unsigned slots = var->type->uniform_locations(); - unsigned max_loc = var->data.location + slots - 1; - - /* Resize remap table if locations do not fit in the current one. */ - if (max_loc + 1 > prog->NumUniformRemapTable) { - prog->UniformRemapTable = - reralloc(prog, prog->UniformRemapTable, - gl_uniform_storage *, - max_loc + 1); - - if (!prog->UniformRemapTable) { - linker_error(prog, "Out of memory during linking."); - return false; - } - - /* Initialize allocated space. */ - for (unsigned i = prog->NumUniformRemapTable; i < max_loc + 1; i++) - prog->UniformRemapTable[i] = NULL; - - prog->NumUniformRemapTable = max_loc + 1; - } - - for (unsigned i = 0; i < slots; i++) { - unsigned loc = var->data.location + i; - - /* Check if location is already used. */ - if (prog->UniformRemapTable[loc] == INACTIVE_UNIFORM_EXPLICIT_LOCATION) { - - /* Possibly same uniform from a different stage, this is ok. */ - unsigned hash_loc; - if (map->get(hash_loc, var->name) && hash_loc == loc - i) - continue; - - /* ARB_explicit_uniform_location specification states: - * - * "No two default-block uniform variables in the program can have - * the same location, even if they are unused, otherwise a compiler - * or linker error will be generated." - */ - linker_error(prog, - "location qualifier for uniform %s overlaps" - "previously used location", - var->name); - return false; - } - - /* Initialize location as inactive before optimization - * rounds and location assignment. - */ - prog->UniformRemapTable[loc] = INACTIVE_UNIFORM_EXPLICIT_LOCATION; - } - - /* Note, base location used for arrays. */ - map->put(var->data.location, var->name); - - return true; -} - -/** - * Check and reserve all explicit uniform locations, called before - * any optimizations happen to handle also inactive uniforms and - * inactive array elements that may get trimmed away. - */ -static void -check_explicit_uniform_locations(struct gl_context *ctx, - struct gl_shader_program *prog) -{ - if (!ctx->Extensions.ARB_explicit_uniform_location) - return; - - /* This map is used to detect if overlapping explicit locations - * occur with the same uniform (from different stage) or a different one. - */ - string_to_uint_map *uniform_map = new string_to_uint_map; - - if (!uniform_map) { - linker_error(prog, "Out of memory during linking."); - return; - } - - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - struct gl_shader *sh = prog->_LinkedShaders[i]; - - if (!sh) - continue; - - foreach_in_list(ir_instruction, node, sh->ir) { - ir_variable *var = node->as_variable(); - if ((var && var->data.mode == ir_var_uniform) && - var->data.explicit_location) { - if (!reserve_explicit_locations(prog, uniform_map, var)) { - delete uniform_map; - return; - } - } - } - } - - delete uniform_map; -} - -void -link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) -{ - tfeedback_decl *tfeedback_decls = NULL; - unsigned num_tfeedback_decls = prog->TransformFeedback.NumVarying; - - void *mem_ctx = ralloc_context(NULL); // temporary linker context - - prog->LinkStatus = true; /* All error paths will set this to false */ - prog->Validated = false; - prog->_Used = false; - - ralloc_free(prog->InfoLog); - prog->InfoLog = ralloc_strdup(NULL, ""); - - ralloc_free(prog->UniformBlocks); - prog->UniformBlocks = NULL; - prog->NumUniformBlocks = 0; - for (int i = 0; i < MESA_SHADER_STAGES; i++) { - ralloc_free(prog->UniformBlockStageIndex[i]); - prog->UniformBlockStageIndex[i] = NULL; - } - - ralloc_free(prog->AtomicBuffers); - prog->AtomicBuffers = NULL; - prog->NumAtomicBuffers = 0; - prog->ARB_fragment_coord_conventions_enable = false; - - /* Separate the shaders into groups based on their type. - */ - struct gl_shader **shader_list[MESA_SHADER_STAGES]; - unsigned num_shaders[MESA_SHADER_STAGES]; - - for (int i = 0; i < MESA_SHADER_STAGES; i++) { - shader_list[i] = (struct gl_shader **) - calloc(prog->NumShaders, sizeof(struct gl_shader *)); - num_shaders[i] = 0; - } - - unsigned min_version = UINT_MAX; - unsigned max_version = 0; - const bool is_es_prog = - (prog->NumShaders > 0 && prog->Shaders[0]->IsES) ? true : false; - for (unsigned i = 0; i < prog->NumShaders; i++) { - min_version = MIN2(min_version, prog->Shaders[i]->Version); - max_version = MAX2(max_version, prog->Shaders[i]->Version); - - if ((!!prog->Shaders[i]->IsES) != is_es_prog) { - linker_error(prog, "all shaders must use same shading " - "language version\n"); - goto done; - } - - prog->ARB_fragment_coord_conventions_enable |= - prog->Shaders[i]->ARB_fragment_coord_conventions_enable; - - gl_shader_stage shader_type = prog->Shaders[i]->Stage; - shader_list[shader_type][num_shaders[shader_type]] = prog->Shaders[i]; - num_shaders[shader_type]++; - } - - /* In desktop GLSL, different shader versions may be linked together. In - * GLSL ES, all shader versions must be the same. - */ - if (is_es_prog && min_version != max_version) { - linker_error(prog, "all shaders must use same shading " - "language version\n"); - goto done; - } - - prog->Version = max_version; - prog->IsES = is_es_prog; - - /* Geometry shaders have to be linked with vertex shaders. - */ - if (num_shaders[MESA_SHADER_GEOMETRY] > 0 && - num_shaders[MESA_SHADER_VERTEX] == 0 && - !prog->SeparateShader) { - linker_error(prog, "Geometry shader must be linked with " - "vertex shader\n"); - goto done; - } - - /* Compute shaders have additional restrictions. */ - if (num_shaders[MESA_SHADER_COMPUTE] > 0 && - num_shaders[MESA_SHADER_COMPUTE] != prog->NumShaders) { - linker_error(prog, "Compute shaders may not be linked with any other " - "type of shader\n"); - } - - for (unsigned int i = 0; i < MESA_SHADER_STAGES; i++) { - if (prog->_LinkedShaders[i] != NULL) - ctx->Driver.DeleteShader(ctx, prog->_LinkedShaders[i]); - - prog->_LinkedShaders[i] = NULL; - } - - /* Link all shaders for a particular stage and validate the result. - */ - for (int stage = 0; stage < MESA_SHADER_STAGES; stage++) { - if (num_shaders[stage] > 0) { - gl_shader *const sh = - link_intrastage_shaders(mem_ctx, ctx, prog, shader_list[stage], - num_shaders[stage]); - - if (!prog->LinkStatus) - goto done; - - switch (stage) { - case MESA_SHADER_VERTEX: - validate_vertex_shader_executable(prog, sh); - break; - case MESA_SHADER_GEOMETRY: - validate_geometry_shader_executable(prog, sh); - break; - case MESA_SHADER_FRAGMENT: - validate_fragment_shader_executable(prog, sh); - break; - } - if (!prog->LinkStatus) - goto done; - - _mesa_reference_shader(ctx, &prog->_LinkedShaders[stage], sh); - } - } - - if (num_shaders[MESA_SHADER_GEOMETRY] > 0) - prog->LastClipDistanceArraySize = prog->Geom.ClipDistanceArraySize; - else if (num_shaders[MESA_SHADER_VERTEX] > 0) - prog->LastClipDistanceArraySize = prog->Vert.ClipDistanceArraySize; - else - prog->LastClipDistanceArraySize = 0; /* Not used */ - - /* Here begins the inter-stage linking phase. Some initial validation is - * performed, then locations are assigned for uniforms, attributes, and - * varyings. - */ - cross_validate_uniforms(prog); - if (!prog->LinkStatus) - goto done; - - unsigned prev; - - for (prev = 0; prev <= MESA_SHADER_FRAGMENT; prev++) { - if (prog->_LinkedShaders[prev] != NULL) - break; - } - - check_explicit_uniform_locations(ctx, prog); - if (!prog->LinkStatus) - goto done; - - /* Validate the inputs of each stage with the output of the preceding - * stage. - */ - for (unsigned i = prev + 1; i <= MESA_SHADER_FRAGMENT; i++) { - if (prog->_LinkedShaders[i] == NULL) - continue; - - validate_interstage_inout_blocks(prog, prog->_LinkedShaders[prev], - prog->_LinkedShaders[i]); - if (!prog->LinkStatus) - goto done; - - cross_validate_outputs_to_inputs(prog, - prog->_LinkedShaders[prev], - prog->_LinkedShaders[i]); - if (!prog->LinkStatus) - goto done; - - prev = i; - } - - /* Cross-validate uniform blocks between shader stages */ - validate_interstage_uniform_blocks(prog, prog->_LinkedShaders, - MESA_SHADER_STAGES); - if (!prog->LinkStatus) - goto done; - - for (unsigned int i = 0; i < MESA_SHADER_STAGES; i++) { - if (prog->_LinkedShaders[i] != NULL) - lower_named_interface_blocks(mem_ctx, prog->_LinkedShaders[i]); - } - - /* Implement the GLSL 1.30+ rule for discard vs infinite loops Do - * it before optimization because we want most of the checks to get - * dropped thanks to constant propagation. - * - * This rule also applies to GLSL ES 3.00. - */ - if (max_version >= (is_es_prog ? 300U : 130U)) { - struct gl_shader *sh = prog->_LinkedShaders[MESA_SHADER_FRAGMENT]; - if (sh) { - lower_discard_flow(sh->ir); - } - } - - if (!interstage_cross_validate_uniform_blocks(prog)) - goto done; - - /* Do common optimization before assigning storage for attributes, - * uniforms, and varyings. Later optimization could possibly make - * some of that unused. - */ - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - if (prog->_LinkedShaders[i] == NULL) - continue; - - detect_recursion_linked(prog, prog->_LinkedShaders[i]->ir); - if (!prog->LinkStatus) - goto done; - - if (ctx->Const.ShaderCompilerOptions[i].LowerClipDistance) { - lower_clip_distance(prog->_LinkedShaders[i]); - } - - while (do_common_optimization(prog->_LinkedShaders[i]->ir, true, false, - &ctx->Const.ShaderCompilerOptions[i], - ctx->Const.NativeIntegers)) - ; - } - - /* Check and validate stream emissions in geometry shaders */ - validate_geometry_shader_emissions(ctx, prog); - - /* Mark all generic shader inputs and outputs as unpaired. */ - for (unsigned i = MESA_SHADER_VERTEX; i <= MESA_SHADER_FRAGMENT; i++) { - if (prog->_LinkedShaders[i] != NULL) { - link_invalidate_variable_locations(prog->_LinkedShaders[i]->ir); - } - } - - /* FINISHME: The value of the max_attribute_index parameter is - * FINISHME: implementation dependent based on the value of - * FINISHME: GL_MAX_VERTEX_ATTRIBS. GL_MAX_VERTEX_ATTRIBS must be - * FINISHME: at least 16, so hardcode 16 for now. - */ - if (!assign_attribute_or_color_locations(prog, MESA_SHADER_VERTEX, 16)) { - goto done; - } - - if (!assign_attribute_or_color_locations(prog, MESA_SHADER_FRAGMENT, MAX2(ctx->Const.MaxDrawBuffers, ctx->Const.MaxDualSourceDrawBuffers))) { - goto done; - } - - unsigned first; - for (first = 0; first <= MESA_SHADER_FRAGMENT; first++) { - if (prog->_LinkedShaders[first] != NULL) - break; - } - - if (num_tfeedback_decls != 0) { - /* From GL_EXT_transform_feedback: - * A program will fail to link if: - * - * * the specified by TransformFeedbackVaryingsEXT is - * non-zero, but the program object has no vertex or geometry - * shader; - */ - if (first == MESA_SHADER_FRAGMENT) { - linker_error(prog, "Transform feedback varyings specified, but " - "no vertex or geometry shader is present."); - goto done; - } - - tfeedback_decls = ralloc_array(mem_ctx, tfeedback_decl, - prog->TransformFeedback.NumVarying); - if (!parse_tfeedback_decls(ctx, prog, mem_ctx, num_tfeedback_decls, - prog->TransformFeedback.VaryingNames, - tfeedback_decls)) - goto done; - } - - /* Linking the stages in the opposite order (from fragment to vertex) - * ensures that inter-shader outputs written to in an earlier stage are - * eliminated if they are (transitively) not used in a later stage. - */ - int last, next; - for (last = MESA_SHADER_FRAGMENT; last >= 0; last--) { - if (prog->_LinkedShaders[last] != NULL) - break; - } - - if (last >= 0 && last < MESA_SHADER_FRAGMENT) { - gl_shader *const sh = prog->_LinkedShaders[last]; - - if (num_tfeedback_decls != 0 || prog->SeparateShader) { - /* There was no fragment shader, but we still have to assign varying - * locations for use by transform feedback. - */ - if (!assign_varying_locations(ctx, mem_ctx, prog, - sh, NULL, - num_tfeedback_decls, tfeedback_decls, - 0)) - goto done; - } - - do_dead_builtin_varyings(ctx, sh, NULL, - num_tfeedback_decls, tfeedback_decls); - - if (!prog->SeparateShader) - demote_shader_inputs_and_outputs(sh, ir_var_shader_out); - - /* Eliminate code that is now dead due to unused outputs being demoted. - */ - while (do_dead_code(sh->ir, false)) - ; - } - else if (first == MESA_SHADER_FRAGMENT) { - /* If the program only contains a fragment shader... - */ - gl_shader *const sh = prog->_LinkedShaders[first]; - - do_dead_builtin_varyings(ctx, NULL, sh, - num_tfeedback_decls, tfeedback_decls); - - if (prog->SeparateShader) { - if (!assign_varying_locations(ctx, mem_ctx, prog, - NULL /* producer */, - sh /* consumer */, - 0 /* num_tfeedback_decls */, - NULL /* tfeedback_decls */, - 0 /* gs_input_vertices */)) - goto done; - } else - demote_shader_inputs_and_outputs(sh, ir_var_shader_in); - - while (do_dead_code(sh->ir, false)) - ; - } - - next = last; - for (int i = next - 1; i >= 0; i--) { - if (prog->_LinkedShaders[i] == NULL) - continue; - - gl_shader *const sh_i = prog->_LinkedShaders[i]; - gl_shader *const sh_next = prog->_LinkedShaders[next]; - unsigned gs_input_vertices = - next == MESA_SHADER_GEOMETRY ? prog->Geom.VerticesIn : 0; - - if (!assign_varying_locations(ctx, mem_ctx, prog, sh_i, sh_next, - next == MESA_SHADER_FRAGMENT ? num_tfeedback_decls : 0, - tfeedback_decls, gs_input_vertices)) - goto done; - - do_dead_builtin_varyings(ctx, sh_i, sh_next, - next == MESA_SHADER_FRAGMENT ? num_tfeedback_decls : 0, - tfeedback_decls); - - demote_shader_inputs_and_outputs(sh_i, ir_var_shader_out); - demote_shader_inputs_and_outputs(sh_next, ir_var_shader_in); - - /* Eliminate code that is now dead due to unused outputs being demoted. - */ - while (do_dead_code(sh_i->ir, false)) - ; - while (do_dead_code(sh_next->ir, false)) - ; - - /* This must be done after all dead varyings are eliminated. */ - if (!check_against_output_limit(ctx, prog, sh_i)) - goto done; - if (!check_against_input_limit(ctx, prog, sh_next)) - goto done; - - next = i; - } - - if (!store_tfeedback_info(ctx, prog, num_tfeedback_decls, tfeedback_decls)) - goto done; - - update_array_sizes(prog); - link_assign_uniform_locations(prog, ctx->Const.UniformBooleanTrue); - link_assign_atomic_counter_resources(ctx, prog); - store_fragdepth_layout(prog); - - check_resources(ctx, prog); - check_image_resources(ctx, prog); - link_check_atomic_counter_resources(ctx, prog); - - if (!prog->LinkStatus) - goto done; - - /* OpenGL ES requires that a vertex shader and a fragment shader both be - * present in a linked program. GL_ARB_ES2_compatibility doesn't say - * anything about shader linking when one of the shaders (vertex or - * fragment shader) is absent. So, the extension shouldn't change the - * behavior specified in GLSL specification. - */ - if (!prog->SeparateShader && ctx->API == API_OPENGLES2) { - if (prog->_LinkedShaders[MESA_SHADER_VERTEX] == NULL) { - linker_error(prog, "program lacks a vertex shader\n"); - } else if (prog->_LinkedShaders[MESA_SHADER_FRAGMENT] == NULL) { - linker_error(prog, "program lacks a fragment shader\n"); - } - } - - /* FINISHME: Assign fragment shader output locations. */ - -done: - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - free(shader_list[i]); - if (prog->_LinkedShaders[i] == NULL) - continue; - - /* Do a final validation step to make sure that the IR wasn't - * invalidated by any modifications performed after intrastage linking. - */ - validate_ir_tree(prog->_LinkedShaders[i]->ir); - - /* Retain any live IR, but trash the rest. */ - reparent_ir(prog->_LinkedShaders[i]->ir, prog->_LinkedShaders[i]->ir); - - /* The symbol table in the linked shaders may contain references to - * variables that were removed (e.g., unused uniforms). Since it may - * contain junk, there is no possible valid use. Delete it and set the - * pointer to NULL. - */ - delete prog->_LinkedShaders[i]->symbols; - prog->_LinkedShaders[i]->symbols = NULL; - } - - ralloc_free(mem_ctx); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/linker.h b/3rdparty/glsl-optimizer/src/glsl/linker.h deleted file mode 100644 index 4f8c19316..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/linker.h +++ /dev/null @@ -1,199 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef GLSL_LINKER_H -#define GLSL_LINKER_H - -ir_function_signature * -link_get_main_function_signature(gl_shader *sh); - -extern bool -link_function_calls(gl_shader_program *prog, gl_shader *main, - gl_shader **shader_list, unsigned num_shaders); - -extern void -link_invalidate_variable_locations(exec_list *ir); - -extern void -link_assign_uniform_locations(struct gl_shader_program *prog, - unsigned int boolean_true); - -extern void -link_set_uniform_initializers(struct gl_shader_program *prog, - unsigned int boolean_true); - -extern int -link_cross_validate_uniform_block(void *mem_ctx, - struct gl_uniform_block **linked_blocks, - unsigned int *num_linked_blocks, - struct gl_uniform_block *new_block); - -extern bool -link_uniform_blocks_are_compatible(const gl_uniform_block *a, - const gl_uniform_block *b); - -extern unsigned -link_uniform_blocks(void *mem_ctx, - struct gl_shader_program *prog, - struct gl_shader **shader_list, - unsigned num_shaders, - struct gl_uniform_block **blocks_ret); - -void -validate_intrastage_interface_blocks(struct gl_shader_program *prog, - const gl_shader **shader_list, - unsigned num_shaders); - -void -validate_interstage_inout_blocks(struct gl_shader_program *prog, - const gl_shader *producer, - const gl_shader *consumer); - -void -validate_interstage_uniform_blocks(struct gl_shader_program *prog, - gl_shader **stages, int num_stages); - -extern void -link_assign_atomic_counter_resources(struct gl_context *ctx, - struct gl_shader_program *prog); - -extern void -link_check_atomic_counter_resources(struct gl_context *ctx, - struct gl_shader_program *prog); - -/** - * Class for processing all of the leaf fields of a variable that corresponds - * to a program resource. - * - * The leaf fields are all the parts of the variable that the application - * could query using \c glGetProgramResourceIndex (or that could be returned - * by \c glGetProgramResourceName). - * - * Classes my derive from this class to implement specific functionality. - * This class only provides the mechanism to iterate over the leaves. Derived - * classes must implement \c ::visit_field and may override \c ::process. - */ -class program_resource_visitor { -public: - /** - * Begin processing a variable - * - * Classes that overload this function should call \c ::process from the - * base class to start the recursive processing of the variable. - * - * \param var The variable that is to be processed - * - * Calls \c ::visit_field for each leaf of the variable. - * - * \warning - * When processing a uniform block, this entry should only be used in cases - * where the row / column ordering of matrices in the block does not - * matter. For example, enumerating the names of members of the block, but - * not for determining the offsets of members. - */ - void process(ir_variable *var); - - /** - * Begin processing a variable of a structured type. - * - * This flavor of \c process should be used to handle structured types - * (i.e., structures, interfaces, or arrays there of) that need special - * name handling. A common usage is to handle cases where the block name - * (instead of the instance name) is used for an interface block. - * - * \param type Type that is to be processed, associated with \c name - * \param name Base name of the structured variable being processed - * - * \note - * \c type must be \c GLSL_TYPE_RECORD, \c GLSL_TYPE_INTERFACE, or an array - * there of. - */ - void process(const glsl_type *type, const char *name); - -protected: - /** - * Method invoked for each leaf of the variable - * - * \param type Type of the field. - * \param name Fully qualified name of the field. - * \param row_major For a matrix type, is it stored row-major. - * \param record_type Type of the record containing the field. - * \param last_field Set if \c name is the last field of the structure - * containing it. This will always be false for items - * not contained in a structure or interface block. - * - * The default implementation just calls the other \c visit_field method. - */ - virtual void visit_field(const glsl_type *type, const char *name, - bool row_major, const glsl_type *record_type, - bool last_field); - - /** - * Method invoked for each leaf of the variable - * - * \param type Type of the field. - * \param name Fully qualified name of the field. - * \param row_major For a matrix type, is it stored row-major. - */ - virtual void visit_field(const glsl_type *type, const char *name, - bool row_major) = 0; - - /** - * Visit a record before visiting its fields - * - * For structures-of-structures or interfaces-of-structures, this visits - * the inner structure before visiting its fields. - * - * The default implementation does nothing. - */ - virtual void visit_field(const glsl_struct_field *field); - -private: - /** - * \param name_length Length of the current name \b not including the - * terminating \c NUL character. - * \param last_field Set if \c name is the last field of the structure - * containing it. This will always be false for items - * not contained in a structure or interface block. - */ - void recursion(const glsl_type *t, char **name, size_t name_length, - bool row_major, const glsl_type *record_type, - bool last_field); -}; - -extern struct gl_shader * -link_intrastage_shaders(void *mem_ctx, - struct gl_context *ctx, - struct gl_shader_program *prog, - struct gl_shader **shader_list, - unsigned num_shaders); - -void -linker_error(gl_shader_program *prog, const char *fmt, ...); - -void -linker_warning(gl_shader_program *prog, const char *fmt, ...); - -#endif /* GLSL_LINKER_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/list.h b/3rdparty/glsl-optimizer/src/glsl/list.h deleted file mode 100644 index ae0a15cae..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/list.h +++ /dev/null @@ -1,658 +0,0 @@ -/* - * Copyright © 2008, 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file list.h - * \brief Doubly-linked list abstract container type. - * - * Each doubly-linked list has a sentinel head and tail node. These nodes - * contain no data. The head sentinel can be identified by its \c prev - * pointer being \c NULL. The tail sentinel can be identified by its - * \c next pointer being \c NULL. - * - * A list is empty if either the head sentinel's \c next pointer points to the - * tail sentinel or the tail sentinel's \c prev poiner points to the head - * sentinel. - * - * Instead of tracking two separate \c node structures and a \c list structure - * that points to them, the sentinel nodes are in a single structure. Noting - * that each sentinel node always has one \c NULL pointer, the \c NULL - * pointers occupy the same memory location. In the \c list structure - * contains a the following: - * - * - A \c head pointer that represents the \c next pointer of the - * head sentinel node. - * - A \c tail pointer that represents the \c prev pointer of the head - * sentinel node and the \c next pointer of the tail sentinel node. This - * pointer is \b always \c NULL. - * - A \c tail_prev pointer that represents the \c prev pointer of the - * tail sentinel node. - * - * Therefore, if \c head->next is \c NULL or \c tail_prev->prev is \c NULL, - * the list is empty. - * - * To anyone familiar with "exec lists" on the Amiga, this structure should - * be immediately recognizable. See the following link for the original Amiga - * operating system documentation on the subject. - * - * http://www.natami.net/dev/Libraries_Manual_guide/node02D7.html - * - * \author Ian Romanick - */ - -#pragma once -#ifndef LIST_CONTAINER_H -#define LIST_CONTAINER_H - -#ifndef __cplusplus -#include -#endif -#include - -#include "util/ralloc.h" - -struct exec_node { - struct exec_node *next; - struct exec_node *prev; - -#ifdef __cplusplus - DECLARE_RALLOC_CXX_OPERATORS(exec_node) - - exec_node() : next(NULL), prev(NULL) - { - /* empty */ - } - - const exec_node *get_next() const; - exec_node *get_next(); - - const exec_node *get_prev() const; - exec_node *get_prev(); - - void remove(); - - /** - * Link a node with itself - * - * This creates a sort of degenerate list that is occasionally useful. - */ - void self_link(); - - /** - * Insert a node in the list after the current node - */ - void insert_after(exec_node *after); - /** - * Insert a node in the list before the current node - */ - void insert_before(exec_node *before); - - /** - * Insert another list in the list before the current node - */ - void insert_before(struct exec_list *before); - - /** - * Replace the current node with the given node. - */ - void replace_with(exec_node *replacement); - - /** - * Is this the sentinel at the tail of the list? - */ - bool is_tail_sentinel() const; - - /** - * Is this the sentinel at the head of the list? - */ - bool is_head_sentinel() const; -#endif -}; - -static inline void -exec_node_init(struct exec_node *n) -{ - n->next = NULL; - n->prev = NULL; -} - -static inline const struct exec_node * -exec_node_get_next_const(const struct exec_node *n) -{ - return n->next; -} - -static inline struct exec_node * -exec_node_get_next(struct exec_node *n) -{ - return n->next; -} - -static inline const struct exec_node * -exec_node_get_prev_const(const struct exec_node *n) -{ - return n->prev; -} - -static inline struct exec_node * -exec_node_get_prev(struct exec_node *n) -{ - return n->prev; -} - -static inline void -exec_node_remove(struct exec_node *n) -{ - if (n->next) - n->next->prev = n->prev; - if (n->prev) - n->prev->next = n->next; - n->next = NULL; - n->prev = NULL; -} - -static inline void -exec_node_self_link(struct exec_node *n) -{ - n->next = n; - n->prev = n; -} - -static inline void -exec_node_insert_after(struct exec_node *n, struct exec_node *after) -{ - after->next = n->next; - after->prev = n; - - n->next->prev = after; - n->next = after; -} - -static inline void -exec_node_insert_node_before(struct exec_node *n, struct exec_node *before) -{ - before->next = n; - before->prev = n->prev; - - n->prev->next = before; - n->prev = before; -} - -static inline void -exec_node_replace_with(struct exec_node *n, struct exec_node *replacement) -{ - replacement->prev = n->prev; - replacement->next = n->next; - - n->prev->next = replacement; - n->next->prev = replacement; -} - -static inline bool -exec_node_is_tail_sentinel(const struct exec_node *n) -{ - return n->next == NULL; -} - -static inline bool -exec_node_is_head_sentinel(const struct exec_node *n) -{ - return n->prev == NULL; -} - -#ifdef __cplusplus -inline const exec_node *exec_node::get_next() const -{ - return exec_node_get_next_const(this); -} - -inline exec_node *exec_node::get_next() -{ - return exec_node_get_next(this); -} - -inline const exec_node *exec_node::get_prev() const -{ - return exec_node_get_prev_const(this); -} - -inline exec_node *exec_node::get_prev() -{ - return exec_node_get_prev(this); -} - -inline void exec_node::remove() -{ - exec_node_remove(this); -} - -inline void exec_node::self_link() -{ - exec_node_self_link(this); -} - -inline void exec_node::insert_after(exec_node *after) -{ - exec_node_insert_after(this, after); -} - -inline void exec_node::insert_before(exec_node *before) -{ - exec_node_insert_node_before(this, before); -} - -inline void exec_node::replace_with(exec_node *replacement) -{ - exec_node_replace_with(this, replacement); -} - -inline bool exec_node::is_tail_sentinel() const -{ - return exec_node_is_tail_sentinel(this); -} - -inline bool exec_node::is_head_sentinel() const -{ - return exec_node_is_head_sentinel(this); -} -#endif - -#ifdef __cplusplus -/* This macro will not work correctly if `t' uses virtual inheritance. If you - * are using virtual inheritance, you deserve a slow and painful death. Enjoy! - */ -#define exec_list_offsetof(t, f, p) \ - (((char *) &((t *) p)->f) - ((char *) p)) -#else -#define exec_list_offsetof(t, f, p) offsetof(t, f) -#endif - -/** - * Get a pointer to the structure containing an exec_node - * - * Given a pointer to an \c exec_node embedded in a structure, get a pointer to - * the containing structure. - * - * \param type Base type of the structure containing the node - * \param node Pointer to the \c exec_node - * \param field Name of the field in \c type that is the embedded \c exec_node - */ -#define exec_node_data(type, node, field) \ - ((type *) (((char *) node) - exec_list_offsetof(type, field, node))) - -#ifdef __cplusplus -struct exec_node; -#endif - -struct exec_list { - struct exec_node *head; - struct exec_node *tail; - struct exec_node *tail_pred; - -#ifdef __cplusplus - DECLARE_RALLOC_CXX_OPERATORS(exec_list) - - exec_list() - { - make_empty(); - } - - void make_empty(); - - bool is_empty() const; - - const exec_node *get_head() const; - exec_node *get_head(); - - const exec_node *get_tail() const; - exec_node *get_tail(); - - unsigned length() const; - - void push_head(exec_node *n); - void push_tail(exec_node *n); - void push_degenerate_list_at_head(exec_node *n); - - /** - * Remove the first node from a list and return it - * - * \return - * The first node in the list or \c NULL if the list is empty. - * - * \sa exec_list::get_head - */ - exec_node *pop_head(); - - /** - * Move all of the nodes from this list to the target list - */ - void move_nodes_to(exec_list *target); - - /** - * Append all nodes from the source list to the end of the target list - */ - void append_list(exec_list *source); - - /** - * Prepend all nodes from the source list to the beginning of the target - * list - */ - void prepend_list(exec_list *source); -#endif -}; - -static inline void -exec_list_make_empty(struct exec_list *list) -{ - list->head = (struct exec_node *) & list->tail; - list->tail = NULL; - list->tail_pred = (struct exec_node *) & list->head; -} - -static inline bool -exec_list_is_empty(const struct exec_list *list) -{ - /* There are three ways to test whether a list is empty or not. - * - * - Check to see if the \c head points to the \c tail. - * - Check to see if the \c tail_pred points to the \c head. - * - Check to see if the \c head is the sentinel node by test whether its - * \c next pointer is \c NULL. - * - * The first two methods tend to generate better code on modern systems - * because they save a pointer dereference. - */ - return list->head == (struct exec_node *) &list->tail; -} - -static inline const struct exec_node * -exec_list_get_head_const(const struct exec_list *list) -{ - return !exec_list_is_empty(list) ? list->head : NULL; -} - -static inline struct exec_node * -exec_list_get_head(struct exec_list *list) -{ - return !exec_list_is_empty(list) ? list->head : NULL; -} - -static inline const struct exec_node * -exec_list_get_tail_const(const struct exec_list *list) -{ - return !exec_list_is_empty(list) ? list->tail_pred : NULL; -} - -static inline struct exec_node * -exec_list_get_tail(struct exec_list *list) -{ - return !exec_list_is_empty(list) ? list->tail_pred : NULL; -} - -static inline unsigned -exec_list_length(const struct exec_list *list) -{ - unsigned size = 0; - struct exec_node *node; - - for (node = list->head; node->next != NULL; node = node->next) { - size++; - } - - return size; -} - -static inline void -exec_list_push_head(struct exec_list *list, struct exec_node *n) -{ - n->next = list->head; - n->prev = (struct exec_node *) &list->head; - - n->next->prev = n; - list->head = n; -} - -static inline void -exec_list_push_tail(struct exec_list *list, struct exec_node *n) -{ - n->next = (struct exec_node *) &list->tail; - n->prev = list->tail_pred; - - n->prev->next = n; - list->tail_pred = n; -} - -static inline void -exec_list_push_degenerate_list_at_head(struct exec_list *list, struct exec_node *n) -{ - assert(n->prev->next == n); - - n->prev->next = list->head; - list->head->prev = n->prev; - n->prev = (struct exec_node *) &list->head; - list->head = n; -} - -static inline struct exec_node * -exec_list_pop_head(struct exec_list *list) -{ - struct exec_node *const n = exec_list_get_head(list); - if (n != NULL) - exec_node_remove(n); - - return n; -} - -static inline void -exec_list_move_nodes_to(struct exec_list *list, struct exec_list *target) -{ - if (exec_list_is_empty(list)) { - exec_list_make_empty(target); - } else { - target->head = list->head; - target->tail = NULL; - target->tail_pred = list->tail_pred; - - target->head->prev = (struct exec_node *) &target->head; - target->tail_pred->next = (struct exec_node *) &target->tail; - - exec_list_make_empty(list); - } -} - -static inline void -exec_list_append(struct exec_list *list, struct exec_list *source) -{ - if (exec_list_is_empty(source)) - return; - - /* Link the first node of the source with the last node of the target list. - */ - list->tail_pred->next = source->head; - source->head->prev = list->tail_pred; - - /* Make the tail of the source list be the tail of the target list. - */ - list->tail_pred = source->tail_pred; - list->tail_pred->next = (struct exec_node *) &list->tail; - - /* Make the source list empty for good measure. - */ - exec_list_make_empty(source); -} - -static inline void -exec_list_prepend(struct exec_list *list, struct exec_list *source) -{ - exec_list_append(source, list); - exec_list_move_nodes_to(source, list); -} - -static inline void -exec_node_insert_list_before(struct exec_node *n, struct exec_list *before) -{ - if (exec_list_is_empty(before)) - return; - - before->tail_pred->next = n; - before->head->prev = n->prev; - - n->prev->next = before->head; - n->prev = before->tail_pred; - - exec_list_make_empty(before); -} - -#ifdef __cplusplus -inline void exec_list::make_empty() -{ - exec_list_make_empty(this); -} - -inline bool exec_list::is_empty() const -{ - return exec_list_is_empty(this); -} - -inline const exec_node *exec_list::get_head() const -{ - return exec_list_get_head_const(this); -} - -inline exec_node *exec_list::get_head() -{ - return exec_list_get_head(this); -} - -inline const exec_node *exec_list::get_tail() const -{ - return exec_list_get_tail_const(this); -} - -inline exec_node *exec_list::get_tail() -{ - return exec_list_get_tail(this); -} - -inline unsigned exec_list::length() const -{ - return exec_list_length(this); -} - -inline void exec_list::push_head(exec_node *n) -{ - exec_list_push_head(this, n); -} - -inline void exec_list::push_tail(exec_node *n) -{ - exec_list_push_tail(this, n); -} - -inline void exec_list::push_degenerate_list_at_head(exec_node *n) -{ - exec_list_push_degenerate_list_at_head(this, n); -} - -inline exec_node *exec_list::pop_head() -{ - return exec_list_pop_head(this); -} - -inline void exec_list::move_nodes_to(exec_list *target) -{ - exec_list_move_nodes_to(this, target); -} - -inline void exec_list::append_list(exec_list *source) -{ - exec_list_append(this, source); -} - -inline void exec_list::prepend_list(exec_list *source) -{ - exec_list_prepend(this, source); -} - -inline void exec_node::insert_before(exec_list *before) -{ - exec_node_insert_list_before(this, before); -} -#endif - -#define foreach_in_list(__type, __inst, __list) \ - for (__type *(__inst) = (__type *)(__list)->head; \ - !(__inst)->is_tail_sentinel(); \ - (__inst) = (__type *)(__inst)->next) - -#define foreach_in_list_reverse(__type, __inst, __list) \ - for (__type *(__inst) = (__type *)(__list)->tail_pred; \ - !(__inst)->is_head_sentinel(); \ - (__inst) = (__type *)(__inst)->prev) - -/** - * This version is safe even if the current node is removed. - */ -#define foreach_in_list_safe(__type, __node, __list) \ - for (__type *__node = (__type *)(__list)->head, \ - *__next = (__type *)__node->next; \ - __next != NULL; \ - __node = __next, __next = (__type *)__next->next) - -#define foreach_in_list_use_after(__type, __inst, __list) \ - __type *(__inst); \ - for ((__inst) = (__type *)(__list)->head; \ - !(__inst)->is_tail_sentinel(); \ - (__inst) = (__type *)(__inst)->next) -/** - * Iterate through two lists at once. Stops at the end of the shorter list. - * - * This is safe against either current node being removed or replaced. - */ -#define foreach_two_lists(__node1, __list1, __node2, __list2) \ - for (struct exec_node * __node1 = (__list1)->head, \ - * __node2 = (__list2)->head, \ - * __next1 = __node1->next, \ - * __next2 = __node2->next \ - ; __next1 != NULL && __next2 != NULL \ - ; __node1 = __next1, \ - __node2 = __next2, \ - __next1 = __next1->next, \ - __next2 = __next2->next) - -#define foreach_list_typed(__type, __node, __field, __list) \ - for (__type * __node = \ - exec_node_data(__type, (__list)->head, __field); \ - (__node)->__field.next != NULL; \ - (__node) = exec_node_data(__type, (__node)->__field.next, __field)) - -#define foreach_list_typed_safe(__type, __node, __field, __list) \ - for (__type * __node = \ - exec_node_data(__type, (__list)->head, __field), \ - * __next = \ - exec_node_data(__type, (__node)->__field.next, __field); \ - __next != NULL; \ - __node = __next, __next = \ - exec_node_data(__type, (__next)->__field.next, __field)) - -#endif /* LIST_CONTAINER_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/loop_analysis.cpp b/3rdparty/glsl-optimizer/src/glsl/loop_analysis.cpp deleted file mode 100644 index b0d3e3063..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/loop_analysis.cpp +++ /dev/null @@ -1,813 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "glsl_types.h" -#include "loop_analysis.h" -#include "ir_hierarchical_visitor.h" -#include "ir_variable_refcount.h" -#include "util/hash_table.h" - -static bool is_loop_terminator(ir_if *ir); - -static bool all_expression_operands_are_loop_constant(ir_rvalue *, - hash_table *); - -static ir_rvalue *get_basic_induction_increment(ir_assignment *, hash_table *); - - -/** - * Record the fact that the given loop variable was referenced inside the loop. - * - * \arg in_assignee is true if the reference was on the LHS of an assignment. - * - * \arg in_conditional_code_or_nested_loop is true if the reference occurred - * inside an if statement or a nested loop. - * - * \arg current_assignment is the ir_assignment node that the loop variable is - * on the LHS of, if any (ignored if \c in_assignee is false). - */ -void -loop_variable::record_reference(bool in_assignee, - bool in_conditional_code_or_nested_loop, - ir_assignment *current_assignment) -{ - if (in_assignee) { - assert(current_assignment != NULL); - - if (in_conditional_code_or_nested_loop || - current_assignment->condition != NULL) { - this->conditional_or_nested_assignment = true; - } - - if (this->first_assignment == NULL) { - assert(this->num_assignments == 0); - - this->first_assignment = current_assignment; - } - - this->num_assignments++; - } else if (this->first_assignment == current_assignment) { - /* This catches the case where the variable is used in the RHS of an - * assignment where it is also in the LHS. - */ - this->read_before_write = true; - } -} - - -loop_state::loop_state() -{ - this->ht = hash_table_ctor(0, hash_table_pointer_hash, - hash_table_pointer_compare); - this->ht_inductors = hash_table_ctor(0, hash_table_pointer_hash, - hash_table_pointer_compare); - this->ht_non_inductors = hash_table_ctor(0, hash_table_pointer_hash, - hash_table_pointer_compare); - this->ht_variables = hash_table_ctor(0, hash_table_pointer_hash, - hash_table_pointer_compare); - this->mem_ctx = ralloc_context(NULL); - this->loop_found = false; -} - - -loop_state::~loop_state() -{ - hash_table_dtor(this->ht); - hash_table_dtor(this->ht_inductors); - hash_table_dtor(this->ht_non_inductors); - hash_table_dtor(this->ht_variables); - ralloc_free(this->mem_ctx); -} - - -loop_variable_state * -loop_state::insert(ir_loop *ir) -{ - loop_variable_state *ls = new(this->mem_ctx) loop_variable_state; - - hash_table_insert(this->ht, ls, ir); - this->loop_found = true; - - return ls; -} - - -loop_variable_state * -loop_state::get(const ir_loop *ir) -{ - return (loop_variable_state *) hash_table_find(this->ht, ir); -} - -loop_variable_state * -loop_state::get_for_inductor(const ir_variable *ir) -{ - return (loop_variable_state *) hash_table_find(this->ht_inductors, ir); -} - -static void *unreferenced_variable = (void *)1; -static void *assigned_variable = (void *)2; - -void -loop_state::insert_variable(ir_variable *var) -{ - // data starts as 1. If an assignment is seen, it's replaced with 2. - // this way we can mark a variable as a non-inductor if it's referenced - // other than the first assignment - hash_table_insert(this->ht_variables, unreferenced_variable, var); -} - -void -loop_state::reference_variable(ir_variable *var, bool assignment) -{ - void *ref = hash_table_find(this->ht_variables, var); - - // variable declaration was not seen or already discarded, just ignore - if (ref == NULL) - return; - - if (ref == unreferenced_variable && assignment) - { - hash_table_replace(this->ht_variables, assigned_variable, var); - return; - } - - // variable is referenced and not just in an initial assignment, - // so it cannot be an inductor - hash_table_remove(this->ht_variables, var); - hash_table_insert(this->ht_non_inductors, this, var); -} - -bool -loop_state::insert_inductor(loop_variable* loopvar, loop_variable_state* state, ir_loop* loop) -{ - ir_variable* var = loopvar->var; - - // Check if this variable is already marked as "sure can't be a private inductor variable" - if (hash_table_find(this->ht_non_inductors, var)) - return false; - - // Check if this variable is used after the loop anywhere. If it is, it can't be a - // variable that's private to the loop. - ir_variable_refcount_visitor refs; - for (exec_node* node = loop->next; - !node->is_tail_sentinel(); - node = node->next) - { - ir_instruction *ir = (ir_instruction *) node; - ir->accept (&refs); - if (refs.find_variable_entry(var)) - { - // add to list of "non inductors", so that next loop does not try - // to add it as inductor again - hash_table_insert(this->ht_non_inductors, state, var); - return false; - } - } - - // Check if this variable is used before the loop anywhere. If it is, it can't be a - // variable that's private to the loop. - // Skip over the IR that declared the variable or assigned the initial value though. - for (exec_node* node = loop->prev; - !node->is_head_sentinel(); - node = node->prev) - { - ir_instruction *ir = (ir_instruction *) node; - if (ir == loopvar->initial_value_ir) - continue; - if (ir->ir_type == ir_type_variable) - continue; - - ir->accept (&refs); - if (refs.find_variable_entry(var)) - { - // add to list of "non inductors", so that next loop does not try - // to add it as inductor again - hash_table_insert(this->ht_non_inductors, state, var); - return false; - } - } - - state->private_induction_variable_count++; - hash_table_insert(this->ht_inductors, state, var); - return true; -} - - -loop_variable * -loop_variable_state::get(const ir_variable *ir) -{ - return (loop_variable *) hash_table_find(this->var_hash, ir); -} - - -loop_variable * -loop_variable_state::insert(ir_variable *var) -{ - void *mem_ctx = ralloc_parent(this); - loop_variable *lv = rzalloc(mem_ctx, loop_variable); - - lv->var = var; - - hash_table_insert(this->var_hash, lv, lv->var); - this->variables.push_tail(lv); - - return lv; -} - - -loop_terminator * -loop_variable_state::insert(ir_if *if_stmt) -{ - void *mem_ctx = ralloc_parent(this); - loop_terminator *t = new(mem_ctx) loop_terminator(); - - t->ir = if_stmt; - this->terminators.push_tail(t); - - return t; -} - - -/** - * If the given variable already is recorded in the state for this loop, - * return the corresponding loop_variable object that records information - * about it. - * - * Otherwise, create a new loop_variable object to record information about - * the variable, and set its \c read_before_write field appropriately based on - * \c in_assignee. - * - * \arg in_assignee is true if this variable was encountered on the LHS of an - * assignment. - */ -loop_variable * -loop_variable_state::get_or_insert(ir_variable *var, bool in_assignee) -{ - loop_variable *lv = this->get(var); - - if (lv == NULL) { - lv = this->insert(var); - lv->read_before_write = !in_assignee; - } - - return lv; -} - - -namespace { - -class loop_analysis : public ir_hierarchical_visitor { -public: - loop_analysis(loop_state *loops); - - virtual ir_visitor_status visit(ir_loop_jump *); - virtual ir_visitor_status visit(ir_dereference_variable *); - - virtual ir_visitor_status visit(ir_variable *); - - virtual ir_visitor_status visit_enter(ir_call *); - - virtual ir_visitor_status visit_enter(ir_loop *); - virtual ir_visitor_status visit_leave(ir_loop *); - virtual ir_visitor_status visit_enter(ir_assignment *); - virtual ir_visitor_status visit_leave(ir_assignment *); - virtual ir_visitor_status visit_enter(ir_if *); - virtual ir_visitor_status visit_leave(ir_if *); - - void visit_general(ir_instruction *); - - loop_state *loops; - - int if_statement_depth; - - bool first_pass; - - ir_assignment *current_assignment; - - exec_list state; -}; - -} /* anonymous namespace */ - -void loop_enter_callback(class ir_instruction *ir, void *data) -{ - ((loop_analysis *)data)->visit_general(ir); -} - -loop_analysis::loop_analysis(loop_state *loops) - : loops(loops), if_statement_depth(0), current_assignment(NULL), first_pass(false) -{ - /* empty */ - data_enter = this; - callback_enter = &loop_enter_callback; -} - - -ir_visitor_status -loop_analysis::visit(ir_loop_jump *ir) -{ - (void) ir; - - assert(!this->state.is_empty()); - - loop_variable_state *const ls = - (loop_variable_state *) this->state.get_head(); - - ls->num_loop_jumps++; - - return visit_continue; -} - - -ir_visitor_status -loop_analysis::visit(ir_variable *var) -{ - // if inside a loop, simply continue - we're only interested in variables declared - // entirely outside of any loops - if (!this->state.is_empty()) - return visit_continue; - - // In the first pass over the instructions we look at variables declared and - // examine their references to determine if they can be an inductor or not - // for the second pass - if (this->first_pass) - loops->insert_variable(var); - - return visit_continue; -} - -ir_visitor_status -loop_analysis::visit_enter(ir_call *) -{ - /* Mark every loop that we're currently analyzing as containing an ir_call - * (even those at outer nesting levels). - */ - foreach_in_list(loop_variable_state, ls, &this->state) { - ls->contains_calls = true; - } - - return visit_continue_with_parent; -} - - -ir_visitor_status -loop_analysis::visit(ir_dereference_variable *ir) -{ - /* If we're not somewhere inside a loop, just check for - * non-inductors - */ - if (this->state.is_empty() || this->first_pass) - { - if (this->state.is_empty() && this->first_pass) - loops->reference_variable(ir->variable_referenced(), this->in_assignee); - return visit_continue; - } - - bool nested = false; - - foreach_in_list(loop_variable_state, ls, &this->state) { - ir_variable *var = ir->variable_referenced(); - loop_variable *lv = ls->get_or_insert(var, this->in_assignee); - - lv->record_reference(this->in_assignee, - nested || this->if_statement_depth > 0, - this->current_assignment); - nested = true; - } - - return visit_continue; -} - -ir_visitor_status -loop_analysis::visit_enter(ir_loop *ir) -{ - loop_variable_state *ls = this->loops->insert(ir); - this->state.push_head(ls); - - return visit_continue; -} - -ir_visitor_status -loop_analysis::visit_leave(ir_loop *ir) -{ - loop_variable_state *const ls = - (loop_variable_state *) this->state.pop_head(); - - /* Function calls may contain side effects. These could alter any of our - * variables in ways that cannot be known, and may even terminate shader - * execution (say, calling discard in the fragment shader). So we can't - * rely on any of our analysis about assignments to variables. - * - * We could perform some conservative analysis (prove there's no statically - * possible assignment, etc.) but it isn't worth it for now; function - * inlining will allow us to unroll loops anyway. - * - * We also skip doing any work in the first pass, where we are just identifying - * variables that cannot be inductors. - */ - if (ls->contains_calls || this->first_pass) - return visit_continue; - - foreach_in_list(ir_instruction, node, &ir->body_instructions) { - /* Skip over declarations at the start of a loop. - */ - if (node->as_variable()) - continue; - - ir_if *if_stmt = ((ir_instruction *) node)->as_if(); - - if ((if_stmt != NULL) && is_loop_terminator(if_stmt)) - ls->insert(if_stmt); - else - break; - } - - - foreach_in_list_safe(loop_variable, lv, &ls->variables) { - ir_variable *var = lv->var; - if (var != NULL) { - lv->initial_value = find_initial_value(ir, var, &lv->initial_value_ir); - } - /* Move variables that are already marked as being loop constant to - * a separate list. These trivially don't need to be tested. - */ - if (lv->is_loop_constant()) { - lv->remove(); - ls->constants.push_tail(lv); - } - } - - /* Each variable assigned in the loop that isn't already marked as being loop - * constant might still be loop constant. The requirements at this point - * are: - * - * - Variable is written before it is read. - * - * - Only one assignment to the variable. - * - * - All operands on the RHS of the assignment are also loop constants. - * - * The last requirement is the reason for the progress loop. A variable - * marked as a loop constant on one pass may allow other variables to be - * marked as loop constant on following passes. - */ - bool progress; - do { - progress = false; - - foreach_in_list_safe(loop_variable, lv, &ls->variables) { - if (lv->conditional_or_nested_assignment || (lv->num_assignments > 1)) - continue; - - /* Process the RHS of the assignment. If all of the variables - * accessed there are loop constants, then add this - */ - ir_rvalue *const rhs = lv->first_assignment->rhs; - if (all_expression_operands_are_loop_constant(rhs, ls->var_hash)) { - lv->rhs_clean = true; - - if (lv->is_loop_constant()) { - progress = true; - - lv->remove(); - ls->constants.push_tail(lv); - } - } - } - } while (progress); - - /* The remaining variables that are not loop invariant might be loop - * induction variables. - */ - foreach_in_list_safe(loop_variable, lv, &ls->variables) { - /* If there is more than one assignment to a variable, it cannot be a - * loop induction variable. This isn't strictly true, but this is a - * very simple induction variable detector, and it can't handle more - * complex cases. - */ - if (lv->num_assignments > 1) - continue; - - /* All of the variables with zero assignments in the loop are loop - * invariant, and they should have already been filtered out. - */ - assert(lv->num_assignments == 1); - assert(lv->first_assignment != NULL); - - /* The assignment to the variable in the loop must be unconditional and - * not inside a nested loop. - */ - if (lv->conditional_or_nested_assignment) - continue; - - /* Basic loop induction variables have a single assignment in the loop - * that has the form 'VAR = VAR + i' or 'VAR = VAR - i' where i is a - * loop invariant. - */ - ir_rvalue *const inc = - get_basic_induction_increment(lv->first_assignment, ls->var_hash); - if (inc != NULL) { - lv->increment = inc; - - if (loops->insert_inductor(lv, ls, ir)) { - lv->remove(); - ls->induction_variables.push_tail(lv); - } - } - } - - /* Search the loop terminating conditions for those of the form 'i < c' - * where i is a loop induction variable, c is a constant, and < is any - * relative operator. From each of these we can infer an iteration count. - * Also figure out which terminator (if any) produces the smallest - * iteration count--this is the limiting terminator. - */ - foreach_in_list(loop_terminator, t, &ls->terminators) { - ir_if *if_stmt = t->ir; - - /* If-statements can be either 'if (expr)' or 'if (deref)'. We only care - * about the former here. - */ - ir_expression *cond = if_stmt->condition->as_expression(); - if (cond == NULL) - continue; - - switch (cond->operation) { - case ir_binop_less: - case ir_binop_greater: - case ir_binop_lequal: - case ir_binop_gequal: { - /* The expressions that we care about will either be of the form - * 'counter < limit' or 'limit < counter'. Figure out which is - * which. - */ - ir_rvalue *counter = cond->operands[0]->as_dereference_variable(); - ir_constant *limit = cond->operands[1]->as_constant(); - enum ir_expression_operation cmp = cond->operation; - - if (limit == NULL) { - counter = cond->operands[1]->as_dereference_variable(); - limit = cond->operands[0]->as_constant(); - - switch (cmp) { - case ir_binop_less: cmp = ir_binop_greater; break; - case ir_binop_greater: cmp = ir_binop_less; break; - case ir_binop_lequal: cmp = ir_binop_gequal; break; - case ir_binop_gequal: cmp = ir_binop_lequal; break; - default: assert(!"Should not get here."); - } - } - - if ((counter == NULL) || (limit == NULL)) - break; - - ir_variable *var = counter->variable_referenced(); - - loop_variable *lv = ls->get(var); - if (lv != NULL && lv->is_induction_var()) { - t->iterations = calculate_iterations(lv->initial_value, limit, lv->increment, - cmp); - - if (t->iterations >= 0 && - (ls->limiting_terminator == NULL || - t->iterations < ls->limiting_terminator->iterations)) { - ls->limiting_terminator = t; - } - } - break; - } - - default: - break; - } - } - - return visit_continue; -} - -ir_visitor_status -loop_analysis::visit_enter(ir_if *ir) -{ - (void) ir; - - if (!this->state.is_empty()) - this->if_statement_depth++; - - return visit_continue; -} - -ir_visitor_status -loop_analysis::visit_leave(ir_if *ir) -{ - (void) ir; - - if (!this->state.is_empty()) - this->if_statement_depth--; - - return visit_continue; -} - -ir_visitor_status -loop_analysis::visit_enter(ir_assignment *ir) -{ - /* If we're not somewhere inside a loop, there's nothing to do. - */ - if (this->state.is_empty()) - return visit_continue; - - this->current_assignment = ir; - - return visit_continue; -} - -ir_visitor_status -loop_analysis::visit_leave(ir_assignment *ir) -{ - if (this->state.is_empty()) - return visit_continue; - - assert(this->current_assignment == ir); - this->current_assignment = NULL; - - return visit_continue; -} - -void -loop_analysis::visit_general(ir_instruction *ir) -{ - /* If we're inside a loop, we can't start marking things as non-inductors - * Likewise in the second pass we've done all this work, so return early - */ - if (!this->state.is_empty() || !this->first_pass) - return; - - ir_variable_refcount_visitor refs; - ir->accept (&refs); - - struct hash_entry *referenced_var; - hash_table_foreach (refs.ht, referenced_var) { - ir_variable *var = (ir_variable *)referenced_var->key; - loops->reference_variable(var, false); - } -} - -class examine_rhs : public ir_hierarchical_visitor { -public: - examine_rhs(hash_table *loop_variables) - { - this->only_uses_loop_constants = true; - this->loop_variables = loop_variables; - } - - virtual ir_visitor_status visit(ir_dereference_variable *ir) - { - loop_variable *lv = - (loop_variable *) hash_table_find(this->loop_variables, ir->var); - - assert(lv != NULL); - - if (lv->is_loop_constant()) { - return visit_continue; - } else { - this->only_uses_loop_constants = false; - return visit_stop; - } - } - - hash_table *loop_variables; - bool only_uses_loop_constants; -}; - - -bool -all_expression_operands_are_loop_constant(ir_rvalue *ir, hash_table *variables) -{ - examine_rhs v(variables); - - ir->accept(&v); - - return v.only_uses_loop_constants; -} - - -ir_rvalue * -get_basic_induction_increment(ir_assignment *ir, hash_table *var_hash) -{ - /* The RHS must be a binary expression. - */ - ir_expression *const rhs = ir->rhs->as_expression(); - if ((rhs == NULL) - || ((rhs->operation != ir_binop_add) - && (rhs->operation != ir_binop_sub))) - return NULL; - - /* One of the of operands of the expression must be the variable assigned. - * If the operation is subtraction, the variable in question must be the - * "left" operand. - */ - ir_variable *const var = ir->lhs->variable_referenced(); - - ir_variable *const op0 = rhs->operands[0]->variable_referenced(); - ir_variable *const op1 = rhs->operands[1]->variable_referenced(); - - if (((op0 != var) && (op1 != var)) - || ((op1 == var) && (rhs->operation == ir_binop_sub))) - return NULL; - - ir_rvalue *inc = (op0 == var) ? rhs->operands[1] : rhs->operands[0]; - - if (inc->as_constant() == NULL) { - ir_variable *const inc_var = inc->variable_referenced(); - if (inc_var != NULL) { - loop_variable *lv = - (loop_variable *) hash_table_find(var_hash, inc_var); - - if (lv == NULL || !lv->is_loop_constant()) { - assert(lv != NULL); - inc = NULL; - } - } else - inc = NULL; - } - - if ((inc != NULL) && (rhs->operation == ir_binop_sub)) { - void *mem_ctx = ralloc_parent(ir); - - inc = new(mem_ctx) ir_expression(ir_unop_neg, - inc->type, - inc->clone(mem_ctx, NULL), - NULL); - } - - return inc; -} - - -/** - * Detect whether an if-statement is a loop terminating condition - * - * Detects if-statements of the form - * - * (if (expression bool ...) (break)) - */ -bool -is_loop_terminator(ir_if *ir) -{ - if (!ir->else_instructions.is_empty()) - return false; - - ir_instruction *const inst = - (ir_instruction *) ir->then_instructions.get_head(); - if (inst == NULL) - return false; - - if (inst->ir_type != ir_type_loop_jump) - return false; - - ir_loop_jump *const jump = (ir_loop_jump *) inst; - if (jump->mode != ir_loop_jump::jump_break) - return false; - - return true; -} - -loop_state * -analyze_loop_variables(exec_list *instructions) -{ - loop_state *loops = new loop_state; - loop_analysis v(loops); - - /* Do two passes over the instructions. The first pass builds a view - * of the variables declared and whether or not they're used outside - * of loops (if so, they cannot be inductors). - * - * In the second pass we apply this information to do the loop analysis - * itself. - */ - v.first_pass = true; - v.run(instructions); - v.first_pass = false; - v.run(instructions); - - return v.loops; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/loop_analysis.h b/3rdparty/glsl-optimizer/src/glsl/loop_analysis.h deleted file mode 100644 index 3b6b2d011..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/loop_analysis.h +++ /dev/null @@ -1,280 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef LOOP_ANALYSIS_H -#define LOOP_ANALYSIS_H - -#include "ir.h" -#include "glsl_types.h" -#include "program/hash_table.h" - -/** - * Analyze and classify all variables used in all loops in the instruction list - */ -extern class loop_state * -analyze_loop_variables(exec_list *instructions); - - -/** - * Fill in loop control fields - * - * Based on analysis of loop variables, this function tries to remove - * redundant sequences in the loop of the form - * - * (if (expression bool ...) (break)) - * - * For example, if it is provable that one loop exit condition will - * always be satisfied before another, the unnecessary exit condition will be - * removed. - */ -extern bool -set_loop_controls(exec_list *instructions, loop_state *ls); - - -extern bool -unroll_loops(exec_list *instructions, loop_state *ls, - const struct gl_shader_compiler_options *options); - -ir_rvalue * -find_initial_value(ir_loop *loop, ir_variable *var, ir_instruction **out_containing_ir); - -int -calculate_iterations(ir_rvalue *from, ir_rvalue *to, ir_rvalue *increment, - enum ir_expression_operation op); - - -/** - * Tracking for all variables used in a loop - */ -class loop_variable_state : public exec_node { -public: - class loop_variable *get(const ir_variable *); - class loop_variable *insert(ir_variable *); - class loop_variable *get_or_insert(ir_variable *, bool in_assignee); - class loop_terminator *insert(ir_if *); - - - /** - * Variables that have not yet been classified - */ - exec_list variables; - - /** - * Variables whose values are constant within the body of the loop - * - * This list contains \c loop_variable objects. - */ - exec_list constants; - - /** - * Induction variables for this loop - * - * This list contains \c loop_variable objects. - */ - exec_list induction_variables; - int private_induction_variable_count; - - /** - * Simple if-statements that lead to the termination of the loop - * - * This list contains \c loop_terminator objects. - * - * \sa is_loop_terminator - */ - exec_list terminators; - - /** - * If any of the terminators in \c terminators leads to termination of the - * loop after a constant number of iterations, this is the terminator that - * leads to termination after the smallest number of iterations. Otherwise - * NULL. - */ - loop_terminator *limiting_terminator; - - /** - * Hash table containing all variables accessed in this loop - */ - hash_table *var_hash; - - /** - * Number of ir_loop_jump instructions that operate on this loop - */ - unsigned num_loop_jumps; - - /** - * Whether this loop contains any function calls. - */ - bool contains_calls; - - loop_variable_state() - { - this->num_loop_jumps = 0; - this->contains_calls = false; - this->var_hash = hash_table_ctor(0, hash_table_pointer_hash, - hash_table_pointer_compare); - this->limiting_terminator = NULL; - } - - ~loop_variable_state() - { - hash_table_dtor(this->var_hash); - } - - DECLARE_RALLOC_CXX_OPERATORS(loop_variable_state) -}; - - -class loop_variable : public exec_node { -public: - /** The variable in question. */ - ir_variable *var; - - /** Is the variable read in the loop before it is written? */ - bool read_before_write; - - /** Are all variables in the RHS of the assignment loop constants? */ - bool rhs_clean; - - /** - * Is there an assignment to the variable that is conditional, or inside a - * nested loop? - */ - bool conditional_or_nested_assignment; - - /** Reference to the first assignment to the variable in the loop body. */ - ir_assignment *first_assignment; - - /** Reference to initial value outside of the loop. */ - ir_rvalue *initial_value; - /** IR that assigned the initial value. */ - ir_instruction *initial_value_ir; - - /** Number of assignments to the variable in the loop body. */ - unsigned num_assignments; - - /** - * Increment value for a loop induction variable - * - * If this is a loop induction variable, the amount by which the variable - * is incremented on each iteration through the loop. - * - * If this is not a loop induction variable, NULL. - */ - ir_rvalue *increment; - - - inline bool is_induction_var() const - { - /* Induction variables always have a non-null increment, and vice - * versa. - */ - return this->increment != NULL; - } - - - inline bool is_loop_constant() const - { - const bool is_const = (this->num_assignments == 0) - || (((this->num_assignments == 1) - && !this->conditional_or_nested_assignment - && !this->read_before_write - && this->rhs_clean) || this->var->data.read_only); - - /* If the RHS of *the* assignment is clean, then there must be exactly - * one assignment of the variable. - */ - assert((this->rhs_clean && (this->num_assignments == 1)) - || !this->rhs_clean); - - return is_const; - } - - void record_reference(bool in_assignee, - bool in_conditional_code_or_nested_loop, - ir_assignment *current_assignment); -}; - - -class loop_terminator : public exec_node { -public: - loop_terminator() - : ir(NULL), iterations(-1) - { - } - - /** - * Statement which terminates the loop. - */ - ir_if *ir; - - /** - * The number of iterations after which the terminator is known to - * terminate the loop (if that is a fixed value). Otherwise -1. - */ - int iterations; -}; - - -class loop_state { -public: - ~loop_state(); - - /** - * Get the loop variable state data for a particular loop - */ - loop_variable_state *get(const ir_loop *); - - loop_variable_state *insert(ir_loop *ir); - - loop_variable_state* get_for_inductor (const ir_variable*); - bool insert_inductor(loop_variable* loopvar, loop_variable_state* state, ir_loop* loop); - void insert_non_inductor(ir_variable *var); - void insert_variable(ir_variable *var); - void reference_variable(ir_variable *var, bool assignment); - - bool loop_found; - -private: - loop_state(); - - /** - * Hash table containing all loops that have been analyzed. - */ - hash_table *ht; - - /** - * Hash table from ir_variables to loop state, for induction variables. - */ - hash_table *ht_inductors; - hash_table *ht_non_inductors; - hash_table *ht_variables; - - - void *mem_ctx; - - friend loop_state *analyze_loop_variables(exec_list *instructions); -}; - -#endif /* LOOP_ANALYSIS_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/loop_controls.cpp b/3rdparty/glsl-optimizer/src/glsl/loop_controls.cpp deleted file mode 100644 index 87cce8957..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/loop_controls.cpp +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include -#include "main/compiler.h" -#include "glsl_types.h" -#include "loop_analysis.h" -#include "ir_hierarchical_visitor.h" -#include "ir_variable_refcount.h" - - -/** - * Find an initializer of a variable outside a loop - * - * Works backwards from the loop to find the pre-loop value of the variable. - * This is used, for example, to find the initial value of loop induction - * variables. - * - * \param loop Loop where \c var is an induction variable - * \param var Variable whose initializer is to be found - * - * \return - * The \c ir_rvalue assigned to the variable outside the loop. May return - * \c NULL if no initializer can be found. - */ -ir_rvalue * -find_initial_value(ir_loop *loop, ir_variable *var, ir_instruction **out_containing_ir) -{ - *out_containing_ir = NULL; - ir_variable_refcount_visitor refs; - - for (exec_node *node = loop->prev; - !node->is_head_sentinel(); - node = node->prev) { - ir_instruction *ir = (ir_instruction *) node; - - switch (ir->ir_type) { - case ir_type_call: - case ir_type_loop: - case ir_type_loop_jump: - case ir_type_return: - case ir_type_if: - ir->accept(&refs); - if (refs.find_variable_entry(var)) - return NULL; - break; - - case ir_type_function: - case ir_type_function_signature: - assert(!"Should not get here."); - return NULL; - - case ir_type_assignment: { - ir_assignment *assign = ir->as_assignment(); - ir_variable *assignee = assign->lhs->whole_variable_referenced(); - - if (assignee == var) - { - *out_containing_ir = assign; - return (assign->condition != NULL) ? NULL : assign->rhs; - } - - break; - } - - default: - break; - } - } - - return NULL; -} - - -int -calculate_iterations(ir_rvalue *from, ir_rvalue *to, ir_rvalue *increment, - enum ir_expression_operation op) -{ - if (from == NULL || to == NULL || increment == NULL) - return -1; - - void *mem_ctx = ralloc_context(NULL); - - ir_expression *const sub = - new(mem_ctx) ir_expression(ir_binop_sub, from->type, to, from); - - ir_expression *const div = - new(mem_ctx) ir_expression(ir_binop_div, sub->type, sub, increment); - - ir_constant *iter = div->constant_expression_value(); - - if (iter == NULL) - return -1; - - if (!iter->type->is_integer()) { - ir_rvalue *cast = - new(mem_ctx) ir_expression(ir_unop_f2i, glsl_type::int_type, iter, - NULL); - - iter = cast->constant_expression_value(); - } - - int iter_value = iter->get_int_component(0); - - /* Make sure that the calculated number of iterations satisfies the exit - * condition. This is needed to catch off-by-one errors and some types of - * ill-formed loops. For example, we need to detect that the following - * loop does not have a maximum iteration count. - * - * for (float x = 0.0; x != 0.9; x += 0.2) - * ; - */ - const int bias[] = { -1, 0, 1 }; - bool valid_loop = false; - - for (unsigned i = 0; i < Elements(bias); i++) { - /* Increment may be of type int, uint or float. */ - switch (increment->type->base_type) { - case GLSL_TYPE_INT: - iter = new(mem_ctx) ir_constant(iter_value + bias[i]); - break; - case GLSL_TYPE_UINT: - iter = new(mem_ctx) ir_constant(unsigned(iter_value + bias[i])); - break; - case GLSL_TYPE_FLOAT: - iter = new(mem_ctx) ir_constant(float(iter_value + bias[i])); - break; - default: - unreachable(!"Unsupported type for loop iterator."); - } - - ir_expression *const mul = - new(mem_ctx) ir_expression(ir_binop_mul, increment->type, iter, - increment); - - ir_expression *const add = - new(mem_ctx) ir_expression(ir_binop_add, mul->type, mul, from); - - ir_expression *const cmp = - new(mem_ctx) ir_expression(op, glsl_type::bool_type, add, to); - - ir_constant *const cmp_result = cmp->constant_expression_value(); - - assert(cmp_result != NULL); - if (cmp_result->get_bool_component(0)) { - iter_value += bias[i]; - valid_loop = true; - break; - } - } - - ralloc_free(mem_ctx); - return (valid_loop) ? iter_value : -1; -} - -namespace { - -class loop_control_visitor : public ir_hierarchical_visitor { -public: - loop_control_visitor(loop_state *state) - { - this->state = state; - this->progress = false; - } - - virtual ir_visitor_status visit_leave(ir_loop *ir); - - loop_state *state; - - bool progress; -}; - -} /* anonymous namespace */ - -ir_visitor_status -loop_control_visitor::visit_leave(ir_loop *ir) -{ - loop_variable_state *const ls = this->state->get(ir); - - /* If we've entered a loop that hasn't been analyzed, something really, - * really bad has happened. - */ - if (ls == NULL) { - assert(ls != NULL); - return visit_continue; - } - - if (ls->limiting_terminator != NULL) { - /* If the limiting terminator has an iteration count of zero, then we've - * proven that the loop cannot run, so delete it. - */ - int iterations = ls->limiting_terminator->iterations; - if (iterations == 0) { - ir->remove(); - this->progress = true; - return visit_continue; - } - } - - /* Remove the conditional break statements associated with all terminators - * that are associated with a fixed iteration count, except for the one - * associated with the limiting terminator--that one needs to stay, since - * it terminates the loop. Exception: if the loop still has a normative - * bound, then that terminates the loop, so we don't even need the limiting - * terminator. - */ - foreach_in_list(loop_terminator, t, &ls->terminators) { - if (t->iterations < 0) - continue; - - if (t != ls->limiting_terminator) { - t->ir->remove(); - - assert(ls->num_loop_jumps > 0); - ls->num_loop_jumps--; - - this->progress = true; - } - } - - return visit_continue; -} - - -bool -set_loop_controls(exec_list *instructions, loop_state *ls) -{ - loop_control_visitor v(ls); - - v.run(instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/loop_unroll.cpp b/3rdparty/glsl-optimizer/src/glsl/loop_unroll.cpp deleted file mode 100644 index 526c4d7a9..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/loop_unroll.cpp +++ /dev/null @@ -1,408 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "glsl_types.h" -#include "loop_analysis.h" -#include "ir_hierarchical_visitor.h" - -#include "main/mtypes.h" - -namespace { - -class loop_unroll_visitor : public ir_hierarchical_visitor { -public: - loop_unroll_visitor(loop_state *state, - const struct gl_shader_compiler_options *options) - { - this->state = state; - this->progress = false; - this->options = options; - } - - virtual ir_visitor_status visit_leave(ir_loop *ir); - void simple_unroll(ir_loop *ir, int iterations); - void complex_unroll(ir_loop *ir, int iterations, - bool continue_from_then_branch); - void splice_post_if_instructions(ir_if *ir_if, exec_list *splice_dest); - - loop_state *state; - - bool progress; - const struct gl_shader_compiler_options *options; -}; - -} /* anonymous namespace */ - -static bool -is_break(ir_instruction *ir) -{ - return ir != NULL && ir->ir_type == ir_type_loop_jump - && ((ir_loop_jump *) ir)->is_break(); -} - -class loop_unroll_count : public ir_hierarchical_visitor { -public: - int nodes; - bool unsupported_variable_indexing; - /* If there are nested loops, the node count will be inaccurate. */ - bool nested_loop; - - loop_unroll_count(exec_list *list, loop_variable_state *ls, - const struct gl_shader_compiler_options *options) - : ls(ls), options(options) - { - nodes = 0; - nested_loop = false; - unsupported_variable_indexing = false; - - run(list); - } - - virtual ir_visitor_status visit_enter(ir_assignment *) - { - nodes++; - return visit_continue; - } - - virtual ir_visitor_status visit_enter(ir_expression *) - { - nodes++; - return visit_continue; - } - - virtual ir_visitor_status visit_enter(ir_loop *) - { - nested_loop = true; - return visit_continue; - } - - virtual ir_visitor_status visit_enter(ir_dereference_array *ir) - { - /* Check for arrays variably-indexed by a loop induction variable. - * Unrolling the loop may convert that access into constant-indexing. - * - * Many drivers don't support particular kinds of variable indexing, - * and have to resort to using lower_variable_index_to_cond_assign to - * handle it. This results in huge amounts of horrible code, so we'd - * like to avoid that if possible. Here, we just note that it will - * happen. - */ - if ((ir->array->type->is_array() || ir->array->type->is_matrix()) && - !ir->array_index->as_constant()) { - ir_variable *array = ir->array->variable_referenced(); - loop_variable *lv = ls->get(ir->array_index->variable_referenced()); - if (array && lv && lv->is_induction_var()) { - switch (array->data.mode) { - case ir_var_auto: - case ir_var_temporary: - case ir_var_const_in: - case ir_var_function_in: - case ir_var_function_out: - case ir_var_function_inout: - if (options->EmitNoIndirectTemp) - unsupported_variable_indexing = true; - break; - case ir_var_uniform: - if (options->EmitNoIndirectUniform) - unsupported_variable_indexing = true; - break; - case ir_var_shader_in: - if (options->EmitNoIndirectInput) - unsupported_variable_indexing = true; - break; - case ir_var_shader_out: - if (options->EmitNoIndirectOutput) - unsupported_variable_indexing = true; - break; - } - } - } - return visit_continue; - } - -private: - loop_variable_state *ls; - const struct gl_shader_compiler_options *options; -}; - - -/** - * Unroll a loop which does not contain any jumps. For example, if the input - * is: - * - * (loop (...) ...instrs...) - * - * And the iteration count is 3, the output will be: - * - * ...instrs... ...instrs... ...instrs... - */ -void -loop_unroll_visitor::simple_unroll(ir_loop *ir, int iterations) -{ - void *const mem_ctx = ralloc_parent(ir); - - for (int i = 0; i < iterations; i++) { - exec_list copy_list; - - copy_list.make_empty(); - clone_ir_list(mem_ctx, ©_list, &ir->body_instructions); - - ir->insert_before(©_list); - } - - /* The loop has been replaced by the unrolled copies. Remove the original - * loop from the IR sequence. - */ - ir->remove(); - - this->progress = true; -} - - -/** - * Unroll a loop whose last statement is an ir_if. If \c - * continue_from_then_branch is true, the loop is repeated only when the - * "then" branch of the if is taken; otherwise it is repeated only when the - * "else" branch of the if is taken. - * - * For example, if the input is: - * - * (loop (...) - * ...body... - * (if (cond) - * (...then_instrs...) - * (...else_instrs...))) - * - * And the iteration count is 3, and \c continue_from_then_branch is true, - * then the output will be: - * - * ...body... - * (if (cond) - * (...then_instrs... - * ...body... - * (if (cond) - * (...then_instrs... - * ...body... - * (if (cond) - * (...then_instrs...) - * (...else_instrs...))) - * (...else_instrs...))) - * (...else_instrs)) - */ -void -loop_unroll_visitor::complex_unroll(ir_loop *ir, int iterations, - bool continue_from_then_branch) -{ - void *const mem_ctx = ralloc_parent(ir); - ir_instruction *ir_to_replace = ir; - - for (int i = 0; i < iterations; i++) { - exec_list copy_list; - - copy_list.make_empty(); - clone_ir_list(mem_ctx, ©_list, &ir->body_instructions); - - ir_if *ir_if = ((ir_instruction *) copy_list.get_tail())->as_if(); - assert(ir_if != NULL); - - ir_to_replace->insert_before(©_list); - ir_to_replace->remove(); - - /* placeholder that will be removed in the next iteration */ - ir_to_replace = - new(mem_ctx) ir_loop_jump(ir_loop_jump::jump_continue); - - exec_list *const list = (continue_from_then_branch) - ? &ir_if->then_instructions : &ir_if->else_instructions; - - list->push_tail(ir_to_replace); - } - - ir_to_replace->remove(); - - this->progress = true; -} - - -/** - * Move all of the instructions which follow \c ir_if to the end of - * \c splice_dest. - * - * For example, in the code snippet: - * - * (if (cond) - * (...then_instructions... - * break) - * (...else_instructions...)) - * ...post_if_instructions... - * - * If \c ir_if points to the "if" instruction, and \c splice_dest points to - * (...else_instructions...), the code snippet is transformed into: - * - * (if (cond) - * (...then_instructions... - * break) - * (...else_instructions... - * ...post_if_instructions...)) - */ -void -loop_unroll_visitor::splice_post_if_instructions(ir_if *ir_if, - exec_list *splice_dest) -{ - while (!ir_if->get_next()->is_tail_sentinel()) { - ir_instruction *move_ir = (ir_instruction *) ir_if->get_next(); - - move_ir->remove(); - splice_dest->push_tail(move_ir); - } -} - - -ir_visitor_status -loop_unroll_visitor::visit_leave(ir_loop *ir) -{ - loop_variable_state *const ls = this->state->get(ir); - int iterations; - - /* If we've entered a loop that hasn't been analyzed, something really, - * really bad has happened. - */ - if (ls == NULL) { - assert(ls != NULL); - return visit_continue; - } - - /* Don't try to unroll loops where the number of iterations is not known - * at compile-time. - */ - if (ls->limiting_terminator == NULL) - return visit_continue; - - iterations = ls->limiting_terminator->iterations; - - const int max_iterations = options->MaxUnrollIterations; - - /* Don't try to unroll loops that have zillions of iterations either. - */ - if (iterations > max_iterations) - return visit_continue; - - /* Don't try to unroll nested loops and loops with a huge body. - */ - loop_unroll_count count(&ir->body_instructions, ls, options); - - bool loop_too_large = - count.nested_loop || count.nodes * iterations > (int)max_iterations * 25; - - if (loop_too_large && !count.unsupported_variable_indexing) - return visit_continue; - - /* Note: the limiting terminator contributes 1 to ls->num_loop_jumps. - * We'll be removing the limiting terminator before we unroll. - */ - assert(ls->num_loop_jumps > 0); - unsigned predicted_num_loop_jumps = ls->num_loop_jumps - 1; - - if (predicted_num_loop_jumps > 1) - return visit_continue; - - if (predicted_num_loop_jumps == 0) { - ls->limiting_terminator->ir->remove(); - simple_unroll(ir, iterations); - return visit_continue; - } - - ir_instruction *last_ir = (ir_instruction *) ir->body_instructions.get_tail(); - assert(last_ir != NULL); - - if (is_break(last_ir)) { - /* If the only loop-jump is a break at the end of the loop, the loop - * will execute exactly once. Remove the break and use the simple - * unroller with an iteration count of 1. - */ - last_ir->remove(); - - ls->limiting_terminator->ir->remove(); - simple_unroll(ir, 1); - return visit_continue; - } - - /* recognize loops in the form produced by ir_lower_jumps */ - foreach_in_list(ir_instruction, cur_ir, &ir->body_instructions) { - /* Skip the limiting terminator, since it will go away when we - * unroll. - */ - if (cur_ir == ls->limiting_terminator->ir) - continue; - - ir_if *ir_if = cur_ir->as_if(); - if (ir_if != NULL) { - /* Determine which if-statement branch, if any, ends with a - * break. The branch that did *not* have the break will get a - * temporary continue inserted in each iteration of the loop - * unroll. - * - * Note that since ls->num_loop_jumps is <= 1, it is impossible - * for both branches to end with a break. - */ - ir_instruction *ir_if_last = - (ir_instruction *) ir_if->then_instructions.get_tail(); - - if (is_break(ir_if_last)) { - ls->limiting_terminator->ir->remove(); - splice_post_if_instructions(ir_if, &ir_if->else_instructions); - ir_if_last->remove(); - complex_unroll(ir, iterations, false); - return visit_continue; - } else { - ir_if_last = - (ir_instruction *) ir_if->else_instructions.get_tail(); - - if (is_break(ir_if_last)) { - ls->limiting_terminator->ir->remove(); - splice_post_if_instructions(ir_if, &ir_if->then_instructions); - ir_if_last->remove(); - complex_unroll(ir, iterations, true); - return visit_continue; - } - } - } - } - - /* Did not find the break statement. It must be in a complex if-nesting, - * so don't try to unroll. - */ - return visit_continue; -} - - -bool -unroll_loops(exec_list *instructions, loop_state *ls, - const struct gl_shader_compiler_options *options) -{ - loop_unroll_visitor v(ls, options); - - v.run(instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_clip_distance.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_clip_distance.cpp deleted file mode 100644 index fdb131296..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_clip_distance.cpp +++ /dev/null @@ -1,549 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file lower_clip_distance.cpp - * - * This pass accounts for the difference between the way - * gl_ClipDistance is declared in standard GLSL (as an array of - * floats), and the way it is frequently implemented in hardware (as - * a pair of vec4s, with four clip distances packed into each). - * - * The declaration of gl_ClipDistance is replaced with a declaration - * of gl_ClipDistanceMESA, and any references to gl_ClipDistance are - * translated to refer to gl_ClipDistanceMESA with the appropriate - * swizzling of array indices. For instance: - * - * gl_ClipDistance[i] - * - * is translated into: - * - * gl_ClipDistanceMESA[i>>2][i&3] - * - * Since some hardware may not internally represent gl_ClipDistance as a pair - * of vec4's, this lowering pass is optional. To enable it, set the - * LowerClipDistance flag in gl_shader_compiler_options to true. - */ - -#include "glsl_symbol_table.h" -#include "ir_rvalue_visitor.h" -#include "ir.h" -#include "program/prog_instruction.h" /* For WRITEMASK_* */ - -namespace { - -class lower_clip_distance_visitor : public ir_rvalue_visitor { -public: - explicit lower_clip_distance_visitor(gl_shader_stage shader_stage) - : progress(false), old_clip_distance_1d_var(NULL), - old_clip_distance_2d_var(NULL), new_clip_distance_1d_var(NULL), - new_clip_distance_2d_var(NULL), shader_stage(shader_stage) - { - } - - virtual ir_visitor_status visit(ir_variable *); - void create_indices(ir_rvalue*, ir_rvalue *&, ir_rvalue *&); - bool is_clip_distance_vec8(ir_rvalue *ir); - ir_rvalue *lower_clip_distance_vec8(ir_rvalue *ir); - virtual ir_visitor_status visit_leave(ir_assignment *); - void visit_new_assignment(ir_assignment *ir); - virtual ir_visitor_status visit_leave(ir_call *); - - virtual void handle_rvalue(ir_rvalue **rvalue); - - void fix_lhs(ir_assignment *); - - bool progress; - - /** - * Pointer to the declaration of gl_ClipDistance, if found. - * - * Note: - * - * - the 2d_var is for geometry shader input only. - * - * - since gl_ClipDistance is available in geometry shaders as both an - * input and an output, it's possible for both old_clip_distance_1d_var - * and old_clip_distance_2d_var to be non-null. - */ - ir_variable *old_clip_distance_1d_var; - ir_variable *old_clip_distance_2d_var; - - /** - * Pointer to the newly-created gl_ClipDistanceMESA variable. - */ - ir_variable *new_clip_distance_1d_var; - ir_variable *new_clip_distance_2d_var; - - /** - * Type of shader we are compiling (e.g. MESA_SHADER_VERTEX) - */ - const gl_shader_stage shader_stage; -}; - -} /* anonymous namespace */ - -/** - * Replace any declaration of gl_ClipDistance as an array of floats with a - * declaration of gl_ClipDistanceMESA as an array of vec4's. - */ -ir_visitor_status -lower_clip_distance_visitor::visit(ir_variable *ir) -{ - if (!ir->name || strcmp(ir->name, "gl_ClipDistance") != 0) - return visit_continue; - assert (ir->type->is_array()); - - if (!ir->type->element_type()->is_array()) { - /* 1D gl_ClipDistance (used for vertex and geometry output, and fragment - * input). - */ - if (this->old_clip_distance_1d_var) - return visit_continue; - - this->progress = true; - this->old_clip_distance_1d_var = ir; - assert (ir->type->element_type() == glsl_type::float_type); - unsigned new_size = (ir->type->array_size() + 3) / 4; - - /* Clone the old var so that we inherit all of its properties */ - this->new_clip_distance_1d_var = ir->clone(ralloc_parent(ir), NULL); - - /* And change the properties that we need to change */ - this->new_clip_distance_1d_var->name - = ralloc_strdup(this->new_clip_distance_1d_var, - "gl_ClipDistanceMESA"); - this->new_clip_distance_1d_var->type - = glsl_type::get_array_instance(glsl_type::vec4_type, new_size); - this->new_clip_distance_1d_var->data.max_array_access - = ir->data.max_array_access / 4; - - ir->replace_with(this->new_clip_distance_1d_var); - } else { - /* 2D gl_ClipDistance (used for geometry input). */ - assert(ir->data.mode == ir_var_shader_in && - this->shader_stage == MESA_SHADER_GEOMETRY); - if (this->old_clip_distance_2d_var) - return visit_continue; - - this->progress = true; - this->old_clip_distance_2d_var = ir; - assert (ir->type->element_type()->element_type() == glsl_type::float_type); - unsigned new_size = (ir->type->element_type()->array_size() + 3) / 4; - - /* Clone the old var so that we inherit all of its properties */ - this->new_clip_distance_2d_var = ir->clone(ralloc_parent(ir), NULL); - - /* And change the properties that we need to change */ - this->new_clip_distance_2d_var->name - = ralloc_strdup(this->new_clip_distance_2d_var, "gl_ClipDistanceMESA"); - this->new_clip_distance_2d_var->type = glsl_type::get_array_instance( - glsl_type::get_array_instance(glsl_type::vec4_type, - new_size), - ir->type->array_size()); - this->new_clip_distance_2d_var->data.max_array_access - = ir->data.max_array_access / 4; - - ir->replace_with(this->new_clip_distance_2d_var); - } - return visit_continue; -} - - -/** - * Create the necessary GLSL rvalues to index into gl_ClipDistanceMESA based - * on the rvalue previously used to index into gl_ClipDistance. - * - * \param array_index Selects one of the vec4's in gl_ClipDistanceMESA - * \param swizzle_index Selects a component within the vec4 selected by - * array_index. - */ -void -lower_clip_distance_visitor::create_indices(ir_rvalue *old_index, - ir_rvalue *&array_index, - ir_rvalue *&swizzle_index) -{ - void *ctx = ralloc_parent(old_index); - - /* Make sure old_index is a signed int so that the bitwise "shift" and - * "and" operations below type check properly. - */ - if (old_index->type != glsl_type::int_type) { - assert (old_index->type == glsl_type::uint_type); - old_index = new(ctx) ir_expression(ir_unop_u2i, old_index); - } - - ir_constant *old_index_constant = old_index->constant_expression_value(); - if (old_index_constant) { - /* gl_ClipDistance is being accessed via a constant index. Don't bother - * creating expressions to calculate the lowered indices. Just create - * constants. - */ - int const_val = old_index_constant->get_int_component(0); - array_index = new(ctx) ir_constant(const_val / 4); - swizzle_index = new(ctx) ir_constant(const_val % 4); - } else { - /* Create a variable to hold the value of old_index (so that we - * don't compute it twice). - */ - ir_variable *old_index_var = new(ctx) ir_variable( - glsl_type::int_type, "clip_distance_index", ir_var_temporary, glsl_precision_undefined); - this->base_ir->insert_before(old_index_var); - this->base_ir->insert_before(new(ctx) ir_assignment( - new(ctx) ir_dereference_variable(old_index_var), old_index)); - - /* Create the expression clip_distance_index / 4. Do this as a bit - * shift because that's likely to be more efficient. - */ - array_index = new(ctx) ir_expression( - ir_binop_rshift, new(ctx) ir_dereference_variable(old_index_var), - new(ctx) ir_constant(2)); - - /* Create the expression clip_distance_index % 4. Do this as a bitwise - * AND because that's likely to be more efficient. - */ - swizzle_index = new(ctx) ir_expression( - ir_binop_bit_and, new(ctx) ir_dereference_variable(old_index_var), - new(ctx) ir_constant(3)); - } -} - - -/** - * Determine whether the given rvalue describes an array of 8 floats that - * needs to be lowered to an array of 2 vec4's; that is, determine whether it - * matches one of the following patterns: - * - * - gl_ClipDistance (if gl_ClipDistance is 1D) - * - gl_ClipDistance[i] (if gl_ClipDistance is 2D) - */ -bool -lower_clip_distance_visitor::is_clip_distance_vec8(ir_rvalue *ir) -{ - /* Note that geometry shaders contain gl_ClipDistance both as an input - * (which is a 2D array) and an output (which is a 1D array), so it's - * possible for both this->old_clip_distance_1d_var and - * this->old_clip_distance_2d_var to be non-NULL in the same shader. - */ - - if (this->old_clip_distance_1d_var) { - ir_dereference_variable *var_ref = ir->as_dereference_variable(); - if (var_ref && var_ref->var == this->old_clip_distance_1d_var) - return true; - } - if (this->old_clip_distance_2d_var) { - /* 2D clip distance is only possible as a geometry input */ - assert(this->shader_stage == MESA_SHADER_GEOMETRY); - - ir_dereference_array *array_ref = ir->as_dereference_array(); - if (array_ref) { - ir_dereference_variable *var_ref = - array_ref->array->as_dereference_variable(); - if (var_ref && var_ref->var == this->old_clip_distance_2d_var) - return true; - } - } - return false; -} - - -/** - * If the given ir satisfies is_clip_distance_vec8(), return new ir - * representing its lowered equivalent. That is, map: - * - * - gl_ClipDistance => gl_ClipDistanceMESA (if gl_ClipDistance is 1D) - * - gl_ClipDistance[i] => gl_ClipDistanceMESA[i] (if gl_ClipDistance is 2D) - * - * Otherwise return NULL. - */ -ir_rvalue * -lower_clip_distance_visitor::lower_clip_distance_vec8(ir_rvalue *ir) -{ - if (this->old_clip_distance_1d_var) { - ir_dereference_variable *var_ref = ir->as_dereference_variable(); - if (var_ref && var_ref->var == this->old_clip_distance_1d_var) { - return new(ralloc_parent(ir)) - ir_dereference_variable(this->new_clip_distance_1d_var); - } - } - if (this->old_clip_distance_2d_var) { - /* 2D clip distance is only possible as a geometry input */ - assert(this->shader_stage == MESA_SHADER_GEOMETRY); - - ir_dereference_array *array_ref = ir->as_dereference_array(); - if (array_ref) { - ir_dereference_variable *var_ref = - array_ref->array->as_dereference_variable(); - if (var_ref && var_ref->var == this->old_clip_distance_2d_var) { - return new(ralloc_parent(ir)) - ir_dereference_array(this->new_clip_distance_2d_var, - array_ref->array_index); - } - } - } - return NULL; -} - - -void -lower_clip_distance_visitor::handle_rvalue(ir_rvalue **rv) -{ - if (*rv == NULL) - return; - - ir_dereference_array *const array_deref = (*rv)->as_dereference_array(); - if (array_deref == NULL) - return; - - /* Replace any expression that indexes one of the floats in gl_ClipDistance - * with an expression that indexes into one of the vec4's in - * gl_ClipDistanceMESA and accesses the appropriate component. - */ - ir_rvalue *lowered_vec8 = - this->lower_clip_distance_vec8(array_deref->array); - if (lowered_vec8 != NULL) { - this->progress = true; - ir_rvalue *array_index; - ir_rvalue *swizzle_index; - this->create_indices(array_deref->array_index, array_index, swizzle_index); - void *mem_ctx = ralloc_parent(array_deref); - - ir_dereference_array *const new_array_deref = - new(mem_ctx) ir_dereference_array(lowered_vec8, array_index); - - ir_expression *const expr = - new(mem_ctx) ir_expression(ir_binop_vector_extract, - new_array_deref, - swizzle_index); - - *rv = expr; - } -} - -void -lower_clip_distance_visitor::fix_lhs(ir_assignment *ir) -{ - if (ir->lhs->ir_type == ir_type_expression) { - void *mem_ctx = ralloc_parent(ir); - ir_expression *const expr = (ir_expression *) ir->lhs; - - /* The expression must be of the form: - * - * (vector_extract gl_ClipDistanceMESA[i], j). - */ - assert(expr->operation == ir_binop_vector_extract); - assert(expr->operands[0]->ir_type == ir_type_dereference_array); - assert(expr->operands[0]->type == glsl_type::vec4_type); - - ir_dereference *const new_lhs = (ir_dereference *) expr->operands[0]; - ir->rhs = new(mem_ctx) ir_expression(ir_triop_vector_insert, - glsl_type::vec4_type, - new_lhs->clone(mem_ctx, NULL), - ir->rhs, - expr->operands[1]); - ir->set_lhs(new_lhs); - ir->write_mask = WRITEMASK_XYZW; - } -} - -/** - * Replace any assignment having the 1D gl_ClipDistance (undereferenced) as - * its LHS or RHS with a sequence of assignments, one for each component of - * the array. Each of these assignments is lowered to refer to - * gl_ClipDistanceMESA as appropriate. - * - * We need to do a similar replacement for 2D gl_ClipDistance, however since - * it's an input, the only case we need to address is where a 1D slice of it - * is the entire RHS of an assignment, e.g.: - * - * foo = gl_in[i].gl_ClipDistance - */ -ir_visitor_status -lower_clip_distance_visitor::visit_leave(ir_assignment *ir) -{ - /* First invoke the base class visitor. This causes handle_rvalue() to be - * called on ir->rhs and ir->condition. - */ - ir_rvalue_visitor::visit_leave(ir); - - if (this->is_clip_distance_vec8(ir->lhs) || - this->is_clip_distance_vec8(ir->rhs)) { - /* LHS or RHS of the assignment is the entire 1D gl_ClipDistance array - * (or a 1D slice of a 2D gl_ClipDistance input array). Since we are - * reshaping gl_ClipDistance from an array of floats to an array of - * vec4's, this isn't going to work as a bulk assignment anymore, so - * unroll it to element-by-element assignments and lower each of them. - * - * Note: to unroll into element-by-element assignments, we need to make - * clones of the LHS and RHS. This is safe because expressions and - * l-values are side-effect free. - */ - void *ctx = ralloc_parent(ir); - int array_size = ir->lhs->type->array_size(); - for (int i = 0; i < array_size; ++i) { - ir_dereference_array *new_lhs = new(ctx) ir_dereference_array( - ir->lhs->clone(ctx, NULL), new(ctx) ir_constant(i)); - ir_dereference_array *new_rhs = new(ctx) ir_dereference_array( - ir->rhs->clone(ctx, NULL), new(ctx) ir_constant(i)); - this->handle_rvalue((ir_rvalue **) &new_rhs); - - /* Handle the LHS after creating the new assignment. This must - * happen in this order because handle_rvalue may replace the old LHS - * with an ir_expression of ir_binop_vector_extract. Since this is - * not a valide l-value, this will cause an assertion in the - * ir_assignment constructor to fail. - * - * If this occurs, replace the mangled LHS with a dereference of the - * vector, and replace the RHS with an ir_triop_vector_insert. - */ - ir_assignment *const assign = new(ctx) ir_assignment(new_lhs, new_rhs); - this->handle_rvalue((ir_rvalue **) &assign->lhs); - this->fix_lhs(assign); - - this->base_ir->insert_before(assign); - } - ir->remove(); - - return visit_continue; - } - - /* Handle the LHS as if it were an r-value. Normally - * rvalue_visit(ir_assignment *) only visits the RHS, but we need to lower - * expressions in the LHS as well. - * - * This may cause the LHS to get replaced with an ir_expression of - * ir_binop_vector_extract. If this occurs, replace it with a dereference - * of the vector, and replace the RHS with an ir_triop_vector_insert. - */ - handle_rvalue((ir_rvalue **)&ir->lhs); - this->fix_lhs(ir); - - return rvalue_visit(ir); -} - - -/** - * Set up base_ir properly and call visit_leave() on a newly created - * ir_assignment node. This is used in cases where we have to insert an - * ir_assignment in a place where we know the hierarchical visitor won't see - * it. - */ -void -lower_clip_distance_visitor::visit_new_assignment(ir_assignment *ir) -{ - ir_instruction *old_base_ir = this->base_ir; - this->base_ir = ir; - ir->accept(this); - this->base_ir = old_base_ir; -} - - -/** - * If a 1D gl_ClipDistance variable appears as an argument in an ir_call - * expression, replace it with a temporary variable, and make sure the ir_call - * is preceded and/or followed by assignments that copy the contents of the - * temporary variable to and/or from gl_ClipDistance. Each of these - * assignments is then lowered to refer to gl_ClipDistanceMESA. - * - * We need to do a similar replacement for 2D gl_ClipDistance, however since - * it's an input, the only case we need to address is where a 1D slice of it - * is passed as an "in" parameter to an ir_call, e.g.: - * - * foo(gl_in[i].gl_ClipDistance) - */ -ir_visitor_status -lower_clip_distance_visitor::visit_leave(ir_call *ir) -{ - void *ctx = ralloc_parent(ir); - - const exec_node *formal_param_node = ir->callee->parameters.head; - const exec_node *actual_param_node = ir->actual_parameters.head; - while (!actual_param_node->is_tail_sentinel()) { - ir_variable *formal_param = (ir_variable *) formal_param_node; - ir_rvalue *actual_param = (ir_rvalue *) actual_param_node; - - /* Advance formal_param_node and actual_param_node now so that we can - * safely replace actual_param with another node, if necessary, below. - */ - formal_param_node = formal_param_node->next; - actual_param_node = actual_param_node->next; - - if (this->is_clip_distance_vec8(actual_param)) { - /* User is trying to pass the whole 1D gl_ClipDistance array (or a 1D - * slice of a 2D gl_ClipDistance array) to a function call. Since we - * are reshaping gl_ClipDistance from an array of floats to an array - * of vec4's, this isn't going to work anymore, so use a temporary - * array instead. - */ - ir_variable *temp_clip_distance = new(ctx) ir_variable( - actual_param->type, "temp_clip_distance", ir_var_temporary, actual_param->get_precision()); - this->base_ir->insert_before(temp_clip_distance); - actual_param->replace_with( - new(ctx) ir_dereference_variable(temp_clip_distance)); - if (formal_param->data.mode == ir_var_function_in - || formal_param->data.mode == ir_var_function_inout) { - /* Copy from gl_ClipDistance to the temporary before the call. - * Since we are going to insert this copy before the current - * instruction, we need to visit it afterwards to make sure it - * gets lowered. - */ - ir_assignment *new_assignment = new(ctx) ir_assignment( - new(ctx) ir_dereference_variable(temp_clip_distance), - actual_param->clone(ctx, NULL)); - this->base_ir->insert_before(new_assignment); - this->visit_new_assignment(new_assignment); - } - if (formal_param->data.mode == ir_var_function_out - || formal_param->data.mode == ir_var_function_inout) { - /* Copy from the temporary to gl_ClipDistance after the call. - * Since visit_list_elements() has already decided which - * instruction it's going to visit next, we need to visit - * afterwards to make sure it gets lowered. - */ - ir_assignment *new_assignment = new(ctx) ir_assignment( - actual_param->clone(ctx, NULL), - new(ctx) ir_dereference_variable(temp_clip_distance)); - this->base_ir->insert_after(new_assignment); - this->visit_new_assignment(new_assignment); - } - } - } - - return rvalue_visit(ir); -} - - -bool -lower_clip_distance(gl_shader *shader) -{ - lower_clip_distance_visitor v(shader->Stage); - - visit_list_elements(&v, shader->ir); - - if (v.new_clip_distance_1d_var) - shader->symbols->add_variable(v.new_clip_distance_1d_var); - if (v.new_clip_distance_2d_var) - shader->symbols->add_variable(v.new_clip_distance_2d_var); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_discard.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_discard.cpp deleted file mode 100644 index fa08931c6..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_discard.cpp +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file lower_discard.cpp - * - * This pass moves discards out of if-statements. - * - * Case 1: The "then" branch contains a conditional discard: - * --------------------------------------------------------- - * - * if (cond1) { - * s1; - * discard cond2; - * s2; - * } else { - * s3; - * } - * - * becomes: - * - * temp = false; - * if (cond1) { - * s1; - * temp = cond2; - * s2; - * } else { - * s3; - * } - * discard temp; - * - * Case 2: The "else" branch contains a conditional discard: - * --------------------------------------------------------- - * - * if (cond1) { - * s1; - * } else { - * s2; - * discard cond2; - * s3; - * } - * - * becomes: - * - * temp = false; - * if (cond1) { - * s1; - * } else { - * s2; - * temp = cond2; - * s3; - * } - * discard temp; - * - * Case 3: Both branches contain a conditional discard: - * ---------------------------------------------------- - * - * if (cond1) { - * s1; - * discard cond2; - * s2; - * } else { - * s3; - * discard cond3; - * s4; - * } - * - * becomes: - * - * temp = false; - * if (cond1) { - * s1; - * temp = cond2; - * s2; - * } else { - * s3; - * temp = cond3; - * s4; - * } - * discard temp; - * - * If there are multiple conditional discards, we need only deal with one of - * them. Repeatedly applying this pass will take care of the others. - * - * Unconditional discards are treated as having a condition of "true". - */ - -#include "glsl_types.h" -#include "ir.h" - -namespace { - -class lower_discard_visitor : public ir_hierarchical_visitor { -public: - lower_discard_visitor() - { - this->progress = false; - } - - ir_visitor_status visit_leave(ir_if *); - - bool progress; -}; - -} /* anonymous namespace */ - -bool -lower_discard(exec_list *instructions) -{ - lower_discard_visitor v; - - visit_list_elements(&v, instructions); - - return v.progress; -} - - -static ir_discard * -find_discard(exec_list &instructions) -{ - foreach_in_list(ir_instruction, node, &instructions) { - ir_discard *ir = node->as_discard(); - if (ir != NULL) - return ir; - } - return NULL; -} - - -static void -replace_discard(void *mem_ctx, ir_variable *var, ir_discard *ir) -{ - ir_rvalue *condition = ir->condition; - - /* For unconditional discards, use "true" as the condition. */ - if (condition == NULL) - condition = new(mem_ctx) ir_constant(true); - - ir_assignment *assignment = - new(mem_ctx) ir_assignment(new(mem_ctx) ir_dereference_variable(var), - condition, NULL); - - ir->replace_with(assignment); -} - - -ir_visitor_status -lower_discard_visitor::visit_leave(ir_if *ir) -{ - ir_discard *then_discard = find_discard(ir->then_instructions); - ir_discard *else_discard = find_discard(ir->else_instructions); - - if (then_discard == NULL && else_discard == NULL) - return visit_continue; - - void *mem_ctx = ralloc_parent(ir); - - ir_variable *temp = new(mem_ctx) ir_variable(glsl_type::bool_type, - "discard_cond_temp", - ir_var_temporary, glsl_precision_low); - ir_assignment *temp_initializer = - new(mem_ctx) ir_assignment(new(mem_ctx) ir_dereference_variable(temp), - new(mem_ctx) ir_constant(false), NULL); - - ir->insert_before(temp); - ir->insert_before(temp_initializer); - - if (then_discard != NULL) - replace_discard(mem_ctx, temp, then_discard); - - if (else_discard != NULL) - replace_discard(mem_ctx, temp, else_discard); - - ir_discard *discard = then_discard != NULL ? then_discard : else_discard; - discard->condition = new(mem_ctx) ir_dereference_variable(temp); - ir->insert_after(discard); - - this->progress = true; - - return visit_continue; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_discard_flow.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_discard_flow.cpp deleted file mode 100644 index bee53d29c..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_discard_flow.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** @file lower_discard_flow.cpp - * - * Implements the GLSL 1.30 revision 9 rule for fragment shader - * discard handling: - * - * "Control flow exits the shader, and subsequent implicit or - * explicit derivatives are undefined when this control flow is - * non-uniform (meaning different fragments within the primitive - * take different control paths)." - * - * There seem to be two conflicting things here. "Control flow exits - * the shader" sounds like the discarded fragments should effectively - * jump to the end of the shader, but that breaks derivatives in the - * case of uniform control flow and causes rendering failure in the - * bushes in Unigine Tropics. - * - * The question, then, is whether the intent was "loops stop at the - * point that the only active channels left are discarded pixels" or - * "discarded pixels become inactive at the point that control flow - * returns to the top of a loop". This implements the second - * interpretation. - */ - -#include "glsl_types.h" -#include "ir.h" -#include "program/hash_table.h" - -namespace { - -class lower_discard_flow_visitor : public ir_hierarchical_visitor { -public: - lower_discard_flow_visitor(ir_variable *discarded) - : discarded(discarded) - { - mem_ctx = ralloc_parent(discarded); - } - - ~lower_discard_flow_visitor() - { - } - - ir_visitor_status visit_enter(ir_discard *ir); - ir_visitor_status visit_enter(ir_loop_jump *ir); - ir_visitor_status visit_enter(ir_loop *ir); - ir_visitor_status visit_enter(ir_function_signature *ir); - - ir_if *generate_discard_break(); - - ir_variable *discarded; - void *mem_ctx; -}; - -} /* anonymous namespace */ - -ir_visitor_status -lower_discard_flow_visitor::visit_enter(ir_loop_jump *ir) -{ - if (ir->mode != ir_loop_jump::jump_continue) - return visit_continue; - - ir->insert_before(generate_discard_break()); - - return visit_continue; -} - -ir_visitor_status -lower_discard_flow_visitor::visit_enter(ir_discard *ir) -{ - ir_dereference *lhs = new(mem_ctx) ir_dereference_variable(discarded); - ir_rvalue *rhs = new(mem_ctx) ir_constant(true); - ir_assignment *assign = new(mem_ctx) ir_assignment(lhs, rhs); - ir->insert_before(assign); - - return visit_continue; -} - -ir_visitor_status -lower_discard_flow_visitor::visit_enter(ir_loop *ir) -{ - ir->body_instructions.push_tail(generate_discard_break()); - - return visit_continue; -} - -ir_visitor_status -lower_discard_flow_visitor::visit_enter(ir_function_signature *ir) -{ - if (strcmp(ir->function_name(), "main") != 0) - return visit_continue; - - ir_dereference *lhs = new(mem_ctx) ir_dereference_variable(discarded); - ir_rvalue *rhs = new(mem_ctx) ir_constant(false); - ir_assignment *assign = new(mem_ctx) ir_assignment(lhs, rhs); - ir->body.push_head(assign); - - return visit_continue; -} - -ir_if * -lower_discard_flow_visitor::generate_discard_break() -{ - ir_rvalue *if_condition = new(mem_ctx) ir_dereference_variable(discarded); - ir_if *if_inst = new(mem_ctx) ir_if(if_condition); - - ir_instruction *br = new(mem_ctx) ir_loop_jump(ir_loop_jump::jump_break); - if_inst->then_instructions.push_tail(br); - - return if_inst; -} - -void -lower_discard_flow(exec_list *ir) -{ - void *mem_ctx = ir; - - ir_variable *var = new(mem_ctx) ir_variable(glsl_type::bool_type, - "discarded", - ir_var_temporary, glsl_precision_low); - - ir->push_head(var); - - lower_discard_flow_visitor v(var); - - visit_list_elements(&v, ir); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_if_to_cond_assign.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_if_to_cond_assign.cpp deleted file mode 100644 index c174dd01b..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_if_to_cond_assign.cpp +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file lower_if_to_cond_assign.cpp - * - * This attempts to flatten if-statements to conditional assignments for - * GPUs with limited or no flow control support. - * - * It can't handle other control flow being inside of its block, such - * as calls or loops. Hopefully loop unrolling and inlining will take - * care of those. - * - * Drivers for GPUs with no control flow support should simply call - * - * lower_if_to_cond_assign(instructions) - * - * to attempt to flatten all if-statements. - * - * Some GPUs (such as i965 prior to gen6) do support control flow, but have a - * maximum nesting depth N. Drivers for such hardware can call - * - * lower_if_to_cond_assign(instructions, N) - * - * to attempt to flatten any if-statements appearing at depth > N. - */ - -#include "glsl_types.h" -#include "ir.h" -#include "program/hash_table.h" - -namespace { - -class ir_if_to_cond_assign_visitor : public ir_hierarchical_visitor { -public: - ir_if_to_cond_assign_visitor(unsigned max_depth) - { - this->progress = false; - this->max_depth = max_depth; - this->depth = 0; - - this->condition_variables = hash_table_ctor(0, hash_table_pointer_hash, - hash_table_pointer_compare); - } - - ~ir_if_to_cond_assign_visitor() - { - hash_table_dtor(this->condition_variables); - } - - ir_visitor_status visit_enter(ir_if *); - ir_visitor_status visit_leave(ir_if *); - - bool progress; - unsigned max_depth; - unsigned depth; - - struct hash_table *condition_variables; -}; - -} /* anonymous namespace */ - -bool -lower_if_to_cond_assign(exec_list *instructions, unsigned max_depth) -{ - if (max_depth == UINT_MAX) - return false; - - ir_if_to_cond_assign_visitor v(max_depth); - - visit_list_elements(&v, instructions); - - return v.progress; -} - -void -check_control_flow(ir_instruction *ir, void *data) -{ - bool *found_control_flow = (bool *)data; - switch (ir->ir_type) { - case ir_type_call: - case ir_type_discard: - case ir_type_loop: - case ir_type_loop_jump: - case ir_type_return: - *found_control_flow = true; - break; - default: - break; - } -} - -void -move_block_to_cond_assign(void *mem_ctx, - ir_if *if_ir, ir_rvalue *cond_expr, - exec_list *instructions, - struct hash_table *ht) -{ - foreach_in_list_safe(ir_instruction, ir, instructions) { - if (ir->ir_type == ir_type_assignment) { - ir_assignment *assign = (ir_assignment *)ir; - - if (hash_table_find(ht, assign) == NULL) { - hash_table_insert(ht, assign, assign); - - /* If the LHS of the assignment is a condition variable that was - * previously added, insert an additional assignment of false to - * the variable. - */ - const bool assign_to_cv = - hash_table_find(ht, assign->lhs->variable_referenced()) != NULL; - - if (!assign->condition) { - if (assign_to_cv) { - assign->rhs = - new(mem_ctx) ir_expression(ir_binop_logic_and, - glsl_type::bool_type, - cond_expr->clone(mem_ctx, NULL), - assign->rhs); - } else { - assign->condition = cond_expr->clone(mem_ctx, NULL); - } - } else { - assign->condition = - new(mem_ctx) ir_expression(ir_binop_logic_and, - glsl_type::bool_type, - cond_expr->clone(mem_ctx, NULL), - assign->condition); - } - } - } - - /* Now, move from the if block to the block surrounding it. */ - ir->remove(); - if_ir->insert_before(ir); - } -} - -ir_visitor_status -ir_if_to_cond_assign_visitor::visit_enter(ir_if *ir) -{ - (void) ir; - this->depth++; - - return visit_continue; -} - -ir_visitor_status -ir_if_to_cond_assign_visitor::visit_leave(ir_if *ir) -{ - /* Only flatten when beyond the GPU's maximum supported nesting depth. */ - if (this->depth-- <= this->max_depth) - return visit_continue; - - bool found_control_flow = false; - ir_assignment *assign; - - /* Check that both blocks don't contain anything we can't support. */ - foreach_in_list(ir_instruction, then_ir, &ir->then_instructions) { - visit_tree(then_ir, check_control_flow, &found_control_flow); - } - foreach_in_list(ir_instruction, else_ir, &ir->else_instructions) { - visit_tree(else_ir, check_control_flow, &found_control_flow); - } - if (found_control_flow) - return visit_continue; - - void *mem_ctx = ralloc_parent(ir); - - /* Store the condition to a variable. Move all of the instructions from - * the then-clause of the if-statement. Use the condition variable as a - * condition for all assignments. - */ - ir_variable *const then_var = - new(mem_ctx) ir_variable(glsl_type::bool_type, - "if_to_cond_assign_then", - ir_var_temporary, glsl_precision_low); - ir->insert_before(then_var); - - ir_dereference_variable *then_cond = - new(mem_ctx) ir_dereference_variable(then_var); - - assign = new(mem_ctx) ir_assignment(then_cond, ir->condition); - ir->insert_before(assign); - - move_block_to_cond_assign(mem_ctx, ir, then_cond, - &ir->then_instructions, - this->condition_variables); - - /* Add the new condition variable to the hash table. This allows us to - * find this variable when lowering other (enclosing) if-statements. - */ - hash_table_insert(this->condition_variables, then_var, then_var); - - /* If there are instructions in the else-clause, store the inverse of the - * condition to a variable. Move all of the instructions from the - * else-clause if the if-statement. Use the (inverse) condition variable - * as a condition for all assignments. - */ - if (!ir->else_instructions.is_empty()) { - ir_variable *const else_var = - new(mem_ctx) ir_variable(glsl_type::bool_type, - "if_to_cond_assign_else", - ir_var_temporary, glsl_precision_low); - ir->insert_before(else_var); - - ir_dereference_variable *else_cond = - new(mem_ctx) ir_dereference_variable(else_var); - - ir_rvalue *inverse = - new(mem_ctx) ir_expression(ir_unop_logic_not, - then_cond->clone(mem_ctx, NULL)); - - assign = new(mem_ctx) ir_assignment(else_cond, inverse); - ir->insert_before(assign); - - move_block_to_cond_assign(mem_ctx, ir, else_cond, - &ir->else_instructions, - this->condition_variables); - - /* Add the new condition variable to the hash table. This allows us to - * find this variable when lowering other (enclosing) if-statements. - */ - hash_table_insert(this->condition_variables, else_var, else_var); - } - - ir->remove(); - - this->progress = true; - - return visit_continue; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_instructions.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_instructions.cpp deleted file mode 100644 index b3e436429..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_instructions.cpp +++ /dev/null @@ -1,578 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file lower_instructions.cpp - * - * Many GPUs lack native instructions for certain expression operations, and - * must replace them with some other expression tree. This pass lowers some - * of the most common cases, allowing the lowering code to be implemented once - * rather than in each driver backend. - * - * Currently supported transformations: - * - SUB_TO_ADD_NEG - * - DIV_TO_MUL_RCP - * - INT_DIV_TO_MUL_RCP - * - EXP_TO_EXP2 - * - POW_TO_EXP2 - * - LOG_TO_LOG2 - * - MOD_TO_FRACT - * - LDEXP_TO_ARITH - * - BITFIELD_INSERT_TO_BFM_BFI - * - CARRY_TO_ARITH - * - BORROW_TO_ARITH - * - SAT_TO_CLAMP - * - * SUB_TO_ADD_NEG: - * --------------- - * Breaks an ir_binop_sub expression down to add(op0, neg(op1)) - * - * This simplifies expression reassociation, and for many backends - * there is no subtract operation separate from adding the negation. - * For backends with native subtract operations, they will probably - * want to recognize add(op0, neg(op1)) or the other way around to - * produce a subtract anyway. - * - * DIV_TO_MUL_RCP and INT_DIV_TO_MUL_RCP: - * -------------------------------------- - * Breaks an ir_binop_div expression down to op0 * (rcp(op1)). - * - * Many GPUs don't have a divide instruction (945 and 965 included), - * but they do have an RCP instruction to compute an approximate - * reciprocal. By breaking the operation down, constant reciprocals - * can get constant folded. - * - * DIV_TO_MUL_RCP only lowers floating point division; INT_DIV_TO_MUL_RCP - * handles the integer case, converting to and from floating point so that - * RCP is possible. - * - * EXP_TO_EXP2 and LOG_TO_LOG2: - * ---------------------------- - * Many GPUs don't have a base e log or exponent instruction, but they - * do have base 2 versions, so this pass converts exp and log to exp2 - * and log2 operations. - * - * POW_TO_EXP2: - * ----------- - * Many older GPUs don't have an x**y instruction. For these GPUs, convert - * x**y to 2**(y * log2(x)). - * - * MOD_TO_FRACT: - * ------------- - * Breaks an ir_binop_mod expression down to (op1 * fract(op0 / op1)) - * - * Many GPUs don't have a MOD instruction (945 and 965 included), and - * if we have to break it down like this anyway, it gives an - * opportunity to do things like constant fold the (1.0 / op1) easily. - * - * LDEXP_TO_ARITH: - * ------------- - * Converts ir_binop_ldexp to arithmetic and bit operations. - * - * BITFIELD_INSERT_TO_BFM_BFI: - * --------------------------- - * Breaks ir_quadop_bitfield_insert into ir_binop_bfm (bitfield mask) and - * ir_triop_bfi (bitfield insert). - * - * Many GPUs implement the bitfieldInsert() built-in from ARB_gpu_shader_5 - * with a pair of instructions. - * - * CARRY_TO_ARITH: - * --------------- - * Converts ir_carry into (x + y) < x. - * - * BORROW_TO_ARITH: - * ---------------- - * Converts ir_borrow into (x < y). - * - * SAT_TO_CLAMP: - * ------------- - * Converts ir_unop_saturate into min(max(x, 0.0), 1.0) - * - */ - -#include "main/core.h" /* for M_LOG2E */ -#include "glsl_types.h" -#include "ir.h" -#include "ir_builder.h" -#include "ir_optimization.h" - -using namespace ir_builder; - -namespace { - -class lower_instructions_visitor : public ir_hierarchical_visitor { -public: - lower_instructions_visitor(unsigned lower) - : progress(false), lower(lower) { } - - ir_visitor_status visit_leave(ir_expression *); - - bool progress; - -private: - unsigned lower; /** Bitfield of which operations to lower */ - - void sub_to_add_neg(ir_expression *); - void div_to_mul_rcp(ir_expression *); - void int_div_to_mul_rcp(ir_expression *); - void mod_to_fract(ir_expression *); - void exp_to_exp2(ir_expression *); - void pow_to_exp2(ir_expression *); - void log_to_log2(ir_expression *); - void bitfield_insert_to_bfm_bfi(ir_expression *); - void ldexp_to_arith(ir_expression *); - void carry_to_arith(ir_expression *); - void borrow_to_arith(ir_expression *); - void sat_to_clamp(ir_expression *); -}; - -} /* anonymous namespace */ - -/** - * Determine if a particular type of lowering should occur - */ -#define lowering(x) (this->lower & x) - -bool -lower_instructions(exec_list *instructions, unsigned what_to_lower) -{ - lower_instructions_visitor v(what_to_lower); - - visit_list_elements(&v, instructions); - return v.progress; -} - -void -lower_instructions_visitor::sub_to_add_neg(ir_expression *ir) -{ - ir->operation = ir_binop_add; - ir->operands[1] = new(ir) ir_expression(ir_unop_neg, ir->operands[1]->type, - ir->operands[1], NULL); - this->progress = true; -} - -void -lower_instructions_visitor::div_to_mul_rcp(ir_expression *ir) -{ - assert(ir->operands[1]->type->is_float()); - - /* New expression for the 1.0 / op1 */ - ir_rvalue *expr; - expr = new(ir) ir_expression(ir_unop_rcp, - ir->operands[1]->type, - ir->operands[1]); - - /* op0 / op1 -> op0 * (1.0 / op1) */ - ir->operation = ir_binop_mul; - ir->operands[1] = expr; - - this->progress = true; -} - -void -lower_instructions_visitor::int_div_to_mul_rcp(ir_expression *ir) -{ - assert(ir->operands[1]->type->is_integer()); - - /* Be careful with integer division -- we need to do it as a - * float and re-truncate, since rcp(n > 1) of an integer would - * just be 0. - */ - ir_rvalue *op0, *op1; - const struct glsl_type *vec_type; - - vec_type = glsl_type::get_instance(GLSL_TYPE_FLOAT, - ir->operands[1]->type->vector_elements, - ir->operands[1]->type->matrix_columns); - - if (ir->operands[1]->type->base_type == GLSL_TYPE_INT) - op1 = new(ir) ir_expression(ir_unop_i2f, vec_type, ir->operands[1], NULL); - else - op1 = new(ir) ir_expression(ir_unop_u2f, vec_type, ir->operands[1], NULL); - - op1 = new(ir) ir_expression(ir_unop_rcp, op1->type, op1, NULL); - - vec_type = glsl_type::get_instance(GLSL_TYPE_FLOAT, - ir->operands[0]->type->vector_elements, - ir->operands[0]->type->matrix_columns); - - if (ir->operands[0]->type->base_type == GLSL_TYPE_INT) - op0 = new(ir) ir_expression(ir_unop_i2f, vec_type, ir->operands[0], NULL); - else - op0 = new(ir) ir_expression(ir_unop_u2f, vec_type, ir->operands[0], NULL); - - vec_type = glsl_type::get_instance(GLSL_TYPE_FLOAT, - ir->type->vector_elements, - ir->type->matrix_columns); - - op0 = new(ir) ir_expression(ir_binop_mul, vec_type, op0, op1); - - if (ir->operands[1]->type->base_type == GLSL_TYPE_INT) { - ir->operation = ir_unop_f2i; - ir->operands[0] = op0; - } else { - ir->operation = ir_unop_i2u; - ir->operands[0] = new(ir) ir_expression(ir_unop_f2i, op0); - } - ir->operands[1] = NULL; - - this->progress = true; -} - -void -lower_instructions_visitor::exp_to_exp2(ir_expression *ir) -{ - ir_constant *log2_e = new(ir) ir_constant(float(M_LOG2E)); - - ir->operation = ir_unop_exp2; - ir->operands[0] = new(ir) ir_expression(ir_binop_mul, ir->operands[0]->type, - ir->operands[0], log2_e); - this->progress = true; -} - -void -lower_instructions_visitor::pow_to_exp2(ir_expression *ir) -{ - ir_expression *const log2_x = - new(ir) ir_expression(ir_unop_log2, ir->operands[0]->type, - ir->operands[0]); - - ir->operation = ir_unop_exp2; - ir->operands[0] = new(ir) ir_expression(ir_binop_mul, ir->operands[1]->type, - ir->operands[1], log2_x); - ir->operands[1] = NULL; - this->progress = true; -} - -void -lower_instructions_visitor::log_to_log2(ir_expression *ir) -{ - ir->operation = ir_binop_mul; - ir->operands[0] = new(ir) ir_expression(ir_unop_log2, ir->operands[0]->type, - ir->operands[0], NULL); - ir->operands[1] = new(ir) ir_constant(float(1.0 / M_LOG2E)); - this->progress = true; -} - -void -lower_instructions_visitor::mod_to_fract(ir_expression *ir) -{ - ir_variable *temp = new(ir) ir_variable(ir->operands[1]->type, "mod_b", - ir_var_temporary, precision_from_ir(ir->operands[1])); - this->base_ir->insert_before(temp); - - ir_assignment *const assign = - new(ir) ir_assignment(new(ir) ir_dereference_variable(temp), - ir->operands[1], NULL); - - this->base_ir->insert_before(assign); - - ir_expression *const div_expr = - new(ir) ir_expression(ir_binop_div, ir->operands[0]->type, - ir->operands[0], - new(ir) ir_dereference_variable(temp)); - - /* Don't generate new IR that would need to be lowered in an additional - * pass. - */ - if (lowering(DIV_TO_MUL_RCP)) - div_to_mul_rcp(div_expr); - - ir_rvalue *expr = new(ir) ir_expression(ir_unop_fract, - ir->operands[0]->type, - div_expr, - NULL); - - ir->operation = ir_binop_mul; - ir->operands[0] = new(ir) ir_dereference_variable(temp); - ir->operands[1] = expr; - this->progress = true; -} - -void -lower_instructions_visitor::bitfield_insert_to_bfm_bfi(ir_expression *ir) -{ - /* Translates - * ir_quadop_bitfield_insert base insert offset bits - * into - * ir_triop_bfi (ir_binop_bfm bits offset) insert base - */ - - ir_rvalue *base_expr = ir->operands[0]; - - ir->operation = ir_triop_bfi; - ir->operands[0] = new(ir) ir_expression(ir_binop_bfm, - ir->type->get_base_type(), - ir->operands[3], - ir->operands[2]); - /* ir->operands[1] is still the value to insert. */ - ir->operands[2] = base_expr; - ir->operands[3] = NULL; - - this->progress = true; -} - -void -lower_instructions_visitor::ldexp_to_arith(ir_expression *ir) -{ - /* Translates - * ir_binop_ldexp x exp - * into - * - * extracted_biased_exp = rshift(bitcast_f2i(abs(x)), exp_shift); - * resulting_biased_exp = extracted_biased_exp + exp; - * - * if (resulting_biased_exp < 1) { - * return copysign(0.0, x); - * } - * - * return bitcast_u2f((bitcast_f2u(x) & sign_mantissa_mask) | - * lshift(i2u(resulting_biased_exp), exp_shift)); - * - * which we can't actually implement as such, since the GLSL IR doesn't - * have vectorized if-statements. We actually implement it without branches - * using conditional-select: - * - * extracted_biased_exp = rshift(bitcast_f2i(abs(x)), exp_shift); - * resulting_biased_exp = extracted_biased_exp + exp; - * - * is_not_zero_or_underflow = gequal(resulting_biased_exp, 1); - * x = csel(is_not_zero_or_underflow, x, copysign(0.0f, x)); - * resulting_biased_exp = csel(is_not_zero_or_underflow, - * resulting_biased_exp, 0); - * - * return bitcast_u2f((bitcast_f2u(x) & sign_mantissa_mask) | - * lshift(i2u(resulting_biased_exp), exp_shift)); - */ - - const unsigned vec_elem = ir->type->vector_elements; - - /* Types */ - const glsl_type *ivec = glsl_type::get_instance(GLSL_TYPE_INT, vec_elem, 1); - const glsl_type *bvec = glsl_type::get_instance(GLSL_TYPE_BOOL, vec_elem, 1); - - /* Constants */ - ir_constant *zeroi = ir_constant::zero(ir, ivec); - - ir_constant *sign_mask = new(ir) ir_constant(0x80000000u, vec_elem); - - ir_constant *exp_shift = new(ir) ir_constant(23); - ir_constant *exp_width = new(ir) ir_constant(8); - - /* Temporary variables */ - glsl_precision prec = ir->get_precision(); - ir_variable *x = new(ir) ir_variable(ir->type, "x", ir_var_temporary, prec); - ir_variable *exp = new(ir) ir_variable(ivec, "exp", ir_var_temporary, prec); - - ir_variable *zero_sign_x = new(ir) ir_variable(ir->type, "zero_sign_x", - ir_var_temporary, prec); - - ir_variable *extracted_biased_exp = - new(ir) ir_variable(ivec, "extracted_biased_exp", ir_var_temporary, prec); - ir_variable *resulting_biased_exp = - new(ir) ir_variable(ivec, "resulting_biased_exp", ir_var_temporary, prec); - - ir_variable *is_not_zero_or_underflow = - new(ir) ir_variable(bvec, "is_not_zero_or_underflow", ir_var_temporary, prec); - - ir_instruction &i = *base_ir; - - /* Copy and arguments. */ - i.insert_before(x); - i.insert_before(assign(x, ir->operands[0])); - i.insert_before(exp); - i.insert_before(assign(exp, ir->operands[1])); - - /* Extract the biased exponent from . */ - i.insert_before(extracted_biased_exp); - i.insert_before(assign(extracted_biased_exp, - rshift(bitcast_f2i(abs(x)), exp_shift))); - - i.insert_before(resulting_biased_exp); - i.insert_before(assign(resulting_biased_exp, - add(extracted_biased_exp, exp))); - - /* Test if result is ±0.0, subnormal, or underflow by checking if the - * resulting biased exponent would be less than 0x1. If so, the result is - * 0.0 with the sign of x. (Actually, invert the conditions so that - * immediate values are the second arguments, which is better for i965) - */ - i.insert_before(zero_sign_x); - i.insert_before(assign(zero_sign_x, - bitcast_u2f(bit_and(bitcast_f2u(x), sign_mask)))); - - i.insert_before(is_not_zero_or_underflow); - i.insert_before(assign(is_not_zero_or_underflow, - gequal(resulting_biased_exp, - new(ir) ir_constant(0x1, vec_elem)))); - i.insert_before(assign(x, csel(is_not_zero_or_underflow, - x, zero_sign_x))); - i.insert_before(assign(resulting_biased_exp, - csel(is_not_zero_or_underflow, - resulting_biased_exp, zeroi))); - - /* We could test for overflows by checking if the resulting biased exponent - * would be greater than 0xFE. Turns out we don't need to because the GLSL - * spec says: - * - * "If this product is too large to be represented in the - * floating-point type, the result is undefined." - */ - - ir_constant *exp_shift_clone = exp_shift->clone(ir, NULL); - ir->operation = ir_unop_bitcast_i2f; - ir->operands[0] = bitfield_insert(bitcast_f2i(x), resulting_biased_exp, - exp_shift_clone, exp_width); - ir->operands[1] = NULL; - - /* Don't generate new IR that would need to be lowered in an additional - * pass. - */ - if (lowering(BITFIELD_INSERT_TO_BFM_BFI)) - bitfield_insert_to_bfm_bfi(ir->operands[0]->as_expression()); - - this->progress = true; -} - -void -lower_instructions_visitor::carry_to_arith(ir_expression *ir) -{ - /* Translates - * ir_binop_carry x y - * into - * sum = ir_binop_add x y - * bcarry = ir_binop_less sum x - * carry = ir_unop_b2i bcarry - */ - - ir_rvalue *x_clone = ir->operands[0]->clone(ir, NULL); - ir->operation = ir_unop_i2u; - ir->operands[0] = b2i(less(add(ir->operands[0], ir->operands[1]), x_clone)); - ir->operands[1] = NULL; - - this->progress = true; -} - -void -lower_instructions_visitor::borrow_to_arith(ir_expression *ir) -{ - /* Translates - * ir_binop_borrow x y - * into - * bcarry = ir_binop_less x y - * carry = ir_unop_b2i bcarry - */ - - ir->operation = ir_unop_i2u; - ir->operands[0] = b2i(less(ir->operands[0], ir->operands[1])); - ir->operands[1] = NULL; - - this->progress = true; -} - -void -lower_instructions_visitor::sat_to_clamp(ir_expression *ir) -{ - /* Translates - * ir_unop_saturate x - * into - * ir_binop_min (ir_binop_max(x, 0.0), 1.0) - */ - - ir->operation = ir_binop_min; - ir->operands[0] = new(ir) ir_expression(ir_binop_max, ir->operands[0]->type, - ir->operands[0], - new(ir) ir_constant(0.0f)); - ir->operands[1] = new(ir) ir_constant(1.0f); - - this->progress = true; -} - -ir_visitor_status -lower_instructions_visitor::visit_leave(ir_expression *ir) -{ - switch (ir->operation) { - case ir_binop_sub: - if (lowering(SUB_TO_ADD_NEG)) - sub_to_add_neg(ir); - break; - - case ir_binop_div: - if (ir->operands[1]->type->is_integer() && lowering(INT_DIV_TO_MUL_RCP)) - int_div_to_mul_rcp(ir); - else if (ir->operands[1]->type->is_float() && lowering(DIV_TO_MUL_RCP)) - div_to_mul_rcp(ir); - break; - - case ir_unop_exp: - if (lowering(EXP_TO_EXP2)) - exp_to_exp2(ir); - break; - - case ir_unop_log: - if (lowering(LOG_TO_LOG2)) - log_to_log2(ir); - break; - - case ir_binop_mod: - if (lowering(MOD_TO_FRACT) && ir->type->is_float()) - mod_to_fract(ir); - break; - - case ir_binop_pow: - if (lowering(POW_TO_EXP2)) - pow_to_exp2(ir); - break; - - case ir_quadop_bitfield_insert: - if (lowering(BITFIELD_INSERT_TO_BFM_BFI)) - bitfield_insert_to_bfm_bfi(ir); - break; - - case ir_binop_ldexp: - if (lowering(LDEXP_TO_ARITH)) - ldexp_to_arith(ir); - break; - - case ir_binop_carry: - if (lowering(CARRY_TO_ARITH)) - carry_to_arith(ir); - break; - - case ir_binop_borrow: - if (lowering(BORROW_TO_ARITH)) - borrow_to_arith(ir); - break; - - case ir_unop_saturate: - if (lowering(SAT_TO_CLAMP)) - sat_to_clamp(ir); - break; - - default: - return visit_continue; - } - - return visit_continue; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_jumps.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_jumps.cpp deleted file mode 100644 index 591c6d692..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_jumps.cpp +++ /dev/null @@ -1,1032 +0,0 @@ -/* - * Copyright © 2010 Luca Barbieri - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file lower_jumps.cpp - * - * This pass lowers jumps (break, continue, and return) to if/else structures. - * - * It can be asked to: - * 1. Pull jumps out of ifs where possible - * 2. Remove all "continue"s, replacing them with an "execute flag" - * 3. Replace all "break" with a single conditional one at the end of the loop - * 4. Replace all "return"s with a single return at the end of the function, - * for the main function and/or other functions - * - * Applying this pass gives several benefits: - * 1. All functions can be inlined. - * 2. nv40 and other pre-DX10 chips without "continue" can be supported - * 3. nv30 and other pre-DX10 chips with no control flow at all are better - * supported - * - * Continues are lowered by adding a per-loop "execute flag", initialized to - * true, that when cleared inhibits all execution until the end of the loop. - * - * Breaks are lowered to continues, plus setting a "break flag" that is checked - * at the end of the loop, and trigger the unique "break". - * - * Returns are lowered to breaks/continues, plus adding a "return flag" that - * causes loops to break again out of their enclosing loops until all the - * loops are exited: then the "execute flag" logic will ignore everything - * until the end of the function. - * - * Note that "continue" and "return" can also be implemented by adding - * a dummy loop and using break. - * However, this is bad for hardware with limited nesting depth, and - * prevents further optimization, and thus is not currently performed. - */ - -#include "glsl_types.h" -#include -#include "ir.h" - -/** - * Enum recording the result of analyzing how control flow might exit - * an IR node. - * - * Each possible value of jump_strength indicates a strictly stronger - * guarantee on control flow than the previous value. - * - * The ordering of strengths roughly reflects the way jumps are - * lowered: jumps with higher strength tend to be lowered to jumps of - * lower strength. Accordingly, strength is used as a heuristic to - * determine which lowering to perform first. - * - * This enum is also used by get_jump_strength() to categorize - * instructions as either break, continue, return, or other. When - * used in this fashion, strength_always_clears_execute_flag is not - * used. - * - * The control flow analysis made by this optimization pass makes two - * simplifying assumptions: - * - * - It ignores discard instructions, since they are lowered by a - * separate pass (lower_discard.cpp). - * - * - It assumes it is always possible for control to flow from a loop - * to the instruction immediately following it. Technically, this - * is not true (since all execution paths through the loop might - * jump back to the top, or return from the function). - * - * Both of these simplifying assumtions are safe, since they can never - * cause reachable code to be incorrectly classified as unreachable; - * they can only do the opposite. - */ -enum jump_strength -{ - /** - * Analysis has produced no guarantee on how control flow might - * exit this IR node. It might fall out the bottom (with or - * without clearing the execute flag, if present), or it might - * continue to the top of the innermost enclosing loop, break out - * of it, or return from the function. - */ - strength_none, - - /** - * The only way control can fall out the bottom of this node is - * through a code path that clears the execute flag. It might also - * continue to the top of the innermost enclosing loop, break out - * of it, or return from the function. - */ - strength_always_clears_execute_flag, - - /** - * Control cannot fall out the bottom of this node. It might - * continue to the top of the innermost enclosing loop, break out - * of it, or return from the function. - */ - strength_continue, - - /** - * Control cannot fall out the bottom of this node, or continue the - * top of the innermost enclosing loop. It can only break out of - * it or return from the function. - */ - strength_break, - - /** - * Control cannot fall out the bottom of this node, continue to the - * top of the innermost enclosing loop, or break out of it. It can - * only return from the function. - */ - strength_return -}; - -namespace { - -struct block_record -{ - /* minimum jump strength (of lowered IR, not pre-lowering IR) - * - * If the block ends with a jump, must be the strength of the jump. - * Otherwise, the jump would be dead and have been deleted before) - * - * If the block doesn't end with a jump, it can be different than strength_none if all paths before it lead to some jump - * (e.g. an if with a return in one branch, and a break in the other, while not lowering them) - * Note that identical jumps are usually unified though. - */ - jump_strength min_strength; - - /* can anything clear the execute flag? */ - bool may_clear_execute_flag; - - block_record() - { - this->min_strength = strength_none; - this->may_clear_execute_flag = false; - } -}; - -struct loop_record -{ - ir_function_signature* signature; - ir_loop* loop; - - /* used to avoid lowering the break used to represent lowered breaks */ - unsigned nesting_depth; - bool in_if_at_the_end_of_the_loop; - - bool may_set_return_flag; - - ir_variable* break_flag; - ir_variable* execute_flag; /* cleared to emulate continue */ - - loop_record(ir_function_signature* p_signature = 0, ir_loop* p_loop = 0) - { - this->signature = p_signature; - this->loop = p_loop; - this->nesting_depth = 0; - this->in_if_at_the_end_of_the_loop = false; - this->may_set_return_flag = false; - this->break_flag = 0; - this->execute_flag = 0; - } - - ir_variable* get_execute_flag() - { - /* also supported for the "function loop" */ - if(!this->execute_flag) { - exec_list& list = this->loop ? this->loop->body_instructions : signature->body; - this->execute_flag = new(this->signature) ir_variable(glsl_type::bool_type, "execute_flag", ir_var_temporary, glsl_precision_low); - list.push_head(new(this->signature) ir_assignment(new(this->signature) ir_dereference_variable(execute_flag), new(this->signature) ir_constant(true), 0)); - list.push_head(this->execute_flag); - } - return this->execute_flag; - } - - ir_variable* get_break_flag() - { - assert(this->loop); - if(!this->break_flag) { - this->break_flag = new(this->signature) ir_variable(glsl_type::bool_type, "break_flag", ir_var_temporary, glsl_precision_low); - this->loop->insert_before(this->break_flag); - this->loop->insert_before(new(this->signature) ir_assignment(new(this->signature) ir_dereference_variable(break_flag), new(this->signature) ir_constant(false), 0)); - } - return this->break_flag; - } -}; - -struct function_record -{ - ir_function_signature* signature; - ir_variable* return_flag; /* used to break out of all loops and then jump to the return instruction */ - ir_variable* return_value; - bool lower_return; - unsigned nesting_depth; - - function_record(ir_function_signature* p_signature = 0, - bool lower_return = false) - { - this->signature = p_signature; - this->return_flag = 0; - this->return_value = 0; - this->nesting_depth = 0; - this->lower_return = lower_return; - } - - ir_variable* get_return_flag() - { - if(!this->return_flag) { - this->return_flag = new(this->signature) ir_variable(glsl_type::bool_type, "return_flag", ir_var_temporary, glsl_precision_low); - this->signature->body.push_head(new(this->signature) ir_assignment(new(this->signature) ir_dereference_variable(return_flag), new(this->signature) ir_constant(false), 0)); - this->signature->body.push_head(this->return_flag); - } - return this->return_flag; - } - - ir_variable* get_return_value() - { - if(!this->return_value) { - assert(!this->signature->return_type->is_void()); - return_value = new(this->signature) ir_variable(this->signature->return_type, "return_value", ir_var_temporary, this->signature->precision); - this->signature->body.push_head(this->return_value); - } - return this->return_value; - } -}; - -struct ir_lower_jumps_visitor : public ir_control_flow_visitor { - /* Postconditions: on exit of any visit() function: - * - * ANALYSIS: this->block.min_strength, - * this->block.may_clear_execute_flag, and - * this->loop.may_set_return_flag are updated to reflect the - * characteristics of the visited statement. - * - * DEAD_CODE_ELIMINATION: If this->block.min_strength is not - * strength_none, the visited node is at the end of its exec_list. - * In other words, any unreachable statements that follow the - * visited statement in its exec_list have been removed. - * - * CONTAINED_JUMPS_LOWERED: If the visited statement contains other - * statements, then should_lower_jump() is false for all of the - * return, break, or continue statements it contains. - * - * Note that visiting a jump does not lower it. That is the - * responsibility of the statement (or function signature) that - * contains the jump. - */ - - bool progress; - - struct function_record function; - struct loop_record loop; - struct block_record block; - - bool pull_out_jumps; - bool lower_continue; - bool lower_break; - bool lower_sub_return; - bool lower_main_return; - - ir_lower_jumps_visitor() - : progress(false), - pull_out_jumps(false), - lower_continue(false), - lower_break(false), - lower_sub_return(false), - lower_main_return(false) - { - } - - void truncate_after_instruction(exec_node *ir) - { - if (!ir) - return; - - while (!ir->get_next()->is_tail_sentinel()) { - ((ir_instruction *)ir->get_next())->remove(); - this->progress = true; - } - } - - void move_outer_block_inside(ir_instruction *ir, exec_list *inner_block) - { - while (!ir->get_next()->is_tail_sentinel()) { - ir_instruction *move_ir = (ir_instruction *)ir->get_next(); - - move_ir->remove(); - inner_block->push_tail(move_ir); - } - } - - /** - * Insert the instructions necessary to lower a return statement, - * before the given return instruction. - */ - void insert_lowered_return(ir_return *ir) - { - ir_variable* return_flag = this->function.get_return_flag(); - if(!this->function.signature->return_type->is_void()) { - ir_variable* return_value = this->function.get_return_value(); - ir->insert_before( - new(ir) ir_assignment( - new (ir) ir_dereference_variable(return_value), - ir->value)); - } - ir->insert_before( - new(ir) ir_assignment( - new (ir) ir_dereference_variable(return_flag), - new (ir) ir_constant(true))); - this->loop.may_set_return_flag = true; - } - - /** - * If the given instruction is a return, lower it to instructions - * that store the return value (if there is one), set the return - * flag, and then break. - * - * It is safe to pass NULL to this function. - */ - void lower_return_unconditionally(ir_instruction *ir) - { - if (get_jump_strength(ir) != strength_return) { - return; - } - insert_lowered_return((ir_return*)ir); - ir->replace_with(new(ir) ir_loop_jump(ir_loop_jump::jump_break)); - } - - /** - * Create the necessary instruction to replace a break instruction. - */ - ir_instruction *create_lowered_break() - { - void *ctx = this->function.signature; - return new(ctx) ir_assignment( - new(ctx) ir_dereference_variable(this->loop.get_break_flag()), - new(ctx) ir_constant(true), - 0); - } - - /** - * If the given instruction is a break, lower it to an instruction - * that sets the break flag, without consulting - * should_lower_jump(). - * - * It is safe to pass NULL to this function. - */ - void lower_break_unconditionally(ir_instruction *ir) - { - if (get_jump_strength(ir) != strength_break) { - return; - } - ir->replace_with(create_lowered_break()); - } - - /** - * If the block ends in a conditional or unconditional break, lower - * it, even though should_lower_jump() says it needn't be lowered. - */ - void lower_final_breaks(exec_list *block) - { - ir_instruction *ir = (ir_instruction *) block->get_tail(); - lower_break_unconditionally(ir); - ir_if *ir_if = ir->as_if(); - if (ir_if) { - lower_break_unconditionally( - (ir_instruction *) ir_if->then_instructions.get_tail()); - lower_break_unconditionally( - (ir_instruction *) ir_if->else_instructions.get_tail()); - } - } - - virtual void visit(class ir_loop_jump * ir) - { - /* Eliminate all instructions after each one, since they are - * unreachable. This satisfies the DEAD_CODE_ELIMINATION - * postcondition. - */ - truncate_after_instruction(ir); - - /* Set this->block.min_strength based on this instruction. This - * satisfies the ANALYSIS postcondition. It is not necessary to - * update this->block.may_clear_execute_flag or - * this->loop.may_set_return_flag, because an unlowered jump - * instruction can't change any flags. - */ - this->block.min_strength = ir->is_break() ? strength_break : strength_continue; - - /* The CONTAINED_JUMPS_LOWERED postcondition is already - * satisfied, because jump statements can't contain other - * statements. - */ - } - - virtual void visit(class ir_return * ir) - { - /* Eliminate all instructions after each one, since they are - * unreachable. This satisfies the DEAD_CODE_ELIMINATION - * postcondition. - */ - truncate_after_instruction(ir); - - /* Set this->block.min_strength based on this instruction. This - * satisfies the ANALYSIS postcondition. It is not necessary to - * update this->block.may_clear_execute_flag or - * this->loop.may_set_return_flag, because an unlowered return - * instruction can't change any flags. - */ - this->block.min_strength = strength_return; - - /* The CONTAINED_JUMPS_LOWERED postcondition is already - * satisfied, because jump statements can't contain other - * statements. - */ - } - - virtual void visit(class ir_discard * ir) - { - /* Nothing needs to be done. The ANALYSIS and - * DEAD_CODE_ELIMINATION postconditions are already satisfied, - * because discard statements are ignored by this optimization - * pass. The CONTAINED_JUMPS_LOWERED postcondition is already - * satisfied, because discard statements can't contain other - * statements. - */ - (void) ir; - } - - virtual void visit(class ir_precision_statement * ir) - { - /* Nothing needs to be done. */ - } - - virtual void visit(class ir_typedecl_statement * ir) - { - /* Nothing needs to be done. */ - } - - enum jump_strength get_jump_strength(ir_instruction* ir) - { - if(!ir) - return strength_none; - else if(ir->ir_type == ir_type_loop_jump) { - if(((ir_loop_jump*)ir)->is_break()) - return strength_break; - else - return strength_continue; - } else if(ir->ir_type == ir_type_return) - return strength_return; - else - return strength_none; - } - - bool should_lower_jump(ir_jump* ir) - { - unsigned strength = get_jump_strength(ir); - bool lower; - switch(strength) - { - case strength_none: - lower = false; /* don't change this, code relies on it */ - break; - case strength_continue: - lower = lower_continue; - break; - case strength_break: - assert(this->loop.loop); - /* never lower "canonical break" */ - if(ir->get_next()->is_tail_sentinel() && (this->loop.nesting_depth == 0 - || (this->loop.nesting_depth == 1 && this->loop.in_if_at_the_end_of_the_loop))) - lower = false; - else - lower = lower_break; - break; - case strength_return: - /* never lower return at the end of a this->function */ - if(this->function.nesting_depth == 0 && ir->get_next()->is_tail_sentinel()) - lower = false; - else - lower = this->function.lower_return; - break; - } - return lower; - } - - block_record visit_block(exec_list* list) - { - /* Note: since visiting a node may change that node's next - * pointer, we can't use visit_exec_list(), because - * visit_exec_list() caches the node's next pointer before - * visiting it. So we use foreach_in_list() instead. - * - * foreach_in_list() isn't safe if the node being visited gets - * removed, but fortunately this visitor doesn't do that. - */ - - block_record saved_block = this->block; - this->block = block_record(); - foreach_in_list(ir_instruction, node, list) { - node->accept(this); - } - block_record ret = this->block; - this->block = saved_block; - return ret; - } - - virtual void visit(ir_if *ir) - { - if(this->loop.nesting_depth == 0 && ir->get_next()->is_tail_sentinel()) - this->loop.in_if_at_the_end_of_the_loop = true; - - ++this->function.nesting_depth; - ++this->loop.nesting_depth; - - block_record block_records[2]; - ir_jump* jumps[2]; - - /* Recursively lower nested jumps. This satisfies the - * CONTAINED_JUMPS_LOWERED postcondition, except in the case of - * unconditional jumps at the end of ir->then_instructions and - * ir->else_instructions, which are handled below. - */ - block_records[0] = visit_block(&ir->then_instructions); - block_records[1] = visit_block(&ir->else_instructions); - -retry: /* we get here if we put code after the if inside a branch */ - - /* Determine which of ir->then_instructions and - * ir->else_instructions end with an unconditional jump. - */ - for(unsigned i = 0; i < 2; ++i) { - exec_list& list = i ? ir->else_instructions : ir->then_instructions; - jumps[i] = 0; - if(!list.is_empty() && get_jump_strength((ir_instruction*)list.get_tail())) - jumps[i] = (ir_jump*)list.get_tail(); - } - - /* Loop until we have satisfied the CONTAINED_JUMPS_LOWERED - * postcondition by lowering jumps in both then_instructions and - * else_instructions. - */ - for(;;) { - /* Determine the types of the jumps that terminate - * ir->then_instructions and ir->else_instructions. - */ - jump_strength jump_strengths[2]; - - for(unsigned i = 0; i < 2; ++i) { - if(jumps[i]) { - jump_strengths[i] = block_records[i].min_strength; - assert(jump_strengths[i] == get_jump_strength(jumps[i])); - } else - jump_strengths[i] = strength_none; - } - - /* If both code paths end in a jump, and the jumps are the - * same, and we are pulling out jumps, replace them with a - * single jump that comes after the if instruction. The new - * jump will be visited next, and it will be lowered if - * necessary by the loop or conditional that encloses it. - */ - if(pull_out_jumps && jump_strengths[0] == jump_strengths[1]) { - bool unify = true; - if(jump_strengths[0] == strength_continue) - ir->insert_after(new(ir) ir_loop_jump(ir_loop_jump::jump_continue)); - else if(jump_strengths[0] == strength_break) - ir->insert_after(new(ir) ir_loop_jump(ir_loop_jump::jump_break)); - /* FINISHME: unify returns with identical expressions */ - else if(jump_strengths[0] == strength_return && this->function.signature->return_type->is_void()) - ir->insert_after(new(ir) ir_return(NULL)); - else - unify = false; - - if(unify) { - jumps[0]->remove(); - jumps[1]->remove(); - this->progress = true; - - /* Update jumps[] to reflect the fact that the jumps - * are gone, and update block_records[] to reflect the - * fact that control can now flow to the next - * instruction. - */ - jumps[0] = 0; - jumps[1] = 0; - block_records[0].min_strength = strength_none; - block_records[1].min_strength = strength_none; - - /* The CONTAINED_JUMPS_LOWERED postcondition is now - * satisfied, so we can break out of the loop. - */ - break; - } - } - - /* lower a jump: if both need to lowered, start with the strongest one, so that - * we might later unify the lowered version with the other one - */ - bool should_lower[2]; - for(unsigned i = 0; i < 2; ++i) - should_lower[i] = should_lower_jump(jumps[i]); - - int lower; - if(should_lower[1] && should_lower[0]) - lower = jump_strengths[1] > jump_strengths[0]; - else if(should_lower[0]) - lower = 0; - else if(should_lower[1]) - lower = 1; - else - /* Neither code path ends in a jump that needs to be - * lowered, so the CONTAINED_JUMPS_LOWERED postcondition - * is satisfied and we can break out of the loop. - */ - break; - - if(jump_strengths[lower] == strength_return) { - /* To lower a return, we create a return flag (if the - * function doesn't have one already) and add instructions - * that: 1. store the return value (if this function has a - * non-void return) and 2. set the return flag - */ - insert_lowered_return((ir_return*)jumps[lower]); - if(this->loop.loop) { - /* If we are in a loop, replace the return instruction - * with a break instruction, and then loop so that the - * break instruction can be lowered if necessary. - */ - ir_loop_jump* lowered = 0; - lowered = new(ir) ir_loop_jump(ir_loop_jump::jump_break); - /* Note: we must update block_records and jumps to - * reflect the fact that the control path has been - * altered from a return to a break. - */ - block_records[lower].min_strength = strength_break; - jumps[lower]->replace_with(lowered); - jumps[lower] = lowered; - } else { - /* If we are not in a loop, we then proceed as we would - * for a continue statement (set the execute flag to - * false to prevent the rest of the function from - * executing). - */ - goto lower_continue; - } - this->progress = true; - } else if(jump_strengths[lower] == strength_break) { - /* To lower a break, we create a break flag (if the loop - * doesn't have one already) and add an instruction that - * sets it. - * - * Then we proceed as we would for a continue statement - * (set the execute flag to false to prevent the rest of - * the loop body from executing). - * - * The visit() function for the loop will ensure that the - * break flag is checked after executing the loop body. - */ - jumps[lower]->insert_before(create_lowered_break()); - goto lower_continue; - } else if(jump_strengths[lower] == strength_continue) { -lower_continue: - /* To lower a continue, we create an execute flag (if the - * loop doesn't have one already) and replace the continue - * with an instruction that clears it. - * - * Note that this code path gets exercised when lowering - * return statements that are not inside a loop, so - * this->loop must be initialized even outside of loops. - */ - ir_variable* execute_flag = this->loop.get_execute_flag(); - jumps[lower]->replace_with(new(ir) ir_assignment(new (ir) ir_dereference_variable(execute_flag), new (ir) ir_constant(false), 0)); - /* Note: we must update block_records and jumps to reflect - * the fact that the control path has been altered to an - * instruction that clears the execute flag. - */ - jumps[lower] = 0; - block_records[lower].min_strength = strength_always_clears_execute_flag; - block_records[lower].may_clear_execute_flag = true; - this->progress = true; - - /* Let the loop run again, in case the other branch of the - * if needs to be lowered too. - */ - } - } - - /* move out a jump out if possible */ - if(pull_out_jumps) { - /* If one of the branches ends in a jump, and control cannot - * fall out the bottom of the other branch, then we can move - * the jump after the if. - * - * Set move_out to the branch we are moving a jump out of. - */ - int move_out = -1; - if(jumps[0] && block_records[1].min_strength >= strength_continue) - move_out = 0; - else if(jumps[1] && block_records[0].min_strength >= strength_continue) - move_out = 1; - - if(move_out >= 0) - { - jumps[move_out]->remove(); - ir->insert_after(jumps[move_out]); - /* Note: we must update block_records and jumps to reflect - * the fact that the jump has been moved out of the if. - */ - jumps[move_out] = 0; - block_records[move_out].min_strength = strength_none; - this->progress = true; - } - } - - /* Now satisfy the ANALYSIS postcondition by setting - * this->block.min_strength and - * this->block.may_clear_execute_flag based on the - * characteristics of the two branches. - */ - if(block_records[0].min_strength < block_records[1].min_strength) - this->block.min_strength = block_records[0].min_strength; - else - this->block.min_strength = block_records[1].min_strength; - this->block.may_clear_execute_flag = this->block.may_clear_execute_flag || block_records[0].may_clear_execute_flag || block_records[1].may_clear_execute_flag; - - /* Now we need to clean up the instructions that follow the - * if. - * - * If those instructions are unreachable, then satisfy the - * DEAD_CODE_ELIMINATION postcondition by eliminating them. - * Otherwise that postcondition is already satisfied. - */ - if(this->block.min_strength) - truncate_after_instruction(ir); - else if(this->block.may_clear_execute_flag) - { - /* If the "if" instruction might clear the execute flag, then - * we need to guard any instructions that follow so that they - * are only executed if the execute flag is set. - * - * If one of the branches of the "if" always clears the - * execute flag, and the other branch never clears it, then - * this is easy: just move all the instructions following the - * "if" into the branch that never clears it. - */ - int move_into = -1; - if(block_records[0].min_strength && !block_records[1].may_clear_execute_flag) - move_into = 1; - else if(block_records[1].min_strength && !block_records[0].may_clear_execute_flag) - move_into = 0; - - if(move_into >= 0) { - assert(!block_records[move_into].min_strength && !block_records[move_into].may_clear_execute_flag); /* otherwise, we just truncated */ - - exec_list* list = move_into ? &ir->else_instructions : &ir->then_instructions; - exec_node* next = ir->get_next(); - if(!next->is_tail_sentinel()) { - move_outer_block_inside(ir, list); - - /* If any instructions moved, then we need to visit - * them (since they are now inside the "if"). Since - * block_records[move_into] is in its default state - * (see assertion above), we can safely replace - * block_records[move_into] with the result of this - * analysis. - */ - exec_list list; - list.head = next; - block_records[move_into] = visit_block(&list); - - /* - * Then we need to re-start our jump lowering, since one - * of the instructions we moved might be a jump that - * needs to be lowered. - */ - this->progress = true; - goto retry; - } - } else { - /* If we get here, then the simple case didn't apply; we - * need to actually guard the instructions that follow. - * - * To avoid creating unnecessarily-deep nesting, first - * look through the instructions that follow and unwrap - * any instructions that that are already wrapped in the - * appropriate guard. - */ - ir_instruction* ir_after; - for(ir_after = (ir_instruction*)ir->get_next(); !ir_after->is_tail_sentinel();) - { - ir_if* ir_if = ir_after->as_if(); - if(ir_if && ir_if->else_instructions.is_empty()) { - ir_dereference_variable* ir_if_cond_deref = ir_if->condition->as_dereference_variable(); - if(ir_if_cond_deref && ir_if_cond_deref->var == this->loop.execute_flag) { - ir_instruction* ir_next = (ir_instruction*)ir_after->get_next(); - ir_after->insert_before(&ir_if->then_instructions); - ir_after->remove(); - ir_after = ir_next; - continue; - } - } - ir_after = (ir_instruction*)ir_after->get_next(); - - /* only set this if we find any unprotected instruction */ - this->progress = true; - } - - /* Then, wrap all the instructions that follow in a single - * guard. - */ - if(!ir->get_next()->is_tail_sentinel()) { - assert(this->loop.execute_flag); - ir_if* if_execute = new(ir) ir_if(new(ir) ir_dereference_variable(this->loop.execute_flag)); - move_outer_block_inside(ir, &if_execute->then_instructions); - ir->insert_after(if_execute); - } - } - } - --this->loop.nesting_depth; - --this->function.nesting_depth; - } - - virtual void visit(ir_loop *ir) - { - /* Visit the body of the loop, with a fresh data structure in - * this->loop so that the analysis we do here won't bleed into - * enclosing loops. - * - * We assume that all code after a loop is reachable from the - * loop (see comments on enum jump_strength), so the - * DEAD_CODE_ELIMINATION postcondition is automatically - * satisfied, as is the block.min_strength portion of the - * ANALYSIS postcondition. - * - * The block.may_clear_execute_flag portion of the ANALYSIS - * postcondition is automatically satisfied because execute - * flags do not propagate outside of loops. - * - * The loop.may_set_return_flag portion of the ANALYSIS - * postcondition is handled below. - */ - ++this->function.nesting_depth; - loop_record saved_loop = this->loop; - this->loop = loop_record(this->function.signature, ir); - - /* Recursively lower nested jumps. This satisfies the - * CONTAINED_JUMPS_LOWERED postcondition, except in the case of - * an unconditional continue or return at the bottom of the - * loop, which are handled below. - */ - block_record body = visit_block(&ir->body_instructions); - - /* If the loop ends in an unconditional continue, eliminate it - * because it is redundant. - */ - ir_instruction *ir_last - = (ir_instruction *) ir->body_instructions.get_tail(); - if (get_jump_strength(ir_last) == strength_continue) { - ir_last->remove(); - } - - /* If the loop ends in an unconditional return, and we are - * lowering returns, lower it. - */ - if (this->function.lower_return) - lower_return_unconditionally(ir_last); - - if(body.min_strength >= strength_break) { - /* FINISHME: If the min_strength of the loop body is - * strength_break or strength_return, that means that it - * isn't a loop at all, since control flow always leaves the - * body of the loop via break or return. In principle the - * loop could be eliminated in this case. This optimization - * is not implemented yet. - */ - } - - if(this->loop.break_flag) { - /* We only get here if we are lowering breaks */ - assert (lower_break); - - /* If a break flag was generated while visiting the body of - * the loop, then at least one break was lowered, so we need - * to generate an if statement at the end of the loop that - * does a "break" if the break flag is set. The break we - * generate won't violate the CONTAINED_JUMPS_LOWERED - * postcondition, because should_lower_jump() always returns - * false for a break that happens at the end of a loop. - * - * However, if the loop already ends in a conditional or - * unconditional break, then we need to lower that break, - * because it won't be at the end of the loop anymore. - */ - lower_final_breaks(&ir->body_instructions); - - ir_if* break_if = new(ir) ir_if(new(ir) ir_dereference_variable(this->loop.break_flag)); - break_if->then_instructions.push_tail(new(ir) ir_loop_jump(ir_loop_jump::jump_break)); - ir->body_instructions.push_tail(break_if); - } - - /* If the body of the loop may set the return flag, then at - * least one return was lowered to a break, so we need to ensure - * that the return flag is checked after the body of the loop is - * executed. - */ - if(this->loop.may_set_return_flag) { - assert(this->function.return_flag); - /* Generate the if statement to check the return flag */ - ir_if* return_if = new(ir) ir_if(new(ir) ir_dereference_variable(this->function.return_flag)); - /* Note: we also need to propagate the knowledge that the - * return flag may get set to the outer context. This - * satisfies the loop.may_set_return_flag part of the - * ANALYSIS postcondition. - */ - saved_loop.may_set_return_flag = true; - if(saved_loop.loop) - /* If this loop is nested inside another one, then the if - * statement that we generated should break out of that - * loop if the return flag is set. Caller will lower that - * break statement if necessary. - */ - return_if->then_instructions.push_tail(new(ir) ir_loop_jump(ir_loop_jump::jump_break)); - else - /* Otherwise, all we need to do is ensure that the - * instructions that follow are only executed if the - * return flag is clear. We can do that by moving those - * instructions into the else clause of the generated if - * statement. - */ - move_outer_block_inside(ir, &return_if->else_instructions); - ir->insert_after(return_if); - } - - this->loop = saved_loop; - --this->function.nesting_depth; - } - - virtual void visit(ir_function_signature *ir) - { - /* these are not strictly necessary */ - assert(!this->function.signature); - assert(!this->loop.loop); - - bool lower_return; - if (strcmp(ir->function_name(), "main") == 0) - lower_return = lower_main_return; - else - lower_return = lower_sub_return; - - function_record saved_function = this->function; - loop_record saved_loop = this->loop; - this->function = function_record(ir, lower_return); - this->loop = loop_record(ir); - - assert(!this->loop.loop); - - /* Visit the body of the function to lower any jumps that occur - * in it, except possibly an unconditional return statement at - * the end of it. - */ - visit_block(&ir->body); - - /* If the body ended in an unconditional return of non-void, - * then we don't need to lower it because it's the one canonical - * return. - * - * If the body ended in a return of void, eliminate it because - * it is redundant. - */ - if (ir->return_type->is_void() && - get_jump_strength((ir_instruction *) ir->body.get_tail())) { - ir_jump *jump = (ir_jump *) ir->body.get_tail(); - assert (jump->ir_type == ir_type_return); - jump->remove(); - } - - if(this->function.return_value) - ir->body.push_tail(new(ir) ir_return(new (ir) ir_dereference_variable(this->function.return_value))); - - this->loop = saved_loop; - this->function = saved_function; - } - - virtual void visit(class ir_function * ir) - { - visit_block(&ir->signatures); - } -}; - -} /* anonymous namespace */ - -bool -do_lower_jumps(exec_list *instructions, bool pull_out_jumps, bool lower_sub_return, bool lower_main_return, bool lower_continue, bool lower_break) -{ - ir_lower_jumps_visitor v; - v.pull_out_jumps = pull_out_jumps; - v.lower_continue = lower_continue; - v.lower_break = lower_break; - v.lower_sub_return = lower_sub_return; - v.lower_main_return = lower_main_return; - - bool progress_ever = false; - do { - v.progress = false; - visit_exec_list(instructions, &v); - progress_ever = v.progress || progress_ever; - } while (v.progress); - - return progress_ever; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_mat_op_to_vec.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_mat_op_to_vec.cpp deleted file mode 100644 index d69ac0498..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_mat_op_to_vec.cpp +++ /dev/null @@ -1,432 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file lower_mat_op_to_vec.cpp - * - * Breaks matrix operation expressions down to a series of vector operations. - * - * Generally this is how we have to codegen matrix operations for a - * GPU, so this gives us the chance to constant fold operations on a - * column or row. - */ - -#include "ir.h" -#include "ir_expression_flattening.h" -#include "glsl_types.h" - -namespace { - -class ir_mat_op_to_vec_visitor : public ir_hierarchical_visitor { -public: - ir_mat_op_to_vec_visitor() - { - this->made_progress = false; - this->mem_ctx = NULL; - } - - ir_visitor_status visit_leave(ir_assignment *); - - ir_dereference *get_column(ir_dereference *val, int col); - ir_rvalue *get_element(ir_dereference *val, int col, int row); - - void do_mul_mat_mat(ir_dereference *result, - ir_dereference *a, ir_dereference *b); - void do_mul_mat_vec(ir_dereference *result, - ir_dereference *a, ir_dereference *b); - void do_mul_vec_mat(ir_dereference *result, - ir_dereference *a, ir_dereference *b); - void do_mul_mat_scalar(ir_dereference *result, - ir_dereference *a, ir_dereference *b); - void do_equal_mat_mat(ir_dereference *result, ir_dereference *a, - ir_dereference *b, bool test_equal); - - void *mem_ctx; - bool made_progress; -}; - -} /* anonymous namespace */ - -static bool -mat_op_to_vec_predicate(ir_instruction *ir) -{ - ir_expression *expr = ir->as_expression(); - unsigned int i; - - if (!expr) - return false; - - for (i = 0; i < expr->get_num_operands(); i++) { - if (expr->operands[i]->type->is_matrix()) - return true; - } - - return false; -} - -bool -do_mat_op_to_vec(exec_list *instructions) -{ - ir_mat_op_to_vec_visitor v; - - /* Pull out any matrix expression to a separate assignment to a - * temp. This will make our handling of the breakdown to - * operations on the matrix's vector components much easier. - */ - do_expression_flattening(instructions, mat_op_to_vec_predicate); - - visit_list_elements(&v, instructions); - - return v.made_progress; -} - -ir_rvalue * -ir_mat_op_to_vec_visitor::get_element(ir_dereference *val, int col, int row) -{ - val = get_column(val, col); - - return new(mem_ctx) ir_swizzle(val, row, 0, 0, 0, 1); -} - -ir_dereference * -ir_mat_op_to_vec_visitor::get_column(ir_dereference *val, int row) -{ - val = val->clone(mem_ctx, NULL); - - if (val->type->is_matrix()) { - val = new(mem_ctx) ir_dereference_array(val, - new(mem_ctx) ir_constant(row)); - } - - return val; -} - -void -ir_mat_op_to_vec_visitor::do_mul_mat_mat(ir_dereference *result, - ir_dereference *a, - ir_dereference *b) -{ - unsigned b_col, i; - ir_assignment *assign; - ir_expression *expr; - - for (b_col = 0; b_col < (int)b->type->matrix_columns; b_col++) { - /* first column */ - expr = new(mem_ctx) ir_expression(ir_binop_mul, - get_column(a, 0), - get_element(b, b_col, 0)); - - /* following columns */ - for (i = 1; i < (int)a->type->matrix_columns; i++) { - ir_expression *mul_expr; - - mul_expr = new(mem_ctx) ir_expression(ir_binop_mul, - get_column(a, i), - get_element(b, b_col, i)); - expr = new(mem_ctx) ir_expression(ir_binop_add, - expr, - mul_expr); - } - - assign = new(mem_ctx) ir_assignment(get_column(result, b_col), expr); - base_ir->insert_before(assign); - } -} - -void -ir_mat_op_to_vec_visitor::do_mul_mat_vec(ir_dereference *result, - ir_dereference *a, - ir_dereference *b) -{ - unsigned i; - ir_assignment *assign; - ir_expression *expr; - - /* first column */ - expr = new(mem_ctx) ir_expression(ir_binop_mul, - get_column(a, 0), - get_element(b, 0, 0)); - - /* following columns */ - for (i = 1; i < (int)a->type->matrix_columns; i++) { - ir_expression *mul_expr; - - mul_expr = new(mem_ctx) ir_expression(ir_binop_mul, - get_column(a, i), - get_element(b, 0, i)); - expr = new(mem_ctx) ir_expression(ir_binop_add, expr, mul_expr); - } - - result = result->clone(mem_ctx, NULL); - assign = new(mem_ctx) ir_assignment(result, expr); - base_ir->insert_before(assign); -} - -void -ir_mat_op_to_vec_visitor::do_mul_vec_mat(ir_dereference *result, - ir_dereference *a, - ir_dereference *b) -{ - unsigned i; - - for (i = 0; i < (int)b->type->matrix_columns; i++) { - ir_rvalue *column_result; - ir_expression *column_expr; - ir_assignment *column_assign; - - column_result = result->clone(mem_ctx, NULL); - column_result = new(mem_ctx) ir_swizzle(column_result, i, 0, 0, 0, 1); - - column_expr = new(mem_ctx) ir_expression(ir_binop_dot, - a->clone(mem_ctx, NULL), - get_column(b, i)); - - column_assign = new(mem_ctx) ir_assignment(column_result, - column_expr); - base_ir->insert_before(column_assign); - } -} - -void -ir_mat_op_to_vec_visitor::do_mul_mat_scalar(ir_dereference *result, - ir_dereference *a, - ir_dereference *b) -{ - unsigned i; - - for (i = 0; i < (int)a->type->matrix_columns; i++) { - ir_expression *column_expr; - ir_assignment *column_assign; - - column_expr = new(mem_ctx) ir_expression(ir_binop_mul, - get_column(a, i), - b->clone(mem_ctx, NULL)); - - column_assign = new(mem_ctx) ir_assignment(get_column(result, i), - column_expr); - base_ir->insert_before(column_assign); - } -} - -void -ir_mat_op_to_vec_visitor::do_equal_mat_mat(ir_dereference *result, - ir_dereference *a, - ir_dereference *b, - bool test_equal) -{ - /* This essentially implements the following GLSL: - * - * bool equal(mat4 a, mat4 b) - * { - * return !any(bvec4(a[0] != b[0], - * a[1] != b[1], - * a[2] != b[2], - * a[3] != b[3]); - * } - * - * bool nequal(mat4 a, mat4 b) - * { - * return any(bvec4(a[0] != b[0], - * a[1] != b[1], - * a[2] != b[2], - * a[3] != b[3]); - * } - */ - const unsigned columns = a->type->matrix_columns; - const glsl_type *const bvec_type = - glsl_type::get_instance(GLSL_TYPE_BOOL, columns, 1); - - ir_variable *const tmp_bvec = - new(this->mem_ctx) ir_variable(bvec_type, "mat_cmp_bvec", - ir_var_temporary, glsl_precision_low); - this->base_ir->insert_before(tmp_bvec); - - for (unsigned i = 0; i < columns; i++) { - ir_expression *const cmp = - new(this->mem_ctx) ir_expression(ir_binop_any_nequal, - get_column(a, i), - get_column(b, i)); - - ir_dereference *const lhs = - new(this->mem_ctx) ir_dereference_variable(tmp_bvec); - - ir_assignment *const assign = - new(this->mem_ctx) ir_assignment(lhs, cmp, NULL, (1U << i)); - - this->base_ir->insert_before(assign); - } - - ir_rvalue *const val = new(this->mem_ctx) ir_dereference_variable(tmp_bvec); - ir_expression *any = new(this->mem_ctx) ir_expression(ir_unop_any, val); - - if (test_equal) - any = new(this->mem_ctx) ir_expression(ir_unop_logic_not, any); - - ir_assignment *const assign = - new(mem_ctx) ir_assignment(result->clone(mem_ctx, NULL), any); - base_ir->insert_before(assign); -} - -static bool -has_matrix_operand(const ir_expression *expr, unsigned &columns) -{ - for (unsigned i = 0; i < expr->get_num_operands(); i++) { - if (expr->operands[i]->type->is_matrix()) { - columns = expr->operands[i]->type->matrix_columns; - return true; - } - } - - return false; -} - - -ir_visitor_status -ir_mat_op_to_vec_visitor::visit_leave(ir_assignment *orig_assign) -{ - ir_expression *orig_expr = orig_assign->rhs->as_expression(); - unsigned int i, matrix_columns = 1; - ir_dereference *op[2]; - - if (!orig_expr) - return visit_continue; - - if (!has_matrix_operand(orig_expr, matrix_columns)) - return visit_continue; - - assert(orig_expr->get_num_operands() <= 2); - - mem_ctx = ralloc_parent(orig_assign); - - ir_dereference_variable *result = - orig_assign->lhs->as_dereference_variable(); - assert(result); - - /* Store the expression operands in temps so we can use them - * multiple times. - */ - for (i = 0; i < orig_expr->get_num_operands(); i++) { - ir_assignment *assign; - ir_dereference *deref = orig_expr->operands[i]->as_dereference(); - - /* Avoid making a temporary if we don't need to to avoid aliasing. */ - if (deref && - deref->variable_referenced() != result->variable_referenced()) { - op[i] = deref; - continue; - } - - /* Otherwise, store the operand in a temporary generally if it's - * not a dereference. - */ - ir_variable *var = new(mem_ctx) ir_variable(orig_expr->operands[i]->type, - "mat_op_to_vec", - ir_var_temporary, precision_from_ir(orig_expr->operands[i])); - base_ir->insert_before(var); - - /* Note that we use this dereference for the assignment. That means - * that others that want to use op[i] have to clone the deref. - */ - op[i] = new(mem_ctx) ir_dereference_variable(var); - assign = new(mem_ctx) ir_assignment(op[i], orig_expr->operands[i]); - base_ir->insert_before(assign); - } - - /* OK, time to break down this matrix operation. */ - switch (orig_expr->operation) { - case ir_unop_neg: { - /* Apply the operation to each column.*/ - for (i = 0; i < matrix_columns; i++) { - ir_expression *column_expr; - ir_assignment *column_assign; - - column_expr = new(mem_ctx) ir_expression(orig_expr->operation, - get_column(op[0], i)); - - column_assign = new(mem_ctx) ir_assignment(get_column(result, i), - column_expr); - assert(column_assign->write_mask != 0); - base_ir->insert_before(column_assign); - } - break; - } - case ir_binop_add: - case ir_binop_sub: - case ir_binop_div: - case ir_binop_mod: { - /* For most operations, the matrix version is just going - * column-wise through and applying the operation to each column - * if available. - */ - for (i = 0; i < matrix_columns; i++) { - ir_expression *column_expr; - ir_assignment *column_assign; - - column_expr = new(mem_ctx) ir_expression(orig_expr->operation, - get_column(op[0], i), - get_column(op[1], i)); - - column_assign = new(mem_ctx) ir_assignment(get_column(result, i), - column_expr); - assert(column_assign->write_mask != 0); - base_ir->insert_before(column_assign); - } - break; - } - case ir_binop_mul: - if (op[0]->type->is_matrix()) { - if (op[1]->type->is_matrix()) { - do_mul_mat_mat(result, op[0], op[1]); - } else if (op[1]->type->is_vector()) { - do_mul_mat_vec(result, op[0], op[1]); - } else { - assert(op[1]->type->is_scalar()); - do_mul_mat_scalar(result, op[0], op[1]); - } - } else { - assert(op[1]->type->is_matrix()); - if (op[0]->type->is_vector()) { - do_mul_vec_mat(result, op[0], op[1]); - } else { - assert(op[0]->type->is_scalar()); - do_mul_mat_scalar(result, op[1], op[0]); - } - } - break; - - case ir_binop_all_equal: - case ir_binop_any_nequal: - do_equal_mat_mat(result, op[1], op[0], - (orig_expr->operation == ir_binop_all_equal)); - break; - - default: - printf("FINISHME: Handle matrix operation for %s\n", - orig_expr->operator_string()); - abort(); - } - orig_assign->remove(); - this->made_progress = true; - - return visit_continue; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_named_interface_blocks.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_named_interface_blocks.cpp deleted file mode 100644 index c128d9220..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_named_interface_blocks.cpp +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (c) 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file lower_named_interface_blocks.cpp - * - * This lowering pass converts all interface blocks with instance names - * into interface blocks without an instance name. - * - * For example, the following shader: - * - * out block { - * float block_var; - * } inst_name; - * - * main() - * { - * inst_name.block_var = 0.0; - * } - * - * Is rewritten to: - * - * out block { - * float block_var; - * }; - * - * main() - * { - * block_var = 0.0; - * } - * - * This takes place after the shader code has already been verified with - * the interface name in place. - * - * The linking phase will use the interface block name rather than the - * interface's instance name when linking interfaces. - * - * This modification to the ir allows our currently existing dead code - * elimination to work with interface blocks without changes. - */ - -#include "glsl_symbol_table.h" -#include "ir.h" -#include "ir_optimization.h" -#include "ir_rvalue_visitor.h" -#include "program/hash_table.h" - -namespace { - -class flatten_named_interface_blocks_declarations : public ir_rvalue_visitor -{ -public: - void * const mem_ctx; - hash_table *interface_namespace; - - flatten_named_interface_blocks_declarations(void *mem_ctx) - : mem_ctx(mem_ctx), - interface_namespace(NULL) - { - } - - void run(exec_list *instructions); - - virtual ir_visitor_status visit_leave(ir_assignment *); - virtual void handle_rvalue(ir_rvalue **rvalue); -}; - -} /* anonymous namespace */ - -void -flatten_named_interface_blocks_declarations::run(exec_list *instructions) -{ - interface_namespace = hash_table_ctor(0, hash_table_string_hash, - hash_table_string_compare); - - /* First pass: adjust instance block variables with an instance name - * to not have an instance name. - * - * The interface block variables are stored in the interface_namespace - * hash table so they can be used in the second pass. - */ - foreach_in_list_safe(ir_instruction, node, instructions) { - ir_variable *var = node->as_variable(); - if (!var || !var->is_interface_instance()) - continue; - - /* It should be possible to handle uniforms during this pass, - * but, this will require changes to the other uniform block - * support code. - */ - if (var->data.mode == ir_var_uniform) - continue; - - const glsl_type * iface_t = var->type; - const glsl_type * array_t = NULL; - exec_node *insert_pos = var; - - if (iface_t->is_array()) { - array_t = iface_t; - iface_t = array_t->fields.array; - } - - assert (iface_t->is_interface()); - - for (unsigned i = 0; i < iface_t->length; i++) { - const char * field_name = iface_t->fields.structure[i].name; - char *iface_field_name = - ralloc_asprintf(mem_ctx, "%s.%s.%s", - iface_t->name, var->name, field_name); - - ir_variable *found_var = - (ir_variable *) hash_table_find(interface_namespace, - iface_field_name); - if (!found_var) { - ir_variable *new_var; - char *var_name = - ralloc_strdup(mem_ctx, iface_t->fields.structure[i].name); - if (array_t == NULL) { - new_var = - new(mem_ctx) ir_variable(iface_t->fields.structure[i].type, - var_name, - (ir_variable_mode) var->data.mode, - iface_t->fields.structure[i].precision); - new_var->data.from_named_ifc_block_nonarray = 1; - } else { - const glsl_type *new_array_type = - glsl_type::get_array_instance( - iface_t->fields.structure[i].type, - array_t->length); - new_var = - new(mem_ctx) ir_variable(new_array_type, - var_name, - (ir_variable_mode) var->data.mode, - iface_t->fields.structure[i].precision); - new_var->data.from_named_ifc_block_array = 1; - } - new_var->data.location = iface_t->fields.structure[i].location; - new_var->data.explicit_location = (new_var->data.location >= 0); - new_var->data.interpolation = - iface_t->fields.structure[i].interpolation; - new_var->data.centroid = iface_t->fields.structure[i].centroid; - new_var->data.sample = iface_t->fields.structure[i].sample; - - new_var->init_interface_type(iface_t); - hash_table_insert(interface_namespace, new_var, - iface_field_name); - insert_pos->insert_after(new_var); - insert_pos = new_var; - } - } - var->remove(); - } - - /* Second pass: visit all ir_dereference_record instances, and if they - * reference an interface block, then flatten the refererence out. - */ - visit_list_elements(this, instructions); - hash_table_dtor(interface_namespace); - interface_namespace = NULL; -} - -ir_visitor_status -flatten_named_interface_blocks_declarations::visit_leave(ir_assignment *ir) -{ - ir_dereference_record *lhs_rec = ir->lhs->as_dereference_record(); - if (lhs_rec) { - ir_rvalue *lhs_rec_tmp = lhs_rec; - handle_rvalue(&lhs_rec_tmp); - if (lhs_rec_tmp != lhs_rec) { - ir->set_lhs(lhs_rec_tmp); - } - } - return rvalue_visit(ir); -} - -void -flatten_named_interface_blocks_declarations::handle_rvalue(ir_rvalue **rvalue) -{ - if (*rvalue == NULL) - return; - - ir_dereference_record *ir = (*rvalue)->as_dereference_record(); - if (ir == NULL) - return; - - ir_variable *var = ir->variable_referenced(); - if (var == NULL) - return; - - if (!var->is_interface_instance()) - return; - - /* It should be possible to handle uniforms during this pass, - * but, this will require changes to the other uniform block - * support code. - */ - if (var->data.mode == ir_var_uniform) - return; - - if (var->get_interface_type() != NULL) { - char *iface_field_name = - ralloc_asprintf(mem_ctx, "%s.%s.%s", var->get_interface_type()->name, - var->name, ir->field); - /* Find the variable in the set of flattened interface blocks */ - ir_variable *found_var = - (ir_variable *) hash_table_find(interface_namespace, - iface_field_name); - assert(found_var); - - ir_dereference_variable *deref_var = - new(mem_ctx) ir_dereference_variable(found_var); - - ir_dereference_array *deref_array = - ir->record->as_dereference_array(); - if (deref_array != NULL) { - *rvalue = - new(mem_ctx) ir_dereference_array(deref_var, - deref_array->array_index); - } else { - *rvalue = deref_var; - } - } -} - -void -lower_named_interface_blocks(void *mem_ctx, gl_shader *shader) -{ - flatten_named_interface_blocks_declarations v_decl(mem_ctx); - v_decl.run(shader->ir); -} - diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_noise.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_noise.cpp deleted file mode 100644 index 85f59b675..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_noise.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file lower_noise.cpp - * IR lower pass to remove noise opcodes. - * - * \author Ian Romanick - */ - -#include "ir.h" -#include "ir_rvalue_visitor.h" - -class lower_noise_visitor : public ir_rvalue_visitor { -public: - lower_noise_visitor() : progress(false) - { - /* empty */ - } - - void handle_rvalue(ir_rvalue **rvalue) - { - if (!*rvalue) - return; - - ir_expression *expr = (*rvalue)->as_expression(); - if (!expr) - return; - - /* In the future, ir_unop_noise may be replaced by a call to a function - * that implements noise. No hardware has a noise instruction. - */ - if (expr->operation == ir_unop_noise) { - *rvalue = ir_constant::zero(ralloc_parent(expr), expr->type); - this->progress = true; - } - } - - bool progress; -}; - - -bool -lower_noise(exec_list *instructions) -{ - lower_noise_visitor v; - - visit_list_elements(&v, instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_offset_array.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_offset_array.cpp deleted file mode 100644 index 859e5e788..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_offset_array.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright © 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file brw_lower_offset_array.cpp - * - * IR lower pass to decompose ir_texture ir_tg4 with an array of offsets - * into four ir_tg4s with a single ivec2 offset, select the .w component of each, - * and return those four values packed into a gvec4. - * - * \author Chris Forbes - */ - -#include "glsl_types.h" -#include "ir.h" -#include "ir_builder.h" -#include "ir_optimization.h" -#include "ir_rvalue_visitor.h" - -using namespace ir_builder; - -class brw_lower_offset_array_visitor : public ir_rvalue_visitor { -public: - brw_lower_offset_array_visitor() - { - progress = false; - } - - void handle_rvalue(ir_rvalue **rv); - - bool progress; -}; - -void -brw_lower_offset_array_visitor::handle_rvalue(ir_rvalue **rv) -{ - if (*rv == NULL || (*rv)->ir_type != ir_type_texture) - return; - - ir_texture *ir = (ir_texture *) *rv; - if (ir->op != ir_tg4 || !ir->offset || !ir->offset->type->is_array()) - return; - - void *mem_ctx = ralloc_parent(ir); - - ir_variable *var = - new (mem_ctx) ir_variable(ir->type, "result", ir_var_temporary, ir->get_precision()); - base_ir->insert_before(var); - - for (int i = 0; i < 4; i++) { - ir_texture *tex = ir->clone(mem_ctx, NULL); - tex->offset = new (mem_ctx) ir_dereference_array(tex->offset, - new (mem_ctx) ir_constant(i)); - - base_ir->insert_before(assign(var, swizzle_w(tex), 1 << i)); - } - - *rv = new (mem_ctx) ir_dereference_variable(var); - - progress = true; -} - -bool -lower_offset_arrays(exec_list *instructions) -{ - brw_lower_offset_array_visitor v; - - visit_list_elements(&v, instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_output_reads.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_output_reads.cpp deleted file mode 100644 index 9d536e6f3..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_output_reads.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright © 2012 Vincent Lejeune - * Copyright © 2012 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "ir.h" -#include "program/hash_table.h" - -/** - * \file lower_output_reads.cpp - * - * In GLSL, shader output variables (such as varyings) can be both read and - * written. However, on some hardware, reading an output register causes - * trouble. - * - * This pass creates temporary shadow copies of every (used) shader output, - * and replaces all accesses to use those instead. It also adds code to the - * main() function to copy the final values to the actual shader outputs. - */ - -namespace { - -class output_read_remover : public ir_hierarchical_visitor { -protected: - /** - * A hash table mapping from the original ir_variable shader outputs - * (ir_var_shader_out mode) to the new temporaries to be used instead. - */ - hash_table *replacements; - - void *mem_ctx; -public: - output_read_remover(); - ~output_read_remover(); - virtual ir_visitor_status visit(class ir_dereference_variable *); - virtual ir_visitor_status visit_leave(class ir_emit_vertex *); - virtual ir_visitor_status visit_leave(class ir_return *); - virtual ir_visitor_status visit_leave(class ir_function_signature *); -}; - -} /* anonymous namespace */ - -/** - * Hash function for the output variables - computes the hash of the name. - * NOTE: We're using the name string to ensure that the hash doesn't depend - * on any random factors, otherwise the output_read_remover could produce - * the random order of the assignments. - * - * NOTE: If you want to reuse this function please take into account that - * generally the names of the variables are non-unique. - */ -static unsigned -hash_table_var_hash(const void *key) -{ - const ir_variable * var = static_cast(key); - return hash_table_string_hash(var->name); -} - -output_read_remover::output_read_remover() -{ - mem_ctx = ralloc_context(NULL); - replacements = - hash_table_ctor(0, hash_table_var_hash, hash_table_pointer_compare); -} - -output_read_remover::~output_read_remover() -{ - hash_table_dtor(replacements); - ralloc_free(mem_ctx); -} - -ir_visitor_status -output_read_remover::visit(ir_dereference_variable *ir) -{ - if (ir->var->data.mode != ir_var_shader_out) - return visit_continue; - - ir_variable *temp = (ir_variable *) hash_table_find(replacements, ir->var); - - /* If we don't have an existing temporary, create one. */ - if (temp == NULL) { - void *var_ctx = ralloc_parent(ir->var); - temp = new(var_ctx) ir_variable(ir->var->type, ir->var->name, - ir_var_temporary, (glsl_precision)ir->var->data.precision); - hash_table_insert(replacements, temp, ir->var); - ir->var->insert_after(temp); - } - - /* Update the dereference to use the temporary */ - ir->var = temp; - - return visit_continue; -} - -/** - * Create an assignment to copy a temporary value back to the actual output. - */ -static ir_assignment * -copy(void *ctx, ir_variable *output, ir_variable *temp) -{ - ir_dereference_variable *lhs = new(ctx) ir_dereference_variable(output); - ir_dereference_variable *rhs = new(ctx) ir_dereference_variable(temp); - return new(ctx) ir_assignment(lhs, rhs); -} - -/** Insert a copy-back assignment before a "return" statement or a call to - * EmitVertex(). - */ -static void -emit_return_copy(const void *key, void *data, void *closure) -{ - ir_return *ir = (ir_return *) closure; - ir->insert_before(copy(ir, (ir_variable *) key, (ir_variable *) data)); -} - -/** Insert a copy-back assignment at the end of the main() function */ -static void -emit_main_copy(const void *key, void *data, void *closure) -{ - ir_function_signature *sig = (ir_function_signature *) closure; - sig->body.push_tail(copy(sig, (ir_variable *) key, (ir_variable *) data)); -} - -ir_visitor_status -output_read_remover::visit_leave(ir_return *ir) -{ - hash_table_call_foreach(replacements, emit_return_copy, ir); - return visit_continue; -} - -ir_visitor_status -output_read_remover::visit_leave(ir_emit_vertex *ir) -{ - hash_table_call_foreach(replacements, emit_return_copy, ir); - hash_table_clear(replacements); - return visit_continue; -} - -ir_visitor_status -output_read_remover::visit_leave(ir_function_signature *sig) -{ - if (strcmp(sig->function_name(), "main") != 0) - return visit_continue; - - hash_table_call_foreach(replacements, emit_main_copy, sig); - return visit_continue; -} - -void -lower_output_reads(exec_list *instructions) -{ - output_read_remover v; - visit_list_elements(&v, instructions); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_packed_varyings.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_packed_varyings.cpp deleted file mode 100644 index ae85a2053..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_packed_varyings.cpp +++ /dev/null @@ -1,681 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file lower_varyings_to_packed.cpp - * - * This lowering pass generates GLSL code that manually packs varyings into - * vec4 slots, for the benefit of back-ends that don't support packed varyings - * natively. - * - * For example, the following shader: - * - * out mat3x2 foo; // location=4, location_frac=0 - * out vec3 bar[2]; // location=5, location_frac=2 - * - * main() - * { - * ... - * } - * - * Is rewritten to: - * - * mat3x2 foo; - * vec3 bar[2]; - * out vec4 packed4; // location=4, location_frac=0 - * out vec4 packed5; // location=5, location_frac=0 - * out vec4 packed6; // location=6, location_frac=0 - * - * main() - * { - * ... - * packed4.xy = foo[0]; - * packed4.zw = foo[1]; - * packed5.xy = foo[2]; - * packed5.zw = bar[0].xy; - * packed6.x = bar[0].z; - * packed6.yzw = bar[1]; - * } - * - * This lowering pass properly handles "double parking" of a varying vector - * across two varying slots. For example, in the code above, two of the - * components of bar[0] are stored in packed5, and the remaining component is - * stored in packed6. - * - * Note that in theory, the extra instructions may cause some loss of - * performance. However, hopefully in most cases the performance loss will - * either be absorbed by a later optimization pass, or it will be offset by - * memory bandwidth savings (because fewer varyings are used). - * - * This lowering pass also packs flat floats, ints, and uints together, by - * using ivec4 as the base type of flat "varyings", and using appropriate - * casts to convert floats and uints into ints. - * - * This lowering pass also handles varyings whose type is a struct or an array - * of struct. Structs are packed in order and with no gaps, so there may be a - * performance penalty due to structure elements being double-parked. - * - * Lowering of geometry shader inputs is slightly more complex, since geometry - * inputs are always arrays, so we need to lower arrays to arrays. For - * example, the following input: - * - * in struct Foo { - * float f; - * vec3 v; - * vec2 a[2]; - * } arr[3]; // location=4, location_frac=0 - * - * Would get lowered like this if it occurred in a fragment shader: - * - * struct Foo { - * float f; - * vec3 v; - * vec2 a[2]; - * } arr[3]; - * in vec4 packed4; // location=4, location_frac=0 - * in vec4 packed5; // location=5, location_frac=0 - * in vec4 packed6; // location=6, location_frac=0 - * in vec4 packed7; // location=7, location_frac=0 - * in vec4 packed8; // location=8, location_frac=0 - * in vec4 packed9; // location=9, location_frac=0 - * - * main() - * { - * arr[0].f = packed4.x; - * arr[0].v = packed4.yzw; - * arr[0].a[0] = packed5.xy; - * arr[0].a[1] = packed5.zw; - * arr[1].f = packed6.x; - * arr[1].v = packed6.yzw; - * arr[1].a[0] = packed7.xy; - * arr[1].a[1] = packed7.zw; - * arr[2].f = packed8.x; - * arr[2].v = packed8.yzw; - * arr[2].a[0] = packed9.xy; - * arr[2].a[1] = packed9.zw; - * ... - * } - * - * But it would get lowered like this if it occurred in a geometry shader: - * - * struct Foo { - * float f; - * vec3 v; - * vec2 a[2]; - * } arr[3]; - * in vec4 packed4[3]; // location=4, location_frac=0 - * in vec4 packed5[3]; // location=5, location_frac=0 - * - * main() - * { - * arr[0].f = packed4[0].x; - * arr[0].v = packed4[0].yzw; - * arr[0].a[0] = packed5[0].xy; - * arr[0].a[1] = packed5[0].zw; - * arr[1].f = packed4[1].x; - * arr[1].v = packed4[1].yzw; - * arr[1].a[0] = packed5[1].xy; - * arr[1].a[1] = packed5[1].zw; - * arr[2].f = packed4[2].x; - * arr[2].v = packed4[2].yzw; - * arr[2].a[0] = packed5[2].xy; - * arr[2].a[1] = packed5[2].zw; - * ... - * } - */ - -#include "glsl_symbol_table.h" -#include "ir.h" -#include "ir_optimization.h" - -namespace { - -/** - * Visitor that performs varying packing. For each varying declared in the - * shader, this visitor determines whether it needs to be packed. If so, it - * demotes it to an ordinary global, creates new packed varyings, and - * generates assignments to convert between the original varying and the - * packed varying. - */ -class lower_packed_varyings_visitor -{ -public: - lower_packed_varyings_visitor(void *mem_ctx, unsigned locations_used, - ir_variable_mode mode, - unsigned gs_input_vertices, - exec_list *out_instructions); - - void run(exec_list *instructions); - -private: - ir_assignment *bitwise_assign_pack(ir_rvalue *lhs, ir_rvalue *rhs); - ir_assignment *bitwise_assign_unpack(ir_rvalue *lhs, ir_rvalue *rhs); - unsigned lower_rvalue(ir_rvalue *rvalue, unsigned fine_location, - ir_variable *unpacked_var, const char *name, - bool gs_input_toplevel, unsigned vertex_index); - unsigned lower_arraylike(ir_rvalue *rvalue, unsigned array_size, - unsigned fine_location, - ir_variable *unpacked_var, const char *name, - bool gs_input_toplevel, unsigned vertex_index); - ir_dereference *get_packed_varying_deref(unsigned location, - ir_variable *unpacked_var, - const char *name, - unsigned vertex_index); - bool needs_lowering(ir_variable *var); - - /** - * Memory context used to allocate new instructions for the shader. - */ - void * const mem_ctx; - - /** - * Number of generic varying slots which are used by this shader. This is - * used to allocate temporary intermediate data structures. If any varying - * used by this shader has a location greater than or equal to - * VARYING_SLOT_VAR0 + locations_used, an assertion will fire. - */ - const unsigned locations_used; - - /** - * Array of pointers to the packed varyings that have been created for each - * generic varying slot. NULL entries in this array indicate varying slots - * for which a packed varying has not been created yet. - */ - ir_variable **packed_varyings; - - /** - * Type of varying which is being lowered in this pass (either - * ir_var_shader_in or ir_var_shader_out). - */ - const ir_variable_mode mode; - - /** - * If we are currently lowering geometry shader inputs, the number of input - * vertices the geometry shader accepts. Otherwise zero. - */ - const unsigned gs_input_vertices; - - /** - * Exec list into which the visitor should insert the packing instructions. - * Caller provides this list; it should insert the instructions into the - * appropriate place in the shader once the visitor has finished running. - */ - exec_list *out_instructions; -}; - -} /* anonymous namespace */ - -lower_packed_varyings_visitor::lower_packed_varyings_visitor( - void *mem_ctx, unsigned locations_used, ir_variable_mode mode, - unsigned gs_input_vertices, exec_list *out_instructions) - : mem_ctx(mem_ctx), - locations_used(locations_used), - packed_varyings((ir_variable **) - rzalloc_array_size(mem_ctx, sizeof(*packed_varyings), - locations_used)), - mode(mode), - gs_input_vertices(gs_input_vertices), - out_instructions(out_instructions) -{ -} - -void -lower_packed_varyings_visitor::run(exec_list *instructions) -{ - foreach_in_list(ir_instruction, node, instructions) { - ir_variable *var = node->as_variable(); - if (var == NULL) - continue; - - if (var->data.mode != this->mode || - var->data.location < VARYING_SLOT_VAR0 || - !this->needs_lowering(var)) - continue; - - /* This lowering pass is only capable of packing floats and ints - * together when their interpolation mode is "flat". Therefore, to be - * safe, caller should ensure that integral varyings always use flat - * interpolation, even when this is not required by GLSL. - */ - assert(var->data.interpolation == INTERP_QUALIFIER_FLAT || - !var->type->contains_integer()); - - /* Change the old varying into an ordinary global. */ - assert(var->data.mode != ir_var_temporary); - var->data.mode = ir_var_auto; - - /* Create a reference to the old varying. */ - ir_dereference_variable *deref - = new(this->mem_ctx) ir_dereference_variable(var); - - /* Recursively pack or unpack it. */ - this->lower_rvalue(deref, var->data.location * 4 + var->data.location_frac, var, - var->name, this->gs_input_vertices != 0, 0); - } -} - - -/** - * Make an ir_assignment from \c rhs to \c lhs, performing appropriate - * bitcasts if necessary to match up types. - * - * This function is called when packing varyings. - */ -ir_assignment * -lower_packed_varyings_visitor::bitwise_assign_pack(ir_rvalue *lhs, - ir_rvalue *rhs) -{ - if (lhs->type->base_type != rhs->type->base_type) { - /* Since we only mix types in flat varyings, and we always store flat - * varyings as type ivec4, we need only produce conversions from (uint - * or float) to int. - */ - assert(lhs->type->base_type == GLSL_TYPE_INT); - switch (rhs->type->base_type) { - case GLSL_TYPE_UINT: - rhs = new(this->mem_ctx) - ir_expression(ir_unop_u2i, lhs->type, rhs); - break; - case GLSL_TYPE_FLOAT: - rhs = new(this->mem_ctx) - ir_expression(ir_unop_bitcast_f2i, lhs->type, rhs); - break; - default: - assert(!"Unexpected type conversion while lowering varyings"); - break; - } - } - return new(this->mem_ctx) ir_assignment(lhs, rhs); -} - - -/** - * Make an ir_assignment from \c rhs to \c lhs, performing appropriate - * bitcasts if necessary to match up types. - * - * This function is called when unpacking varyings. - */ -ir_assignment * -lower_packed_varyings_visitor::bitwise_assign_unpack(ir_rvalue *lhs, - ir_rvalue *rhs) -{ - if (lhs->type->base_type != rhs->type->base_type) { - /* Since we only mix types in flat varyings, and we always store flat - * varyings as type ivec4, we need only produce conversions from int to - * (uint or float). - */ - assert(rhs->type->base_type == GLSL_TYPE_INT); - switch (lhs->type->base_type) { - case GLSL_TYPE_UINT: - rhs = new(this->mem_ctx) - ir_expression(ir_unop_i2u, lhs->type, rhs); - break; - case GLSL_TYPE_FLOAT: - rhs = new(this->mem_ctx) - ir_expression(ir_unop_bitcast_i2f, lhs->type, rhs); - break; - default: - assert(!"Unexpected type conversion while lowering varyings"); - break; - } - } - return new(this->mem_ctx) ir_assignment(lhs, rhs); -} - - -/** - * Recursively pack or unpack the given varying (or portion of a varying) by - * traversing all of its constituent vectors. - * - * \param fine_location is the location where the first constituent vector - * should be packed--the word "fine" indicates that this location is expressed - * in multiples of a float, rather than multiples of a vec4 as is used - * elsewhere in Mesa. - * - * \param gs_input_toplevel should be set to true if we are lowering geometry - * shader inputs, and we are currently lowering the whole input variable - * (i.e. we are lowering the array whose index selects the vertex). - * - * \param vertex_index: if we are lowering geometry shader inputs, and the - * level of the array that we are currently lowering is *not* the top level, - * then this indicates which vertex we are currently lowering. Otherwise it - * is ignored. - * - * \return the location where the next constituent vector (after this one) - * should be packed. - */ -unsigned -lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue, - unsigned fine_location, - ir_variable *unpacked_var, - const char *name, - bool gs_input_toplevel, - unsigned vertex_index) -{ - /* When gs_input_toplevel is set, we should be looking at a geometry shader - * input array. - */ - assert(!gs_input_toplevel || rvalue->type->is_array()); - - if (rvalue->type->is_record()) { - for (unsigned i = 0; i < rvalue->type->length; i++) { - if (i != 0) - rvalue = rvalue->clone(this->mem_ctx, NULL); - const char *field_name = rvalue->type->fields.structure[i].name; - ir_dereference_record *dereference_record = new(this->mem_ctx) - ir_dereference_record(rvalue, field_name); - char *deref_name - = ralloc_asprintf(this->mem_ctx, "%s.%s", name, field_name); - fine_location = this->lower_rvalue(dereference_record, fine_location, - unpacked_var, deref_name, false, - vertex_index); - } - return fine_location; - } else if (rvalue->type->is_array()) { - /* Arrays are packed/unpacked by considering each array element in - * sequence. - */ - return this->lower_arraylike(rvalue, rvalue->type->array_size(), - fine_location, unpacked_var, name, - gs_input_toplevel, vertex_index); - } else if (rvalue->type->is_matrix()) { - /* Matrices are packed/unpacked by considering each column vector in - * sequence. - */ - return this->lower_arraylike(rvalue, rvalue->type->matrix_columns, - fine_location, unpacked_var, name, - false, vertex_index); - } else if (rvalue->type->vector_elements + fine_location % 4 > 4) { - /* This vector is going to be "double parked" across two varying slots, - * so handle it as two separate assignments. - */ - unsigned left_components = 4 - fine_location % 4; - unsigned right_components - = rvalue->type->vector_elements - left_components; - unsigned left_swizzle_values[4] = { 0, 0, 0, 0 }; - unsigned right_swizzle_values[4] = { 0, 0, 0, 0 }; - char left_swizzle_name[4] = { 0, 0, 0, 0 }; - char right_swizzle_name[4] = { 0, 0, 0, 0 }; - for (unsigned i = 0; i < left_components; i++) { - left_swizzle_values[i] = i; - left_swizzle_name[i] = "xyzw"[i]; - } - for (unsigned i = 0; i < right_components; i++) { - right_swizzle_values[i] = i + left_components; - right_swizzle_name[i] = "xyzw"[i + left_components]; - } - ir_swizzle *left_swizzle = new(this->mem_ctx) - ir_swizzle(rvalue, left_swizzle_values, left_components); - ir_swizzle *right_swizzle = new(this->mem_ctx) - ir_swizzle(rvalue->clone(this->mem_ctx, NULL), right_swizzle_values, - right_components); - char *left_name - = ralloc_asprintf(this->mem_ctx, "%s.%s", name, left_swizzle_name); - char *right_name - = ralloc_asprintf(this->mem_ctx, "%s.%s", name, right_swizzle_name); - fine_location = this->lower_rvalue(left_swizzle, fine_location, - unpacked_var, left_name, false, - vertex_index); - return this->lower_rvalue(right_swizzle, fine_location, unpacked_var, - right_name, false, vertex_index); - } else { - /* No special handling is necessary; pack the rvalue into the - * varying. - */ - unsigned swizzle_values[4] = { 0, 0, 0, 0 }; - unsigned components = rvalue->type->vector_elements; - unsigned location = fine_location / 4; - unsigned location_frac = fine_location % 4; - for (unsigned i = 0; i < components; ++i) - swizzle_values[i] = i + location_frac; - ir_dereference *packed_deref = - this->get_packed_varying_deref(location, unpacked_var, name, - vertex_index); - ir_swizzle *swizzle = new(this->mem_ctx) - ir_swizzle(packed_deref, swizzle_values, components); - if (this->mode == ir_var_shader_out) { - ir_assignment *assignment - = this->bitwise_assign_pack(swizzle, rvalue); - this->out_instructions->push_tail(assignment); - } else { - ir_assignment *assignment - = this->bitwise_assign_unpack(rvalue, swizzle); - this->out_instructions->push_tail(assignment); - } - return fine_location + components; - } -} - -/** - * Recursively pack or unpack a varying for which we need to iterate over its - * constituent elements, accessing each one using an ir_dereference_array. - * This takes care of both arrays and matrices, since ir_dereference_array - * treats a matrix like an array of its column vectors. - * - * \param gs_input_toplevel should be set to true if we are lowering geometry - * shader inputs, and we are currently lowering the whole input variable - * (i.e. we are lowering the array whose index selects the vertex). - * - * \param vertex_index: if we are lowering geometry shader inputs, and the - * level of the array that we are currently lowering is *not* the top level, - * then this indicates which vertex we are currently lowering. Otherwise it - * is ignored. - */ -unsigned -lower_packed_varyings_visitor::lower_arraylike(ir_rvalue *rvalue, - unsigned array_size, - unsigned fine_location, - ir_variable *unpacked_var, - const char *name, - bool gs_input_toplevel, - unsigned vertex_index) -{ - for (unsigned i = 0; i < array_size; i++) { - if (i != 0) - rvalue = rvalue->clone(this->mem_ctx, NULL); - ir_constant *constant = new(this->mem_ctx) ir_constant(i); - ir_dereference_array *dereference_array = new(this->mem_ctx) - ir_dereference_array(rvalue, constant); - if (gs_input_toplevel) { - /* Geometry shader inputs are a special case. Instead of storing - * each element of the array at a different location, all elements - * are at the same location, but with a different vertex index. - */ - (void) this->lower_rvalue(dereference_array, fine_location, - unpacked_var, name, false, i); - } else { - char *subscripted_name - = ralloc_asprintf(this->mem_ctx, "%s[%d]", name, i); - fine_location = - this->lower_rvalue(dereference_array, fine_location, - unpacked_var, subscripted_name, - false, vertex_index); - } - } - return fine_location; -} - -/** - * Retrieve the packed varying corresponding to the given varying location. - * If no packed varying has been created for the given varying location yet, - * create it and add it to the shader before returning it. - * - * The newly created varying inherits its interpolation parameters from \c - * unpacked_var. Its base type is ivec4 if we are lowering a flat varying, - * vec4 otherwise. - * - * \param vertex_index: if we are lowering geometry shader inputs, then this - * indicates which vertex we are currently lowering. Otherwise it is ignored. - */ -ir_dereference * -lower_packed_varyings_visitor::get_packed_varying_deref( - unsigned location, ir_variable *unpacked_var, const char *name, - unsigned vertex_index) -{ - unsigned slot = location - VARYING_SLOT_VAR0; - assert(slot < locations_used); - if (this->packed_varyings[slot] == NULL) { - char *packed_name = ralloc_asprintf(this->mem_ctx, "packed:%s", name); - const glsl_type *packed_type; - if (unpacked_var->data.interpolation == INTERP_QUALIFIER_FLAT) - packed_type = glsl_type::ivec4_type; - else - packed_type = glsl_type::vec4_type; - if (this->gs_input_vertices != 0) { - packed_type = - glsl_type::get_array_instance(packed_type, - this->gs_input_vertices); - } - ir_variable *packed_var = new(this->mem_ctx) - ir_variable(packed_type, packed_name, this->mode, (glsl_precision)unpacked_var->data.precision); - if (this->gs_input_vertices != 0) { - /* Prevent update_array_sizes() from messing with the size of the - * array. - */ - packed_var->data.max_array_access = this->gs_input_vertices - 1; - } - packed_var->data.centroid = unpacked_var->data.centroid; - packed_var->data.sample = unpacked_var->data.sample; - packed_var->data.interpolation = unpacked_var->data.interpolation; - packed_var->data.location = location; - unpacked_var->insert_before(packed_var); - this->packed_varyings[slot] = packed_var; - } else { - /* For geometry shader inputs, only update the packed variable name the - * first time we visit each component. - */ - if (this->gs_input_vertices == 0 || vertex_index == 0) { - ralloc_asprintf_append((char **) &this->packed_varyings[slot]->name, - ",%s", name); - } - } - - ir_dereference *deref = new(this->mem_ctx) - ir_dereference_variable(this->packed_varyings[slot]); - if (this->gs_input_vertices != 0) { - /* When lowering GS inputs, the packed variable is an array, so we need - * to dereference it using vertex_index. - */ - ir_constant *constant = new(this->mem_ctx) ir_constant(vertex_index); - deref = new(this->mem_ctx) ir_dereference_array(deref, constant); - } - return deref; -} - -bool -lower_packed_varyings_visitor::needs_lowering(ir_variable *var) -{ - /* Things composed of vec4's and varyings with explicitly assigned - * locations don't need lowering. Everything else does. - */ - if (var->data.explicit_location) - return false; - - const glsl_type *type = var->type; - if (this->gs_input_vertices != 0) { - assert(type->is_array()); - type = type->element_type(); - } - if (type->is_array()) - type = type->fields.array; - if (type->vector_elements == 4) - return false; - return true; -} - - -/** - * Visitor that splices varying packing code before every use of EmitVertex() - * in a geometry shader. - */ -class lower_packed_varyings_gs_splicer : public ir_hierarchical_visitor -{ -public: - explicit lower_packed_varyings_gs_splicer(void *mem_ctx, - const exec_list *instructions); - - virtual ir_visitor_status visit_leave(ir_emit_vertex *ev); - -private: - /** - * Memory context used to allocate new instructions for the shader. - */ - void * const mem_ctx; - - /** - * Instructions that should be spliced into place before each EmitVertex() - * call. - */ - const exec_list *instructions; -}; - - -lower_packed_varyings_gs_splicer::lower_packed_varyings_gs_splicer( - void *mem_ctx, const exec_list *instructions) - : mem_ctx(mem_ctx), instructions(instructions) -{ -} - - -ir_visitor_status -lower_packed_varyings_gs_splicer::visit_leave(ir_emit_vertex *ev) -{ - foreach_in_list(ir_instruction, ir, this->instructions) { - ev->insert_before(ir->clone(this->mem_ctx, NULL)); - } - return visit_continue; -} - - -void -lower_packed_varyings(void *mem_ctx, unsigned locations_used, - ir_variable_mode mode, unsigned gs_input_vertices, - gl_shader *shader) -{ - exec_list *instructions = shader->ir; - ir_function *main_func = shader->symbols->get_function("main"); - exec_list void_parameters; - ir_function_signature *main_func_sig - = main_func->matching_signature(NULL, &void_parameters, false); - exec_list new_instructions; - lower_packed_varyings_visitor visitor(mem_ctx, locations_used, mode, - gs_input_vertices, &new_instructions); - visitor.run(instructions); - if (mode == ir_var_shader_out) { - if (shader->Stage == MESA_SHADER_GEOMETRY) { - /* For geometry shaders, outputs need to be lowered before each call - * to EmitVertex() - */ - lower_packed_varyings_gs_splicer splicer(mem_ctx, &new_instructions); - splicer.run(instructions); - } else { - /* For other shader types, outputs need to be lowered at the end of - * main() - */ - main_func_sig->body.append_list(&new_instructions); - } - } else { - /* Shader inputs need to be lowered at the beginning of main() */ - main_func_sig->body.head->insert_before(&new_instructions); - } -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_packing_builtins.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_packing_builtins.cpp deleted file mode 100644 index f6b38e3f8..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_packing_builtins.cpp +++ /dev/null @@ -1,1314 +0,0 @@ -/* - * Copyright © 2012 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "ir.h" -#include "ir_builder.h" -#include "ir_optimization.h" -#include "ir_rvalue_visitor.h" - -namespace { - -using namespace ir_builder; - -/** - * A visitor that lowers built-in floating-point pack/unpack expressions - * such packSnorm2x16. - */ -class lower_packing_builtins_visitor : public ir_rvalue_visitor { -public: - /** - * \param op_mask is a bitmask of `enum lower_packing_builtins_op` - */ - explicit lower_packing_builtins_visitor(int op_mask) - : op_mask(op_mask), - progress(false) - { - /* Mutually exclusive options. */ - assert(!((op_mask & LOWER_PACK_HALF_2x16) && - (op_mask & LOWER_PACK_HALF_2x16_TO_SPLIT))); - - assert(!((op_mask & LOWER_UNPACK_HALF_2x16) && - (op_mask & LOWER_UNPACK_HALF_2x16_TO_SPLIT))); - - factory.instructions = &factory_instructions; - } - - virtual ~lower_packing_builtins_visitor() - { - assert(factory_instructions.is_empty()); - } - - bool get_progress() { return progress; } - - void handle_rvalue(ir_rvalue **rvalue) - { - if (!*rvalue) - return; - - ir_expression *expr = (*rvalue)->as_expression(); - if (!expr) - return; - - enum lower_packing_builtins_op lowering_op = - choose_lowering_op(expr->operation); - - if (lowering_op == LOWER_PACK_UNPACK_NONE) - return; - - setup_factory(ralloc_parent(expr)); - - ir_rvalue *op0 = expr->operands[0]; - ralloc_steal(factory.mem_ctx, op0); - - switch (lowering_op) { - case LOWER_PACK_SNORM_2x16: - *rvalue = lower_pack_snorm_2x16(op0); - break; - case LOWER_PACK_SNORM_4x8: - *rvalue = lower_pack_snorm_4x8(op0); - break; - case LOWER_PACK_UNORM_2x16: - *rvalue = lower_pack_unorm_2x16(op0); - break; - case LOWER_PACK_UNORM_4x8: - *rvalue = lower_pack_unorm_4x8(op0); - break; - case LOWER_PACK_HALF_2x16: - *rvalue = lower_pack_half_2x16(op0); - break; - case LOWER_PACK_HALF_2x16_TO_SPLIT: - *rvalue = split_pack_half_2x16(op0); - break; - case LOWER_UNPACK_SNORM_2x16: - *rvalue = lower_unpack_snorm_2x16(op0); - break; - case LOWER_UNPACK_SNORM_4x8: - *rvalue = lower_unpack_snorm_4x8(op0); - break; - case LOWER_UNPACK_UNORM_2x16: - *rvalue = lower_unpack_unorm_2x16(op0); - break; - case LOWER_UNPACK_UNORM_4x8: - *rvalue = lower_unpack_unorm_4x8(op0); - break; - case LOWER_UNPACK_HALF_2x16: - *rvalue = lower_unpack_half_2x16(op0); - break; - case LOWER_UNPACK_HALF_2x16_TO_SPLIT: - *rvalue = split_unpack_half_2x16(op0); - break; - case LOWER_PACK_UNPACK_NONE: - assert(!"not reached"); - break; - } - - teardown_factory(); - progress = true; - } - -private: - const int op_mask; - bool progress; - ir_factory factory; - exec_list factory_instructions; - - /** - * Determine the needed lowering operation by filtering \a expr_op - * through \ref op_mask. - */ - enum lower_packing_builtins_op - choose_lowering_op(ir_expression_operation expr_op) - { - /* C++ regards int and enum as fundamentally different types. - * So, we can't simply return from each case; we must cast the return - * value. - */ - int result; - - switch (expr_op) { - case ir_unop_pack_snorm_2x16: - result = op_mask & LOWER_PACK_SNORM_2x16; - break; - case ir_unop_pack_snorm_4x8: - result = op_mask & LOWER_PACK_SNORM_4x8; - break; - case ir_unop_pack_unorm_2x16: - result = op_mask & LOWER_PACK_UNORM_2x16; - break; - case ir_unop_pack_unorm_4x8: - result = op_mask & LOWER_PACK_UNORM_4x8; - break; - case ir_unop_pack_half_2x16: - result = op_mask & (LOWER_PACK_HALF_2x16 | LOWER_PACK_HALF_2x16_TO_SPLIT); - break; - case ir_unop_unpack_snorm_2x16: - result = op_mask & LOWER_UNPACK_SNORM_2x16; - break; - case ir_unop_unpack_snorm_4x8: - result = op_mask & LOWER_UNPACK_SNORM_4x8; - break; - case ir_unop_unpack_unorm_2x16: - result = op_mask & LOWER_UNPACK_UNORM_2x16; - break; - case ir_unop_unpack_unorm_4x8: - result = op_mask & LOWER_UNPACK_UNORM_4x8; - break; - case ir_unop_unpack_half_2x16: - result = op_mask & (LOWER_UNPACK_HALF_2x16 | LOWER_UNPACK_HALF_2x16_TO_SPLIT); - break; - default: - result = LOWER_PACK_UNPACK_NONE; - break; - } - - return static_cast(result); - } - - void - setup_factory(void *mem_ctx) - { - assert(factory.mem_ctx == NULL); - assert(factory.instructions->is_empty()); - - factory.mem_ctx = mem_ctx; - } - - void - teardown_factory() - { - base_ir->insert_before(factory.instructions); - assert(factory.instructions->is_empty()); - factory.mem_ctx = NULL; - } - - template - ir_constant* - constant(T x) - { - return factory.constant(x); - } - - /** - * \brief Pack two uint16's into a single uint32. - * - * Interpret the given uvec2 as a uint16 pair. Pack the pair into a uint32 - * where the least significant bits specify the first element of the pair. - * Return the uint32. - */ - ir_rvalue* - pack_uvec2_to_uint(ir_rvalue *uvec2_rval) - { - assert(uvec2_rval->type == glsl_type::uvec2_type); - - /* uvec2 u = UVEC2_RVAL; */ - ir_variable *u = factory.make_temp(glsl_type::uvec2_type, - "tmp_pack_uvec2_to_uint"); - factory.emit(assign(u, uvec2_rval)); - - /* return (u.y << 16) | (u.x & 0xffff); */ - return bit_or(lshift(swizzle_y(u), constant(16u)), - bit_and(swizzle_x(u), constant(0xffffu))); - } - - /** - * \brief Pack four uint8's into a single uint32. - * - * Interpret the given uvec4 as a uint32 4-typle. Pack the 4-tuple into a - * uint32 where the least significant bits specify the first element of the - * 4-tuple. Return the uint32. - */ - ir_rvalue* - pack_uvec4_to_uint(ir_rvalue *uvec4_rval) - { - assert(uvec4_rval->type == glsl_type::uvec4_type); - - /* uvec4 u = UVEC4_RVAL; */ - ir_variable *u = factory.make_temp(glsl_type::uvec4_type, - "tmp_pack_uvec4_to_uint"); - factory.emit(assign(u, bit_and(uvec4_rval, constant(0xffu)))); - - /* return (u.w << 24) | (u.z << 16) | (u.y << 8) | u.x; */ - return bit_or(bit_or(lshift(swizzle_w(u), constant(24u)), - lshift(swizzle_z(u), constant(16u))), - bit_or(lshift(swizzle_y(u), constant(8u)), - swizzle_x(u))); - } - - /** - * \brief Unpack a uint32 into two uint16's. - * - * Interpret the given uint32 as a uint16 pair where the uint32's least - * significant bits specify the pair's first element. Return the uint16 - * pair as a uvec2. - */ - ir_rvalue* - unpack_uint_to_uvec2(ir_rvalue *uint_rval) - { - assert(uint_rval->type == glsl_type::uint_type); - - /* uint u = UINT_RVAL; */ - ir_variable *u = factory.make_temp(glsl_type::uint_type, - "tmp_unpack_uint_to_uvec2_u"); - factory.emit(assign(u, uint_rval)); - - /* uvec2 u2; */ - ir_variable *u2 = factory.make_temp(glsl_type::uvec2_type, - "tmp_unpack_uint_to_uvec2_u2"); - - /* u2.x = u & 0xffffu; */ - factory.emit(assign(u2, bit_and(u, constant(0xffffu)), WRITEMASK_X)); - - /* u2.y = u >> 16u; */ - factory.emit(assign(u2, rshift(u, constant(16u)), WRITEMASK_Y)); - - return deref(u2).val; - } - - /** - * \brief Unpack a uint32 into four uint8's. - * - * Interpret the given uint32 as a uint8 4-tuple where the uint32's least - * significant bits specify the 4-tuple's first element. Return the uint8 - * 4-tuple as a uvec4. - */ - ir_rvalue* - unpack_uint_to_uvec4(ir_rvalue *uint_rval) - { - assert(uint_rval->type == glsl_type::uint_type); - - /* uint u = UINT_RVAL; */ - ir_variable *u = factory.make_temp(glsl_type::uint_type, - "tmp_unpack_uint_to_uvec4_u"); - factory.emit(assign(u, uint_rval)); - - /* uvec4 u4; */ - ir_variable *u4 = factory.make_temp(glsl_type::uvec4_type, - "tmp_unpack_uint_to_uvec4_u4"); - - /* u4.x = u & 0xffu; */ - factory.emit(assign(u4, bit_and(u, constant(0xffu)), WRITEMASK_X)); - - /* u4.y = (u >> 8u) & 0xffu; */ - factory.emit(assign(u4, bit_and(rshift(u, constant(8u)), - constant(0xffu)), WRITEMASK_Y)); - - /* u4.z = (u >> 16u) & 0xffu; */ - factory.emit(assign(u4, bit_and(rshift(u, constant(16u)), - constant(0xffu)), WRITEMASK_Z)); - - /* u4.w = (u >> 24u) */ - factory.emit(assign(u4, rshift(u, constant(24u)), WRITEMASK_W)); - - return deref(u4).val; - } - - /** - * \brief Lower a packSnorm2x16 expression. - * - * \param vec2_rval is packSnorm2x16's input - * \return packSnorm2x16's output as a uint rvalue - */ - ir_rvalue* - lower_pack_snorm_2x16(ir_rvalue *vec2_rval) - { - /* From page 88 (94 of pdf) of the GLSL ES 3.00 spec: - * - * highp uint packSnorm2x16(vec2 v) - * -------------------------------- - * First, converts each component of the normalized floating-point value - * v into 16-bit integer values. Then, the results are packed into the - * returned 32-bit unsigned integer. - * - * The conversion for component c of v to fixed point is done as - * follows: - * - * packSnorm2x16: round(clamp(c, -1, +1) * 32767.0) - * - * The first component of the vector will be written to the least - * significant bits of the output; the last component will be written to - * the most significant bits. - * - * This function generates IR that approximates the following pseudo-GLSL: - * - * return pack_uvec2_to_uint( - * uvec2(ivec2( - * round(clamp(VEC2_RVALUE, -1.0f, 1.0f) * 32767.0f)))); - * - * It is necessary to first convert the vec2 to ivec2 rather than directly - * converting vec2 to uvec2 because the latter conversion is undefined. - * From page 56 (62 of pdf) of the GLSL ES 3.00 spec: "It is undefined to - * convert a negative floating point value to an uint". - */ - assert(vec2_rval->type == glsl_type::vec2_type); - - ir_rvalue *result = pack_uvec2_to_uint( - i2u(f2i(round_even(mul(clamp(vec2_rval, - constant(-1.0f), - constant(1.0f)), - constant(32767.0f)))))); - - assert(result->type == glsl_type::uint_type); - return result; - } - - /** - * \brief Lower a packSnorm4x8 expression. - * - * \param vec4_rval is packSnorm4x8's input - * \return packSnorm4x8's output as a uint rvalue - */ - ir_rvalue* - lower_pack_snorm_4x8(ir_rvalue *vec4_rval) - { - /* From page 137 (143 of pdf) of the GLSL 4.30 spec: - * - * highp uint packSnorm4x8(vec4 v) - * ------------------------------- - * First, converts each component of the normalized floating-point value - * v into 8-bit integer values. Then, the results are packed into the - * returned 32-bit unsigned integer. - * - * The conversion for component c of v to fixed point is done as - * follows: - * - * packSnorm4x8: round(clamp(c, -1, +1) * 127.0) - * - * The first component of the vector will be written to the least - * significant bits of the output; the last component will be written to - * the most significant bits. - * - * This function generates IR that approximates the following pseudo-GLSL: - * - * return pack_uvec4_to_uint( - * uvec4(ivec4( - * round(clamp(VEC4_RVALUE, -1.0f, 1.0f) * 127.0f)))); - * - * It is necessary to first convert the vec4 to ivec4 rather than directly - * converting vec4 to uvec4 because the latter conversion is undefined. - * From page 87 (93 of pdf) of the GLSL 4.30 spec: "It is undefined to - * convert a negative floating point value to an uint". - */ - assert(vec4_rval->type == glsl_type::vec4_type); - - ir_rvalue *result = pack_uvec4_to_uint( - i2u(f2i(round_even(mul(clamp(vec4_rval, - constant(-1.0f), - constant(1.0f)), - constant(127.0f)))))); - - assert(result->type == glsl_type::uint_type); - return result; - } - - /** - * \brief Lower an unpackSnorm2x16 expression. - * - * \param uint_rval is unpackSnorm2x16's input - * \return unpackSnorm2x16's output as a vec2 rvalue - */ - ir_rvalue* - lower_unpack_snorm_2x16(ir_rvalue *uint_rval) - { - /* From page 88 (94 of pdf) of the GLSL ES 3.00 spec: - * - * highp vec2 unpackSnorm2x16 (highp uint p) - * ----------------------------------------- - * First, unpacks a single 32-bit unsigned integer p into a pair of - * 16-bit unsigned integers. Then, each component is converted to - * a normalized floating-point value to generate the returned - * two-component vector. - * - * The conversion for unpacked fixed-point value f to floating point is - * done as follows: - * - * unpackSnorm2x16: clamp(f / 32767.0, -1,+1) - * - * The first component of the returned vector will be extracted from the - * least significant bits of the input; the last component will be - * extracted from the most significant bits. - * - * This function generates IR that approximates the following pseudo-GLSL: - * - * return clamp( - * ((ivec2(unpack_uint_to_uvec2(UINT_RVALUE)) << 16) >> 16) / 32767.0f, - * -1.0f, 1.0f); - * - * The above IR may appear unnecessarily complex, but the intermediate - * conversion to ivec2 and the bit shifts are necessary to correctly unpack - * negative floats. - * - * To see why, consider packing and then unpacking vec2(-1.0, 0.0). - * packSnorm2x16 encodes -1.0 as the int16 0xffff. During unpacking, we - * place that int16 into an int32, which results in the *positive* integer - * 0x0000ffff. The int16's sign bit becomes, in the int32, the rather - * unimportant bit 16. We must now extend the int16's sign bit into bits - * 17-32, which is accomplished by left-shifting then right-shifting. - */ - - assert(uint_rval->type == glsl_type::uint_type); - - ir_rvalue *result = - clamp(div(i2f(rshift(lshift(u2i(unpack_uint_to_uvec2(uint_rval)), - constant(16)), - constant(16u))), - constant(32767.0f)), - constant(-1.0f), - constant(1.0f)); - - assert(result->type == glsl_type::vec2_type); - return result; - } - - /** - * \brief Lower an unpackSnorm4x8 expression. - * - * \param uint_rval is unpackSnorm4x8's input - * \return unpackSnorm4x8's output as a vec4 rvalue - */ - ir_rvalue* - lower_unpack_snorm_4x8(ir_rvalue *uint_rval) - { - /* From page 137 (143 of pdf) of the GLSL 4.30 spec: - * - * highp vec4 unpackSnorm4x8 (highp uint p) - * ---------------------------------------- - * First, unpacks a single 32-bit unsigned integer p into four - * 8-bit unsigned integers. Then, each component is converted to - * a normalized floating-point value to generate the returned - * four-component vector. - * - * The conversion for unpacked fixed-point value f to floating point is - * done as follows: - * - * unpackSnorm4x8: clamp(f / 127.0, -1, +1) - * - * The first component of the returned vector will be extracted from the - * least significant bits of the input; the last component will be - * extracted from the most significant bits. - * - * This function generates IR that approximates the following pseudo-GLSL: - * - * return clamp( - * ((ivec4(unpack_uint_to_uvec4(UINT_RVALUE)) << 24) >> 24) / 127.0f, - * -1.0f, 1.0f); - * - * The above IR may appear unnecessarily complex, but the intermediate - * conversion to ivec4 and the bit shifts are necessary to correctly unpack - * negative floats. - * - * To see why, consider packing and then unpacking vec4(-1.0, 0.0, 0.0, - * 0.0). packSnorm4x8 encodes -1.0 as the int8 0xff. During unpacking, we - * place that int8 into an int32, which results in the *positive* integer - * 0x000000ff. The int8's sign bit becomes, in the int32, the rather - * unimportant bit 8. We must now extend the int8's sign bit into bits - * 9-32, which is accomplished by left-shifting then right-shifting. - */ - - assert(uint_rval->type == glsl_type::uint_type); - - ir_rvalue *result = - clamp(div(i2f(rshift(lshift(u2i(unpack_uint_to_uvec4(uint_rval)), - constant(24u)), - constant(24u))), - constant(127.0f)), - constant(-1.0f), - constant(1.0f)); - - assert(result->type == glsl_type::vec4_type); - return result; - } - - /** - * \brief Lower a packUnorm2x16 expression. - * - * \param vec2_rval is packUnorm2x16's input - * \return packUnorm2x16's output as a uint rvalue - */ - ir_rvalue* - lower_pack_unorm_2x16(ir_rvalue *vec2_rval) - { - /* From page 88 (94 of pdf) of the GLSL ES 3.00 spec: - * - * highp uint packUnorm2x16 (vec2 v) - * --------------------------------- - * First, converts each component of the normalized floating-point value - * v into 16-bit integer values. Then, the results are packed into the - * returned 32-bit unsigned integer. - * - * The conversion for component c of v to fixed point is done as - * follows: - * - * packUnorm2x16: round(clamp(c, 0, +1) * 65535.0) - * - * The first component of the vector will be written to the least - * significant bits of the output; the last component will be written to - * the most significant bits. - * - * This function generates IR that approximates the following pseudo-GLSL: - * - * return pack_uvec2_to_uint(uvec2( - * round(clamp(VEC2_RVALUE, 0.0f, 1.0f) * 65535.0f))); - * - * Here it is safe to directly convert the vec2 to uvec2 because the vec2 - * has been clamped to a non-negative range. - */ - - assert(vec2_rval->type == glsl_type::vec2_type); - - ir_rvalue *result = pack_uvec2_to_uint( - f2u(round_even(mul(saturate(vec2_rval), constant(65535.0f))))); - - assert(result->type == glsl_type::uint_type); - return result; - } - - /** - * \brief Lower a packUnorm4x8 expression. - * - * \param vec4_rval is packUnorm4x8's input - * \return packUnorm4x8's output as a uint rvalue - */ - ir_rvalue* - lower_pack_unorm_4x8(ir_rvalue *vec4_rval) - { - /* From page 137 (143 of pdf) of the GLSL 4.30 spec: - * - * highp uint packUnorm4x8 (vec4 v) - * -------------------------------- - * First, converts each component of the normalized floating-point value - * v into 8-bit integer values. Then, the results are packed into the - * returned 32-bit unsigned integer. - * - * The conversion for component c of v to fixed point is done as - * follows: - * - * packUnorm4x8: round(clamp(c, 0, +1) * 255.0) - * - * The first component of the vector will be written to the least - * significant bits of the output; the last component will be written to - * the most significant bits. - * - * This function generates IR that approximates the following pseudo-GLSL: - * - * return pack_uvec4_to_uint(uvec4( - * round(clamp(VEC2_RVALUE, 0.0f, 1.0f) * 255.0f))); - * - * Here it is safe to directly convert the vec4 to uvec4 because the the - * vec4 has been clamped to a non-negative range. - */ - - assert(vec4_rval->type == glsl_type::vec4_type); - - ir_rvalue *result = pack_uvec4_to_uint( - f2u(round_even(mul(saturate(vec4_rval), constant(255.0f))))); - - assert(result->type == glsl_type::uint_type); - return result; - } - - /** - * \brief Lower an unpackUnorm2x16 expression. - * - * \param uint_rval is unpackUnorm2x16's input - * \return unpackUnorm2x16's output as a vec2 rvalue - */ - ir_rvalue* - lower_unpack_unorm_2x16(ir_rvalue *uint_rval) - { - /* From page 89 (95 of pdf) of the GLSL ES 3.00 spec: - * - * highp vec2 unpackUnorm2x16 (highp uint p) - * ----------------------------------------- - * First, unpacks a single 32-bit unsigned integer p into a pair of - * 16-bit unsigned integers. Then, each component is converted to - * a normalized floating-point value to generate the returned - * two-component vector. - * - * The conversion for unpacked fixed-point value f to floating point is - * done as follows: - * - * unpackUnorm2x16: f / 65535.0 - * - * The first component of the returned vector will be extracted from the - * least significant bits of the input; the last component will be - * extracted from the most significant bits. - * - * This function generates IR that approximates the following pseudo-GLSL: - * - * return vec2(unpack_uint_to_uvec2(UINT_RVALUE)) / 65535.0; - */ - - assert(uint_rval->type == glsl_type::uint_type); - - ir_rvalue *result = div(u2f(unpack_uint_to_uvec2(uint_rval)), - constant(65535.0f)); - - assert(result->type == glsl_type::vec2_type); - return result; - } - - /** - * \brief Lower an unpackUnorm4x8 expression. - * - * \param uint_rval is unpackUnorm4x8's input - * \return unpackUnorm4x8's output as a vec4 rvalue - */ - ir_rvalue* - lower_unpack_unorm_4x8(ir_rvalue *uint_rval) - { - /* From page 137 (143 of pdf) of the GLSL 4.30 spec: - * - * highp vec4 unpackUnorm4x8 (highp uint p) - * ---------------------------------------- - * First, unpacks a single 32-bit unsigned integer p into four - * 8-bit unsigned integers. Then, each component is converted to - * a normalized floating-point value to generate the returned - * two-component vector. - * - * The conversion for unpacked fixed-point value f to floating point is - * done as follows: - * - * unpackUnorm4x8: f / 255.0 - * - * The first component of the returned vector will be extracted from the - * least significant bits of the input; the last component will be - * extracted from the most significant bits. - * - * This function generates IR that approximates the following pseudo-GLSL: - * - * return vec4(unpack_uint_to_uvec4(UINT_RVALUE)) / 255.0; - */ - - assert(uint_rval->type == glsl_type::uint_type); - - ir_rvalue *result = div(u2f(unpack_uint_to_uvec4(uint_rval)), - constant(255.0f)); - - assert(result->type == glsl_type::vec4_type); - return result; - } - - /** - * \brief Lower the component-wise calculation of packHalf2x16. - * - * \param f_rval is one component of packHafl2x16's input - * \param e_rval is the unshifted exponent bits of f_rval - * \param m_rval is the unshifted mantissa bits of f_rval - * - * \return a uint rvalue that encodes a float16 in its lower 16 bits - */ - ir_rvalue* - pack_half_1x16_nosign(ir_rvalue *f_rval, - ir_rvalue *e_rval, - ir_rvalue *m_rval) - { - assert(e_rval->type == glsl_type::uint_type); - assert(m_rval->type == glsl_type::uint_type); - - /* uint u16; */ - ir_variable *u16 = factory.make_temp(glsl_type::uint_type, - "tmp_pack_half_1x16_u16"); - - /* float f = FLOAT_RVAL; */ - ir_variable *f = factory.make_temp(glsl_type::float_type, - "tmp_pack_half_1x16_f"); - factory.emit(assign(f, f_rval)); - - /* uint e = E_RVAL; */ - ir_variable *e = factory.make_temp(glsl_type::uint_type, - "tmp_pack_half_1x16_e"); - factory.emit(assign(e, e_rval)); - - /* uint m = M_RVAL; */ - ir_variable *m = factory.make_temp(glsl_type::uint_type, - "tmp_pack_half_1x16_m"); - factory.emit(assign(m, m_rval)); - - /* Preliminaries - * ------------- - * - * For a float16, the bit layout is: - * - * sign: 15 - * exponent: 10:14 - * mantissa: 0:9 - * - * Let f16 be a float16 value. The sign, exponent, and mantissa - * determine its value thus: - * - * if e16 = 0 and m16 = 0, then zero: (-1)^s16 * 0 (1) - * if e16 = 0 and m16!= 0, then subnormal: (-1)^s16 * 2^(e16 - 14) * (m16 / 2^10) (2) - * if 0 < e16 < 31, then normal: (-1)^s16 * 2^(e16 - 15) * (1 + m16 / 2^10) (3) - * if e16 = 31 and m16 = 0, then infinite: (-1)^s16 * inf (4) - * if e16 = 31 and m16 != 0, then NaN (5) - * - * where 0 <= m16 < 2^10. - * - * For a float32, the bit layout is: - * - * sign: 31 - * exponent: 23:30 - * mantissa: 0:22 - * - * Let f32 be a float32 value. The sign, exponent, and mantissa - * determine its value thus: - * - * if e32 = 0 and m32 = 0, then zero: (-1)^s * 0 (10) - * if e32 = 0 and m32 != 0, then subnormal: (-1)^s * 2^(e32 - 126) * (m32 / 2^23) (11) - * if 0 < e32 < 255, then normal: (-1)^s * 2^(e32 - 127) * (1 + m32 / 2^23) (12) - * if e32 = 255 and m32 = 0, then infinite: (-1)^s * inf (13) - * if e32 = 255 and m32 != 0, then NaN (14) - * - * where 0 <= m32 < 2^23. - * - * The minimum and maximum normal float16 values are - * - * min_norm16 = 2^(1 - 15) * (1 + 0 / 2^10) = 2^(-14) (20) - * max_norm16 = 2^(30 - 15) * (1 + 1023 / 2^10) (21) - * - * The step at max_norm16 is - * - * max_step16 = 2^5 (22) - * - * Observe that the float16 boundary values in equations 20-21 lie in the - * range of normal float32 values. - * - * - * Rounding Behavior - * ----------------- - * Not all float32 values can be exactly represented as a float16. We - * round all such intermediate float32 values to the nearest float16; if - * the float32 is exactly between to float16 values, we round to the one - * with an even mantissa. This rounding behavior has several benefits: - * - * - It has no sign bias. - * - * - It reproduces the behavior of real hardware: opcode F32TO16 in Intel's - * GPU ISA. - * - * - By reproducing the behavior of the GPU (at least on Intel hardware), - * compile-time evaluation of constant packHalf2x16 GLSL expressions will - * result in the same value as if the expression were executed on the - * GPU. - * - * Calculation - * ----------- - * Our task is to compute s16, e16, m16 given f32. Since this function - * ignores the sign bit, assume that s32 = s16 = 0. There are several - * cases consider. - */ - - factory.emit( - - /* Case 1) f32 is NaN - * - * The resultant f16 will also be NaN. - */ - - /* if (e32 == 255 && m32 != 0) { */ - if_tree(logic_and(equal(e, constant(0xffu << 23u)), - logic_not(equal(m, constant(0u)))), - - assign(u16, constant(0x7fffu)), - - /* Case 2) f32 lies in the range [0, min_norm16). - * - * The resultant float16 will be either zero, subnormal, or normal. - * - * Solving - * - * f32 = min_norm16 (30) - * - * gives - * - * e32 = 113 and m32 = 0 (31) - * - * Therefore this case occurs if and only if - * - * e32 < 113 (32) - */ - - /* } else if (e32 < 113) { */ - if_tree(less(e, constant(113u << 23u)), - - /* u16 = uint(round_to_even(abs(f32) * float(1u << 24u))); */ - assign(u16, f2u(round_even(mul(expr(ir_unop_abs, f), - constant((float) (1 << 24)))))), - - /* Case 3) f32 lies in the range - * [min_norm16, max_norm16 + max_step16). - * - * The resultant float16 will be either normal or infinite. - * - * Solving - * - * f32 = max_norm16 + max_step16 (40) - * = 2^15 * (1 + 1023 / 2^10) + 2^5 (41) - * = 2^16 (42) - * gives - * - * e32 = 143 and m32 = 0 (43) - * - * We already solved the boundary condition f32 = min_norm16 above - * in equation 31. Therefore this case occurs if and only if - * - * 113 <= e32 and e32 < 143 - */ - - /* } else if (e32 < 143) { */ - if_tree(less(e, constant(143u << 23u)), - - /* The addition below handles the case where the mantissa rounds - * up to 1024 and bumps the exponent. - * - * u16 = ((e - (112u << 23u)) >> 13u) - * + round_to_even((float(m) / (1u << 13u)); - */ - assign(u16, add(rshift(sub(e, constant(112u << 23u)), - constant(13u)), - f2u(round_even( - div(u2f(m), constant((float) (1 << 13))))))), - - /* Case 4) f32 lies in the range [max_norm16 + max_step16, inf]. - * - * The resultant float16 will be infinite. - * - * The cases above caught all float32 values in the range - * [0, max_norm16 + max_step16), so this is the fall-through case. - */ - - /* } else { */ - - assign(u16, constant(31u << 10u)))))); - - /* } */ - - return deref(u16).val; - } - - /** - * \brief Lower a packHalf2x16 expression. - * - * \param vec2_rval is packHalf2x16's input - * \return packHalf2x16's output as a uint rvalue - */ - ir_rvalue* - lower_pack_half_2x16(ir_rvalue *vec2_rval) - { - /* From page 89 (95 of pdf) of the GLSL ES 3.00 spec: - * - * highp uint packHalf2x16 (mediump vec2 v) - * ---------------------------------------- - * Returns an unsigned integer obtained by converting the components of - * a two-component floating-point vector to the 16-bit floating-point - * representation found in the OpenGL ES Specification, and then packing - * these two 16-bit integers into a 32-bit unsigned integer. - * - * The first vector component specifies the 16 least- significant bits - * of the result; the second component specifies the 16 most-significant - * bits. - */ - - assert(vec2_rval->type == glsl_type::vec2_type); - - /* vec2 f = VEC2_RVAL; */ - ir_variable *f = factory.make_temp(glsl_type::vec2_type, - "tmp_pack_half_2x16_f"); - factory.emit(assign(f, vec2_rval)); - - /* uvec2 f32 = bitcast_f2u(f); */ - ir_variable *f32 = factory.make_temp(glsl_type::uvec2_type, - "tmp_pack_half_2x16_f32"); - factory.emit(assign(f32, expr(ir_unop_bitcast_f2u, f))); - - /* uvec2 f16; */ - ir_variable *f16 = factory.make_temp(glsl_type::uvec2_type, - "tmp_pack_half_2x16_f16"); - - /* Get f32's unshifted exponent bits. - * - * uvec2 e = f32 & 0x7f800000u; - */ - ir_variable *e = factory.make_temp(glsl_type::uvec2_type, - "tmp_pack_half_2x16_e"); - factory.emit(assign(e, bit_and(f32, constant(0x7f800000u)))); - - /* Get f32's unshifted mantissa bits. - * - * uvec2 m = f32 & 0x007fffffu; - */ - ir_variable *m = factory.make_temp(glsl_type::uvec2_type, - "tmp_pack_half_2x16_m"); - factory.emit(assign(m, bit_and(f32, constant(0x007fffffu)))); - - /* Set f16's exponent and mantissa bits. - * - * f16.x = pack_half_1x16_nosign(e.x, m.x); - * f16.y = pack_half_1y16_nosign(e.y, m.y); - */ - factory.emit(assign(f16, pack_half_1x16_nosign(swizzle_x(f), - swizzle_x(e), - swizzle_x(m)), - WRITEMASK_X)); - factory.emit(assign(f16, pack_half_1x16_nosign(swizzle_y(f), - swizzle_y(e), - swizzle_y(m)), - WRITEMASK_Y)); - - /* Set f16's sign bits. - * - * f16 |= (f32 & (1u << 31u) >> 16u; - */ - factory.emit( - assign(f16, bit_or(f16, - rshift(bit_and(f32, constant(1u << 31u)), - constant(16u))))); - - - /* return (f16.y << 16u) | f16.x; */ - ir_rvalue *result = bit_or(lshift(swizzle_y(f16), - constant(16u)), - swizzle_x(f16)); - - assert(result->type == glsl_type::uint_type); - return result; - } - - /** - * \brief Split packHalf2x16's vec2 operand into two floats. - * - * \param vec2_rval is packHalf2x16's input - * \return a uint rvalue - * - * Some code generators, such as the i965 fragment shader, require that all - * vector expressions be lowered to a sequence of scalar expressions. - * However, packHalf2x16 cannot be scalarized by the same mechanism as - * a true vector operation because its input and output have a differing - * number of vector components. - * - * This method scalarizes packHalf2x16 by transforming it from an unary - * operation having vector input to a binary operation having scalar input. - * That is, it transforms - * - * packHalf2x16(VEC2_RVAL); - * - * into - * - * vec2 v = VEC2_RVAL; - * return packHalf2x16_split(v.x, v.y); - */ - ir_rvalue* - split_pack_half_2x16(ir_rvalue *vec2_rval) - { - assert(vec2_rval->type == glsl_type::vec2_type); - - ir_variable *v = factory.make_temp(glsl_type::vec2_type, - "tmp_split_pack_half_2x16_v"); - factory.emit(assign(v, vec2_rval)); - - return expr(ir_binop_pack_half_2x16_split, swizzle_x(v), swizzle_y(v)); - } - - /** - * \brief Lower the component-wise calculation of unpackHalf2x16. - * - * Given a uint that encodes a float16 in its lower 16 bits, this function - * returns a uint that encodes a float32 with the same value. The sign bit - * of the float16 is ignored. - * - * \param e_rval is the unshifted exponent bits of a float16 - * \param m_rval is the unshifted mantissa bits of a float16 - * \param a uint rvalue that encodes a float32 - */ - ir_rvalue* - unpack_half_1x16_nosign(ir_rvalue *e_rval, ir_rvalue *m_rval) - { - assert(e_rval->type == glsl_type::uint_type); - assert(m_rval->type == glsl_type::uint_type); - - /* uint u32; */ - ir_variable *u32 = factory.make_temp(glsl_type::uint_type, - "tmp_unpack_half_1x16_u32"); - - /* uint e = E_RVAL; */ - ir_variable *e = factory.make_temp(glsl_type::uint_type, - "tmp_unpack_half_1x16_e"); - factory.emit(assign(e, e_rval)); - - /* uint m = M_RVAL; */ - ir_variable *m = factory.make_temp(glsl_type::uint_type, - "tmp_unpack_half_1x16_m"); - factory.emit(assign(m, m_rval)); - - /* Preliminaries - * ------------- - * - * For a float16, the bit layout is: - * - * sign: 15 - * exponent: 10:14 - * mantissa: 0:9 - * - * Let f16 be a float16 value. The sign, exponent, and mantissa - * determine its value thus: - * - * if e16 = 0 and m16 = 0, then zero: (-1)^s16 * 0 (1) - * if e16 = 0 and m16!= 0, then subnormal: (-1)^s16 * 2^(e16 - 14) * (m16 / 2^10) (2) - * if 0 < e16 < 31, then normal: (-1)^s16 * 2^(e16 - 15) * (1 + m16 / 2^10) (3) - * if e16 = 31 and m16 = 0, then infinite: (-1)^s16 * inf (4) - * if e16 = 31 and m16 != 0, then NaN (5) - * - * where 0 <= m16 < 2^10. - * - * For a float32, the bit layout is: - * - * sign: 31 - * exponent: 23:30 - * mantissa: 0:22 - * - * Let f32 be a float32 value. The sign, exponent, and mantissa - * determine its value thus: - * - * if e32 = 0 and m32 = 0, then zero: (-1)^s * 0 (10) - * if e32 = 0 and m32 != 0, then subnormal: (-1)^s * 2^(e32 - 126) * (m32 / 2^23) (11) - * if 0 < e32 < 255, then normal: (-1)^s * 2^(e32 - 127) * (1 + m32 / 2^23) (12) - * if e32 = 255 and m32 = 0, then infinite: (-1)^s * inf (13) - * if e32 = 255 and m32 != 0, then NaN (14) - * - * where 0 <= m32 < 2^23. - * - * Calculation - * ----------- - * Our task is to compute s32, e32, m32 given f16. Since this function - * ignores the sign bit, assume that s32 = s16 = 0. There are several - * cases consider. - */ - - factory.emit( - - /* Case 1) f16 is zero or subnormal. - * - * The simplest method of calcuating f32 in this case is - * - * f32 = f16 (20) - * = 2^(-14) * (m16 / 2^10) (21) - * = m16 / 2^(-24) (22) - */ - - /* if (e16 == 0) { */ - if_tree(equal(e, constant(0u)), - - /* u32 = bitcast_f2u(float(m) / float(1 << 24)); */ - assign(u32, expr(ir_unop_bitcast_f2u, - div(u2f(m), constant((float)(1 << 24))))), - - /* Case 2) f16 is normal. - * - * The equation - * - * f32 = f16 (30) - * 2^(e32 - 127) * (1 + m32 / 2^23) = (31) - * 2^(e16 - 15) * (1 + m16 / 2^10) - * - * can be decomposed into two - * - * 2^(e32 - 127) = 2^(e16 - 15) (32) - * 1 + m32 / 2^23 = 1 + m16 / 2^10 (33) - * - * which solve to - * - * e32 = e16 + 112 (34) - * m32 = m16 * 2^13 (35) - */ - - /* } else if (e16 < 31)) { */ - if_tree(less(e, constant(31u << 10u)), - - /* u32 = ((e + (112 << 10)) | m) << 13; - */ - assign(u32, lshift(bit_or(add(e, constant(112u << 10u)), m), - constant(13u))), - - - /* Case 3) f16 is infinite. */ - if_tree(equal(m, constant(0u)), - - assign(u32, constant(255u << 23u)), - - /* Case 4) f16 is NaN. */ - /* } else { */ - - assign(u32, constant(0x7fffffffu)))))); - - /* } */ - - return deref(u32).val; - } - - /** - * \brief Lower an unpackHalf2x16 expression. - * - * \param uint_rval is unpackHalf2x16's input - * \return unpackHalf2x16's output as a vec2 rvalue - */ - ir_rvalue* - lower_unpack_half_2x16(ir_rvalue *uint_rval) - { - /* From page 89 (95 of pdf) of the GLSL ES 3.00 spec: - * - * mediump vec2 unpackHalf2x16 (highp uint v) - * ------------------------------------------ - * Returns a two-component floating-point vector with components - * obtained by unpacking a 32-bit unsigned integer into a pair of 16-bit - * values, interpreting those values as 16-bit floating-point numbers - * according to the OpenGL ES Specification, and converting them to - * 32-bit floating-point values. - * - * The first component of the vector is obtained from the - * 16 least-significant bits of v; the second component is obtained - * from the 16 most-significant bits of v. - */ - assert(uint_rval->type == glsl_type::uint_type); - - /* uint u = RVALUE; - * uvec2 f16 = uvec2(u.x & 0xffff, u.y >> 16); - */ - ir_variable *f16 = factory.make_temp(glsl_type::uvec2_type, - "tmp_unpack_half_2x16_f16"); - factory.emit(assign(f16, unpack_uint_to_uvec2(uint_rval))); - - /* uvec2 f32; */ - ir_variable *f32 = factory.make_temp(glsl_type::uvec2_type, - "tmp_unpack_half_2x16_f32"); - - /* Get f16's unshifted exponent bits. - * - * uvec2 e = f16 & 0x7c00u; - */ - ir_variable *e = factory.make_temp(glsl_type::uvec2_type, - "tmp_unpack_half_2x16_e"); - factory.emit(assign(e, bit_and(f16, constant(0x7c00u)))); - - /* Get f16's unshifted mantissa bits. - * - * uvec2 m = f16 & 0x03ffu; - */ - ir_variable *m = factory.make_temp(glsl_type::uvec2_type, - "tmp_unpack_half_2x16_m"); - factory.emit(assign(m, bit_and(f16, constant(0x03ffu)))); - - /* Set f32's exponent and mantissa bits. - * - * f32.x = unpack_half_1x16_nosign(e.x, m.x); - * f32.y = unpack_half_1x16_nosign(e.y, m.y); - */ - factory.emit(assign(f32, unpack_half_1x16_nosign(swizzle_x(e), - swizzle_x(m)), - WRITEMASK_X)); - factory.emit(assign(f32, unpack_half_1x16_nosign(swizzle_y(e), - swizzle_y(m)), - WRITEMASK_Y)); - - /* Set f32's sign bit. - * - * f32 |= (f16 & 0x8000u) << 16u; - */ - factory.emit(assign(f32, bit_or(f32, - lshift(bit_and(f16, - constant(0x8000u)), - constant(16u))))); - - /* return bitcast_u2f(f32); */ - ir_rvalue *result = expr(ir_unop_bitcast_u2f, f32); - assert(result->type == glsl_type::vec2_type); - return result; - } - - /** - * \brief Split unpackHalf2x16 into two operations. - * - * \param uint_rval is unpackHalf2x16's input - * \return a vec2 rvalue - * - * Some code generators, such as the i965 fragment shader, require that all - * vector expressions be lowered to a sequence of scalar expressions. - * However, unpackHalf2x16 cannot be scalarized by the same method as - * a true vector operation because the number of components of its input - * and output differ. - * - * This method scalarizes unpackHalf2x16 by transforming it from a single - * operation having vec2 output to a pair of operations each having float - * output. That is, it transforms - * - * unpackHalf2x16(UINT_RVAL) - * - * into - * - * uint u = UINT_RVAL; - * vec2 v; - * - * v.x = unpackHalf2x16_split_x(u); - * v.y = unpackHalf2x16_split_y(u); - * - * return v; - */ - ir_rvalue* - split_unpack_half_2x16(ir_rvalue *uint_rval) - { - assert(uint_rval->type == glsl_type::uint_type); - - /* uint u = uint_rval; */ - ir_variable *u = factory.make_temp(glsl_type::uint_type, - "tmp_split_unpack_half_2x16_u"); - factory.emit(assign(u, uint_rval)); - - /* vec2 v; */ - ir_variable *v = factory.make_temp(glsl_type::vec2_type, - "tmp_split_unpack_half_2x16_v"); - - /* v.x = unpack_half_2x16_split_x(u); */ - factory.emit(assign(v, expr(ir_unop_unpack_half_2x16_split_x, u), - WRITEMASK_X)); - - /* v.y = unpack_half_2x16_split_y(u); */ - factory.emit(assign(v, expr(ir_unop_unpack_half_2x16_split_y, u), - WRITEMASK_Y)); - - return deref(v).val; - } -}; - -} // namespace anonymous - -/** - * \brief Lower the builtin packing functions. - * - * \param op_mask is a bitmask of `enum lower_packing_builtins_op`. - */ -bool -lower_packing_builtins(exec_list *instructions, int op_mask) -{ - lower_packing_builtins_visitor v(op_mask); - visit_list_elements(&v, instructions, true); - return v.get_progress(); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_ubo_reference.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_ubo_reference.cpp deleted file mode 100644 index 271629196..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_ubo_reference.cpp +++ /dev/null @@ -1,553 +0,0 @@ -/* - * Copyright © 2012 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file lower_ubo_reference.cpp - * - * IR lower pass to replace dereferences of variables in a uniform - * buffer object with usage of ir_binop_ubo_load expressions, each of - * which can read data up to the size of a vec4. - * - * This relieves drivers of the responsibility to deal with tricky UBO - * layout issues like std140 structures and row_major matrices on - * their own. - */ - -#include "ir.h" -#include "ir_builder.h" -#include "ir_rvalue_visitor.h" -#include "main/macros.h" - -using namespace ir_builder; - -/** - * Determine if a thing being dereferenced is row-major - * - * There is some trickery here. - * - * If the thing being dereferenced is a member of uniform block \b without an - * instance name, then the name of the \c ir_variable is the field name of an - * interface type. If this field is row-major, then the thing referenced is - * row-major. - * - * If the thing being dereferenced is a member of uniform block \b with an - * instance name, then the last dereference in the tree will be an - * \c ir_dereference_record. If that record field is row-major, then the - * thing referenced is row-major. - */ -static bool -is_dereferenced_thing_row_major(const ir_dereference *deref) -{ - bool matrix = false; - const ir_rvalue *ir = deref; - - while (true) { - matrix = matrix || ir->type->without_array()->is_matrix(); - - switch (ir->ir_type) { - case ir_type_dereference_array: { - const ir_dereference_array *const array_deref = - (const ir_dereference_array *) ir; - - ir = array_deref->array; - break; - } - - case ir_type_dereference_record: { - const ir_dereference_record *const record_deref = - (const ir_dereference_record *) ir; - - ir = record_deref->record; - - const int idx = ir->type->field_index(record_deref->field); - assert(idx >= 0); - - const enum glsl_matrix_layout matrix_layout = - glsl_matrix_layout(ir->type->fields.structure[idx].matrix_layout); - - switch (matrix_layout) { - case GLSL_MATRIX_LAYOUT_INHERITED: - break; - case GLSL_MATRIX_LAYOUT_COLUMN_MAJOR: - return false; - case GLSL_MATRIX_LAYOUT_ROW_MAJOR: - return matrix || deref->type->without_array()->is_record(); - } - - break; - } - - case ir_type_dereference_variable: { - const ir_dereference_variable *const var_deref = - (const ir_dereference_variable *) ir; - - const enum glsl_matrix_layout matrix_layout = - glsl_matrix_layout(var_deref->var->data.matrix_layout); - - switch (matrix_layout) { - case GLSL_MATRIX_LAYOUT_INHERITED: - assert(!matrix); - return false; - case GLSL_MATRIX_LAYOUT_COLUMN_MAJOR: - return false; - case GLSL_MATRIX_LAYOUT_ROW_MAJOR: - return matrix || deref->type->without_array()->is_record(); - } - - unreachable("invalid matrix layout"); - break; - } - - default: - return false; - } - } - - /* The tree must have ended with a dereference that wasn't an - * ir_dereference_variable. That is invalid, and it should be impossible. - */ - unreachable("invalid dereference tree"); - return false; -} - -namespace { -class lower_ubo_reference_visitor : public ir_rvalue_enter_visitor { -public: - lower_ubo_reference_visitor(struct gl_shader *shader) - : shader(shader) - { - } - - void handle_rvalue(ir_rvalue **rvalue); - void emit_ubo_loads(ir_dereference *deref, ir_variable *base_offset, - unsigned int deref_offset, bool row_major); - ir_expression *ubo_load(const struct glsl_type *type, - ir_rvalue *offset); - - void *mem_ctx; - struct gl_shader *shader; - struct gl_uniform_buffer_variable *ubo_var; - ir_rvalue *uniform_block; - bool progress; -}; - -/** - * Determine the name of the interface block field - * - * This is the name of the specific member as it would appear in the - * \c gl_uniform_buffer_variable::Name field in the shader's - * \c UniformBlocks array. - */ -static const char * -interface_field_name(void *mem_ctx, char *base_name, ir_dereference *d, - ir_rvalue **nonconst_block_index) -{ - ir_rvalue *previous_index = NULL; - *nonconst_block_index = NULL; - - while (d != NULL) { - switch (d->ir_type) { - case ir_type_dereference_variable: { - ir_dereference_variable *v = (ir_dereference_variable *) d; - if (previous_index - && v->var->is_interface_instance() - && v->var->type->is_array()) { - - ir_constant *const_index = previous_index->as_constant(); - if (!const_index) { - *nonconst_block_index = previous_index; - return ralloc_asprintf(mem_ctx, "%s[0]", base_name); - } else { - return ralloc_asprintf(mem_ctx, - "%s[%d]", - base_name, - const_index->get_uint_component(0)); - } - } else { - return base_name; - } - - break; - } - - case ir_type_dereference_record: { - ir_dereference_record *r = (ir_dereference_record *) d; - - d = r->record->as_dereference(); - break; - } - - case ir_type_dereference_array: { - ir_dereference_array *a = (ir_dereference_array *) d; - - d = a->array->as_dereference(); - previous_index = a->array_index; - - break; - } - - default: - assert(!"Should not get here."); - break; - } - } - - assert(!"Should not get here."); - return NULL; -} - -void -lower_ubo_reference_visitor::handle_rvalue(ir_rvalue **rvalue) -{ - if (!*rvalue) - return; - - ir_dereference *deref = (*rvalue)->as_dereference(); - if (!deref) - return; - - ir_variable *var = deref->variable_referenced(); - if (!var || !var->is_in_uniform_block()) - return; - - mem_ctx = ralloc_parent(*rvalue); - - ir_rvalue *nonconst_block_index; - const char *const field_name = - interface_field_name(mem_ctx, (char *) var->get_interface_type()->name, - deref, &nonconst_block_index); - - this->uniform_block = NULL; - for (unsigned i = 0; i < shader->NumUniformBlocks; i++) { - if (strcmp(field_name, shader->UniformBlocks[i].Name) == 0) { - - ir_constant *index = new(mem_ctx) ir_constant(i); - - if (nonconst_block_index) { - if (nonconst_block_index->type != glsl_type::uint_type) - nonconst_block_index = i2u(nonconst_block_index); - this->uniform_block = add(nonconst_block_index, index); - } else { - this->uniform_block = index; - } - - struct gl_uniform_block *block = &shader->UniformBlocks[i]; - - this->ubo_var = var->is_interface_instance() - ? &block->Uniforms[0] : &block->Uniforms[var->data.location]; - - break; - } - } - - assert(this->uniform_block); - - ir_rvalue *offset = new(mem_ctx) ir_constant(0u); - unsigned const_offset = 0; - bool row_major = is_dereferenced_thing_row_major(deref); - - /* Calculate the offset to the start of the region of the UBO - * dereferenced by *rvalue. This may be a variable offset if an - * array dereference has a variable index. - */ - while (deref) { - switch (deref->ir_type) { - case ir_type_dereference_variable: { - const_offset += ubo_var->Offset; - deref = NULL; - break; - } - - case ir_type_dereference_array: { - ir_dereference_array *deref_array = (ir_dereference_array *)deref; - unsigned array_stride; - if (deref_array->array->type->is_matrix() && row_major) { - /* When loading a vector out of a row major matrix, the - * step between the columns (vectors) is the size of a - * float, while the step between the rows (elements of a - * vector) is handled below in emit_ubo_loads. - */ - array_stride = 4; - } else if (deref_array->type->is_interface()) { - /* We're processing an array dereference of an interface instance - * array. The thing being dereferenced *must* be a variable - * dereference because intefaces cannot be embedded an other - * types. In terms of calculating the offsets for the lowering - * pass, we don't care about the array index. All elements of an - * interface instance array will have the same offsets relative to - * the base of the block that backs them. - */ - assert(deref_array->array->as_dereference_variable()); - deref = deref_array->array->as_dereference(); - break; - } else { - /* Whether or not the field is row-major (because it might be a - * bvec2 or something) does not affect the array itself. We need - * to know whether an array element in its entirety is row-major. - */ - const bool array_row_major = - is_dereferenced_thing_row_major(deref_array); - - array_stride = deref_array->type->std140_size(array_row_major); - array_stride = glsl_align(array_stride, 16); - } - - ir_rvalue *array_index = deref_array->array_index; - if (array_index->type->base_type == GLSL_TYPE_INT) - array_index = i2u(array_index); - - ir_constant *const_index = - array_index->constant_expression_value(NULL); - if (const_index) { - const_offset += array_stride * const_index->value.u[0]; - } else { - offset = add(offset, - mul(array_index, - new(mem_ctx) ir_constant(array_stride))); - } - deref = deref_array->array->as_dereference(); - break; - } - - case ir_type_dereference_record: { - ir_dereference_record *deref_record = (ir_dereference_record *)deref; - const glsl_type *struct_type = deref_record->record->type; - unsigned intra_struct_offset = 0; - - /* glsl_type::std140_base_alignment doesn't grok interfaces. Use - * 16-bytes for the alignment because that is the general minimum of - * std140. - */ - const unsigned struct_alignment = struct_type->is_interface() - ? 16 - : struct_type->std140_base_alignment(row_major); - - - for (unsigned int i = 0; i < struct_type->length; i++) { - const glsl_type *type = struct_type->fields.structure[i].type; - - ir_dereference_record *field_deref = - new(mem_ctx) ir_dereference_record(deref_record->record, - struct_type->fields.structure[i].name); - const bool field_row_major = - is_dereferenced_thing_row_major(field_deref); - - ralloc_free(field_deref); - - unsigned field_align = type->std140_base_alignment(field_row_major); - - intra_struct_offset = glsl_align(intra_struct_offset, field_align); - - if (strcmp(struct_type->fields.structure[i].name, - deref_record->field) == 0) - break; - intra_struct_offset += type->std140_size(field_row_major); - - /* If the field just examined was itself a structure, apply rule - * #9: - * - * "The structure may have padding at the end; the base offset - * of the member following the sub-structure is rounded up to - * the next multiple of the base alignment of the structure." - */ - if (type->without_array()->is_record()) { - intra_struct_offset = glsl_align(intra_struct_offset, - struct_alignment); - - } - } - - const_offset += intra_struct_offset; - - deref = deref_record->record->as_dereference(); - break; - } - default: - assert(!"not reached"); - deref = NULL; - break; - } - } - - /* Now that we've calculated the offset to the start of the - * dereference, walk over the type and emit loads into a temporary. - */ - const glsl_type *type = (*rvalue)->type; - ir_variable *load_var = new(mem_ctx) ir_variable(type, - "ubo_load_temp", - ir_var_temporary, (*rvalue)->get_precision()); - base_ir->insert_before(load_var); - - ir_variable *load_offset = new(mem_ctx) ir_variable(glsl_type::uint_type, - "ubo_load_temp_offset", - ir_var_temporary, glsl_precision_undefined); - base_ir->insert_before(load_offset); - base_ir->insert_before(assign(load_offset, offset)); - - deref = new(mem_ctx) ir_dereference_variable(load_var); - emit_ubo_loads(deref, load_offset, const_offset, row_major); - *rvalue = deref; - - progress = true; -} - -ir_expression * -lower_ubo_reference_visitor::ubo_load(const glsl_type *type, - ir_rvalue *offset) -{ - ir_rvalue *block_ref = this->uniform_block->clone(mem_ctx, NULL); - return new(mem_ctx) - ir_expression(ir_binop_ubo_load, - type, - block_ref, - offset); - -} - -/** - * Takes LHS and emits a series of assignments into its components - * from the UBO variable at variable_offset + deref_offset. - * - * Recursively calls itself to break the deref down to the point that - * the ir_binop_ubo_load expressions generated are contiguous scalars - * or vectors. - */ -void -lower_ubo_reference_visitor::emit_ubo_loads(ir_dereference *deref, - ir_variable *base_offset, - unsigned int deref_offset, - bool row_major) -{ - if (deref->type->is_record()) { - unsigned int field_offset = 0; - - for (unsigned i = 0; i < deref->type->length; i++) { - const struct glsl_struct_field *field = - &deref->type->fields.structure[i]; - ir_dereference *field_deref = - new(mem_ctx) ir_dereference_record(deref->clone(mem_ctx, NULL), - field->name); - - field_offset = - glsl_align(field_offset, - field->type->std140_base_alignment(row_major)); - - emit_ubo_loads(field_deref, base_offset, deref_offset + field_offset, - row_major); - - field_offset += field->type->std140_size(row_major); - } - return; - } - - if (deref->type->is_array()) { - unsigned array_stride = - glsl_align(deref->type->fields.array->std140_size(row_major), - 16); - - for (unsigned i = 0; i < deref->type->length; i++) { - ir_constant *element = new(mem_ctx) ir_constant(i); - ir_dereference *element_deref = - new(mem_ctx) ir_dereference_array(deref->clone(mem_ctx, NULL), - element); - emit_ubo_loads(element_deref, base_offset, - deref_offset + i * array_stride, - row_major); - } - return; - } - - if (deref->type->is_matrix()) { - for (unsigned i = 0; i < deref->type->matrix_columns; i++) { - ir_constant *col = new(mem_ctx) ir_constant(i); - ir_dereference *col_deref = - new(mem_ctx) ir_dereference_array(deref->clone(mem_ctx, NULL), - col); - - if (row_major) { - /* For a row-major matrix, the next column starts at the next - * element. - */ - emit_ubo_loads(col_deref, base_offset, deref_offset + i * 4, - row_major); - } else { - /* std140 always rounds the stride of arrays (and matrices) to a - * vec4, so matrices are always 16 between columns/rows. - */ - emit_ubo_loads(col_deref, base_offset, deref_offset + i * 16, - row_major); - } - } - return; - } - - assert(deref->type->is_scalar() || - deref->type->is_vector()); - - if (!row_major) { - ir_rvalue *offset = add(base_offset, - new(mem_ctx) ir_constant(deref_offset)); - base_ir->insert_before(assign(deref->clone(mem_ctx, NULL), - ubo_load(deref->type, offset))); - } else { - /* We're dereffing a column out of a row-major matrix, so we - * gather the vector from each stored row. - */ - assert(deref->type->base_type == GLSL_TYPE_FLOAT); - /* Matrices, row_major or not, are stored as if they were - * arrays of vectors of the appropriate size in std140. - * Arrays have their strides rounded up to a vec4, so the - * matrix stride is always 16. - */ - unsigned matrix_stride = 16; - - for (unsigned i = 0; i < deref->type->vector_elements; i++) { - ir_rvalue *chan_offset = - add(base_offset, - new(mem_ctx) ir_constant(deref_offset + i * matrix_stride)); - - base_ir->insert_before(assign(deref->clone(mem_ctx, NULL), - ubo_load(glsl_type::float_type, - chan_offset), - (1U << i))); - } - } -} - -} /* unnamed namespace */ - -void -lower_ubo_reference(struct gl_shader *shader, exec_list *instructions) -{ - lower_ubo_reference_visitor v(shader); - - /* Loop over the instructions lowering references, because we take - * a deref of a UBO array using a UBO dereference as the index will - * produce a collection of instructions all of which have cloned - * UBO dereferences for that array index. - */ - do { - v.progress = false; - visit_list_elements(&v, instructions); - } while (v.progress); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_variable_index_to_cond_assign.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_variable_index_to_cond_assign.cpp deleted file mode 100644 index b0ab6cb2b..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_variable_index_to_cond_assign.cpp +++ /dev/null @@ -1,550 +0,0 @@ -/* - * Copyright © 2010 Luca Barbieri - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file lower_variable_index_to_cond_assign.cpp - * - * Turns non-constant indexing into array types to a series of - * conditional moves of each element into a temporary. - * - * Pre-DX10 GPUs often don't have a native way to do this operation, - * and this works around that. - * - * The lowering process proceeds as follows. Each non-constant index - * found in an r-value is converted to a canonical form \c array[i]. Each - * element of the array is conditionally assigned to a temporary by comparing - * \c i to a constant index. This is done by cloning the canonical form and - * replacing all occurances of \c i with a constant. Each remaining occurance - * of the canonical form in the IR is replaced with a dereference of the - * temporary variable. - * - * L-values with non-constant indices are handled similarly. In this case, - * the RHS of the assignment is assigned to a temporary. The non-constant - * index is replace with the canonical form (just like for r-values). The - * temporary is conditionally assigned to each element of the canonical form - * by comparing \c i with each index. The same clone-and-replace scheme is - * used. - */ - -#include "ir.h" -#include "ir_rvalue_visitor.h" -#include "ir_optimization.h" -#include "glsl_types.h" -#include "main/macros.h" - -/** - * Generate a comparison value for a block of indices - * - * Lowering passes for non-constant indexing of arrays, matrices, or vectors - * can use this to generate blocks of index comparison values. - * - * \param instructions List where new instructions will be appended - * \param index \c ir_variable containing the desired index - * \param base Base value for this block of comparisons - * \param components Number of unique index values to compare. This must - * be on the range [1, 4]. - * \param mem_ctx ralloc memory context to be used for all allocations. - * - * \returns - * An \c ir_rvalue that \b must be cloned for each use in conditional - * assignments, etc. - */ -ir_rvalue * -compare_index_block(exec_list *instructions, ir_variable *index, - unsigned base, unsigned components, void *mem_ctx) -{ - ir_rvalue *broadcast_index = new(mem_ctx) ir_dereference_variable(index); - - assert(index->type->is_scalar()); - assert(index->type->base_type == GLSL_TYPE_INT || index->type->base_type == GLSL_TYPE_UINT); - assert(components >= 1 && components <= 4); - - if (components > 1) { - const ir_swizzle_mask m = { 0, 0, 0, 0, components, false }; - broadcast_index = new(mem_ctx) ir_swizzle(broadcast_index, m); - } - - /* Compare the desired index value with the next block of four indices. - */ - ir_constant_data test_indices_data; - memset(&test_indices_data, 0, sizeof(test_indices_data)); - test_indices_data.i[0] = base; - test_indices_data.i[1] = base + 1; - test_indices_data.i[2] = base + 2; - test_indices_data.i[3] = base + 3; - - ir_constant *const test_indices = - new(mem_ctx) ir_constant(broadcast_index->type, - &test_indices_data); - - ir_rvalue *const condition_val = - new(mem_ctx) ir_expression(ir_binop_equal, - glsl_type::bvec(components), - broadcast_index, - test_indices); - - ir_variable *const condition = - new(mem_ctx) ir_variable(condition_val->type, - "dereference_condition", - ir_var_temporary, precision_from_ir(condition_val)); - instructions->push_tail(condition); - - ir_rvalue *const cond_deref = - new(mem_ctx) ir_dereference_variable(condition); - instructions->push_tail(new(mem_ctx) ir_assignment(cond_deref, condition_val, 0)); - - return cond_deref; -} - -static inline bool -is_array_or_matrix(const ir_rvalue *ir) -{ - return (ir->type->is_array() || ir->type->is_matrix()); -} - -namespace { -/** - * Replace a dereference of a variable with a specified r-value - * - * Each time a dereference of the specified value is replaced, the r-value - * tree is cloned. - */ -class deref_replacer : public ir_rvalue_visitor { -public: - deref_replacer(const ir_variable *variable_to_replace, ir_rvalue *value) - : variable_to_replace(variable_to_replace), value(value), - progress(false) - { - assert(this->variable_to_replace != NULL); - assert(this->value != NULL); - } - - virtual void handle_rvalue(ir_rvalue **rvalue) - { - ir_dereference_variable *const dv = (*rvalue)->as_dereference_variable(); - - if ((dv != NULL) && (dv->var == this->variable_to_replace)) { - this->progress = true; - *rvalue = this->value->clone(ralloc_parent(*rvalue), NULL); - } - } - - const ir_variable *variable_to_replace; - ir_rvalue *value; - bool progress; -}; - -/** - * Find a variable index dereference of an array in an rvalue tree - */ -class find_variable_index : public ir_hierarchical_visitor { -public: - find_variable_index() - : deref(NULL) - { - /* empty */ - } - - virtual ir_visitor_status visit_enter(ir_dereference_array *ir) - { - if (is_array_or_matrix(ir->array) - && (ir->array_index->as_constant() == NULL)) { - this->deref = ir; - return visit_stop; - } - - return visit_continue; - } - - /** - * First array dereference found in the tree that has a non-constant index. - */ - ir_dereference_array *deref; -}; - -struct assignment_generator -{ - ir_instruction* base_ir; - ir_dereference *rvalue; - ir_variable *old_index; - bool is_write; - unsigned int write_mask; - ir_variable* var; - - assignment_generator() - : base_ir(NULL), - rvalue(NULL), - old_index(NULL), - is_write(false), - write_mask(0), - var(NULL) - { - } - - void generate(unsigned i, ir_rvalue* condition, exec_list *list) const - { - /* Just clone the rest of the deref chain when trying to get at the - * underlying variable. - */ - void *mem_ctx = ralloc_parent(base_ir); - - /* Clone the old r-value in its entirety. Then replace any occurances of - * the old variable index with the new constant index. - */ - ir_dereference *element = this->rvalue->clone(mem_ctx, NULL); - ir_constant *const index = new(mem_ctx) ir_constant(i); - deref_replacer r(this->old_index, index); - element->accept(&r); - assert(r.progress); - - /* Generate a conditional assignment to (or from) the constant indexed - * array dereference. - */ - ir_rvalue *variable = new(mem_ctx) ir_dereference_variable(this->var); - ir_assignment *const assignment = (is_write) - ? new(mem_ctx) ir_assignment(element, variable, condition, write_mask) - : new(mem_ctx) ir_assignment(variable, element, condition); - - list->push_tail(assignment); - } -}; - -struct switch_generator -{ - /* make TFunction a template parameter if you need to use other generators */ - typedef assignment_generator TFunction; - const TFunction& generator; - - ir_variable* index; - unsigned linear_sequence_max_length; - unsigned condition_components; - - void *mem_ctx; - - switch_generator(const TFunction& generator, ir_variable *index, - unsigned linear_sequence_max_length, - unsigned condition_components) - : generator(generator), index(index), - linear_sequence_max_length(linear_sequence_max_length), - condition_components(condition_components) - { - this->mem_ctx = ralloc_parent(index); - } - - void linear_sequence(unsigned begin, unsigned end, exec_list *list) - { - if (begin == end) - return; - - /* If the array access is a read, read the first element of this subregion - * unconditionally. The remaining tests will possibly overwrite this - * value with one of the other array elements. - * - * This optimization cannot be done for writes because it will cause the - * first element of the subregion to be written possibly *in addition* to - * one of the other elements. - */ - unsigned first; - if (!this->generator.is_write) { - this->generator.generate(begin, 0, list); - first = begin + 1; - } else { - first = begin; - } - - for (unsigned i = first; i < end; i += 4) { - const unsigned comps = MIN2(condition_components, end - i); - - ir_rvalue *const cond_deref = - compare_index_block(list, index, i, comps, this->mem_ctx); - - if (comps == 1) { - this->generator.generate(i, cond_deref->clone(this->mem_ctx, NULL), - list); - } else { - for (unsigned j = 0; j < comps; j++) { - ir_rvalue *const cond_swiz = - new(this->mem_ctx) ir_swizzle(cond_deref->clone(this->mem_ctx, NULL), - j, 0, 0, 0, 1); - - this->generator.generate(i + j, cond_swiz, list); - } - } - } - } - - void bisect(unsigned begin, unsigned end, exec_list *list) - { - unsigned middle = (begin + end) >> 1; - - assert(index->type->is_integer()); - - ir_constant *const middle_c = (index->type->base_type == GLSL_TYPE_UINT) - ? new(this->mem_ctx) ir_constant((unsigned)middle) - : new(this->mem_ctx) ir_constant((int)middle); - - - ir_dereference_variable *deref = - new(this->mem_ctx) ir_dereference_variable(this->index); - - ir_expression *less = - new(this->mem_ctx) ir_expression(ir_binop_less, glsl_type::bool_type, - deref, middle_c); - - ir_if *if_less = new(this->mem_ctx) ir_if(less); - - generate(begin, middle, &if_less->then_instructions); - generate(middle, end, &if_less->else_instructions); - - list->push_tail(if_less); - } - - void generate(unsigned begin, unsigned end, exec_list *list) - { - unsigned length = end - begin; - if (length <= this->linear_sequence_max_length) - return linear_sequence(begin, end, list); - else - return bisect(begin, end, list); - } -}; - -/** - * Visitor class for replacing expressions with ir_constant values. - */ - -class variable_index_to_cond_assign_visitor : public ir_rvalue_visitor { -public: - variable_index_to_cond_assign_visitor(bool lower_input, - bool lower_output, - bool lower_temp, - bool lower_uniform) - { - this->progress = false; - this->lower_inputs = lower_input; - this->lower_outputs = lower_output; - this->lower_temps = lower_temp; - this->lower_uniforms = lower_uniform; - } - - bool progress; - bool lower_inputs; - bool lower_outputs; - bool lower_temps; - bool lower_uniforms; - - bool storage_type_needs_lowering(ir_dereference_array *deref) const - { - /* If a variable isn't eventually the target of this dereference, then - * it must be a constant or some sort of anonymous temporary storage. - * - * FINISHME: Is this correct? Most drivers treat arrays of constants as - * FINISHME: uniforms. It seems like this should do the same. - */ - const ir_variable *const var = deref->array->variable_referenced(); - if (var == NULL) - return this->lower_temps; - - switch (var->data.mode) { - case ir_var_auto: - case ir_var_temporary: - return this->lower_temps; - case ir_var_uniform: - return this->lower_uniforms; - case ir_var_function_in: - case ir_var_const_in: - return this->lower_temps; - case ir_var_shader_in: - return this->lower_inputs; - case ir_var_function_out: - return this->lower_temps; - case ir_var_shader_out: - case ir_var_shader_inout: - return this->lower_outputs; - case ir_var_function_inout: - return this->lower_temps; - } - - assert(!"Should not get here."); - return false; - } - - bool needs_lowering(ir_dereference_array *deref) const - { - if (deref == NULL || deref->array_index->as_constant() - || !is_array_or_matrix(deref->array)) - return false; - - return this->storage_type_needs_lowering(deref); - } - - ir_variable *convert_dereference_array(ir_dereference_array *orig_deref, - ir_assignment* orig_assign, - ir_dereference *orig_base) - { - assert(is_array_or_matrix(orig_deref->array)); - - const unsigned length = (orig_deref->array->type->is_array()) - ? orig_deref->array->type->length - : orig_deref->array->type->matrix_columns; - - void *const mem_ctx = ralloc_parent(base_ir); - - /* Temporary storage for either the result of the dereference of - * the array, or the RHS that's being assigned into the - * dereference of the array. - */ - ir_variable *var; - - if (orig_assign) { - var = new(mem_ctx) ir_variable(orig_assign->rhs->type, - "dereference_array_value", - ir_var_temporary, precision_from_ir(orig_deref)); - base_ir->insert_before(var); - - ir_dereference *lhs = new(mem_ctx) ir_dereference_variable(var); - ir_assignment *assign = new(mem_ctx) ir_assignment(lhs, - orig_assign->rhs, - NULL); - - base_ir->insert_before(assign); - } else { - var = new(mem_ctx) ir_variable(orig_deref->type, - "dereference_array_value", - ir_var_temporary, precision_from_ir(orig_deref)); - base_ir->insert_before(var); - } - - /* Store the index to a temporary to avoid reusing its tree. */ - ir_variable *index = - new(mem_ctx) ir_variable(orig_deref->array_index->type, - "dereference_array_index", ir_var_temporary, precision_from_ir(orig_deref->array_index)); - base_ir->insert_before(index); - - ir_dereference *lhs = new(mem_ctx) ir_dereference_variable(index); - ir_assignment *assign = - new(mem_ctx) ir_assignment(lhs, orig_deref->array_index, NULL); - base_ir->insert_before(assign); - - orig_deref->array_index = lhs->clone(mem_ctx, NULL); - - assignment_generator ag; - ag.rvalue = orig_base; - ag.base_ir = base_ir; - ag.old_index = index; - ag.var = var; - if (orig_assign) { - ag.is_write = true; - ag.write_mask = orig_assign->write_mask; - } else { - ag.is_write = false; - } - - switch_generator sg(ag, index, 4, 4); - - /* If the original assignment has a condition, respect that original - * condition! This is acomplished by wrapping the new conditional - * assignments in an if-statement that uses the original condition. - */ - if ((orig_assign != NULL) && (orig_assign->condition != NULL)) { - /* No need to clone the condition because the IR that it hangs on is - * going to be removed from the instruction sequence. - */ - ir_if *if_stmt = new(mem_ctx) ir_if(orig_assign->condition); - - sg.generate(0, length, &if_stmt->then_instructions); - base_ir->insert_before(if_stmt); - } else { - exec_list list; - - sg.generate(0, length, &list); - base_ir->insert_before(&list); - } - - return var; - } - - virtual void handle_rvalue(ir_rvalue **pir) - { - if (this->in_assignee) - return; - - if (!*pir) - return; - - ir_dereference_array* orig_deref = (*pir)->as_dereference_array(); - if (needs_lowering(orig_deref)) { - ir_variable *var = - convert_dereference_array(orig_deref, NULL, orig_deref); - assert(var); - *pir = new(ralloc_parent(base_ir)) ir_dereference_variable(var); - this->progress = true; - } - } - - ir_visitor_status - visit_leave(ir_assignment *ir) - { - ir_rvalue_visitor::visit_leave(ir); - - find_variable_index f; - ir->lhs->accept(&f); - - if ((f.deref != NULL) && storage_type_needs_lowering(f.deref)) { - convert_dereference_array(f.deref, ir, ir->lhs); - ir->remove(); - this->progress = true; - } - - return visit_continue; - } -}; - -} /* anonymous namespace */ - -bool -lower_variable_index_to_cond_assign(exec_list *instructions, - bool lower_input, - bool lower_output, - bool lower_temp, - bool lower_uniform) -{ - variable_index_to_cond_assign_visitor v(lower_input, - lower_output, - lower_temp, - lower_uniform); - - /* Continue lowering until no progress is made. If there are multiple - * levels of indirection (e.g., non-constant indexing of array elements and - * matrix columns of an array of matrix), each pass will only lower one - * level of indirection. - */ - bool progress_ever = false; - do { - v.progress = false; - visit_list_elements(&v, instructions); - progress_ever = v.progress || progress_ever; - } while (v.progress); - - return progress_ever; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_vec_index_to_cond_assign.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_vec_index_to_cond_assign.cpp deleted file mode 100644 index 285b0a0f2..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_vec_index_to_cond_assign.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file lower_vec_index_to_cond_assign.cpp - * - * Turns indexing into vector types to a series of conditional moves - * of each channel's swizzle into a temporary. - * - * Most GPUs don't have a native way to do this operation, and this - * works around that. For drivers using both this pass and - * ir_vec_index_to_swizzle, there's a risk that this pass will happen - * before sufficient constant folding to find that the array index is - * constant. However, we hope that other optimization passes, - * particularly constant folding of assignment conditions and copy - * propagation, will result in the same code in the end. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_optimization.h" -#include "glsl_types.h" - -namespace { - -/** - * Visitor class for replacing expressions with ir_constant values. - */ - -class ir_vec_index_to_cond_assign_visitor : public ir_hierarchical_visitor { -public: - ir_vec_index_to_cond_assign_visitor() - { - progress = false; - } - - ir_rvalue *convert_vec_index_to_cond_assign(void *mem_ctx, - ir_rvalue *orig_vector, - ir_rvalue *orig_index, - const glsl_type *type); - - ir_rvalue *convert_vector_extract_to_cond_assign(ir_rvalue *ir); - - virtual ir_visitor_status visit_enter(ir_expression *); - virtual ir_visitor_status visit_enter(ir_swizzle *); - virtual ir_visitor_status visit_leave(ir_assignment *); - virtual ir_visitor_status visit_enter(ir_return *); - virtual ir_visitor_status visit_enter(ir_call *); - virtual ir_visitor_status visit_enter(ir_if *); - - bool progress; -}; - -} /* anonymous namespace */ - -ir_rvalue * -ir_vec_index_to_cond_assign_visitor::convert_vec_index_to_cond_assign(void *mem_ctx, - ir_rvalue *orig_vector, - ir_rvalue *orig_index, - const glsl_type *type) -{ - ir_assignment *assign, *value_assign; - ir_variable *index, *var, *value; - ir_dereference *deref, *deref_value; - unsigned i; - - - exec_list list; - - /* Store the index to a temporary to avoid reusing its tree. */ - index = new(base_ir) ir_variable(glsl_type::int_type, - "vec_index_tmp_i", - ir_var_temporary, glsl_precision_undefined); - list.push_tail(index); - deref = new(base_ir) ir_dereference_variable(index); - assign = new(base_ir) ir_assignment(deref, orig_index, NULL); - list.push_tail(assign); - - /* Store the value inside a temp, thus avoiding matrixes duplication */ - value = new(base_ir) ir_variable(orig_vector->type, "vec_value_tmp", - ir_var_temporary, orig_vector->get_precision()); - list.push_tail(value); - deref_value = new(base_ir) ir_dereference_variable(value); - value_assign = new(base_ir) ir_assignment(deref_value, orig_vector); - list.push_tail(value_assign); - - /* Temporary where we store whichever value we swizzle out. */ - var = new(base_ir) ir_variable(type, "vec_index_tmp_v", - ir_var_temporary, orig_vector->get_precision()); - list.push_tail(var); - - /* Generate a single comparison condition "mask" for all of the components - * in the vector. - */ - ir_rvalue *const cond_deref = - compare_index_block(&list, index, 0, - orig_vector->type->vector_elements, - mem_ctx); - - /* Generate a conditional move of each vector element to the temp. */ - for (i = 0; i < (int)orig_vector->type->vector_elements; i++) { - ir_rvalue *condition_swizzle = - new(base_ir) ir_swizzle(cond_deref->clone(mem_ctx, NULL), - i, 0, 0, 0, 1); - - /* Just clone the rest of the deref chain when trying to get at the - * underlying variable. - */ - ir_rvalue *swizzle = - new(base_ir) ir_swizzle(deref_value->clone(mem_ctx, NULL), - i, 0, 0, 0, 1); - - deref = new(base_ir) ir_dereference_variable(var); - assign = new(base_ir) ir_assignment(deref, swizzle, condition_swizzle); - list.push_tail(assign); - } - - /* Put all of the new instructions in the IR stream before the old - * instruction. - */ - base_ir->insert_before(&list); - - this->progress = true; - return new(base_ir) ir_dereference_variable(var); -} - -ir_rvalue * -ir_vec_index_to_cond_assign_visitor::convert_vector_extract_to_cond_assign(ir_rvalue *ir) -{ - ir_expression *const expr = ir->as_expression(); - - if (expr == NULL || expr->operation != ir_binop_vector_extract) - return ir; - - return convert_vec_index_to_cond_assign(ralloc_parent(ir), - expr->operands[0], - expr->operands[1], - ir->type); -} - -ir_visitor_status -ir_vec_index_to_cond_assign_visitor::visit_enter(ir_expression *ir) -{ - unsigned int i; - - for (i = 0; i < ir->get_num_operands(); i++) { - ir->operands[i] = convert_vector_extract_to_cond_assign(ir->operands[i]); - } - - return visit_continue; -} - -ir_visitor_status -ir_vec_index_to_cond_assign_visitor::visit_enter(ir_swizzle *ir) -{ - /* Can't be hit from normal GLSL, since you can't swizzle a scalar (which - * the result of indexing a vector is. But maybe at some point we'll end up - * using swizzling of scalars for vector construction. - */ - ir->val = convert_vector_extract_to_cond_assign(ir->val); - - return visit_continue; -} - -ir_visitor_status -ir_vec_index_to_cond_assign_visitor::visit_leave(ir_assignment *ir) -{ - - ir->rhs = convert_vector_extract_to_cond_assign(ir->rhs); - - if (ir->condition) { - ir->condition = convert_vector_extract_to_cond_assign(ir->condition); - } - - return visit_continue; -} - -ir_visitor_status -ir_vec_index_to_cond_assign_visitor::visit_enter(ir_call *ir) -{ - foreach_in_list_safe(ir_rvalue, param, &ir->actual_parameters) { - ir_rvalue *new_param = convert_vector_extract_to_cond_assign(param); - - if (new_param != param) { - param->replace_with(new_param); - } - } - - return visit_continue; -} - -ir_visitor_status -ir_vec_index_to_cond_assign_visitor::visit_enter(ir_return *ir) -{ - if (ir->value) { - ir->value = convert_vector_extract_to_cond_assign(ir->value); - } - - return visit_continue; -} - -ir_visitor_status -ir_vec_index_to_cond_assign_visitor::visit_enter(ir_if *ir) -{ - ir->condition = convert_vector_extract_to_cond_assign(ir->condition); - - return visit_continue; -} - -bool -do_vec_index_to_cond_assign(exec_list *instructions) -{ - ir_vec_index_to_cond_assign_visitor v; - - visit_list_elements(&v, instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_vec_index_to_swizzle.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_vec_index_to_swizzle.cpp deleted file mode 100644 index 4d4d2f17e..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_vec_index_to_swizzle.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file lower_vec_index_to_swizzle.cpp - * - * Turns constant indexing into vector types to swizzles. This will - * let other swizzle-aware optimization passes catch these constructs, - * and codegen backends not have to worry about this case. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_optimization.h" -#include "glsl_types.h" -#include "main/macros.h" - -/** - * Visitor class for replacing expressions with ir_constant values. - */ - -namespace { - -class ir_vec_index_to_swizzle_visitor : public ir_hierarchical_visitor { -public: - ir_vec_index_to_swizzle_visitor() - { - progress = false; - } - - ir_rvalue *convert_vector_extract_to_swizzle(ir_rvalue *val); - - virtual ir_visitor_status visit_enter(ir_expression *); - virtual ir_visitor_status visit_enter(ir_swizzle *); - virtual ir_visitor_status visit_enter(ir_assignment *); - virtual ir_visitor_status visit_enter(ir_return *); - virtual ir_visitor_status visit_enter(ir_call *); - virtual ir_visitor_status visit_enter(ir_if *); - - bool progress; -}; - -} /* anonymous namespace */ - -ir_rvalue * -ir_vec_index_to_swizzle_visitor::convert_vector_extract_to_swizzle(ir_rvalue *ir) -{ - ir_expression *const expr = ir->as_expression(); - if (expr == NULL || expr->operation != ir_binop_vector_extract) - return ir; - - ir_constant *const idx = expr->operands[1]->constant_expression_value(); - if (idx == NULL) - return ir; - - void *ctx = ralloc_parent(ir); - this->progress = true; - - /* Page 40 of the GLSL 1.20 spec says: - * - * "When indexing with non-constant expressions, behavior is undefined - * if the index is negative, or greater than or equal to the size of - * the vector." - * - * The quoted spec text mentions non-constant expressions, but this code - * operates on constants. These constants are the result of non-constant - * expressions that have been optimized to constants. The common case here - * is a loop counter from an unrolled loop that is used to index a vector. - * - * The ir_swizzle constructor gets angry if the index is negative or too - * large. For simplicity sake, just clamp the index to [0, size-1]. - */ - const int i = CLAMP(idx->value.i[0], 0, - (int) expr->operands[0]->type->vector_elements - 1); - - return new(ctx) ir_swizzle(expr->operands[0], i, 0, 0, 0, 1); -} - -ir_visitor_status -ir_vec_index_to_swizzle_visitor::visit_enter(ir_expression *ir) -{ - unsigned int i; - - for (i = 0; i < ir->get_num_operands(); i++) { - ir->operands[i] = convert_vector_extract_to_swizzle(ir->operands[i]); - } - - return visit_continue; -} - -ir_visitor_status -ir_vec_index_to_swizzle_visitor::visit_enter(ir_swizzle *ir) -{ - /* Can't be hit from normal GLSL, since you can't swizzle a scalar (which - * the result of indexing a vector is. But maybe at some point we'll end up - * using swizzling of scalars for vector construction. - */ - ir->val = convert_vector_extract_to_swizzle(ir->val); - - return visit_continue; -} - -ir_visitor_status -ir_vec_index_to_swizzle_visitor::visit_enter(ir_assignment *ir) -{ - ir->rhs = convert_vector_extract_to_swizzle(ir->rhs); - - return visit_continue; -} - -ir_visitor_status -ir_vec_index_to_swizzle_visitor::visit_enter(ir_call *ir) -{ - foreach_in_list_safe(ir_rvalue, param, &ir->actual_parameters) { - ir_rvalue *new_param = convert_vector_extract_to_swizzle(param); - - if (new_param != param) { - param->replace_with(new_param); - } - } - - return visit_continue; -} - -ir_visitor_status -ir_vec_index_to_swizzle_visitor::visit_enter(ir_return *ir) -{ - if (ir->value) { - ir->value = convert_vector_extract_to_swizzle(ir->value); - } - - return visit_continue; -} - -ir_visitor_status -ir_vec_index_to_swizzle_visitor::visit_enter(ir_if *ir) -{ - ir->condition = convert_vector_extract_to_swizzle(ir->condition); - - return visit_continue; -} - -bool -do_vec_index_to_swizzle(exec_list *instructions) -{ - ir_vec_index_to_swizzle_visitor v; - - v.run(instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_vector.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_vector.cpp deleted file mode 100644 index 022bcceec..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_vector.cpp +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file lower_vector.cpp - * IR lowering pass to remove some types of ir_quadop_vector - * - * \author Ian Romanick - */ - -#include "ir.h" -#include "ir_rvalue_visitor.h" - -namespace { - -class lower_vector_visitor : public ir_rvalue_visitor { -public: - lower_vector_visitor() : dont_lower_swz(false), progress(false) - { - /* empty */ - } - - void handle_rvalue(ir_rvalue **rvalue); - - /** - * Should SWZ-like expressions be lowered? - */ - bool dont_lower_swz; - - bool progress; -}; - -} /* anonymous namespace */ - -/** - * Determine if an IR expression tree looks like an extended swizzle - * - * Extended swizzles consist of access of a single vector source (with possible - * per component negation) and the constants -1, 0, or 1. - */ -bool -is_extended_swizzle(ir_expression *ir) -{ - /* Track any variables that are accessed by this expression. - */ - ir_variable *var = NULL; - - assert(ir->operation == ir_quadop_vector); - - for (unsigned i = 0; i < ir->type->vector_elements; i++) { - ir_rvalue *op = ir->operands[i]; - - while (op != NULL) { - switch (op->ir_type) { - case ir_type_constant: { - const ir_constant *const c = op->as_constant(); - - if (!c->is_one() && !c->is_zero() && !c->is_negative_one()) - return false; - - op = NULL; - break; - } - - case ir_type_dereference_variable: { - ir_dereference_variable *const d = (ir_dereference_variable *) op; - - if ((var != NULL) && (var != d->var)) - return false; - - var = d->var; - op = NULL; - break; - } - - case ir_type_expression: { - ir_expression *const ex = (ir_expression *) op; - - if (ex->operation != ir_unop_neg) - return false; - - op = ex->operands[0]; - break; - } - - case ir_type_swizzle: - op = ((ir_swizzle *) op)->val; - break; - - default: - return false; - } - } - } - - return true; -} - -void -lower_vector_visitor::handle_rvalue(ir_rvalue **rvalue) -{ - if (!*rvalue) - return; - - ir_expression *expr = (*rvalue)->as_expression(); - if ((expr == NULL) || (expr->operation != ir_quadop_vector)) - return; - - if (this->dont_lower_swz && is_extended_swizzle(expr)) - return; - - /* FINISHME: Is this the right thing to use for the ralloc context? - */ - void *const mem_ctx = expr; - - assert(expr->type->vector_elements == expr->get_num_operands()); - - /* Generate a temporary with the same type as the ir_quadop_operation. - */ - ir_variable *const temp = - new(mem_ctx) ir_variable(expr->type, "vecop_tmp", ir_var_temporary, precision_from_ir(expr)); - - this->base_ir->insert_before(temp); - - /* Counter of the number of components collected so far. - */ - unsigned assigned; - - /* Write-mask in the destination that receives counted by 'assigned'. - */ - unsigned write_mask; - - - /* Generate upto four assignments to that variable. Try to group component - * assignments together: - * - * - All constant components can be assigned at once. - * - All assigments of components from a single variable with the same - * unary operator can be assigned at once. - */ - ir_constant_data d = { { 0 } }; - - assigned = 0; - write_mask = 0; - for (unsigned i = 0; i < expr->type->vector_elements; i++) { - const ir_constant *const c = expr->operands[i]->as_constant(); - - if (c == NULL) - continue; - - switch (expr->type->base_type) { - case GLSL_TYPE_UINT: d.u[assigned] = c->value.u[0]; break; - case GLSL_TYPE_INT: d.i[assigned] = c->value.i[0]; break; - case GLSL_TYPE_FLOAT: d.f[assigned] = c->value.f[0]; break; - case GLSL_TYPE_BOOL: d.b[assigned] = c->value.b[0]; break; - default: assert(!"Should not get here."); break; - } - - write_mask |= (1U << i); - assigned++; - } - - assert((write_mask == 0) == (assigned == 0)); - - /* If there were constant values, generate an assignment. - */ - if (assigned > 0) { - ir_constant *const c = - new(mem_ctx) ir_constant(glsl_type::get_instance(expr->type->base_type, - assigned, 1), - &d); - ir_dereference *const lhs = new(mem_ctx) ir_dereference_variable(temp); - ir_assignment *const assign = - new(mem_ctx) ir_assignment(lhs, c, NULL, write_mask); - - this->base_ir->insert_before(assign); - } - - /* FINISHME: This should try to coalesce assignments. - */ - for (unsigned i = 0; i < expr->type->vector_elements; i++) { - if (expr->operands[i]->ir_type == ir_type_constant) - continue; - - ir_dereference *const lhs = new(mem_ctx) ir_dereference_variable(temp); - ir_assignment *const assign = - new(mem_ctx) ir_assignment(lhs, expr->operands[i], NULL, (1U << i)); - - this->base_ir->insert_before(assign); - assigned++; - } - - assert(assigned == expr->type->vector_elements); - - *rvalue = new(mem_ctx) ir_dereference_variable(temp); - this->progress = true; -} - -bool -lower_quadop_vector(exec_list *instructions, bool dont_lower_swz) -{ - lower_vector_visitor v; - - v.dont_lower_swz = dont_lower_swz; - visit_list_elements(&v, instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_vector_insert.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_vector_insert.cpp deleted file mode 100644 index bd9c1e209..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_vector_insert.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright © 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#include "ir.h" -#include "ir_builder.h" -#include "ir_rvalue_visitor.h" -#include "ir_optimization.h" - -using namespace ir_builder; - -namespace { - -class vector_insert_visitor : public ir_rvalue_visitor { -public: - vector_insert_visitor(bool lower_nonconstant_index) - : progress(false), lower_nonconstant_index(lower_nonconstant_index) - { - factory.instructions = &factory_instructions; - } - - virtual ~vector_insert_visitor() - { - assert(factory_instructions.is_empty()); - } - - virtual void handle_rvalue(ir_rvalue **rv); - - ir_factory factory; - exec_list factory_instructions; - bool progress; - bool lower_nonconstant_index; -}; - -} /* anonymous namespace */ - -void -vector_insert_visitor::handle_rvalue(ir_rvalue **rv) -{ - if (*rv == NULL || (*rv)->ir_type != ir_type_expression) - return; - - ir_expression *const expr = (ir_expression *) *rv; - - if (likely(expr->operation != ir_triop_vector_insert)) - return; - - factory.mem_ctx = ralloc_parent(expr); - - ir_constant *const idx = expr->operands[2]->constant_expression_value(); - if (idx != NULL) { - /* Replace (vector_insert (vec) (scalar) (index)) with a dereference of - * a new temporary. The new temporary gets assigned as - * - * t = vec - * t.mask = scalar - * - * where mask is the component selected by index. - */ - ir_variable *const temp = - factory.make_temp(expr->operands[0]->type, "vec_tmp", expr->operands[0]->get_precision()); - - const int mask = 1 << idx->value.i[0]; - - factory.emit(assign(temp, expr->operands[0])); - factory.emit(assign(temp, expr->operands[1], mask)); - - this->progress = true; - *rv = new(factory.mem_ctx) ir_dereference_variable(temp); - } else if (this->lower_nonconstant_index) { - /* Replace (vector_insert (vec) (scalar) (index)) with a dereference of - * a new temporary. The new temporary gets assigned as - * - * t = vec - * if (index == 0) - * t.x = scalar - * if (index == 1) - * t.y = scalar - * if (index == 2) - * t.z = scalar - * if (index == 3) - * t.w = scalar - */ - ir_variable *const temp = - factory.make_temp(expr->operands[0]->type, "vec_tmp", expr->operands[0]->get_precision()); - - ir_variable *const src_temp = - factory.make_temp(expr->operands[1]->type, "src_temp", expr->operands[1]->get_precision()); - - factory.emit(assign(temp, expr->operands[0])); - factory.emit(assign(src_temp, expr->operands[1])); - - for (unsigned i = 0; i < expr->type->vector_elements; i++) { - ir_constant *const cmp_index = - new(factory.mem_ctx) ir_constant(int(i)); - - ir_variable *const cmp_result = - factory.make_temp(glsl_type::bool_type, "index_condition", glsl_precision_low); - - factory.emit(assign(cmp_result, - equal(expr->operands[2]->clone(factory.mem_ctx, - NULL), - cmp_index))); - - factory.emit(if_tree(cmp_result, - assign(temp, src_temp, WRITEMASK_X << i))); - } - - this->progress = true; - *rv = new(factory.mem_ctx) ir_dereference_variable(temp); - } - - base_ir->insert_before(factory.instructions); -} - -bool -lower_vector_insert(exec_list *instructions, bool lower_nonconstant_index) -{ - vector_insert_visitor v(lower_nonconstant_index); - - visit_list_elements(&v, instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/lower_vertex_id.cpp b/3rdparty/glsl-optimizer/src/glsl/lower_vertex_id.cpp deleted file mode 100644 index 3725eeeca..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/lower_vertex_id.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright © 2014 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file lower_vertex_id.cpp - * - * There exists hardware, such as i965, that does not implement the OpenGL - * semantic for gl_VertexID. Instead, that hardware does not include the - * value of basevertex in the gl_VertexID value. To implement the OpenGL - * semantic, we'll have to convert gl_Vertex_ID to - * gl_VertexIDMESA+gl_BaseVertexMESA. - */ - -#include "glsl_symbol_table.h" -#include "ir_hierarchical_visitor.h" -#include "ir.h" -#include "ir_builder.h" -#include "linker.h" -#include "program/prog_statevars.h" - -namespace { - -class lower_vertex_id_visitor : public ir_hierarchical_visitor { -public: - explicit lower_vertex_id_visitor(ir_function_signature *main_sig, - exec_list *ir_list) - : progress(false), VertexID(NULL), gl_VertexID(NULL), - gl_BaseVertex(NULL), main_sig(main_sig), ir_list(ir_list) - { - foreach_in_list(ir_instruction, ir, ir_list) { - ir_variable *const var = ir->as_variable(); - - if (var != NULL && var->data.mode == ir_var_system_value && - var->data.location == SYSTEM_VALUE_BASE_VERTEX) { - gl_BaseVertex = var; - break; - } - } - } - - virtual ir_visitor_status visit(ir_dereference_variable *); - - bool progress; - -private: - ir_variable *VertexID; - ir_variable *gl_VertexID; - ir_variable *gl_BaseVertex; - - ir_function_signature *main_sig; - exec_list *ir_list; -}; - -} /* anonymous namespace */ - -ir_visitor_status -lower_vertex_id_visitor::visit(ir_dereference_variable *ir) -{ - if (ir->var->data.mode != ir_var_system_value || - ir->var->data.location != SYSTEM_VALUE_VERTEX_ID) - return visit_continue; - - if (VertexID == NULL) { - const glsl_type *const int_t = glsl_type::int_type; - void *const mem_ctx = ralloc_parent(ir); - - VertexID = new(mem_ctx) ir_variable(int_t, "__VertexID", - ir_var_temporary, glsl_precision_high); - ir_list->push_head(VertexID); - - gl_VertexID = new(mem_ctx) ir_variable(int_t, "gl_VertexIDMESA", - ir_var_system_value, glsl_precision_high); - gl_VertexID->data.how_declared = ir_var_declared_implicitly; - gl_VertexID->data.read_only = true; - gl_VertexID->data.location = SYSTEM_VALUE_VERTEX_ID_ZERO_BASE; - gl_VertexID->data.explicit_location = true; - gl_VertexID->data.explicit_index = 0; - ir_list->push_head(gl_VertexID); - - if (gl_BaseVertex == NULL) { - gl_BaseVertex = new(mem_ctx) ir_variable(int_t, "gl_BaseVertex", - ir_var_system_value, glsl_precision_high); - gl_BaseVertex->data.how_declared = ir_var_declared_implicitly; - gl_BaseVertex->data.read_only = true; - gl_BaseVertex->data.location = SYSTEM_VALUE_BASE_VERTEX; - gl_BaseVertex->data.explicit_location = true; - gl_BaseVertex->data.explicit_index = 0; - ir_list->push_head(gl_BaseVertex); - } - - ir_instruction *const inst = - ir_builder::assign(VertexID, - ir_builder::add(gl_VertexID, gl_BaseVertex)); - - main_sig->body.push_head(inst); - } - - ir->var = VertexID; - progress = true; - - return visit_continue; -} - -bool -lower_vertex_id(gl_shader *shader) -{ - /* gl_VertexID only exists in the vertex shader. - */ - if (shader->Stage != MESA_SHADER_VERTEX) - return false; - - ir_function_signature *const main_sig = - link_get_main_function_signature(shader); - if (main_sig == NULL) { - assert(main_sig != NULL); - return false; - } - - lower_vertex_id_visitor v(main_sig, shader->ir); - - v.run(shader->ir); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/main.cpp b/3rdparty/glsl-optimizer/src/glsl/main.cpp deleted file mode 100644 index 97fcee187..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/main.cpp +++ /dev/null @@ -1,415 +0,0 @@ -/* - * Copyright © 2008, 2009 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#include - -/** @file main.cpp - * - * This file is the main() routine and scaffolding for producing - * builtin_compiler (which doesn't include builtins itself and is used - * to generate the profile information for builtin_function.cpp), and - * for glsl_compiler (which does include builtins and can be used to - * offline compile GLSL code and examine the resulting GLSL IR. - */ - -#include "ast.h" -#include "glsl_parser_extras.h" -#include "ir_optimization.h" -#include "program.h" -#include "loop_analysis.h" -#include "standalone_scaffolding.h" - -static int glsl_version = 330; - -static void -initialize_context(struct gl_context *ctx, gl_api api) -{ - initialize_context_to_defaults(ctx, api); - - /* The standalone compiler needs to claim support for almost - * everything in order to compile the built-in functions. - */ - ctx->Const.GLSLVersion = glsl_version; - ctx->Extensions.ARB_ES3_compatibility = true; - ctx->Const.MaxComputeWorkGroupCount[0] = 65535; - ctx->Const.MaxComputeWorkGroupCount[1] = 65535; - ctx->Const.MaxComputeWorkGroupCount[2] = 65535; - ctx->Const.MaxComputeWorkGroupSize[0] = 1024; - ctx->Const.MaxComputeWorkGroupSize[1] = 1024; - ctx->Const.MaxComputeWorkGroupSize[2] = 64; - ctx->Const.MaxComputeWorkGroupInvocations = 1024; - ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = 16; - ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformComponents = 1024; - ctx->Const.Program[MESA_SHADER_COMPUTE].MaxInputComponents = 0; /* not used */ - ctx->Const.Program[MESA_SHADER_COMPUTE].MaxOutputComponents = 0; /* not used */ - - switch (ctx->Const.GLSLVersion) { - case 100: - ctx->Const.MaxClipPlanes = 0; - ctx->Const.MaxCombinedTextureImageUnits = 8; - ctx->Const.MaxDrawBuffers = 2; - ctx->Const.MinProgramTexelOffset = 0; - ctx->Const.MaxProgramTexelOffset = 0; - ctx->Const.MaxLights = 0; - ctx->Const.MaxTextureCoordUnits = 0; - ctx->Const.MaxTextureUnits = 8; - - ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 8; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 0; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 128 * 4; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */ - ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 32; - - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = - ctx->Const.MaxCombinedTextureImageUnits; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 16 * 4; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = - ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */ - - ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4; - break; - case 110: - case 120: - ctx->Const.MaxClipPlanes = 6; - ctx->Const.MaxCombinedTextureImageUnits = 2; - ctx->Const.MaxDrawBuffers = 1; - ctx->Const.MinProgramTexelOffset = 0; - ctx->Const.MaxProgramTexelOffset = 0; - ctx->Const.MaxLights = 8; - ctx->Const.MaxTextureCoordUnits = 2; - ctx->Const.MaxTextureUnits = 2; - - ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 0; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 512; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */ - ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 32; - - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = - ctx->Const.MaxCombinedTextureImageUnits; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 64; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = - ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */ - - ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4; - break; - case 130: - case 140: - ctx->Const.MaxClipPlanes = 8; - ctx->Const.MaxCombinedTextureImageUnits = 16; - ctx->Const.MaxDrawBuffers = 8; - ctx->Const.MinProgramTexelOffset = -8; - ctx->Const.MaxProgramTexelOffset = 7; - ctx->Const.MaxLights = 8; - ctx->Const.MaxTextureCoordUnits = 8; - ctx->Const.MaxTextureUnits = 2; - - ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 16; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 1024; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */ - ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 64; - - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = 16; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 1024; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = - ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */ - - ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4; - break; - case 150: - case 330: - ctx->Const.MaxClipPlanes = 8; - ctx->Const.MaxDrawBuffers = 8; - ctx->Const.MinProgramTexelOffset = -8; - ctx->Const.MaxProgramTexelOffset = 7; - ctx->Const.MaxLights = 8; - ctx->Const.MaxTextureCoordUnits = 8; - ctx->Const.MaxTextureUnits = 2; - - ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 16; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 1024; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */ - ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 64; - - ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits = 16; - ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxUniformComponents = 1024; - ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxInputComponents = - ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents; - ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxOutputComponents = 128; - - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = 16; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 1024; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = - ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxOutputComponents; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */ - - ctx->Const.MaxCombinedTextureImageUnits = - ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits - + ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits - + ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits; - - ctx->Const.MaxGeometryOutputVertices = 256; - ctx->Const.MaxGeometryTotalOutputComponents = 1024; - -// ctx->Const.MaxGeometryVaryingComponents = 64; - - ctx->Const.MaxVarying = 60 / 4; - break; - case 300: - ctx->Const.MaxClipPlanes = 8; - ctx->Const.MaxCombinedTextureImageUnits = 32; - ctx->Const.MaxDrawBuffers = 4; - ctx->Const.MinProgramTexelOffset = -8; - ctx->Const.MaxProgramTexelOffset = 7; - ctx->Const.MaxLights = 0; - ctx->Const.MaxTextureCoordUnits = 0; - ctx->Const.MaxTextureUnits = 0; - - ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 16; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 1024; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */ - ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 16 * 4; - - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = 16; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 224; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = 15 * 4; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */ - - ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents / 4; - break; - } - - ctx->Const.GenerateTemporaryNames = true; - ctx->Driver.NewShader = _mesa_new_shader; -} - -/* Returned string will have 'ctx' as its ralloc owner. */ -static char * -load_text_file(void *ctx, const char *file_name) -{ - char *text = NULL; - size_t size; - size_t total_read = 0; - FILE *fp = fopen(file_name, "rb"); - - if (!fp) { - return NULL; - } - - fseek(fp, 0L, SEEK_END); - size = ftell(fp); - fseek(fp, 0L, SEEK_SET); - - text = (char *) ralloc_size(ctx, size + 1); - if (text != NULL) { - do { - size_t bytes = fread(text + total_read, - 1, size - total_read, fp); - if (bytes < size - total_read) { - free(text); - text = NULL; - goto error; - } - - if (bytes == 0) { - break; - } - - total_read += bytes; - } while (total_read < size); - - text[total_read] = '\0'; -error:; - } - - fclose(fp); - - return text; -} - -int dump_ast = 0; -int dump_hir = 0; -int dump_lir = 0; -int do_link = 0; - -const struct option compiler_opts[] = { - { "dump-ast", no_argument, &dump_ast, 1 }, - { "dump-hir", no_argument, &dump_hir, 1 }, - { "dump-lir", no_argument, &dump_lir, 1 }, - { "link", no_argument, &do_link, 1 }, - { "version", required_argument, NULL, 'v' }, - { NULL, 0, NULL, 0 } -}; - -/** - * \brief Print proper usage and exit with failure. - */ -void -usage_fail(const char *name) -{ - - const char *header = - "usage: %s [options] \n" - "\n" - "Possible options are:\n"; - printf(header, name, name); - for (const struct option *o = compiler_opts; o->name != 0; ++o) { - printf(" --%s\n", o->name); - } - exit(EXIT_FAILURE); -} - - -void -compile_shader(struct gl_context *ctx, struct gl_shader *shader) -{ - struct _mesa_glsl_parse_state *state = - new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader); - - _mesa_glsl_compile_shader(ctx, shader, dump_ast, dump_hir); - - /* Print out the resulting IR */ - if (!state->error && dump_lir) { - _mesa_print_ir(stdout, shader->ir, state); - } - - return; -} - -int -main(int argc, char **argv) -{ - int status = EXIT_SUCCESS; - struct gl_context local_ctx; - struct gl_context *ctx = &local_ctx; - bool glsl_es = false; - - int c; - int idx = 0; - while ((c = getopt_long(argc, argv, "", compiler_opts, &idx)) != -1) { - switch (c) { - case 'v': - glsl_version = strtol(optarg, NULL, 10); - switch (glsl_version) { - case 100: - case 300: - glsl_es = true; - break; - case 110: - case 120: - case 130: - case 140: - case 150: - case 330: - glsl_es = false; - break; - default: - fprintf(stderr, "Unrecognized GLSL version `%s'\n", optarg); - usage_fail(argv[0]); - break; - } - break; - default: - break; - } - } - - - if (argc <= optind) - usage_fail(argv[0]); - - initialize_context(ctx, (glsl_es) ? API_OPENGLES2 : API_OPENGL_COMPAT); - - struct gl_shader_program *whole_program; - - whole_program = rzalloc (NULL, struct gl_shader_program); - assert(whole_program != NULL); - whole_program->InfoLog = ralloc_strdup(whole_program, ""); - - for (/* empty */; argc > optind; optind++) { - whole_program->Shaders = - reralloc(whole_program, whole_program->Shaders, - struct gl_shader *, whole_program->NumShaders + 1); - assert(whole_program->Shaders != NULL); - - struct gl_shader *shader = rzalloc(whole_program, gl_shader); - - whole_program->Shaders[whole_program->NumShaders] = shader; - whole_program->NumShaders++; - - const unsigned len = strlen(argv[optind]); - if (len < 6) - usage_fail(argv[0]); - - const char *const ext = & argv[optind][len - 5]; - if (strncmp(".vert", ext, 5) == 0 || strncmp(".glsl", ext, 5) == 0) - shader->Type = GL_VERTEX_SHADER; - else if (strncmp(".geom", ext, 5) == 0) - shader->Type = GL_GEOMETRY_SHADER; - else if (strncmp(".frag", ext, 5) == 0) - shader->Type = GL_FRAGMENT_SHADER; - else if (strncmp(".comp", ext, 5) == 0) - shader->Type = GL_COMPUTE_SHADER; - else - usage_fail(argv[0]); - shader->Stage = _mesa_shader_enum_to_shader_stage(shader->Type); - - shader->Source = load_text_file(whole_program, argv[optind]); - if (shader->Source == NULL) { - printf("File \"%s\" does not exist.\n", argv[optind]); - exit(EXIT_FAILURE); - } - - compile_shader(ctx, shader); - - if (strlen(shader->InfoLog) > 0) - printf("Info log for %s:\n%s\n", argv[optind], shader->InfoLog); - - if (!shader->CompileStatus) { - status = EXIT_FAILURE; - break; - } - } - - if ((status == EXIT_SUCCESS) && do_link) { - link_shaders(ctx, whole_program); - status = (whole_program->LinkStatus) ? EXIT_SUCCESS : EXIT_FAILURE; - - if (strlen(whole_program->InfoLog) > 0) - printf("Info log for linking:\n%s\n", whole_program->InfoLog); - } - - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) - ralloc_free(whole_program->_LinkedShaders[i]); - - ralloc_free(whole_program); - _mesa_glsl_release_types(); - _mesa_glsl_release_builtin_functions(); - - return status; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_algebraic.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_algebraic.cpp deleted file mode 100644 index ce3cc5c74..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_algebraic.cpp +++ /dev/null @@ -1,842 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_algebraic.cpp - * - * Takes advantage of association, commutivity, and other algebraic - * properties to simplify expressions. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_rvalue_visitor.h" -#include "ir_optimization.h" -#include "ir_builder.h" -#include "glsl_types.h" - -using namespace ir_builder; - -namespace { - -/** - * Visitor class for replacing expressions with ir_constant values. - */ - -class ir_algebraic_visitor : public ir_rvalue_visitor { -public: - ir_algebraic_visitor(bool native_integers, - const struct gl_shader_compiler_options *options) - : options(options) - { - this->progress = false; - this->mem_ctx = NULL; - this->native_integers = native_integers; - } - - virtual ~ir_algebraic_visitor() - { - } - - ir_rvalue *handle_expression(ir_expression *ir); - void handle_rvalue(ir_rvalue **rvalue); - bool reassociate_constant(ir_expression *ir1, - int const_index, - ir_constant *constant, - ir_expression *ir2); - void reassociate_operands(ir_expression *ir1, - int op1, - ir_expression *ir2, - int op2); - ir_rvalue *swizzle_if_required(ir_expression *expr, - ir_rvalue *operand); - - const struct gl_shader_compiler_options *options; - void *mem_ctx; - - bool native_integers; - bool progress; -}; - -} /* unnamed namespace */ - -static inline bool -is_vec_zero(ir_constant *ir) -{ - return (ir == NULL) ? false : ir->is_zero(); -} - -static inline bool -is_vec_one(ir_constant *ir) -{ - return (ir == NULL) ? false : ir->is_one(); -} - -static inline bool -is_vec_two(ir_constant *ir) -{ - return (ir == NULL) ? false : ir->is_value(2.0, 2); -} - -static inline bool -is_vec_negative_one(ir_constant *ir) -{ - return (ir == NULL) ? false : ir->is_negative_one(); -} - -static inline bool -is_vec_basis(ir_constant *ir) -{ - return (ir == NULL) ? false : ir->is_basis(); -} - -static inline bool -is_valid_vec_const(ir_constant *ir) -{ - if (ir == NULL) - return false; - - if (!ir->type->is_scalar() && !ir->type->is_vector()) - return false; - - return true; -} - -static inline bool -is_less_than_one(ir_constant *ir) -{ - if (!is_valid_vec_const(ir)) - return false; - - unsigned component = 0; - for (int c = 0; c < ir->type->vector_elements; c++) { - if (ir->get_float_component(c) < 1.0f) - component++; - } - - return (component == ir->type->vector_elements); -} - -static inline bool -is_greater_than_zero(ir_constant *ir) -{ - if (!is_valid_vec_const(ir)) - return false; - - unsigned component = 0; - for (int c = 0; c < ir->type->vector_elements; c++) { - if (ir->get_float_component(c) > 0.0f) - component++; - } - - return (component == ir->type->vector_elements); -} - -static void -update_type(ir_expression *ir) -{ - if (ir->operands[0]->type->is_vector()) - { - ir->type = ir->operands[0]->type; - ir->set_precision (ir->operands[0]->get_precision()); - } - else - { - ir->type = ir->operands[1]->type; - ir->set_precision (ir->operands[1]->get_precision()); - } -} - -/* Recognize (v.x + v.y) + (v.z + v.w) as dot(v, 1.0) */ -static ir_expression * -try_replace_with_dot(ir_expression *expr0, ir_expression *expr1, void *mem_ctx) -{ - if (expr0 && expr0->operation == ir_binop_add && - expr0->type->is_float() && - expr1 && expr1->operation == ir_binop_add && - expr1->type->is_float()) { - ir_swizzle *x = expr0->operands[0]->as_swizzle(); - ir_swizzle *y = expr0->operands[1]->as_swizzle(); - ir_swizzle *z = expr1->operands[0]->as_swizzle(); - ir_swizzle *w = expr1->operands[1]->as_swizzle(); - - if (!x || x->mask.num_components != 1 || - !y || y->mask.num_components != 1 || - !z || z->mask.num_components != 1 || - !w || w->mask.num_components != 1) { - return NULL; - } - - bool swiz_seen[4] = {false, false, false, false}; - swiz_seen[x->mask.x] = true; - swiz_seen[y->mask.x] = true; - swiz_seen[z->mask.x] = true; - swiz_seen[w->mask.x] = true; - - if (!swiz_seen[0] || !swiz_seen[1] || - !swiz_seen[2] || !swiz_seen[3]) { - return NULL; - } - - if (x->val->equals(y->val) && - x->val->equals(z->val) && - x->val->equals(w->val)) { - return dot(x->val, new(mem_ctx) ir_constant(1.0f, 4)); - } - } - return NULL; -} - -void -ir_algebraic_visitor::reassociate_operands(ir_expression *ir1, - int op1, - ir_expression *ir2, - int op2) -{ - ir_rvalue *temp = ir2->operands[op2]; - ir2->operands[op2] = ir1->operands[op1]; - ir1->operands[op1] = temp; - - /* Update the type of ir2. The type of ir1 won't have changed -- - * base types matched, and at least one of the operands of the 2 - * binops is still a vector if any of them were. - */ - update_type(ir2); - - this->progress = true; -} - -/** - * Reassociates a constant down a tree of adds or multiplies. - * - * Consider (2 * (a * (b * 0.5))). We want to send up with a * b. - */ -bool -ir_algebraic_visitor::reassociate_constant(ir_expression *ir1, int const_index, - ir_constant *constant, - ir_expression *ir2) -{ - if (!ir2 || ir1->operation != ir2->operation) - return false; - - /* Don't want to even think about matrices. */ - if (ir1->operands[0]->type->is_matrix() || - ir1->operands[1]->type->is_matrix() || - ir2->operands[0]->type->is_matrix() || - ir2->operands[1]->type->is_matrix()) - return false; - - ir_constant *ir2_const[2]; - ir2_const[0] = ir2->operands[0]->constant_expression_value(); - ir2_const[1] = ir2->operands[1]->constant_expression_value(); - - if (ir2_const[0] && ir2_const[1]) - return false; - - if (ir2_const[0]) { - reassociate_operands(ir1, const_index, ir2, 1); - return true; - } else if (ir2_const[1]) { - reassociate_operands(ir1, const_index, ir2, 0); - return true; - } - - if (reassociate_constant(ir1, const_index, constant, - ir2->operands[0]->as_expression())) { - update_type(ir2); - return true; - } - - if (reassociate_constant(ir1, const_index, constant, - ir2->operands[1]->as_expression())) { - update_type(ir2); - return true; - } - - return false; -} - -/* When eliminating an expression and just returning one of its operands, - * we may need to swizzle that operand out to a vector if the expression was - * vector type. - */ -ir_rvalue * -ir_algebraic_visitor::swizzle_if_required(ir_expression *expr, - ir_rvalue *operand) -{ - if (expr->type->is_vector() && operand->type->is_scalar()) { - return new(mem_ctx) ir_swizzle(operand, 0, 0, 0, 0, - expr->type->vector_elements); - } else - return operand; -} - -ir_rvalue * -ir_algebraic_visitor::handle_expression(ir_expression *ir) -{ - ir_constant *op_const[4] = {NULL, NULL, NULL, NULL}; - ir_expression *op_expr[4] = {NULL, NULL, NULL, NULL}; - unsigned int i; - - assert(ir->get_num_operands() <= 4); - for (i = 0; i < ir->get_num_operands(); i++) { - if (ir->operands[i]->type->is_matrix()) - return ir; - - op_const[i] = ir->operands[i]->constant_expression_value(); - op_expr[i] = ir->operands[i]->as_expression(); - } - - if (this->mem_ctx == NULL) - this->mem_ctx = ralloc_parent(ir); - - switch (ir->operation) { - case ir_unop_bit_not: - if (op_expr[0] && op_expr[0]->operation == ir_unop_bit_not) - return op_expr[0]->operands[0]; - break; - - case ir_unop_abs: - if (op_expr[0] == NULL) - break; - - switch (op_expr[0]->operation) { - case ir_unop_abs: - case ir_unop_neg: - return abs(op_expr[0]->operands[0]); - default: - break; - } - break; - - case ir_unop_neg: - if (op_expr[0] == NULL) - break; - - if (op_expr[0]->operation == ir_unop_neg) { - return op_expr[0]->operands[0]; - } - if (op_expr[0] && op_expr[0]->operation == ir_binop_sub) { - // -(A-B) => (B-A) - this->progress = true; - return new(mem_ctx) ir_expression(ir_binop_sub, - ir->type, - op_expr[0]->operands[1], - op_expr[0]->operands[0]); - } - break; - - case ir_unop_exp: - if (op_expr[0] == NULL) - break; - - if (op_expr[0]->operation == ir_unop_log) { - return op_expr[0]->operands[0]; - } - break; - - case ir_unop_log: - if (op_expr[0] == NULL) - break; - - if (op_expr[0]->operation == ir_unop_exp) { - return op_expr[0]->operands[0]; - } - break; - - case ir_unop_exp2: - if (op_expr[0] == NULL) - break; - - if (op_expr[0]->operation == ir_unop_log2) { - return op_expr[0]->operands[0]; - } - - if (!options->EmitNoPow && op_expr[0]->operation == ir_binop_mul) { - for (int log2_pos = 0; log2_pos < 2; log2_pos++) { - ir_expression *log2_expr = - op_expr[0]->operands[log2_pos]->as_expression(); - - if (log2_expr && log2_expr->operation == ir_unop_log2) { - return new(mem_ctx) ir_expression(ir_binop_pow, - ir->type, - log2_expr->operands[0], - op_expr[0]->operands[1 - log2_pos]); - } - } - } - break; - - case ir_unop_log2: - if (op_expr[0] == NULL) - break; - - if (op_expr[0]->operation == ir_unop_exp2) { - return op_expr[0]->operands[0]; - } - break; - - case ir_unop_logic_not: { - enum ir_expression_operation new_op = ir_unop_logic_not; - - if (op_expr[0] == NULL) - break; - - switch (op_expr[0]->operation) { - case ir_binop_less: new_op = ir_binop_gequal; break; - case ir_binop_greater: new_op = ir_binop_lequal; break; - case ir_binop_lequal: new_op = ir_binop_greater; break; - case ir_binop_gequal: new_op = ir_binop_less; break; - case ir_binop_equal: new_op = ir_binop_nequal; break; - case ir_binop_nequal: new_op = ir_binop_equal; break; - case ir_binop_all_equal: new_op = ir_binop_any_nequal; break; - case ir_binop_any_nequal: new_op = ir_binop_all_equal; break; - - default: - /* The default case handler is here to silence a warning from GCC. - */ - break; - } - - if (new_op != ir_unop_logic_not) { - return new(mem_ctx) ir_expression(new_op, - ir->type, - op_expr[0]->operands[0], - op_expr[0]->operands[1]); - } - - break; - } - - case ir_binop_add: - if (is_vec_zero(op_const[0])) - return ir->operands[1]; - if (is_vec_zero(op_const[1])) - return ir->operands[0]; - - /* Reassociate addition of constants so that we can do constant - * folding. - */ - if (op_const[0] && !op_const[1]) - reassociate_constant(ir, 0, op_const[0], op_expr[1]); - if (op_const[1] && !op_const[0]) - reassociate_constant(ir, 1, op_const[1], op_expr[0]); - - // A + (-B) => A-B - if (op_expr[1] && op_expr[1]->operation == ir_unop_neg) { - this->progress = true; - return sub(ir->operands[0], op_expr[1]->operands[0]); - } - - /* Recognize (v.x + v.y) + (v.z + v.w) as dot(v, 1.0) */ - if (options->OptimizeForAOS) { - ir_expression *expr = try_replace_with_dot(op_expr[0], op_expr[1], - mem_ctx); - if (expr) - return expr; - } - - /* Replace (-x + y) * a + x and commutative variations with lrp(x, y, a). - * - * (-x + y) * a + x - * (x * -a) + (y * a) + x - * x + (x * -a) + (y * a) - * x * (1 - a) + y * a - * lrp(x, y, a) - */ - for (int mul_pos = 0; mul_pos < 2; mul_pos++) { - ir_expression *mul = op_expr[mul_pos]; - - if (!mul || mul->operation != ir_binop_mul) - continue; - - /* Multiply found on one of the operands. Now check for an - * inner addition operation. - */ - for (int inner_add_pos = 0; inner_add_pos < 2; inner_add_pos++) { - ir_expression *inner_add = - mul->operands[inner_add_pos]->as_expression(); - - if (!inner_add || inner_add->operation != ir_binop_add) - continue; - - /* Inner addition found on one of the operands. Now check for - * one of the operands of the inner addition to be the negative - * of x_operand. - */ - for (int neg_pos = 0; neg_pos < 2; neg_pos++) { - ir_expression *neg = - inner_add->operands[neg_pos]->as_expression(); - - if (!neg || neg->operation != ir_unop_neg) - continue; - - ir_rvalue *x_operand = ir->operands[1 - mul_pos]; - - if (!neg->operands[0]->equals(x_operand)) - continue; - - ir_rvalue *y_operand = inner_add->operands[1 - neg_pos]; - ir_rvalue *a_operand = mul->operands[1 - inner_add_pos]; - - if (x_operand->type != y_operand->type || - x_operand->type != a_operand->type) - continue; - - return lrp(x_operand, y_operand, a_operand); - } - } - } - - break; - - case ir_binop_sub: - if (is_vec_zero(op_const[0])) - return neg(ir->operands[1]); - if (is_vec_zero(op_const[1])) - return ir->operands[0]; - break; - - case ir_binop_mul: - if (is_vec_one(op_const[0])) - return ir->operands[1]; - if (is_vec_one(op_const[1])) - return ir->operands[0]; - - if (is_vec_zero(op_const[0]) || is_vec_zero(op_const[1])) - return ir_constant::zero(ir, ir->type); - - if (is_vec_negative_one(op_const[0])) - return neg(ir->operands[1]); - if (is_vec_negative_one(op_const[1])) - return neg(ir->operands[0]); - - - /* Reassociate multiplication of constants so that we can do - * constant folding. - */ - if (op_const[0] && !op_const[1]) - reassociate_constant(ir, 0, op_const[0], op_expr[1]); - if (op_const[1] && !op_const[0]) - reassociate_constant(ir, 1, op_const[1], op_expr[0]); - - break; - - case ir_binop_div: - if (is_vec_one(op_const[0]) && ir->type->base_type == GLSL_TYPE_FLOAT) { - return new(mem_ctx) ir_expression(ir_unop_rcp, - ir->operands[1]->type, - ir->operands[1], - NULL); - } - if (is_vec_one(op_const[1])) - return ir->operands[0]; - break; - - case ir_binop_dot: - if (is_vec_zero(op_const[0]) || is_vec_zero(op_const[1])) - return ir_constant::zero(mem_ctx, ir->type); - - if (is_vec_basis(op_const[0])) { - unsigned component = 0; - for (unsigned c = 0; c < op_const[0]->type->vector_elements; c++) { - if (op_const[0]->value.f[c] == 1.0) - component = c; - } - return new(mem_ctx) ir_swizzle(ir->operands[1], component, 0, 0, 0, 1); - } - if (is_vec_basis(op_const[1])) { - unsigned component = 0; - for (unsigned c = 0; c < op_const[1]->type->vector_elements; c++) { - if (op_const[1]->value.f[c] == 1.0) - component = c; - } - return new(mem_ctx) ir_swizzle(ir->operands[0], component, 0, 0, 0, 1); - } - break; - - case ir_binop_less: - case ir_binop_lequal: - case ir_binop_greater: - case ir_binop_gequal: - case ir_binop_equal: - case ir_binop_nequal: - for (int add_pos = 0; add_pos < 2; add_pos++) { - ir_expression *add = op_expr[add_pos]; - - if (!add || add->operation != ir_binop_add) - continue; - - ir_constant *zero = op_const[1 - add_pos]; - if (!is_vec_zero(zero)) - continue; - - return new(mem_ctx) ir_expression(ir->operation, - add->operands[0], - neg(add->operands[1])); - } - break; - - case ir_binop_rshift: - case ir_binop_lshift: - /* 0 >> x == 0 */ - if (is_vec_zero(op_const[0])) - return ir->operands[0]; - /* x >> 0 == x */ - if (is_vec_zero(op_const[1])) - return ir->operands[0]; - break; - - case ir_binop_logic_and: - if (is_vec_one(op_const[0])) { - return ir->operands[1]; - } else if (is_vec_one(op_const[1])) { - return ir->operands[0]; - } else if (is_vec_zero(op_const[0]) || is_vec_zero(op_const[1])) { - return ir_constant::zero(mem_ctx, ir->type); - } else if (op_expr[0] && op_expr[0]->operation == ir_unop_logic_not && - op_expr[1] && op_expr[1]->operation == ir_unop_logic_not) { - /* De Morgan's Law: - * (not A) and (not B) === not (A or B) - */ - return logic_not(logic_or(op_expr[0]->operands[0], - op_expr[1]->operands[0])); - } else if (ir->operands[0]->equals(ir->operands[1])) { - /* (a && a) == a */ - return ir->operands[0]; - } - break; - - case ir_binop_logic_xor: - if (is_vec_zero(op_const[0])) { - return ir->operands[1]; - } else if (is_vec_zero(op_const[1])) { - return ir->operands[0]; - } else if (is_vec_one(op_const[0])) { - return logic_not(ir->operands[1]); - } else if (is_vec_one(op_const[1])) { - return logic_not(ir->operands[0]); - } else if (ir->operands[0]->equals(ir->operands[1])) { - /* (a ^^ a) == false */ - return ir_constant::zero(mem_ctx, ir->type); - } - break; - - case ir_binop_logic_or: - if (is_vec_zero(op_const[0])) { - return ir->operands[1]; - } else if (is_vec_zero(op_const[1])) { - return ir->operands[0]; - } else if (is_vec_one(op_const[0]) || is_vec_one(op_const[1])) { - ir_constant_data data; - - for (unsigned i = 0; i < 16; i++) - data.b[i] = true; - - return new(mem_ctx) ir_constant(ir->type, &data); - } else if (op_expr[0] && op_expr[0]->operation == ir_unop_logic_not && - op_expr[1] && op_expr[1]->operation == ir_unop_logic_not) { - /* De Morgan's Law: - * (not A) or (not B) === not (A and B) - */ - return logic_not(logic_and(op_expr[0]->operands[0], - op_expr[1]->operands[0])); - } else if (ir->operands[0]->equals(ir->operands[1])) { - /* (a || a) == a */ - return ir->operands[0]; - } - break; - - case ir_binop_pow: - /* 1^x == 1 */ - if (is_vec_one(op_const[0])) - return op_const[0]; - - /* x^1 == x */ - if (is_vec_one(op_const[1])) - return ir->operands[0]; - - /* pow(2,x) == exp2(x) */ - if (is_vec_two(op_const[0])) - return expr(ir_unop_exp2, ir->operands[1]); - - if (is_vec_two(op_const[1])) { - ir_variable *x = new(ir) ir_variable(ir->operands[1]->type, "x", - ir_var_temporary, ir->operands[1]->get_precision()); - base_ir->insert_before(x); - base_ir->insert_before(assign(x, ir->operands[0])); - return mul(x, x); - } - - break; - - case ir_binop_min: - case ir_binop_max: - if (ir->type->base_type != GLSL_TYPE_FLOAT) - break; - - /* Replace min(max) operations and its commutative combinations with - * a saturate operation - */ - for (int op = 0; op < 2; op++) { - ir_expression *minmax = op_expr[op]; - ir_constant *outer_const = op_const[1 - op]; - ir_expression_operation op_cond = (ir->operation == ir_binop_max) ? - ir_binop_min : ir_binop_max; - - if (!minmax || !outer_const || (minmax->operation != op_cond)) - continue; - - /* Found a min(max) combination. Now try to see if its operands - * meet our conditions that we can do just a single saturate operation - */ - for (int minmax_op = 0; minmax_op < 2; minmax_op++) { - ir_rvalue *inner_val_a = minmax->operands[minmax_op]; - ir_rvalue *inner_val_b = minmax->operands[1 - minmax_op]; - - if (!inner_val_a || !inner_val_b) - continue; - - /* Found a {min|max} ({max|min} (x, 0.0), 1.0) operation and its variations */ - if ((outer_const->is_one() && inner_val_a->is_zero()) || - (inner_val_a->is_one() && outer_const->is_zero())) - return saturate(inner_val_b); - - /* Found a {min|max} ({max|min} (x, 0.0), b) where b < 1.0 - * and its variations - */ - if (is_less_than_one(outer_const) && inner_val_b->is_zero()) - return expr(ir_binop_min, saturate(inner_val_a), outer_const); - - if (!inner_val_b->as_constant()) - continue; - - if (is_less_than_one(inner_val_b->as_constant()) && outer_const->is_zero()) - return expr(ir_binop_min, saturate(inner_val_a), inner_val_b); - - /* Found a {min|max} ({max|min} (x, b), 1.0), where b > 0.0 - * and its variations - */ - if (outer_const->is_one() && is_greater_than_zero(inner_val_b->as_constant())) - return expr(ir_binop_max, saturate(inner_val_a), inner_val_b); - if (inner_val_b->as_constant()->is_one() && is_greater_than_zero(outer_const)) - return expr(ir_binop_max, saturate(inner_val_a), outer_const); - } - } - - break; - - case ir_unop_rcp: - if (op_expr[0] && op_expr[0]->operation == ir_unop_rcp) - return op_expr[0]->operands[0]; - - /* While ir_to_mesa.cpp will lower sqrt(x) to rcp(rsq(x)), it does so at - * its IR level, so we can always apply this transformation. - */ - if (op_expr[0] && op_expr[0]->operation == ir_unop_rsq) - return sqrt(op_expr[0]->operands[0]); - - /* As far as we know, all backends are OK with rsq. */ - if (op_expr[0] && op_expr[0]->operation == ir_unop_sqrt) { - return rsq(op_expr[0]->operands[0]); - } - - break; - - case ir_triop_fma: - /* Operands are op0 * op1 + op2. */ - if (is_vec_zero(op_const[0]) || is_vec_zero(op_const[1])) { - return ir->operands[2]; - } else if (is_vec_zero(op_const[2])) { - return mul(ir->operands[0], ir->operands[1]); - } else if (is_vec_one(op_const[0])) { - return add(ir->operands[1], ir->operands[2]); - } else if (is_vec_one(op_const[1])) { - return add(ir->operands[0], ir->operands[2]); - } - break; - - case ir_triop_lrp: - /* Operands are (x, y, a). */ - if (is_vec_zero(op_const[2])) { - return ir->operands[0]; - } else if (is_vec_one(op_const[2])) { - return ir->operands[1]; - } else if (ir->operands[0]->equals(ir->operands[1])) { - return ir->operands[0]; - } else if (is_vec_zero(op_const[0])) { - return mul(ir->operands[1], ir->operands[2]); - } else if (is_vec_zero(op_const[1])) { - unsigned op2_components = ir->operands[2]->type->vector_elements; - ir_constant *one = new(mem_ctx) ir_constant(1.0f, op2_components); - return mul(ir->operands[0], add(one, neg(ir->operands[2]))); - } - break; - - case ir_triop_csel: - if (is_vec_one(op_const[0])) - return ir->operands[1]; - if (is_vec_zero(op_const[0])) - return ir->operands[2]; - break; - - default: - break; - } - - return ir; -} - -void -ir_algebraic_visitor::handle_rvalue(ir_rvalue **rvalue) -{ - if (!*rvalue) - return; - - ir_expression *expr = (*rvalue)->as_expression(); - if (!expr || expr->operation == ir_quadop_vector) - return; - - ir_rvalue *new_rvalue = handle_expression(expr); - if (new_rvalue == *rvalue) - return; - - /* If the expr used to be some vec OP scalar returning a vector, and the - * optimization gave us back a scalar, we still need to turn it into a - * vector. - */ - *rvalue = swizzle_if_required(expr, new_rvalue); - - this->progress = true; -} - -bool -do_algebraic(exec_list *instructions, bool native_integers, - const struct gl_shader_compiler_options *options) -{ - ir_algebraic_visitor v(native_integers, options); - - visit_list_elements(&v, instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_array_splitting.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_array_splitting.cpp deleted file mode 100644 index cfd1ee32d..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_array_splitting.cpp +++ /dev/null @@ -1,415 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_array_splitting.cpp - * - * If an array is always dereferenced with a constant index, then - * split it apart into its elements, making it more amenable to other - * optimization passes. - * - * This skips uniform/varying arrays, which would need careful - * handling due to their ir->location fields tying them to the GL API - * and other shader stages. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_rvalue_visitor.h" -#include "glsl_types.h" - -static bool debug = false; - -namespace { - -namespace opt_array_splitting { - -class variable_entry : public exec_node -{ -public: - variable_entry(ir_variable *var) - { - this->var = var; - this->split = true; - this->declaration = false; - this->components = NULL; - this->mem_ctx = NULL; - if (var->type->is_array()) - this->size = var->type->length; - else - this->size = var->type->matrix_columns; - } - - ir_variable *var; /* The key: the variable's pointer. */ - unsigned size; /* array length or matrix columns */ - - /** Whether this array should be split or not. */ - bool split; - - /* If the variable had a decl we can work with in the instruction - * stream. We can't do splitting on function arguments, which - * don't get this variable set. - */ - bool declaration; - - ir_variable **components; - - /** ralloc_parent(this->var) -- the shader's talloc context. */ - void *mem_ctx; -}; - -} /* namespace */ - -using namespace opt_array_splitting; - -/** - * This class does a walk over the tree, coming up with the set of - * variables that could be split by looking to see if they are arrays - * that are only ever constant-index dereferenced. - */ -class ir_array_reference_visitor : public ir_hierarchical_visitor { -public: - ir_array_reference_visitor(bool split_shader_outputs) - { - this->split_shader_outputs = split_shader_outputs; - this->mem_ctx = ralloc_context(NULL); - this->variable_list.make_empty(); - } - - ~ir_array_reference_visitor(void) - { - ralloc_free(mem_ctx); - } - - bool get_split_list(exec_list *instructions, bool linked); - - virtual ir_visitor_status visit(ir_variable *); - virtual ir_visitor_status visit(ir_dereference_variable *); - virtual ir_visitor_status visit_enter(ir_dereference_array *); - virtual ir_visitor_status visit_enter(ir_function_signature *); - - variable_entry *get_variable_entry(ir_variable *var); - - /* List of variable_entry */ - exec_list variable_list; - - void *mem_ctx; - bool split_shader_outputs; -}; - -} /* namespace */ - -variable_entry * -ir_array_reference_visitor::get_variable_entry(ir_variable *var) -{ - assert(var); - - if (var->data.mode != ir_var_auto && - var->data.mode != ir_var_temporary && - (!this->split_shader_outputs || (var->data.mode != ir_var_shader_out && var->data.mode != ir_var_shader_inout)) - ) - return NULL; - - if (!(var->type->is_array() || var->type->is_matrix())) - return NULL; - - /* If the array hasn't been sized yet, we can't split it. After - * linking, this should be resolved. - */ - if (var->type->is_unsized_array()) - return NULL; - - foreach_in_list(variable_entry, entry, &this->variable_list) { - if (entry->var == var) - return entry; - } - - variable_entry *entry = new(mem_ctx) variable_entry(var); - this->variable_list.push_tail(entry); - return entry; -} - - -ir_visitor_status -ir_array_reference_visitor::visit(ir_variable *ir) -{ - variable_entry *entry = this->get_variable_entry(ir); - - if (entry) - entry->declaration = true; - - return visit_continue; -} - -ir_visitor_status -ir_array_reference_visitor::visit(ir_dereference_variable *ir) -{ - variable_entry *entry = this->get_variable_entry(ir->var); - - /* If we made it to here without seeing an ir_dereference_array, - * then the dereference of this array didn't have a constant index - * (see the visit_continue_with_parent below), so we can't split - * the variable. - */ - if (entry) - entry->split = false; - - return visit_continue; -} - -ir_visitor_status -ir_array_reference_visitor::visit_enter(ir_dereference_array *ir) -{ - ir_dereference_variable *deref = ir->array->as_dereference_variable(); - if (!deref) - return visit_continue; - - variable_entry *entry = this->get_variable_entry(deref->var); - - /* If the access to the array has a variable index, we wouldn't - * know which split variable this dereference should go to. - */ - if (entry && !ir->array_index->as_constant()) - entry->split = false; - - return visit_continue_with_parent; -} - -ir_visitor_status -ir_array_reference_visitor::visit_enter(ir_function_signature *ir) -{ - /* We don't have logic for array-splitting function arguments, - * so just look at the body instructions and not the parameter - * declarations. - */ - visit_list_elements(this, &ir->body); - return visit_continue_with_parent; -} - -bool -ir_array_reference_visitor::get_split_list(exec_list *instructions, - bool linked) -{ - visit_list_elements(this, instructions); - - /* If the shaders aren't linked yet, we can't mess with global - * declarations, which need to be matched by name across shaders. - */ - if (!linked) { - foreach_in_list(ir_instruction, node, instructions) { - ir_variable *var = node->as_variable(); - if (var) { - variable_entry *entry = get_variable_entry(var); - if (entry) - entry->remove(); - } - } - } - - /* Trim out variables we found that we can't split. */ - foreach_in_list_safe(variable_entry, entry, &variable_list) { - if (debug) { - printf("array %s@%p: decl %d, split %d\n", - entry->var->name, (void *) entry->var, entry->declaration, - entry->split); - } - - if (!(entry->declaration && entry->split)) { - entry->remove(); - } - } - - return !variable_list.is_empty(); -} - -/** - * This class rewrites the dereferences of arrays that have been split - * to use the newly created ir_variables for each component. - */ -class ir_array_splitting_visitor : public ir_rvalue_visitor { -public: - ir_array_splitting_visitor(exec_list *vars) - { - this->variable_list = vars; - } - - virtual ~ir_array_splitting_visitor() - { - } - - virtual ir_visitor_status visit_leave(ir_assignment *); - - void split_deref(ir_dereference **deref); - void handle_rvalue(ir_rvalue **rvalue); - variable_entry *get_splitting_entry(ir_variable *var); - - exec_list *variable_list; -}; - -variable_entry * -ir_array_splitting_visitor::get_splitting_entry(ir_variable *var) -{ - assert(var); - - foreach_in_list(variable_entry, entry, this->variable_list) { - if (entry->var == var) { - return entry; - } - } - - return NULL; -} - -void -ir_array_splitting_visitor::split_deref(ir_dereference **deref) -{ - ir_dereference_array *deref_array = (*deref)->as_dereference_array(); - if (!deref_array) - return; - - ir_dereference_variable *deref_var = deref_array->array->as_dereference_variable(); - if (!deref_var) - return; - ir_variable *var = deref_var->var; - - variable_entry *entry = get_splitting_entry(var); - if (!entry) - return; - - ir_constant *constant = deref_array->array_index->as_constant(); - assert(constant); - - if (constant->value.i[0] < (int)entry->size) { - *deref = new(entry->mem_ctx) - ir_dereference_variable(entry->components[constant->value.i[0]]); - } else { - /* There was a constant array access beyond the end of the - * array. This might have happened due to constant folding - * after the initial parse. This produces an undefined value, - * but shouldn't crash. Just give them an uninitialized - * variable. - */ - ir_variable *temp = new(entry->mem_ctx) ir_variable(deref_array->type, - "undef", - ir_var_temporary, deref_array->get_precision()); - entry->components[0]->insert_before(temp); - *deref = new(entry->mem_ctx) ir_dereference_variable(temp); - } -} - -void -ir_array_splitting_visitor::handle_rvalue(ir_rvalue **rvalue) -{ - if (!*rvalue) - return; - - ir_dereference *deref = (*rvalue)->as_dereference(); - - if (!deref) - return; - - split_deref(&deref); - *rvalue = deref; -} - -ir_visitor_status -ir_array_splitting_visitor::visit_leave(ir_assignment *ir) -{ - /* The normal rvalue visitor skips the LHS of assignments, but we - * need to process those just the same. - */ - ir_rvalue *lhs = ir->lhs; - - handle_rvalue(&lhs); - ir->lhs = lhs->as_dereference(); - - ir->lhs->accept(this); - - handle_rvalue(&ir->rhs); - ir->rhs->accept(this); - - if (ir->condition) { - handle_rvalue(&ir->condition); - ir->condition->accept(this); - } - - return visit_continue; -} - -bool -optimize_split_arrays(exec_list *instructions, bool linked, bool split_shader_outputs) -{ - ir_array_reference_visitor refs(split_shader_outputs); - if (!refs.get_split_list(instructions, linked)) - return false; - - void *mem_ctx = ralloc_context(NULL); - - /* Replace the decls of the arrays to be split with their split - * components. - */ - foreach_in_list(variable_entry, entry, &refs.variable_list) { - const struct glsl_type *type = entry->var->type; - const struct glsl_type *subtype; - glsl_precision subprec = (glsl_precision)entry->var->data.precision; - - if (type->is_matrix()) { - subtype = type->column_type(); - } else { - subtype = type->fields.array; - } - - entry->mem_ctx = ralloc_parent(entry->var); - - entry->components = ralloc_array(mem_ctx, - ir_variable *, - entry->size); - - for (unsigned int i = 0; i < entry->size; i++) { - const char *name = ralloc_asprintf(mem_ctx, "%s_%d", - entry->var->name, i); - - entry->components[i] = - new(entry->mem_ctx) ir_variable(subtype, name, (ir_variable_mode)entry->var->data.mode, subprec); - entry->var->insert_before(entry->components[i]); - if (entry->var->data.explicit_location) - { - entry->components[i]->data.explicit_location = true; - entry->components[i]->data.location = entry->var->data.location + i; - } - } - - entry->var->remove(); - } - - ir_array_splitting_visitor split(&refs.variable_list); - visit_list_elements(&split, instructions); - - if (debug) - _mesa_print_ir(stdout, instructions, NULL); - - ralloc_free(mem_ctx); - - return true; - -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_constant_folding.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_constant_folding.cpp deleted file mode 100644 index 74b855e5e..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_constant_folding.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_constant_folding.cpp - * Replace constant-valued expressions with references to constant values. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_rvalue_visitor.h" -#include "ir_optimization.h" -#include "glsl_types.h" - -namespace { - -/** - * Visitor class for replacing expressions with ir_constant values. - */ - -class ir_constant_folding_visitor : public ir_rvalue_visitor { -public: - ir_constant_folding_visitor() - { - this->progress = false; - } - - virtual ~ir_constant_folding_visitor() - { - /* empty */ - } - - virtual ir_visitor_status visit_enter(ir_assignment *ir); - virtual ir_visitor_status visit_enter(ir_call *ir); - - virtual void handle_rvalue(ir_rvalue **rvalue); - - bool progress; -}; - -} /* unnamed namespace */ - -void -ir_constant_folding_visitor::handle_rvalue(ir_rvalue **rvalue) -{ - if (*rvalue == NULL || (*rvalue)->ir_type == ir_type_constant) - return; - - /* Note that we do rvalue visitoring on leaving. So if an - * expression has a non-constant operand, no need to go looking - * down it to find if it's constant. This cuts the time of this - * pass down drastically. - */ - ir_expression *expr = (*rvalue)->as_expression(); - if (expr) { - for (unsigned int i = 0; i < expr->get_num_operands(); i++) { - if (!expr->operands[i]->as_constant()) - return; - } - } - - /* Ditto for swizzles. */ - ir_swizzle *swiz = (*rvalue)->as_swizzle(); - if (swiz && !swiz->val->as_constant()) - return; - - ir_constant *constant = (*rvalue)->constant_expression_value(); - if (constant) { - *rvalue = constant; - this->progress = true; - } else { - (*rvalue)->accept(this); - } -} - -ir_visitor_status -ir_constant_folding_visitor::visit_enter(ir_assignment *ir) -{ - ir->rhs->accept(this); - handle_rvalue(&ir->rhs); - - if (ir->condition) { - ir->condition->accept(this); - handle_rvalue(&ir->condition); - - ir_constant *const_val = ir->condition->as_constant(); - /* If the condition is constant, either remove the condition or - * remove the never-executed assignment. - */ - if (const_val) { - if (const_val->value.b[0]) - ir->condition = NULL; - else - ir->remove(); - this->progress = true; - } - } - - /* Don't descend into the LHS because we want it to stay as a - * variable dereference. FINISHME: We probably should to get array - * indices though. - */ - return visit_continue_with_parent; -} - -ir_visitor_status -ir_constant_folding_visitor::visit_enter(ir_call *ir) -{ - /* Attempt to constant fold parameters */ - foreach_two_lists(formal_node, &ir->callee->parameters, - actual_node, &ir->actual_parameters) { - ir_rvalue *param_rval = (ir_rvalue *) actual_node; - ir_variable *sig_param = (ir_variable *) formal_node; - - if (sig_param->data.mode == ir_var_function_in - || sig_param->data.mode == ir_var_const_in) { - ir_rvalue *new_param = param_rval; - - handle_rvalue(&new_param); - if (new_param != param_rval) { - param_rval->replace_with(new_param); - } - } - } - - /* Next, see if the call can be replaced with an assignment of a constant */ - ir_constant *const_val = ir->constant_expression_value(); - - if (const_val != NULL) { - ir_assignment *assignment = - new(ralloc_parent(ir)) ir_assignment(ir->return_deref, const_val); - ir->replace_with(assignment); - } - - return visit_continue_with_parent; -} - -bool -do_constant_folding(exec_list *instructions) -{ - ir_constant_folding_visitor constant_folding; - - visit_list_elements(&constant_folding, instructions); - - return constant_folding.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_constant_propagation.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_constant_propagation.cpp deleted file mode 100644 index ca3b67e22..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_constant_propagation.cpp +++ /dev/null @@ -1,464 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * constant of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, constant, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above constantright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR CONSTANTRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_constant_propagation.cpp - * - * Tracks assignments of constants to channels of variables, and - * usage of those constant channels with direct usage of the constants. - * - * This can lead to constant folding and algebraic optimizations in - * those later expressions, while causing no increase in instruction - * count (due to constants being generally free to load from a - * constant push buffer or as instruction immediate values) and - * possibly reducing register pressure. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_rvalue_visitor.h" -#include "ir_basic_block.h" -#include "ir_optimization.h" -#include "glsl_types.h" - -namespace { - -class acp_entry : public exec_node -{ -public: - acp_entry(ir_variable *var, unsigned write_mask, ir_constant *constant) - { - assert(var); - assert(constant); - this->var = var; - this->write_mask = write_mask; - this->constant = constant; - this->initial_values = write_mask; - } - - acp_entry(const acp_entry *src) - { - this->var = src->var; - this->write_mask = src->write_mask; - this->constant = src->constant; - this->initial_values = src->initial_values; - } - - ir_variable *var; - ir_constant *constant; - unsigned write_mask; - - /** Mask of values initially available in the constant. */ - unsigned initial_values; -}; - - -class kill_entry : public exec_node -{ -public: - kill_entry(ir_variable *var, unsigned write_mask) - { - assert(var); - this->var = var; - this->write_mask = write_mask; - } - - ir_variable *var; - unsigned write_mask; -}; - -class ir_constant_propagation_visitor : public ir_rvalue_visitor { -public: - ir_constant_propagation_visitor() - { - progress = false; - killed_all = false; - mem_ctx = ralloc_context(0); - this->acp = new(mem_ctx) exec_list; - this->kills = new(mem_ctx) exec_list; - } - ~ir_constant_propagation_visitor() - { - ralloc_free(mem_ctx); - } - - virtual ir_visitor_status visit_enter(class ir_loop *); - virtual ir_visitor_status visit_enter(class ir_function_signature *); - virtual ir_visitor_status visit_enter(class ir_function *); - virtual ir_visitor_status visit_leave(class ir_assignment *); - virtual ir_visitor_status visit_enter(class ir_call *); - virtual ir_visitor_status visit_enter(class ir_if *); - - void add_constant(ir_assignment *ir); - void kill(ir_variable *ir, unsigned write_mask); - void handle_if_block(exec_list *instructions); - void handle_rvalue(ir_rvalue **rvalue); - - /** List of acp_entry: The available constants to propagate */ - exec_list *acp; - - /** - * List of kill_entry: The masks of variables whose values were - * killed in this block. - */ - exec_list *kills; - - bool progress; - - bool killed_all; - - void *mem_ctx; -}; - - -void -ir_constant_propagation_visitor::handle_rvalue(ir_rvalue **rvalue) -{ - if (this->in_assignee || !*rvalue) - return; - - const glsl_type *type = (*rvalue)->type; - if (!type->is_scalar() && !type->is_vector()) - return; - - ir_swizzle *swiz = NULL; - ir_dereference_variable *deref = (*rvalue)->as_dereference_variable(); - if (!deref) { - swiz = (*rvalue)->as_swizzle(); - if (!swiz) - return; - - deref = swiz->val->as_dereference_variable(); - if (!deref) - return; - } - - ir_constant_data data; - memset(&data, 0, sizeof(data)); - - for (unsigned int i = 0; i < type->components(); i++) { - int channel; - acp_entry *found = NULL; - - if (swiz) { - switch (i) { - case 0: channel = swiz->mask.x; break; - case 1: channel = swiz->mask.y; break; - case 2: channel = swiz->mask.z; break; - case 3: channel = swiz->mask.w; break; - default: assert(!"shouldn't be reached"); channel = 0; break; - } - } else { - channel = i; - } - - foreach_in_list(acp_entry, entry, this->acp) { - if (entry->var == deref->var && entry->write_mask & (1 << channel)) { - found = entry; - break; - } - } - - if (!found) - return; - - int rhs_channel = 0; - for (int j = 0; j < 4; j++) { - if (j == channel) - break; - if (found->initial_values & (1 << j)) - rhs_channel++; - } - - switch (type->base_type) { - case GLSL_TYPE_FLOAT: - data.f[i] = found->constant->value.f[rhs_channel]; - break; - case GLSL_TYPE_INT: - data.i[i] = found->constant->value.i[rhs_channel]; - break; - case GLSL_TYPE_UINT: - data.u[i] = found->constant->value.u[rhs_channel]; - break; - case GLSL_TYPE_BOOL: - data.b[i] = found->constant->value.b[rhs_channel]; - break; - default: - assert(!"not reached"); - break; - } - } - - *rvalue = new(ralloc_parent(deref)) ir_constant(type, &data); - this->progress = true; -} - -ir_visitor_status -ir_constant_propagation_visitor::visit_enter(ir_function_signature *ir) -{ - /* Treat entry into a function signature as a completely separate - * block. Any instructions at global scope will be shuffled into - * main() at link time, so they're irrelevant to us. - */ - exec_list *orig_acp = this->acp; - exec_list *orig_kills = this->kills; - bool orig_killed_all = this->killed_all; - - this->acp = new(mem_ctx) exec_list; - this->kills = new(mem_ctx) exec_list; - this->killed_all = false; - - visit_list_elements(this, &ir->body); - - this->kills = orig_kills; - this->acp = orig_acp; - this->killed_all = orig_killed_all; - - return visit_continue_with_parent; -} - -ir_visitor_status -ir_constant_propagation_visitor::visit_leave(ir_assignment *ir) -{ - if (this->in_assignee) - return visit_continue; - - unsigned kill_mask = ir->write_mask; - if (ir->lhs->as_dereference_array()) { - /* The LHS of the assignment uses an array indexing operator (e.g. v[i] - * = ...;). Since we only try to constant propagate vectors and - * scalars, this means that either (a) array indexing is being used to - * select a vector component, or (b) the variable in question is neither - * a scalar or a vector, so we don't care about it. In the former case, - * we want to kill the whole vector, since in general we can't predict - * which vector component will be selected by array indexing. In the - * latter case, it doesn't matter what we do, so go ahead and kill the - * whole variable anyway. - * - * Note that if the array index is constant (e.g. v[2] = ...;), we could - * in principle be smarter, but we don't need to, because a future - * optimization pass will convert it to a simple assignment with the - * correct mask. - */ - kill_mask = ~0; - } - kill(ir->lhs->variable_referenced(), kill_mask); - - add_constant(ir); - - return visit_continue; -} - -ir_visitor_status -ir_constant_propagation_visitor::visit_enter(ir_function *ir) -{ - (void) ir; - return visit_continue; -} - -ir_visitor_status -ir_constant_propagation_visitor::visit_enter(ir_call *ir) -{ - /* Do constant propagation on call parameters, but skip any out params */ - foreach_two_lists(formal_node, &ir->callee->parameters, - actual_node, &ir->actual_parameters) { - ir_variable *sig_param = (ir_variable *) formal_node; - ir_rvalue *param = (ir_rvalue *) actual_node; - if (sig_param->data.mode != ir_var_function_out - && sig_param->data.mode != ir_var_function_inout) { - ir_rvalue *new_param = param; - handle_rvalue(&new_param); - if (new_param != param) - param->replace_with(new_param); - else - param->accept(this); - } - } - - /* Since we're unlinked, we don't (necssarily) know the side effects of - * this call. So kill all copies. Except if it's a built-in; we know - * they are side effect free. - */ - if (!ir->callee->is_builtin()) { - acp->make_empty(); - this->killed_all = true; - } - - return visit_continue_with_parent; -} - -void -ir_constant_propagation_visitor::handle_if_block(exec_list *instructions) -{ - exec_list *orig_acp = this->acp; - exec_list *orig_kills = this->kills; - bool orig_killed_all = this->killed_all; - - this->acp = new(mem_ctx) exec_list; - this->kills = new(mem_ctx) exec_list; - this->killed_all = false; - - /* Populate the initial acp with a constant of the original */ - foreach_in_list(acp_entry, a, orig_acp) { - this->acp->push_tail(new(this->mem_ctx) acp_entry(a)); - } - - visit_list_elements(this, instructions); - - if (this->killed_all) { - orig_acp->make_empty(); - } - - exec_list *new_kills = this->kills; - this->kills = orig_kills; - this->acp = orig_acp; - this->killed_all = this->killed_all || orig_killed_all; - - foreach_in_list(kill_entry, k, new_kills) { - kill(k->var, k->write_mask); - } -} - -ir_visitor_status -ir_constant_propagation_visitor::visit_enter(ir_if *ir) -{ - ir->condition->accept(this); - handle_rvalue(&ir->condition); - - handle_if_block(&ir->then_instructions); - handle_if_block(&ir->else_instructions); - - /* handle_if_block() already descended into the children. */ - return visit_continue_with_parent; -} - -ir_visitor_status -ir_constant_propagation_visitor::visit_enter(ir_loop *ir) -{ - exec_list *orig_acp = this->acp; - exec_list *orig_kills = this->kills; - bool orig_killed_all = this->killed_all; - - /* FINISHME: For now, the initial acp for loops is totally empty. - * We could go through once, then go through again with the acp - * cloned minus the killed entries after the first run through. - */ - this->acp = new(mem_ctx) exec_list; - this->kills = new(mem_ctx) exec_list; - this->killed_all = false; - - visit_list_elements(this, &ir->body_instructions); - - if (this->killed_all) { - orig_acp->make_empty(); - } - - exec_list *new_kills = this->kills; - this->kills = orig_kills; - this->acp = orig_acp; - this->killed_all = this->killed_all || orig_killed_all; - - foreach_in_list(kill_entry, k, new_kills) { - kill(k->var, k->write_mask); - } - - /* already descended into the children. */ - return visit_continue_with_parent; -} - -void -ir_constant_propagation_visitor::kill(ir_variable *var, unsigned write_mask) -{ - assert(var != NULL); - - /* We don't track non-vectors. */ - if (!var->type->is_vector() && !var->type->is_scalar()) - return; - - /* Remove any entries currently in the ACP for this kill. */ - foreach_in_list_safe(acp_entry, entry, this->acp) { - if (entry->var == var) { - entry->write_mask &= ~write_mask; - if (entry->write_mask == 0) - entry->remove(); - } - } - - /* Add this writemask of the variable to the list of killed - * variables in this block. - */ - foreach_in_list(kill_entry, entry, this->kills) { - if (entry->var == var) { - entry->write_mask |= write_mask; - return; - } - } - /* Not already in the list. Make new entry. */ - this->kills->push_tail(new(this->mem_ctx) kill_entry(var, write_mask)); -} - -/** - * Adds an entry to the available constant list if it's a plain assignment - * of a variable to a variable. - */ -void -ir_constant_propagation_visitor::add_constant(ir_assignment *ir) -{ - acp_entry *entry; - - if (ir->condition) - return; - - if (!ir->write_mask) - return; - - ir_dereference_variable *deref = ir->lhs->as_dereference_variable(); - ir_constant *constant = ir->rhs->as_constant(); - - if (!deref || !constant) - return; - - /* Only do constant propagation on vectors. Constant matrices, - * arrays, or structures would require more work elsewhere. - */ - if (!deref->var->type->is_vector() && !deref->var->type->is_scalar()) - return; - - entry = new(this->mem_ctx) acp_entry(deref->var, ir->write_mask, constant); - this->acp->push_tail(entry); -} - -} /* unnamed namespace */ - -/** - * Does a constant propagation pass on the code present in the instruction stream. - */ -bool -do_constant_propagation(exec_list *instructions) -{ - ir_constant_propagation_visitor v; - - visit_list_elements(&v, instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_constant_variable.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_constant_variable.cpp deleted file mode 100644 index 938666518..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_constant_variable.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_constant_variable.cpp - * - * Marks variables assigned a single constant value over the course - * of the program as constant. - * - * The goal here is to trigger further constant folding and then dead - * code elimination. This is common with vector/matrix constructors - * and calls to builtin functions. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_optimization.h" -#include "glsl_types.h" - -namespace { - -struct assignment_entry { - exec_node link; - int assignment_count; - ir_variable *var; - ir_constant *constval; - bool our_scope; -}; - -class ir_constant_variable_visitor : public ir_hierarchical_visitor { -public: - virtual ir_visitor_status visit_enter(ir_dereference_variable *); - virtual ir_visitor_status visit(ir_variable *); - virtual ir_visitor_status visit_enter(ir_assignment *); - virtual ir_visitor_status visit_enter(ir_call *); - virtual ir_visitor_status visit_enter(ir_function_signature *); - - exec_list list; -}; - -} /* unnamed namespace */ - -static struct assignment_entry * -get_assignment_entry(ir_variable *var, exec_list *list) -{ - struct assignment_entry *entry; - - foreach_list_typed(struct assignment_entry, entry, link, list) { - if (entry->var == var) - return entry; - } - - entry = (struct assignment_entry *)calloc(1, sizeof(*entry)); - entry->var = var; - list->push_head(&entry->link); - return entry; -} - -ir_visitor_status -ir_constant_variable_visitor::visit(ir_variable *ir) -{ - struct assignment_entry *entry = get_assignment_entry(ir, &this->list); - entry->our_scope = true; - return visit_continue; -} - -/* Skip derefs of variables so that we can detect declarations. */ -ir_visitor_status -ir_constant_variable_visitor::visit_enter(ir_dereference_variable *ir) -{ - (void)ir; - return visit_continue_with_parent; -} - -ir_visitor_status -ir_constant_variable_visitor::visit_enter(ir_assignment *ir) -{ - ir_constant *constval; - struct assignment_entry *entry; - - entry = get_assignment_entry(ir->lhs->variable_referenced(), &this->list); - assert(entry); - entry->assignment_count++; - - /* If it's already constant, don't do the work. */ - if (entry->var->constant_value) - return visit_continue; - - /* OK, now find if we actually have all the right conditions for - * this to be a constant value assigned to the var. - */ - if (ir->condition) - return visit_continue; - - ir_variable *var = ir->whole_variable_written(); - if (!var) - return visit_continue; - - constval = ir->rhs->constant_expression_value(); - if (!constval) - return visit_continue; - - /* Mark this entry as having a constant assignment (if the - * assignment count doesn't go >1). do_constant_variable will fix - * up the variable with the constant value later. - */ - entry->constval = constval; - - return visit_continue; -} - -ir_visitor_status -ir_constant_variable_visitor::visit_enter(ir_call *ir) -{ - /* Mark any out parameters as assigned to */ - foreach_two_lists(formal_node, &ir->callee->parameters, - actual_node, &ir->actual_parameters) { - ir_rvalue *param_rval = (ir_rvalue *) actual_node; - ir_variable *param = (ir_variable *) formal_node; - - if (param->data.mode == ir_var_function_out || - param->data.mode == ir_var_function_inout) { - ir_variable *var = param_rval->variable_referenced(); - struct assignment_entry *entry; - - assert(var); - entry = get_assignment_entry(var, &this->list); - entry->assignment_count++; - } - } - - /* Mark the return storage as having been assigned to */ - if (ir->return_deref != NULL) { - ir_variable *var = ir->return_deref->variable_referenced(); - struct assignment_entry *entry; - - assert(var); - entry = get_assignment_entry(var, &this->list); - entry->assignment_count++; - } - - return visit_continue; -} - -ir_visitor_status -ir_constant_variable_visitor::visit_enter(ir_function_signature *ir) -{ - /* Mark any in parameters as assigned to */ - foreach_in_list(ir_variable, var, &ir->parameters) { - if (var->data.mode == ir_var_function_in || var->data.mode == ir_var_const_in || var->data.mode == ir_var_function_inout) { - struct assignment_entry *entry; - entry = get_assignment_entry(var, &this->list); - entry->assignment_count++; - } - } - visit_list_elements(this, &ir->body); - return visit_continue_with_parent; -} - - -/** - * Does a copy propagation pass on the code present in the instruction stream. - */ -bool -do_constant_variable(exec_list *instructions) -{ - bool progress = false; - ir_constant_variable_visitor v; - - v.run(instructions); - - while (!v.list.is_empty()) { - - struct assignment_entry *entry; - entry = exec_node_data(struct assignment_entry, v.list.head, link); - - if (entry->assignment_count == 1 && entry->constval && entry->our_scope) { - entry->var->constant_value = entry->constval; - progress = true; - } - entry->link.remove(); - free(entry); - } - - return progress; -} - -bool -do_constant_variable_unlinked(exec_list *instructions) -{ - bool progress = false; - - foreach_in_list(ir_instruction, ir, instructions) { - ir_function *f = ir->as_function(); - if (f) { - foreach_in_list(ir_function_signature, sig, &f->signatures) { - if (do_constant_variable(&sig->body)) - progress = true; - } - } - } - - return progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_copy_propagation.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_copy_propagation.cpp deleted file mode 100644 index 07efd34ab..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_copy_propagation.cpp +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_copy_propagation.cpp - * - * Moves usage of recently-copied variables to the previous copy of - * the variable. - * - * This should reduce the number of MOV instructions in the generated - * programs unless copy propagation is also done on the LIR, and may - * help anyway by triggering other optimizations that live in the HIR. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_basic_block.h" -#include "ir_optimization.h" -#include "glsl_types.h" - -namespace { - -class acp_entry : public exec_node -{ -public: - acp_entry(ir_variable *lhs, ir_variable *rhs) - { - assert(lhs); - assert(rhs); - this->lhs = lhs; - this->rhs = rhs; - } - - ir_variable *lhs; - ir_variable *rhs; -}; - - -class kill_entry : public exec_node -{ -public: - kill_entry(ir_variable *var) - { - assert(var); - this->var = var; - } - - ir_variable *var; -}; - -class ir_copy_propagation_visitor : public ir_hierarchical_visitor { -public: - ir_copy_propagation_visitor() - { - progress = false; - mem_ctx = ralloc_context(0); - this->acp = new(mem_ctx) exec_list; - this->kills = new(mem_ctx) exec_list; - } - ~ir_copy_propagation_visitor() - { - ralloc_free(mem_ctx); - } - - virtual ir_visitor_status visit(class ir_dereference_variable *); - virtual ir_visitor_status visit_enter(class ir_loop *); - virtual ir_visitor_status visit_enter(class ir_function_signature *); - virtual ir_visitor_status visit_enter(class ir_function *); - virtual ir_visitor_status visit_leave(class ir_assignment *); - virtual ir_visitor_status visit_enter(class ir_call *); - virtual ir_visitor_status visit_enter(class ir_if *); - - void add_copy(ir_assignment *ir); - void kill(ir_variable *ir); - void handle_if_block(exec_list *instructions); - - /** List of acp_entry: The available copies to propagate */ - exec_list *acp; - /** - * List of kill_entry: The variables whose values were killed in this - * block. - */ - exec_list *kills; - - bool progress; - - bool killed_all; - - void *mem_ctx; -}; - -} /* unnamed namespace */ - -ir_visitor_status -ir_copy_propagation_visitor::visit_enter(ir_function_signature *ir) -{ - /* Treat entry into a function signature as a completely separate - * block. Any instructions at global scope will be shuffled into - * main() at link time, so they're irrelevant to us. - */ - exec_list *orig_acp = this->acp; - exec_list *orig_kills = this->kills; - bool orig_killed_all = this->killed_all; - - this->acp = new(mem_ctx) exec_list; - this->kills = new(mem_ctx) exec_list; - this->killed_all = false; - - visit_list_elements(this, &ir->body); - - this->kills = orig_kills; - this->acp = orig_acp; - this->killed_all = orig_killed_all; - - return visit_continue_with_parent; -} - -ir_visitor_status -ir_copy_propagation_visitor::visit_leave(ir_assignment *ir) -{ - kill(ir->lhs->variable_referenced()); - - add_copy(ir); - - return visit_continue; -} - -ir_visitor_status -ir_copy_propagation_visitor::visit_enter(ir_function *ir) -{ - (void) ir; - return visit_continue; -} - -/** - * Replaces dereferences of ACP RHS variables with ACP LHS variables. - * - * This is where the actual copy propagation occurs. Note that the - * rewriting of ir_dereference means that the ir_dereference instance - * must not be shared by multiple IR operations! - */ -ir_visitor_status -ir_copy_propagation_visitor::visit(ir_dereference_variable *ir) -{ - if (this->in_assignee) - return visit_continue; - - ir_variable *var = ir->var; - - foreach_in_list(acp_entry, entry, this->acp) { - if (var == entry->lhs) { - ir->var = entry->rhs; - this->progress = true; - break; - } - } - - return visit_continue; -} - - -ir_visitor_status -ir_copy_propagation_visitor::visit_enter(ir_call *ir) -{ - /* Do copy propagation on call parameters, but skip any out params */ - foreach_two_lists(formal_node, &ir->callee->parameters, - actual_node, &ir->actual_parameters) { - ir_variable *sig_param = (ir_variable *) formal_node; - ir_rvalue *ir = (ir_rvalue *) actual_node; - if (sig_param->data.mode != ir_var_function_out - && sig_param->data.mode != ir_var_function_inout) { - ir->accept(this); - } - } - - /* Since we're unlinked, we don't (necessarily) know the side effects of - * this call. So kill all copies. - * For any built-in functions, do not do this; they are side effect-free. - */ - if (!ir->callee->is_builtin()) { - acp->make_empty(); - this->killed_all = true; - } - - return visit_continue_with_parent; -} - -void -ir_copy_propagation_visitor::handle_if_block(exec_list *instructions) -{ - exec_list *orig_acp = this->acp; - exec_list *orig_kills = this->kills; - bool orig_killed_all = this->killed_all; - - this->acp = new(mem_ctx) exec_list; - this->kills = new(mem_ctx) exec_list; - this->killed_all = false; - - /* Populate the initial acp with a copy of the original */ - foreach_in_list(acp_entry, a, orig_acp) { - this->acp->push_tail(new(this->mem_ctx) acp_entry(a->lhs, a->rhs)); - } - - visit_list_elements(this, instructions); - - if (this->killed_all) { - orig_acp->make_empty(); - } - - exec_list *new_kills = this->kills; - this->kills = orig_kills; - this->acp = orig_acp; - this->killed_all = this->killed_all || orig_killed_all; - - foreach_in_list(kill_entry, k, new_kills) { - kill(k->var); - } -} - -ir_visitor_status -ir_copy_propagation_visitor::visit_enter(ir_if *ir) -{ - ir->condition->accept(this); - - handle_if_block(&ir->then_instructions); - handle_if_block(&ir->else_instructions); - - /* handle_if_block() already descended into the children. */ - return visit_continue_with_parent; -} - -ir_visitor_status -ir_copy_propagation_visitor::visit_enter(ir_loop *ir) -{ - exec_list *orig_acp = this->acp; - exec_list *orig_kills = this->kills; - bool orig_killed_all = this->killed_all; - - /* FINISHME: For now, the initial acp for loops is totally empty. - * We could go through once, then go through again with the acp - * cloned minus the killed entries after the first run through. - */ - this->acp = new(mem_ctx) exec_list; - this->kills = new(mem_ctx) exec_list; - this->killed_all = false; - - visit_list_elements(this, &ir->body_instructions); - - if (this->killed_all) { - orig_acp->make_empty(); - } - - exec_list *new_kills = this->kills; - this->kills = orig_kills; - this->acp = orig_acp; - this->killed_all = this->killed_all || orig_killed_all; - - foreach_in_list(kill_entry, k, new_kills) { - kill(k->var); - } - - /* already descended into the children. */ - return visit_continue_with_parent; -} - -void -ir_copy_propagation_visitor::kill(ir_variable *var) -{ - assert(var != NULL); - - /* Remove any entries currently in the ACP for this kill. */ - foreach_in_list_safe(acp_entry, entry, acp) { - if (entry->lhs == var || entry->rhs == var) { - entry->remove(); - } - } - - /* Add the LHS variable to the list of killed variables in this block. - */ - this->kills->push_tail(new(this->mem_ctx) kill_entry(var)); -} - -/** - * Adds an entry to the available copy list if it's a plain assignment - * of a variable to a variable. - */ -void -ir_copy_propagation_visitor::add_copy(ir_assignment *ir) -{ - acp_entry *entry; - - if (ir->condition) - return; - - ir_variable *lhs_var = ir->whole_variable_written(); - ir_variable *rhs_var = ir->rhs->whole_variable_referenced(); - - if ((lhs_var != NULL) && (rhs_var != NULL)) { - if (lhs_var == rhs_var) { - /* This is a dumb assignment, but we've conveniently noticed - * it here. Removing it now would mess up the loop iteration - * calling us. Just flag it to not execute, and someone else - * will clean up the mess. - */ - ir->condition = new(ralloc_parent(ir)) ir_constant(false); - this->progress = true; - } else { - // Note: do not add to candidate list when RHS has undefined precision: - // it might eventually leave our rvalue node with a different precision - // than rhs. Which would trip up platforms that need strict casts (like Metal). - if (lhs_var->data.precision == rhs_var->data.precision || lhs_var->data.precision==glsl_precision_undefined) { - entry = new(this->mem_ctx) acp_entry(lhs_var, rhs_var); - this->acp->push_tail(entry); - } - } - } -} - -/** - * Does a copy propagation pass on the code present in the instruction stream. - */ -bool -do_copy_propagation(exec_list *instructions) -{ - ir_copy_propagation_visitor v; - - visit_list_elements(&v, instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_copy_propagation_elements.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_copy_propagation_elements.cpp deleted file mode 100644 index 2b50925d9..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_copy_propagation_elements.cpp +++ /dev/null @@ -1,505 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_copy_propagation_elements.cpp - * - * Replaces usage of recently-copied components of variables with the - * previous copy of the variable. - * - * This pass can be compared with opt_copy_propagation, which operands - * on arbitrary whole-variable copies. However, in order to handle - * the copy propagation of swizzled variables or writemasked writes, - * we want to track things on a channel-wise basis. I found that - * trying to mix the swizzled/writemasked support here with the - * whole-variable stuff in opt_copy_propagation.cpp just made a mess, - * so this is separate despite the ACP handling being somewhat - * similar. - * - * This should reduce the number of MOV instructions in the generated - * programs unless copy propagation is also done on the LIR, and may - * help anyway by triggering other optimizations that live in the HIR. - */ - -#include "ir.h" -#include "ir_rvalue_visitor.h" -#include "ir_basic_block.h" -#include "ir_optimization.h" -#include "glsl_types.h" - -static bool debug = false; - -namespace { - -class acp_entry : public exec_node -{ -public: - acp_entry(ir_variable *lhs, ir_variable *rhs, int write_mask, int swizzle[4]) - { - this->lhs = lhs; - this->rhs = rhs; - this->write_mask = write_mask; - memcpy(this->swizzle, swizzle, sizeof(this->swizzle)); - } - - acp_entry(acp_entry *a) - { - this->lhs = a->lhs; - this->rhs = a->rhs; - this->write_mask = a->write_mask; - memcpy(this->swizzle, a->swizzle, sizeof(this->swizzle)); - } - - ir_variable *lhs; - ir_variable *rhs; - unsigned int write_mask; - int swizzle[4]; -}; - - -class kill_entry : public exec_node -{ -public: - kill_entry(ir_variable *var, int write_mask) - { - this->var = var; - this->write_mask = write_mask; - } - - ir_variable *var; - unsigned int write_mask; -}; - -class ir_copy_propagation_elements_visitor : public ir_rvalue_visitor { -public: - ir_copy_propagation_elements_visitor() - { - this->progress = false; - this->killed_all = false; - this->mem_ctx = ralloc_context(NULL); - this->shader_mem_ctx = NULL; - this->acp = new(mem_ctx) exec_list; - this->kills = new(mem_ctx) exec_list; - } - ~ir_copy_propagation_elements_visitor() - { - ralloc_free(mem_ctx); - } - - virtual ir_visitor_status visit_enter(class ir_loop *); - virtual ir_visitor_status visit_enter(class ir_function_signature *); - virtual ir_visitor_status visit_leave(class ir_assignment *); - virtual ir_visitor_status visit_enter(class ir_call *); - virtual ir_visitor_status visit_enter(class ir_if *); - virtual ir_visitor_status visit_leave(class ir_swizzle *); - - void handle_rvalue(ir_rvalue **rvalue); - - void add_copy(ir_assignment *ir); - void kill(kill_entry *k); - void handle_if_block(exec_list *instructions); - - /** List of acp_entry: The available copies to propagate */ - exec_list *acp; - /** - * List of kill_entry: The variables whose values were killed in this - * block. - */ - exec_list *kills; - - bool progress; - - bool killed_all; - - /* Context for our local data structures. */ - void *mem_ctx; - /* Context for allocating new shader nodes. */ - void *shader_mem_ctx; -}; - -} /* unnamed namespace */ - -ir_visitor_status -ir_copy_propagation_elements_visitor::visit_enter(ir_function_signature *ir) -{ - /* Treat entry into a function signature as a completely separate - * block. Any instructions at global scope will be shuffled into - * main() at link time, so they're irrelevant to us. - */ - exec_list *orig_acp = this->acp; - exec_list *orig_kills = this->kills; - bool orig_killed_all = this->killed_all; - - this->acp = new(mem_ctx) exec_list; - this->kills = new(mem_ctx) exec_list; - this->killed_all = false; - - visit_list_elements(this, &ir->body); - - this->kills = orig_kills; - this->acp = orig_acp; - this->killed_all = orig_killed_all; - - return visit_continue_with_parent; -} - -ir_visitor_status -ir_copy_propagation_elements_visitor::visit_leave(ir_assignment *ir) -{ - ir_dereference_variable *lhs = ir->lhs->as_dereference_variable(); - ir_variable *var = ir->lhs->variable_referenced(); - - if (var->type->is_scalar() || var->type->is_vector()) { - kill_entry *k; - - if (lhs) - k = new(mem_ctx) kill_entry(var, ir->write_mask); - else - k = new(mem_ctx) kill_entry(var, ~0); - - kill(k); - } - - add_copy(ir); - - return visit_continue; -} - -ir_visitor_status -ir_copy_propagation_elements_visitor::visit_leave(ir_swizzle *) -{ - /* Don't visit the values of swizzles since they are handled while - * visiting the swizzle itself. - */ - return visit_continue; -} - -/** - * Replaces dereferences of ACP RHS variables with ACP LHS variables. - * - * This is where the actual copy propagation occurs. Note that the - * rewriting of ir_dereference means that the ir_dereference instance - * must not be shared by multiple IR operations! - */ -void -ir_copy_propagation_elements_visitor::handle_rvalue(ir_rvalue **ir) -{ - int swizzle_chan[4]; - ir_dereference_variable *deref_var; - ir_variable *source[4] = {NULL, NULL, NULL, NULL}; - int source_chan[4] = {0, 0, 0, 0}; - int chans; - bool noop_swizzle = true; - - if (!*ir) - return; - - ir_swizzle *swizzle = (*ir)->as_swizzle(); - if (swizzle) { - deref_var = swizzle->val->as_dereference_variable(); - if (!deref_var) - return; - - swizzle_chan[0] = swizzle->mask.x; - swizzle_chan[1] = swizzle->mask.y; - swizzle_chan[2] = swizzle->mask.z; - swizzle_chan[3] = swizzle->mask.w; - chans = swizzle->type->vector_elements; - } else { - deref_var = (*ir)->as_dereference_variable(); - if (!deref_var) - return; - - swizzle_chan[0] = 0; - swizzle_chan[1] = 1; - swizzle_chan[2] = 2; - swizzle_chan[3] = 3; - chans = deref_var->type->vector_elements; - } - - if (this->in_assignee) - return; - - ir_variable *var = deref_var->var; - - /* Try to find ACP entries covering swizzle_chan[], hoping they're - * the same source variable. - */ - foreach_in_list(acp_entry, entry, this->acp) { - if (var == entry->lhs) { - for (int c = 0; c < chans; c++) { - if (entry->write_mask & (1 << swizzle_chan[c])) { - source[c] = entry->rhs; - source_chan[c] = entry->swizzle[swizzle_chan[c]]; - - if (source_chan[c] != swizzle_chan[c]) - noop_swizzle = false; - } - } - } - } - - /* Make sure all channels are copying from the same source variable. */ - if (!source[0]) - return; - for (int c = 1; c < chans; c++) { - if (source[c] != source[0]) - return; - } - - if (!shader_mem_ctx) - shader_mem_ctx = ralloc_parent(deref_var); - - /* Don't pointlessly replace the rvalue with itself (or a noop swizzle - * of itself, which would just be deleted by opt_noop_swizzle). - */ - if (source[0] == var && noop_swizzle) - return; - - if (debug) { - printf("Copy propagation from:\n"); - (*ir)->print(); - } - - deref_var = new(shader_mem_ctx) ir_dereference_variable(source[0]); - *ir = new(shader_mem_ctx) ir_swizzle(deref_var, - source_chan[0], - source_chan[1], - source_chan[2], - source_chan[3], - chans); - progress = true; - - if (debug) { - printf("to:\n"); - (*ir)->print(); - printf("\n"); - } -} - - -ir_visitor_status -ir_copy_propagation_elements_visitor::visit_enter(ir_call *ir) -{ - /* Do copy propagation on call parameters, but skip any out params */ - foreach_two_lists(formal_node, &ir->callee->parameters, - actual_node, &ir->actual_parameters) { - ir_variable *sig_param = (ir_variable *) formal_node; - ir_rvalue *ir = (ir_rvalue *) actual_node; - if (sig_param->data.mode != ir_var_function_out - && sig_param->data.mode != ir_var_function_inout) { - ir->accept(this); - } - } - - /* Since we're unlinked, we don't (necessarily) know the side effects of - * this call. So kill all copies. Except if it's a built-in; we know - * they are side effect free. - */ - if (!ir->callee->is_builtin()) { - acp->make_empty(); - this->killed_all = true; - } - - return visit_continue_with_parent; -} - -void -ir_copy_propagation_elements_visitor::handle_if_block(exec_list *instructions) -{ - exec_list *orig_acp = this->acp; - exec_list *orig_kills = this->kills; - bool orig_killed_all = this->killed_all; - - this->acp = new(mem_ctx) exec_list; - this->kills = new(mem_ctx) exec_list; - this->killed_all = false; - - /* Populate the initial acp with a copy of the original */ - foreach_in_list(acp_entry, a, orig_acp) { - this->acp->push_tail(new(this->mem_ctx) acp_entry(a)); - } - - visit_list_elements(this, instructions); - - if (this->killed_all) { - orig_acp->make_empty(); - } - - exec_list *new_kills = this->kills; - this->kills = orig_kills; - this->acp = orig_acp; - this->killed_all = this->killed_all || orig_killed_all; - - /* Move the new kills into the parent block's list, removing them - * from the parent's ACP list in the process. - */ - foreach_in_list_safe(kill_entry, k, new_kills) { - kill(k); - } -} - -ir_visitor_status -ir_copy_propagation_elements_visitor::visit_enter(ir_if *ir) -{ - ir->condition->accept(this); - - handle_if_block(&ir->then_instructions); - handle_if_block(&ir->else_instructions); - - /* handle_if_block() already descended into the children. */ - return visit_continue_with_parent; -} - -ir_visitor_status -ir_copy_propagation_elements_visitor::visit_enter(ir_loop *ir) -{ - exec_list *orig_acp = this->acp; - exec_list *orig_kills = this->kills; - bool orig_killed_all = this->killed_all; - - /* FINISHME: For now, the initial acp for loops is totally empty. - * We could go through once, then go through again with the acp - * cloned minus the killed entries after the first run through. - */ - this->acp = new(mem_ctx) exec_list; - this->kills = new(mem_ctx) exec_list; - this->killed_all = false; - - visit_list_elements(this, &ir->body_instructions); - - if (this->killed_all) { - orig_acp->make_empty(); - } - - exec_list *new_kills = this->kills; - this->kills = orig_kills; - this->acp = orig_acp; - this->killed_all = this->killed_all || orig_killed_all; - - foreach_in_list_safe(kill_entry, k, new_kills) { - kill(k); - } - - /* already descended into the children. */ - return visit_continue_with_parent; -} - -/* Remove any entries currently in the ACP for this kill. */ -void -ir_copy_propagation_elements_visitor::kill(kill_entry *k) -{ - foreach_in_list_safe(acp_entry, entry, acp) { - if (entry->lhs == k->var) { - entry->write_mask = entry->write_mask & ~k->write_mask; - if (entry->write_mask == 0) { - entry->remove(); - continue; - } - } - if (entry->rhs == k->var) { - entry->remove(); - } - } - - /* If we were on a list, remove ourselves before inserting */ - if (k->next) - k->remove(); - - this->kills->push_tail(k); -} - -/** - * Adds directly-copied channels between vector variables to the available - * copy propagation list. - */ -void -ir_copy_propagation_elements_visitor::add_copy(ir_assignment *ir) -{ - acp_entry *entry; - int orig_swizzle[4] = {0, 1, 2, 3}; - int swizzle[4]; - - if (ir->condition) - return; - - ir_dereference_variable *lhs = ir->lhs->as_dereference_variable(); - if (!lhs || !(lhs->type->is_scalar() || lhs->type->is_vector())) - return; - - ir_dereference_variable *rhs = ir->rhs->as_dereference_variable(); - if (!rhs) { - ir_swizzle *swiz = ir->rhs->as_swizzle(); - if (!swiz) - return; - - rhs = swiz->val->as_dereference_variable(); - if (!rhs) - return; - - orig_swizzle[0] = swiz->mask.x; - orig_swizzle[1] = swiz->mask.y; - orig_swizzle[2] = swiz->mask.z; - orig_swizzle[3] = swiz->mask.w; - } - - /* Move the swizzle channels out to the positions they match in the - * destination. We don't want to have to rewrite the swizzle[] - * array every time we clear a bit of the write_mask. - */ - int j = 0; - for (int i = 0; i < 4; i++) { - if (ir->write_mask & (1 << i)) - swizzle[i] = orig_swizzle[j++]; - } - - if (lhs->var->data.precision != rhs->var->data.precision && lhs->var->data.precision!=glsl_precision_undefined && rhs->var->data.precision!=glsl_precision_undefined) - return; - - int write_mask = ir->write_mask; - if (lhs->var == rhs->var) { - /* If this is a copy from the variable to itself, then we need - * to be sure not to include the updated channels from this - * instruction in the set of new source channels to be - * copy-propagated from. - */ - for (int i = 0; i < 4; i++) { - if (ir->write_mask & (1 << orig_swizzle[i])) - write_mask &= ~(1 << i); - } - } - - entry = new(this->mem_ctx) acp_entry(lhs->var, rhs->var, write_mask, - swizzle); - this->acp->push_tail(entry); -} - -bool -do_copy_propagation_elements(exec_list *instructions) -{ - ir_copy_propagation_elements_visitor v; - - visit_list_elements(&v, instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_cse.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_cse.cpp deleted file mode 100644 index ed4c9c9a0..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_cse.cpp +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Copyright © 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_cse.cpp - * - * constant subexpression elimination at the GLSL IR level. - * - * Compare to brw_fs_cse.cpp for a more complete CSE implementation. This one - * is generic and handles texture operations, but it's rather simple currently - * and doesn't support modification of variables in the available expressions - * list, so it can't do variables other than uniforms or shader inputs. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_rvalue_visitor.h" -#include "ir_basic_block.h" -#include "ir_optimization.h" -#include "ir_builder.h" -#include "glsl_types.h" - -using namespace ir_builder; - -static bool debug = false; - -namespace { - -/** - * This is the record of an available expression for common subexpression - * elimination. - */ -class ae_entry : public exec_node -{ -public: - ae_entry(ir_instruction *base_ir, ir_rvalue **val) - : val(val), base_ir(base_ir) - { - assert(val); - assert(*val); - assert(base_ir); - - var = NULL; - } - - /** - * The pointer to the expression that we might be able to reuse - * - * Note the double pointer -- this is the place in the base_ir expression - * tree that we would rewrite to move the expression out to a new variable - * assignment. - */ - ir_rvalue **val; - - /** - * Root instruction in the basic block where the expression appeared. - * - * This is used so that we can insert the new variable declaration into the - * instruction stream (since *val is just somewhere in base_ir's expression - * tree). - */ - ir_instruction *base_ir; - - /** - * The variable that the expression has been stored in, if it's been CSEd - * once already. - */ - ir_variable *var; -}; - -class cse_visitor : public ir_rvalue_visitor { -public: - cse_visitor(exec_list *validate_instructions) - : validate_instructions(validate_instructions) - { - progress = false; - mem_ctx = ralloc_context(NULL); - this->ae = new(mem_ctx) exec_list; - } - ~cse_visitor() - { - ralloc_free(mem_ctx); - } - - virtual ir_visitor_status visit_enter(ir_function_signature *ir); - virtual ir_visitor_status visit_enter(ir_loop *ir); - virtual ir_visitor_status visit_enter(ir_if *ir); - virtual ir_visitor_status visit_enter(ir_call *ir); - virtual void handle_rvalue(ir_rvalue **rvalue); - - bool progress; - -private: - void *mem_ctx; - - ir_rvalue *try_cse(ir_rvalue *rvalue); - void add_to_ae(ir_rvalue **rvalue); - - /** List of ae_entry: The available expressions to reuse */ - exec_list *ae; - - /** - * The whole shader, so that we can validate_ir_tree in debug mode. - * - * This proved quite useful when trying to get the tree manipulation - * right. - */ - exec_list *validate_instructions; -}; - -/** - * Visitor to walk an expression tree to check that all variables referenced - * are constants. - */ -class is_cse_candidate_visitor : public ir_hierarchical_visitor -{ -public: - - is_cse_candidate_visitor() - : ok(true) - { - } - - virtual ir_visitor_status visit(ir_dereference_variable *ir); - - bool ok; -}; - - -class contains_rvalue_visitor : public ir_rvalue_visitor -{ -public: - - contains_rvalue_visitor(ir_rvalue *val) - : val(val) - { - found = false; - } - - virtual void handle_rvalue(ir_rvalue **rvalue); - - bool found; - -private: - ir_rvalue *val; -}; - -} /* unnamed namespace */ - -static void -dump_ae(exec_list *ae) -{ - int i = 0; - - printf("CSE: AE contents:\n"); - foreach_in_list(ae_entry, entry, ae) { - printf("CSE: AE %2d (%p): ", i, entry); - (*entry->val)->print(); - printf("\n"); - - if (entry->var) - printf("CSE: in var %p:\n", entry->var); - - i++; - } -} - -ir_visitor_status -is_cse_candidate_visitor::visit(ir_dereference_variable *ir) -{ - /* Currently, since we don't handle kills of the ae based on variables - * getting assigned, we can only handle constant variables. - */ - if (ir->var->data.read_only) { - return visit_continue; - } else { - ok = false; - return visit_stop; - } -} - -void -contains_rvalue_visitor::handle_rvalue(ir_rvalue **rvalue) -{ - if (*rvalue == val) - found = true; -} - -static bool -contains_rvalue(ir_rvalue *haystack, ir_rvalue *needle) -{ - contains_rvalue_visitor v(needle); - haystack->accept(&v); - return v.found; -} - -static bool -is_cse_candidate(ir_rvalue *ir) -{ - /* Our temporary variable assignment generation isn't ready to handle - * anything bigger than a vector. - */ - if (!ir->type->is_vector() && !ir->type->is_scalar()) - return false; - - /* Only handle expressions and textures currently. We may want to extend - * to variable-index array dereferences at some point. - */ - switch (ir->ir_type) { - case ir_type_expression: - case ir_type_texture: - break; - default: - return false; - } - - is_cse_candidate_visitor v; - - ir->accept(&v); - - return v.ok; -} - - -/** - * Tries to find and return a reference to a previous computation of a given - * expression. - * - * Walk the list of available expressions checking if any of them match the - * rvalue, and if so, move the previous copy of the expression to a temporary - * and return a reference of the temporary. - */ -ir_rvalue * -cse_visitor::try_cse(ir_rvalue *rvalue) -{ - foreach_in_list(ae_entry, entry, ae) { - if (debug) { - printf("Comparing to AE %p: ", entry); - (*entry->val)->print(); - printf("\n"); - } - - if (!rvalue->equals(*entry->val)) - continue; - - if (debug) { - printf("CSE: Replacing: "); - (*entry->val)->print(); - printf("\n"); - printf("CSE: with: "); - rvalue->print(); - printf("\n"); - } - - if (!entry->var) { - ir_instruction *base_ir = entry->base_ir; - - ir_variable *var = new(rvalue) ir_variable(rvalue->type, - "cse", - ir_var_temporary, rvalue->get_precision()); - - /* Write the previous expression result into a new variable. */ - base_ir->insert_before(var); - ir_assignment *assignment = assign(var, *entry->val); - base_ir->insert_before(assignment); - - /* Replace the expression in the original tree with a deref of the - * variable, but keep tracking the expression for further reuse. - */ - *entry->val = new(rvalue) ir_dereference_variable(var); - entry->val = &assignment->rhs; - - entry->var = var; - - /* Update the base_irs in the AE list. We have to be sure that - * they're correct -- expressions from our base_ir that weren't moved - * need to stay in this base_ir (so that later consumption of them - * puts new variables between our new variable and our base_ir), but - * expressions from our base_ir that we *did* move need base_ir - * updated so that any further elimination from inside gets its new - * assignments put before our new assignment. - */ - foreach_in_list(ae_entry, fixup_entry, ae) { - if (contains_rvalue(assignment->rhs, *fixup_entry->val)) - fixup_entry->base_ir = assignment; - } - - if (debug) - dump_ae(ae); - } - - /* Replace the expression in our current tree with the variable. */ - return new(rvalue) ir_dereference_variable(entry->var); - } - - return NULL; -} - -/** Add the rvalue to the list of available expressions for CSE. */ -void -cse_visitor::add_to_ae(ir_rvalue **rvalue) -{ - if (debug) { - printf("CSE: Add to AE: "); - (*rvalue)->print(); - printf("\n"); - } - - ae->push_tail(new(mem_ctx) ae_entry(base_ir, rvalue)); - - if (debug) - dump_ae(ae); -} - -void -cse_visitor::handle_rvalue(ir_rvalue **rvalue) -{ - if (!*rvalue) - return; - - if (debug) { - printf("CSE: handle_rvalue "); - (*rvalue)->print(); - printf("\n"); - } - - if (!is_cse_candidate(*rvalue)) - return; - - ir_rvalue *new_rvalue = try_cse(*rvalue); - if (new_rvalue) { - *rvalue = new_rvalue; - progress = true; - - if (debug) - validate_ir_tree(validate_instructions); - } else { - add_to_ae(rvalue); - } -} - -ir_visitor_status -cse_visitor::visit_enter(ir_if *ir) -{ - handle_rvalue(&ir->condition); - - ae->make_empty(); - visit_list_elements(this, &ir->then_instructions); - - ae->make_empty(); - visit_list_elements(this, &ir->else_instructions); - - ae->make_empty(); - return visit_continue_with_parent; -} - -ir_visitor_status -cse_visitor::visit_enter(ir_function_signature *ir) -{ - ae->make_empty(); - visit_list_elements(this, &ir->body); - - ae->make_empty(); - return visit_continue_with_parent; -} - -ir_visitor_status -cse_visitor::visit_enter(ir_loop *ir) -{ - ae->make_empty(); - visit_list_elements(this, &ir->body_instructions); - - ae->make_empty(); - return visit_continue_with_parent; -} - -ir_visitor_status -cse_visitor::visit_enter(ir_call *) -{ - /* Because call is an exec_list of ir_rvalues, handle_rvalue gets passed a - * pointer to the (ir_rvalue *) on the stack. Since we save those pointers - * in the AE list, we can't let handle_rvalue get called. - */ - return visit_continue_with_parent; -} - -/** - * Does a (uniform-value) constant subexpression elimination pass on the code - * present in the instruction stream. - */ -bool -do_cse(exec_list *instructions) -{ - cse_visitor v(instructions); - - visit_list_elements(&v, instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_dead_builtin_variables.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_dead_builtin_variables.cpp deleted file mode 100644 index 85c75d6f2..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_dead_builtin_variables.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright © 2014 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_optimization.h" - -/** - * Pre-linking, optimize unused built-in variables - * - * Uniforms, constants, system values, inputs (vertex shader only), and - * outputs (fragment shader only) that are not used can be removed. - */ -void -optimize_dead_builtin_variables(exec_list *instructions, - enum ir_variable_mode other) -{ - foreach_in_list_safe(ir_variable, var, instructions) { - if (var->ir_type != ir_type_variable || var->data.used) - continue; - - if (var->data.mode != ir_var_uniform - && var->data.mode != ir_var_auto - && var->data.mode != ir_var_system_value - && var->data.mode != other) - continue; - - /* So that linker rules can later be enforced, we cannot elimate - * variables that were redeclared in the shader code. - */ - if ((var->data.mode == other || var->data.mode == ir_var_system_value) - && var->data.how_declared != ir_var_declared_implicitly) - continue; - - if (strncmp(var->name, "gl_", 3) != 0) - continue; - - /* gl_ModelViewProjectionMatrix and gl_Vertex are special because they - * are used by ftransform. No other built-in variable is used by a - * built-in function. The forward declarations of these variables in - * the built-in function shader does not have the "state slot" - * information, so removing these variables from the user shader will - * cause problems later. - * - * Matrix uniforms with "Transpose" are not eliminated because there's - * an optimization pass that can turn references to the regular matrix - * into references to the transpose matrix. Eliminating the transpose - * matrix would cause that pass to generate references to undeclareds - * variables (thank you, ir_validate). - * - * It doesn't seem worth the effort to track when the transpose could be - * eliminated (i.e., when the non-transpose was eliminated). - */ - if (strcmp(var->name, "gl_ModelViewProjectionMatrix") == 0 - || strcmp(var->name, "gl_Vertex") == 0 - || strstr(var->name, "Transpose") != NULL) - continue; - - var->remove(); - } -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_dead_builtin_varyings.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_dead_builtin_varyings.cpp deleted file mode 100644 index cb8cf87e3..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_dead_builtin_varyings.cpp +++ /dev/null @@ -1,586 +0,0 @@ -/* - * Copyright © 2013 Marek Olšák - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_dead_builtin_varyings.cpp - * - * This eliminates the built-in shader outputs which are either not written - * at all or not used by the next stage. It also eliminates unused elements - * of gl_TexCoord inputs, which reduces the overall varying usage. - * The varyings handled here are the primary and secondary color, the fog, - * and the texture coordinates (gl_TexCoord). - * - * This pass is necessary, because the Mesa GLSL linker cannot eliminate - * built-in varyings like it eliminates user-defined varyings, because - * the built-in varyings have pre-assigned locations. Also, the elimination - * of unused gl_TexCoord elements requires its own lowering pass anyway. - * - * It's implemented by replacing all occurrences of dead varyings with - * temporary variables, which creates dead code. It is recommended to run - * a dead-code elimination pass after this. - * - * If any texture coordinate slots can be eliminated, the gl_TexCoord array is - * broken down into separate vec4 variables with locations equal to - * VARYING_SLOT_TEX0 + i. - * - * The same is done for the gl_FragData fragment shader output. - */ - -#include "main/core.h" /* for snprintf and ARRAY_SIZE */ -#include "ir.h" -#include "ir_rvalue_visitor.h" -#include "ir_optimization.h" -#include "ir_print_visitor.h" -#include "glsl_types.h" -#include "link_varyings.h" - -namespace { - -/** - * This obtains detailed information about built-in varyings from shader code. - */ -class varying_info_visitor : public ir_hierarchical_visitor { -public: - /* "mode" can be either ir_var_shader_in or ir_var_shader_out */ - varying_info_visitor(ir_variable_mode mode, bool find_frag_outputs = false) - : lower_texcoord_array(true), - texcoord_array(NULL), - texcoord_usage(0), - find_frag_outputs(find_frag_outputs), - lower_fragdata_array(true), - fragdata_array(NULL), - fragdata_usage(0), - color_usage(0), - tfeedback_color_usage(0), - fog(NULL), - has_fog(false), - tfeedback_has_fog(false), - mode(mode) - { - memset(color, 0, sizeof(color)); - memset(backcolor, 0, sizeof(backcolor)); - } - - virtual ir_visitor_status visit_enter(ir_dereference_array *ir) - { - ir_variable *var = ir->variable_referenced(); - - if (!var || var->data.mode != this->mode) - return visit_continue; - - if (this->find_frag_outputs && var->data.location == FRAG_RESULT_DATA0) { - this->fragdata_array = var; - - ir_constant *index = ir->array_index->as_constant(); - if (index == NULL) { - /* This is variable indexing. */ - this->fragdata_usage |= (1 << var->type->array_size()) - 1; - this->lower_fragdata_array = false; - } - else { - this->fragdata_usage |= 1 << index->get_uint_component(0); - } - - /* Don't visit the leaves of ir_dereference_array. */ - return visit_continue_with_parent; - } - - if (!this->find_frag_outputs && var->data.location == VARYING_SLOT_TEX0) { - this->texcoord_array = var; - - ir_constant *index = ir->array_index->as_constant(); - if (index == NULL) { - /* There is variable indexing, we can't lower the texcoord array. - */ - this->texcoord_usage |= (1 << var->type->array_size()) - 1; - this->lower_texcoord_array = false; - } - else { - this->texcoord_usage |= 1 << index->get_uint_component(0); - } - - /* Don't visit the leaves of ir_dereference_array. */ - return visit_continue_with_parent; - } - - return visit_continue; - } - - virtual ir_visitor_status visit(ir_dereference_variable *ir) - { - ir_variable *var = ir->variable_referenced(); - - if (var->data.mode != this->mode || !var->type->is_array()) - return visit_continue; - - if (this->find_frag_outputs && var->data.location == FRAG_RESULT_DATA0) { - /* This is a whole array dereference. */ - this->fragdata_usage |= (1 << var->type->array_size()) - 1; - this->lower_fragdata_array = false; - return visit_continue; - } - - if (!this->find_frag_outputs && var->data.location == VARYING_SLOT_TEX0) { - /* This is a whole array dereference like "gl_TexCoord = x;", - * there's probably no point in lowering that. - */ - this->texcoord_usage |= (1 << var->type->array_size()) - 1; - this->lower_texcoord_array = false; - } - return visit_continue; - } - - virtual ir_visitor_status visit(ir_variable *var) - { - if (var->data.mode != this->mode) - return visit_continue; - - /* Nothing to do here for fragment outputs. */ - if (this->find_frag_outputs) - return visit_continue; - - /* Handle colors and fog. */ - switch (var->data.location) { - case VARYING_SLOT_COL0: - this->color[0] = var; - this->color_usage |= 1; - break; - case VARYING_SLOT_COL1: - this->color[1] = var; - this->color_usage |= 2; - break; - case VARYING_SLOT_BFC0: - this->backcolor[0] = var; - this->color_usage |= 1; - break; - case VARYING_SLOT_BFC1: - this->backcolor[1] = var; - this->color_usage |= 2; - break; - case VARYING_SLOT_FOGC: - this->fog = var; - this->has_fog = true; - break; - } - - return visit_continue; - } - - void get(exec_list *ir, - unsigned num_tfeedback_decls, - tfeedback_decl *tfeedback_decls) - { - /* Handle the transform feedback varyings. */ - for (unsigned i = 0; i < num_tfeedback_decls; i++) { - if (!tfeedback_decls[i].is_varying()) - continue; - - unsigned location = tfeedback_decls[i].get_location(); - - switch (location) { - case VARYING_SLOT_COL0: - case VARYING_SLOT_BFC0: - this->tfeedback_color_usage |= 1; - break; - case VARYING_SLOT_COL1: - case VARYING_SLOT_BFC1: - this->tfeedback_color_usage |= 2; - break; - case VARYING_SLOT_FOGC: - this->tfeedback_has_fog = true; - break; - default: - if (location >= VARYING_SLOT_TEX0 && - location <= VARYING_SLOT_TEX7) { - this->lower_texcoord_array = false; - } - } - } - - /* Process the shader. */ - visit_list_elements(this, ir); - - if (!this->texcoord_array) { - this->lower_texcoord_array = false; - } - if (!this->fragdata_array) { - this->lower_fragdata_array = false; - } - } - - bool lower_texcoord_array; - ir_variable *texcoord_array; - unsigned texcoord_usage; /* bitmask */ - - bool find_frag_outputs; /* false if it's looking for varyings */ - bool lower_fragdata_array; - ir_variable *fragdata_array; - unsigned fragdata_usage; /* bitmask */ - - ir_variable *color[2]; - ir_variable *backcolor[2]; - unsigned color_usage; /* bitmask */ - unsigned tfeedback_color_usage; /* bitmask */ - - ir_variable *fog; - bool has_fog; - bool tfeedback_has_fog; - - ir_variable_mode mode; -}; - - -/** - * This replaces unused varyings with temporary variables. - * - * If "ir" is the producer, the "external" usage should come from - * the consumer. It also works the other way around. If either one is - * missing, set the "external" usage to a full mask. - */ -class replace_varyings_visitor : public ir_rvalue_visitor { -public: - replace_varyings_visitor(exec_list *ir, - const varying_info_visitor *info, - unsigned external_texcoord_usage, - unsigned external_color_usage, - bool external_has_fog) - : info(info), new_fog(NULL) - { - void *const ctx = ir; - - memset(this->new_fragdata, 0, sizeof(this->new_fragdata)); - memset(this->new_texcoord, 0, sizeof(this->new_texcoord)); - memset(this->new_color, 0, sizeof(this->new_color)); - memset(this->new_backcolor, 0, sizeof(this->new_backcolor)); - - const char *mode_str = - info->mode == ir_var_shader_in ? "in" : "out"; - - /* Handle texcoord outputs. - * - * We're going to break down the gl_TexCoord array into separate - * variables. First, add declarations of the new variables all - * occurrences of gl_TexCoord will be replaced with. - */ - if (info->lower_texcoord_array) { - prepare_array(ir, this->new_texcoord, ARRAY_SIZE(this->new_texcoord), - VARYING_SLOT_TEX0, "TexCoord", mode_str, - info->texcoord_usage, external_texcoord_usage); - } - - /* Handle gl_FragData in the same way like gl_TexCoord. */ - if (info->lower_fragdata_array) { - prepare_array(ir, this->new_fragdata, ARRAY_SIZE(this->new_fragdata), - FRAG_RESULT_DATA0, "FragData", mode_str, - info->fragdata_usage, (1 << MAX_DRAW_BUFFERS) - 1); - } - - /* Create dummy variables which will replace set-but-unused color and - * fog outputs. - */ - external_color_usage |= info->tfeedback_color_usage; - - for (int i = 0; i < 2; i++) { - char name[32]; - - if (!(external_color_usage & (1 << i))) { - if (info->color[i]) { - snprintf(name, 32, "gl_%s_FrontColor%i_dummy", mode_str, i); - this->new_color[i] = - new (ctx) ir_variable(glsl_type::vec4_type, name, - ir_var_temporary, glsl_precision_medium); - } - - if (info->backcolor[i]) { - snprintf(name, 32, "gl_%s_BackColor%i_dummy", mode_str, i); - this->new_backcolor[i] = - new (ctx) ir_variable(glsl_type::vec4_type, name, - ir_var_temporary, glsl_precision_medium); - } - } - } - - if (!external_has_fog && !info->tfeedback_has_fog && - info->fog) { - char name[32]; - - snprintf(name, 32, "gl_%s_FogFragCoord_dummy", mode_str); - this->new_fog = new (ctx) ir_variable(glsl_type::float_type, name, - ir_var_temporary, glsl_precision_high); - } - - /* Now do the replacing. */ - visit_list_elements(this, ir); - } - - void prepare_array(exec_list *ir, - ir_variable **new_var, - int max_elements, unsigned start_location, - const char *var_name, const char *mode_str, - unsigned usage, unsigned external_usage) - { - void *const ctx = ir; - - for (int i = max_elements-1; i >= 0; i--) { - if (usage & (1 << i)) { - char name[32]; - - if (!(external_usage & (1 << i))) { - /* This varying is unused in the next stage. Declare - * a temporary instead of an output. */ - snprintf(name, 32, "gl_%s_%s%i_dummy", mode_str, var_name, i); - new_var[i] = - new (ctx) ir_variable(glsl_type::vec4_type, name, - ir_var_temporary, glsl_precision_undefined); - } - else { - snprintf(name, 32, "gl_%s_%s%i", mode_str, var_name, i); - new_var[i] = - new(ctx) ir_variable(glsl_type::vec4_type, name, - this->info->mode, glsl_precision_undefined); - new_var[i]->data.location = start_location + i; - new_var[i]->data.explicit_location = true; - new_var[i]->data.explicit_index = 0; - } - - ir->head->insert_before(new_var[i]); - } - } - } - - virtual ir_visitor_status visit(ir_variable *var) - { - /* Remove the gl_TexCoord array. */ - if (this->info->lower_texcoord_array && - var == this->info->texcoord_array) { - var->remove(); - } - - /* Remove the gl_FragData array. */ - if (this->info->lower_fragdata_array && - var == this->info->fragdata_array) { - var->remove(); - } - - /* Replace set-but-unused color and fog outputs with dummy variables. */ - for (int i = 0; i < 2; i++) { - if (var == this->info->color[i] && this->new_color[i]) { - var->replace_with(this->new_color[i]); - } - if (var == this->info->backcolor[i] && - this->new_backcolor[i]) { - var->replace_with(this->new_backcolor[i]); - } - } - - if (var == this->info->fog && this->new_fog) { - var->replace_with(this->new_fog); - } - - return visit_continue; - } - - virtual void handle_rvalue(ir_rvalue **rvalue) - { - if (!*rvalue) - return; - - void *ctx = ralloc_parent(*rvalue); - - /* Replace an array dereference gl_TexCoord[i] with a single - * variable dereference representing gl_TexCoord[i]. - */ - if (this->info->lower_texcoord_array) { - /* gl_TexCoord[i] occurrence */ - ir_dereference_array *const da = (*rvalue)->as_dereference_array(); - - if (da && da->variable_referenced() == - this->info->texcoord_array) { - unsigned i = da->array_index->as_constant()->get_uint_component(0); - - *rvalue = new(ctx) ir_dereference_variable(this->new_texcoord[i]); - return; - } - } - - /* Same for gl_FragData. */ - if (this->info->lower_fragdata_array) { - /* gl_FragData[i] occurrence */ - ir_dereference_array *const da = (*rvalue)->as_dereference_array(); - - if (da && da->variable_referenced() == this->info->fragdata_array) { - unsigned i = da->array_index->as_constant()->get_uint_component(0); - - *rvalue = new(ctx) ir_dereference_variable(this->new_fragdata[i]); - return; - } - } - - /* Replace set-but-unused color and fog outputs with dummy variables. */ - ir_dereference_variable *const dv = (*rvalue)->as_dereference_variable(); - if (!dv) - return; - - ir_variable *var = dv->variable_referenced(); - - for (int i = 0; i < 2; i++) { - if (var == this->info->color[i] && this->new_color[i]) { - *rvalue = new(ctx) ir_dereference_variable(this->new_color[i]); - return; - } - if (var == this->info->backcolor[i] && - this->new_backcolor[i]) { - *rvalue = new(ctx) ir_dereference_variable(this->new_backcolor[i]); - return; - } - } - - if (var == this->info->fog && this->new_fog) { - *rvalue = new(ctx) ir_dereference_variable(this->new_fog); - } - } - - virtual ir_visitor_status visit_leave(ir_assignment *ir) - { - handle_rvalue(&ir->rhs); - handle_rvalue(&ir->condition); - - /* We have to use set_lhs when changing the LHS of an assignment. */ - ir_rvalue *lhs = ir->lhs; - - handle_rvalue(&lhs); - if (lhs != ir->lhs) { - ir->set_lhs(lhs); - } - - return visit_continue; - } - -private: - const varying_info_visitor *info; - ir_variable *new_fragdata[MAX_DRAW_BUFFERS]; - ir_variable *new_texcoord[MAX_TEXTURE_COORD_UNITS]; - ir_variable *new_color[2]; - ir_variable *new_backcolor[2]; - ir_variable *new_fog; -}; - -} /* anonymous namespace */ - -static void -lower_texcoord_array(exec_list *ir, const varying_info_visitor *info) -{ - replace_varyings_visitor(ir, info, - (1 << MAX_TEXTURE_COORD_UNITS) - 1, - 1 | 2, true); -} - -static void -lower_fragdata_array(exec_list *ir) -{ - varying_info_visitor info(ir_var_shader_out, true); - info.get(ir, 0, NULL); - - replace_varyings_visitor(ir, &info, 0, 0, 0); -} - - -void -do_dead_builtin_varyings(struct gl_context *ctx, - gl_shader *producer, gl_shader *consumer, - unsigned num_tfeedback_decls, - tfeedback_decl *tfeedback_decls) -{ - /* Lower the gl_FragData array to separate variables. */ - if (consumer && consumer->Stage == MESA_SHADER_FRAGMENT) { - lower_fragdata_array(consumer->ir); - } - - /* Lowering of built-in varyings has no effect with the core context and - * GLES2, because they are not available there. - */ - if (ctx->API == API_OPENGL_CORE || - ctx->API == API_OPENGLES2) { - return; - } - - /* Information about built-in varyings. */ - varying_info_visitor producer_info(ir_var_shader_out); - varying_info_visitor consumer_info(ir_var_shader_in); - - if (producer) { - producer_info.get(producer->ir, num_tfeedback_decls, tfeedback_decls); - - if (!consumer) { - /* At least eliminate unused gl_TexCoord elements. */ - if (producer_info.lower_texcoord_array) { - lower_texcoord_array(producer->ir, &producer_info); - } - return; - } - } - - if (consumer) { - consumer_info.get(consumer->ir, 0, NULL); - - if (!producer) { - /* At least eliminate unused gl_TexCoord elements. */ - if (consumer_info.lower_texcoord_array) { - lower_texcoord_array(consumer->ir, &consumer_info); - } - return; - } - } - - /* Eliminate the outputs unused by the consumer. */ - if (producer_info.lower_texcoord_array || - producer_info.color_usage || - producer_info.has_fog) { - replace_varyings_visitor(producer->ir, - &producer_info, - consumer_info.texcoord_usage, - consumer_info.color_usage, - consumer_info.has_fog); - } - - /* The gl_TexCoord fragment shader inputs can be initialized - * by GL_COORD_REPLACE, so we can't eliminate them. - * - * This doesn't prevent elimination of the gl_TexCoord elements which - * are not read by the fragment shader. We want to eliminate those anyway. - */ - if (consumer->Stage == MESA_SHADER_FRAGMENT) { - producer_info.texcoord_usage = (1 << MAX_TEXTURE_COORD_UNITS) - 1; - } - - /* Eliminate the inputs uninitialized by the producer. */ - if (consumer_info.lower_texcoord_array || - consumer_info.color_usage || - consumer_info.has_fog) { - replace_varyings_visitor(consumer->ir, - &consumer_info, - producer_info.texcoord_usage, - producer_info.color_usage, - producer_info.has_fog); - } -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_dead_code.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_dead_code.cpp deleted file mode 100644 index eb6dd7807..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_dead_code.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_dead_code.cpp - * - * Eliminates dead assignments and variable declarations from the code. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_variable_refcount.h" -#include "glsl_types.h" -#include "util/hash_table.h" - -static bool debug = false; - -/** - * Do a dead code pass over instructions and everything that instructions - * references. - * - * Note that this will remove assignments to globals, so it is not suitable - * for usage on an unlinked instruction stream. - */ -bool -do_dead_code(exec_list *instructions, bool uniform_locations_assigned) -{ - ir_variable_refcount_visitor v; - bool progress = false; - - v.run(instructions); - - struct hash_entry *e; - hash_table_foreach(v.ht, e) { - ir_variable_refcount_entry *entry = (ir_variable_refcount_entry *)e->data; - - /* Since each assignment is a reference, the refereneced count must be - * greater than or equal to the assignment count. If they are equal, - * then all of the references are assignments, and the variable is - * dead. - * - * Note that if the variable is neither assigned nor referenced, both - * counts will be zero and will be caught by the equality test. - */ - assert(entry->referenced_count >= entry->assigned_count); - - if (debug) { - printf("%s@%p: %d refs, %d assigns, %sdeclared in our scope\n", - entry->var->name, (void *) entry->var, - entry->referenced_count, entry->assigned_count, - entry->declaration ? "" : "not "); - } - - if ((entry->referenced_count_noself > entry->assigned_count) - || !entry->declaration) - continue; - - if (entry->assign) { - /* Remove a single dead assignment to the variable we found. - * Don't do so if it's a shader or function output, though. - */ - if (entry->var->data.mode != ir_var_function_out && - entry->var->data.mode != ir_var_function_inout && - entry->var->data.mode != ir_var_shader_out && entry->var->data.mode != ir_var_shader_inout) { - entry->assign->remove(); - progress = true; - - if (debug) { - printf("Removed assignment to %s@%p\n", - entry->var->name, (void *) entry->var); - } - } - } else { - /* If there are no assignments or references to the variable left, - * then we can remove its declaration. - */ - - /* uniform initializers are precious, and could get used by another - * stage. Also, once uniform locations have been assigned, the - * declaration cannot be deleted. - */ - if (entry->var->data.mode == ir_var_uniform) { - if (uniform_locations_assigned || entry->var->constant_value) - continue; - - /* Section 2.11.6 (Uniform Variables) of the OpenGL ES 3.0.3 spec - * says: - * - * "All members of a named uniform block declared with a - * shared or std140 layout qualifier are considered active, - * even if they are not referenced in any shader in the - * program. The uniform block itself is also considered - * active, even if no member of the block is referenced." - * - * If the variable is in a uniform block with one of those - * layouts, do not eliminate it. - */ - if (entry->var->is_in_uniform_block()) { - const glsl_type *const block_type = - entry->var->is_interface_instance() - ? entry->var->type : entry->var->get_interface_type(); - - if (block_type->interface_packing != GLSL_INTERFACE_PACKING_PACKED) - continue; - } - } - - entry->var->remove(); - progress = true; - - if (debug) { - printf("Removed declaration of %s@%p\n", - entry->var->name, (void *) entry->var); - } - } - } - - return progress; -} - -/** - * Does a dead code pass on the functions present in the instruction stream. - * - * This is suitable for use while the program is not linked, as it will - * ignore variable declarations (and the assignments to them) for variables - * with global scope. - */ -bool -do_dead_code_unlinked(exec_list *instructions) -{ - bool progress = false; - - foreach_in_list(ir_instruction, ir, instructions) { - ir_function *f = ir->as_function(); - if (f) { - foreach_in_list(ir_function_signature, sig, &f->signatures) { - /* The setting of the uniform_locations_assigned flag here is - * irrelevent. If there is a uniform declaration encountered - * inside the body of the function, something has already gone - * terribly, terribly wrong. - */ - if (do_dead_code(&sig->body, false)) - progress = true; - } - } - } - - return progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_dead_code_local.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_dead_code_local.cpp deleted file mode 100644 index 4770fcff2..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_dead_code_local.cpp +++ /dev/null @@ -1,331 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_dead_code_local.cpp - * - * Eliminates local dead assignments from the code. - * - * This operates on basic blocks, tracking assignments and finding if - * they're used before the variable is completely reassigned. - * - * Compare this to ir_dead_code.cpp, which operates globally looking - * for assignments to variables that are never read. - */ - -#include "ir.h" -#include "ir_basic_block.h" -#include "ir_optimization.h" -#include "glsl_types.h" - -static bool debug = false; - -namespace { - -class assignment_entry : public exec_node -{ -public: - assignment_entry(ir_variable *lhs, ir_assignment *ir) - { - assert(lhs); - assert(ir); - this->lhs = lhs; - this->ir = ir; - this->unused = ir->write_mask; - } - - ir_variable *lhs; - ir_assignment *ir; - - /* bitmask of xyzw channels written that haven't been used so far. */ - int unused; -}; - -class kill_for_derefs_visitor : public ir_hierarchical_visitor { -public: - kill_for_derefs_visitor(exec_list *assignments) - { - this->assignments = assignments; - } - - void use_channels(ir_variable *const var, int used) - { - foreach_in_list_safe(assignment_entry, entry, this->assignments) { - if (entry->lhs == var) { - if (var->type->is_scalar() || var->type->is_vector()) { - if (debug) - printf("used %s (0x%01x - 0x%01x)\n", entry->lhs->name, - entry->unused, used & 0xf); - entry->unused &= ~used; - if (!entry->unused) - entry->remove(); - } else { - if (debug) - printf("used %s\n", entry->lhs->name); - entry->remove(); - } - } - } - } - - virtual ir_visitor_status visit(ir_dereference_variable *ir) - { - use_channels(ir->var, ~0); - - return visit_continue; - } - - virtual ir_visitor_status visit(ir_swizzle *ir) - { - ir_dereference_variable *deref = ir->val->as_dereference_variable(); - if (!deref) - return visit_continue; - - int used = 0; - used |= 1 << ir->mask.x; - used |= 1 << ir->mask.y; - used |= 1 << ir->mask.z; - used |= 1 << ir->mask.w; - - use_channels(deref->var, used); - - return visit_continue_with_parent; - } - - virtual ir_visitor_status visit_leave(ir_emit_vertex *) - { - /* For the purpose of dead code elimination, emitting a vertex counts as - * "reading" all of the currently assigned output variables. - */ - foreach_in_list_safe(assignment_entry, entry, this->assignments) { - if (entry->lhs->data.mode == ir_var_shader_out) { - if (debug) - printf("kill %s\n", entry->lhs->name); - entry->remove(); - } - } - - return visit_continue; - } - -private: - exec_list *assignments; -}; - -class array_index_visit : public ir_hierarchical_visitor { -public: - array_index_visit(ir_hierarchical_visitor *v) - { - this->visitor = v; - } - - virtual ir_visitor_status visit_enter(class ir_dereference_array *ir) - { - ir->array_index->accept(visitor); - return visit_continue; - } - - static void run(ir_instruction *ir, ir_hierarchical_visitor *v) - { - array_index_visit top_visit(v); - ir->accept(& top_visit); - } - - ir_hierarchical_visitor *visitor; -}; - -} /* unnamed namespace */ - -/** - * Adds an entry to the available copy list if it's a plain assignment - * of a variable to a variable. - */ -static bool -process_assignment(void *ctx, ir_assignment *ir, exec_list *assignments) -{ - ir_variable *var = NULL; - bool progress = false; - kill_for_derefs_visitor v(assignments); - - /* Kill assignment entries for things used to produce this assignment. */ - ir->rhs->accept(&v); - if (ir->condition) { - ir->condition->accept(&v); - } - - /* Kill assignment enties used as array indices. - */ - array_index_visit::run(ir->lhs, &v); - var = ir->lhs->variable_referenced(); - assert(var); - - /* Now, check if we did a whole-variable assignment. */ - if (!ir->condition) { - ir_dereference_variable *deref_var = ir->lhs->as_dereference_variable(); - - /* If it's a vector type, we can do per-channel elimination of - * use of the RHS. - */ - if (deref_var && (deref_var->var->type->is_scalar() || - deref_var->var->type->is_vector())) { - - if (debug) - printf("looking for %s.0x%01x to remove\n", var->name, - ir->write_mask); - - foreach_in_list_safe(assignment_entry, entry, assignments) { - if (entry->lhs != var) - continue; - - int remove = entry->unused & ir->write_mask; - if (debug) { - printf("%s 0x%01x - 0x%01x = 0x%01x\n", - var->name, - entry->ir->write_mask, - remove, entry->ir->write_mask & ~remove); - } - if (remove) { - progress = true; - - if (debug) { - printf("rewriting:\n "); - entry->ir->print(); - printf("\n"); - } - - entry->ir->write_mask &= ~remove; - entry->unused &= ~remove; - if (entry->ir->write_mask == 0) { - /* Delete the dead assignment. */ - entry->ir->remove(); - entry->remove(); - } else { - void *mem_ctx = ralloc_parent(entry->ir); - /* Reswizzle the RHS arguments according to the new - * write_mask. - */ - unsigned components[4]; - unsigned channels = 0; - unsigned next = 0; - - for (int i = 0; i < 4; i++) { - if ((entry->ir->write_mask | remove) & (1 << i)) { - if (!(remove & (1 << i))) - components[channels++] = next; - next++; - } - } - - entry->ir->rhs = new(mem_ctx) ir_swizzle(entry->ir->rhs, - components, - channels); - if (debug) { - printf("to:\n "); - entry->ir->print(); - printf("\n"); - } - } - } - } - } else if (ir->whole_variable_written() != NULL) { - /* We did a whole-variable assignment. So, any instruction in - * the assignment list with the same LHS is dead. - */ - if (debug) - printf("looking for %s to remove\n", var->name); - foreach_in_list_safe(assignment_entry, entry, assignments) { - if (entry->lhs == var) { - if (debug) - printf("removing %s\n", var->name); - entry->ir->remove(); - entry->remove(); - progress = true; - } - } - } - } - - /* Add this instruction to the assignment list available to be removed. */ - assignment_entry *entry = new(ctx) assignment_entry(var, ir); - assignments->push_tail(entry); - - if (debug) { - printf("add %s\n", var->name); - - printf("current entries\n"); - foreach_in_list(assignment_entry, entry, assignments) { - printf(" %s (0x%01x)\n", entry->lhs->name, entry->unused); - } - } - - return progress; -} - -static void -dead_code_local_basic_block(ir_instruction *first, - ir_instruction *last, - void *data) -{ - ir_instruction *ir, *ir_next; - /* List of avaialble_copy */ - exec_list assignments; - bool *out_progress = (bool *)data; - bool progress = false; - - void *ctx = ralloc_context(NULL); - /* Safe looping, since process_assignment */ - for (ir = first, ir_next = (ir_instruction *)first->next;; - ir = ir_next, ir_next = (ir_instruction *)ir->next) { - ir_assignment *ir_assign = ir->as_assignment(); - - if (debug) { - ir->print(); - printf("\n"); - } - - if (ir_assign) { - progress = process_assignment(ctx, ir_assign, &assignments) || progress; - } else { - kill_for_derefs_visitor kill(&assignments); - ir->accept(&kill); - } - - if (ir == last) - break; - } - *out_progress = progress; - ralloc_free(ctx); -} - -/** - * Does a copy propagation pass on the code present in the instruction stream. - */ -bool -do_dead_code_local(exec_list *instructions) -{ - bool progress = false; - - call_for_basic_blocks(instructions, dead_code_local_basic_block, &progress); - - return progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_dead_functions.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_dead_functions.cpp deleted file mode 100644 index 5dff16521..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_dead_functions.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_dead_functions.cpp - * - * Eliminates unused functions from the linked program. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_expression_flattening.h" -#include "glsl_types.h" - -namespace { - -class signature_entry : public exec_node -{ -public: - signature_entry(ir_function_signature *sig) - { - this->signature = sig; - this->used = false; - } - - ir_function_signature *signature; - bool used; -}; - -class ir_dead_functions_visitor : public ir_hierarchical_visitor { -public: - ir_dead_functions_visitor() - { - this->mem_ctx = ralloc_context(NULL); - } - - ~ir_dead_functions_visitor() - { - ralloc_free(this->mem_ctx); - } - - virtual ir_visitor_status visit_enter(ir_function_signature *); - virtual ir_visitor_status visit_enter(ir_call *); - - signature_entry *get_signature_entry(ir_function_signature *var); - - /* List of signature_entry */ - exec_list signature_list; - void *mem_ctx; -}; - -} /* unnamed namespace */ - -signature_entry * -ir_dead_functions_visitor::get_signature_entry(ir_function_signature *sig) -{ - foreach_in_list(signature_entry, entry, &this->signature_list) { - if (entry->signature == sig) - return entry; - } - - signature_entry *entry = new(mem_ctx) signature_entry(sig); - this->signature_list.push_tail(entry); - return entry; -} - - -ir_visitor_status -ir_dead_functions_visitor::visit_enter(ir_function_signature *ir) -{ - signature_entry *entry = this->get_signature_entry(ir); - - if (strcmp(ir->function_name(), "main") == 0) { - entry->used = true; - } - - - - return visit_continue; -} - - -ir_visitor_status -ir_dead_functions_visitor::visit_enter(ir_call *ir) -{ - signature_entry *entry = this->get_signature_entry(ir->callee); - - entry->used = true; - - return visit_continue; -} - -bool -do_dead_functions(exec_list *instructions) -{ - ir_dead_functions_visitor v; - bool progress = false; - - visit_list_elements(&v, instructions); - - /* Now that we've figured out which function signatures are used, remove - * the unused ones, and remove function definitions that have no more - * signatures. - */ - foreach_in_list_safe(signature_entry, entry, &v.signature_list) { - if (!entry->used) { - entry->signature->remove(); - delete entry->signature; - progress = true; - } - delete(entry); - } - - /* We don't just do this above when we nuked a signature because of - * const pointers. - */ - foreach_in_list_safe(ir_instruction, ir, instructions) { - ir_function *func = ir->as_function(); - - if (func && func->signatures.is_empty()) { - /* At this point (post-linking), the symbol table is no - * longer in use, so not removing the function from the - * symbol table should be OK. - */ - func->remove(); - delete func; - progress = true; - } - } - - return progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_flatten_nested_if_blocks.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_flatten_nested_if_blocks.cpp deleted file mode 100644 index c70210204..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_flatten_nested_if_blocks.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright © 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_flatten_nested_if_blocks.cpp - * - * Flattens nested if blocks such as: - * - * if (x) { - * if (y) { - * ... - * } - * } - * - * into a single if block with a combined condition: - * - * if (x && y) { - * ... - * } - */ - -#include "ir.h" -#include "ir_builder.h" - -using namespace ir_builder; - -namespace { - -class nested_if_flattener : public ir_hierarchical_visitor { -public: - nested_if_flattener() - { - progress = false; - } - - ir_visitor_status visit_leave(ir_if *); - ir_visitor_status visit_enter(ir_assignment *); - - bool progress; -}; - -} /* unnamed namespace */ - -/* We only care about the top level "if" instructions, so don't - * descend into expressions. - */ -ir_visitor_status -nested_if_flattener::visit_enter(ir_assignment *ir) -{ - (void) ir; - return visit_continue_with_parent; -} - -bool -opt_flatten_nested_if_blocks(exec_list *instructions) -{ - nested_if_flattener v; - - v.run(instructions); - return v.progress; -} - - -ir_visitor_status -nested_if_flattener::visit_leave(ir_if *ir) -{ - /* Only handle a single ir_if within the then clause of an ir_if. No extra - * instructions, no else clauses, nothing. - */ - if (ir->then_instructions.is_empty() || !ir->else_instructions.is_empty()) - return visit_continue; - - ir_if *inner = ((ir_instruction *) ir->then_instructions.head)->as_if(); - if (!inner || !inner->next->is_tail_sentinel() || - !inner->else_instructions.is_empty()) - return visit_continue; - - ir->condition = logic_and(ir->condition, inner->condition); - inner->then_instructions.move_nodes_to(&ir->then_instructions); - - progress = true; - return visit_continue; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_flip_matrices.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_flip_matrices.cpp deleted file mode 100644 index 04c6170b8..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_flip_matrices.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright © 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_flip_matrices.cpp - * - * Convert (matrix * vector) operations to (vector * matrixTranspose), - * which can be done using dot products rather than multiplies and adds. - * On some hardware, this is more efficient. - * - * This currently only does the conversion for built-in matrices which - * already have transposed equivalents. Namely, gl_ModelViewProjectionMatrix - * and gl_TextureMatrix. - */ -#include "ir.h" -#include "ir_optimization.h" -#include "main/macros.h" - -namespace { -class matrix_flipper : public ir_hierarchical_visitor { -public: - matrix_flipper(exec_list *instructions) - { - progress = false; - mvp_transpose = NULL; - texmat_transpose = NULL; - - foreach_in_list(ir_instruction, ir, instructions) { - ir_variable *var = ir->as_variable(); - if (!var) - continue; - if (strcmp(var->name, "gl_ModelViewProjectionMatrixTranspose") == 0) - mvp_transpose = var; - if (strcmp(var->name, "gl_TextureMatrixTranspose") == 0) - texmat_transpose = var; - } - } - - ir_visitor_status visit_enter(ir_expression *ir); - - bool progress; - -private: - ir_variable *mvp_transpose; - ir_variable *texmat_transpose; -}; -} - -ir_visitor_status -matrix_flipper::visit_enter(ir_expression *ir) -{ - if (ir->operation != ir_binop_mul || - !ir->operands[0]->type->is_matrix() || - !ir->operands[1]->type->is_vector()) - return visit_continue; - - ir_variable *mat_var = ir->operands[0]->variable_referenced(); - if (!mat_var) - return visit_continue; - - if (mvp_transpose && - strcmp(mat_var->name, "gl_ModelViewProjectionMatrix") == 0) { -#ifndef NDEBUG - ir_dereference_variable *deref = ir->operands[0]->as_dereference_variable(); - assert(deref && deref->var == mat_var); -#endif - - void *mem_ctx = ralloc_parent(ir); - - ir->operands[0] = ir->operands[1]; - ir->operands[1] = new(mem_ctx) ir_dereference_variable(mvp_transpose); - - progress = true; - } else if (texmat_transpose && - strcmp(mat_var->name, "gl_TextureMatrix") == 0) { - ir_dereference_array *array_ref = ir->operands[0]->as_dereference_array(); - assert(array_ref != NULL); - ir_dereference_variable *var_ref = array_ref->array->as_dereference_variable(); - assert(var_ref && var_ref->var == mat_var); - - ir->operands[0] = ir->operands[1]; - ir->operands[1] = array_ref; - - var_ref->var = texmat_transpose; - - texmat_transpose->data.max_array_access = - MAX2(texmat_transpose->data.max_array_access, mat_var->data.max_array_access); - - progress = true; - } - - return visit_continue; -} - -bool -opt_flip_matrices(struct exec_list *instructions) -{ - matrix_flipper v(instructions); - - visit_list_elements(&v, instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_function_inlining.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_function_inlining.cpp deleted file mode 100644 index 90cca2b75..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_function_inlining.cpp +++ /dev/null @@ -1,380 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_function_inlining.cpp - * - * Replaces calls to functions with the body of the function. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_function_inlining.h" -#include "ir_expression_flattening.h" -#include "glsl_types.h" -#include "program/hash_table.h" - -static void -do_variable_replacement(exec_list *instructions, - ir_variable *orig, - ir_dereference *repl); - -namespace { - -class ir_function_inlining_visitor : public ir_hierarchical_visitor { -public: - ir_function_inlining_visitor() - { - progress = false; - current_function = NULL; - } - - virtual ~ir_function_inlining_visitor() - { - /* empty */ - } - - virtual ir_visitor_status visit_enter(ir_expression *); - virtual ir_visitor_status visit_enter(ir_call *); - virtual ir_visitor_status visit_enter(ir_return *); - virtual ir_visitor_status visit_enter(ir_texture *); - virtual ir_visitor_status visit_enter(ir_swizzle *); - - virtual ir_visitor_status visit_enter(ir_function_signature *sig) - { - this->current_function = sig; - return ir_hierarchical_visitor::visit_enter(sig); - } - virtual ir_visitor_status visit_leave(ir_function_signature *sig) - { - this->current_function = NULL; - return ir_hierarchical_visitor::visit_leave(sig); - } - - ir_function_signature* current_function; - bool progress; - -}; - -} /* unnamed namespace */ - -bool -do_function_inlining(exec_list *instructions) -{ - ir_function_inlining_visitor v; - - v.run(instructions); - - return v.progress; -} - -static void -replace_return_with_assignment(ir_instruction *ir, void *data) -{ - void *ctx = ralloc_parent(ir); - ir_dereference *orig_deref = (ir_dereference *) data; - ir_return *ret = ir->as_return(); - - if (ret) { - if (ret->value) { - ir_rvalue *lhs = orig_deref->clone(ctx, NULL); - ret->replace_with(new(ctx) ir_assignment(lhs, ret->value, NULL)); - } else { - /* un-valued return has to be the last return, or we shouldn't - * have reached here. (see can_inline()). - */ - assert(ret->next->is_tail_sentinel()); - ret->remove(); - } - } -} - -void -ir_call::generate_inline(ir_instruction *next_ir) -{ - void *ctx = ralloc_parent(this); - ir_variable **parameters; - unsigned num_parameters; - int i; - struct hash_table *ht; - - ht = hash_table_ctor(0, hash_table_pointer_hash, hash_table_pointer_compare); - - num_parameters = this->callee->parameters.length(); - parameters = new ir_variable *[num_parameters]; - - /* Generate the declarations for the parameters to our inlined code, - * and set up the mapping of real function body variables to ours. - */ - i = 0; - glsl_precision prec_params_max = glsl_precision_undefined; - foreach_two_lists(formal_node, &this->callee->parameters, - actual_node, &this->actual_parameters) { - ir_variable *sig_param = (ir_variable *) formal_node; - ir_rvalue *param = (ir_rvalue *) actual_node; - - /* Generate a new variable for the parameter. */ - if (sig_param->type->contains_opaque()) { - /* For opaque types, we want the inlined variable references - * referencing the passed in variable, since that will have - * the location information, which an assignment of an opaque - * variable wouldn't. Fix it up below. - */ - parameters[i] = NULL; - } else { - parameters[i] = sig_param->clone(ctx, ht); - parameters[i]->data.mode = ir_var_auto; - - parameters[i]->data.precision = (glsl_precision)parameters[i]->data.precision; - if (parameters[i]->data.precision == glsl_precision_undefined) - parameters[i]->data.precision = param->get_precision(); - prec_params_max = higher_precision (prec_params_max, (glsl_precision)parameters[i]->data.precision); - - /* Remove the read-only decoration because we're going to write - * directly to this variable. If the cloned variable is left - * read-only and the inlined function is inside a loop, the loop - * analysis code will get confused. - */ - parameters[i]->data.read_only = false; - next_ir->insert_before(parameters[i]); - } - - /* Move the actual param into our param variable if it's an 'in' type. */ - if (parameters[i] && (sig_param->data.mode == ir_var_function_in || - sig_param->data.mode == ir_var_const_in || - sig_param->data.mode == ir_var_function_inout)) { - ir_assignment *assign; - - assign = new(ctx) ir_assignment(new(ctx) ir_dereference_variable(parameters[i]), - param, NULL); - next_ir->insert_before(assign); - } - - ++i; - } - - exec_list new_instructions; - - /* Generate the inlined body of the function to a new list */ - foreach_in_list(ir_instruction, ir, &callee->body) { - ir_instruction *new_ir = ir->clone(ctx, ht); - - new_instructions.push_tail(new_ir); - visit_tree(new_ir, replace_return_with_assignment, this->return_deref); - } - - /* If any opaque types were passed in, replace any deref of the - * opaque variable with a deref of the argument. - */ - foreach_two_lists(formal_node, &this->callee->parameters, - actual_node, &this->actual_parameters) { - ir_rvalue *const param = (ir_rvalue *) actual_node; - ir_variable *sig_param = (ir_variable *) formal_node; - - if (sig_param->type->contains_opaque()) { - ir_dereference *deref = param->as_dereference(); - - assert(deref); - do_variable_replacement(&new_instructions, sig_param, deref); - } - } - - /* Now push those new instructions in. */ - next_ir->insert_before(&new_instructions); - - /* Copy back the value of any 'out' parameters from the function body - * variables to our own. - */ - i = 0; - foreach_two_lists(formal_node, &this->callee->parameters, - actual_node, &this->actual_parameters) { - ir_rvalue *const param = (ir_rvalue *) actual_node; - const ir_variable *const sig_param = (ir_variable *) formal_node; - - /* Move our param variable into the actual param if it's an 'out' type. */ - if (parameters[i] && (sig_param->data.mode == ir_var_function_out || - sig_param->data.mode == ir_var_function_inout)) { - ir_assignment *assign; - - assign = new(ctx) ir_assignment(param->clone(ctx, NULL)->as_rvalue(), - new(ctx) ir_dereference_variable(parameters[i]), - NULL); - next_ir->insert_before(assign); - } - - ++i; - } - - delete [] parameters; - - hash_table_dtor(ht); -} - - -ir_visitor_status -ir_function_inlining_visitor::visit_enter(ir_expression *ir) -{ - (void) ir; - return visit_continue_with_parent; -} - - -ir_visitor_status -ir_function_inlining_visitor::visit_enter(ir_return *ir) -{ - (void) ir; - return visit_continue_with_parent; -} - - -ir_visitor_status -ir_function_inlining_visitor::visit_enter(ir_texture *ir) -{ - (void) ir; - return visit_continue_with_parent; -} - - -ir_visitor_status -ir_function_inlining_visitor::visit_enter(ir_swizzle *ir) -{ - (void) ir; - return visit_continue_with_parent; -} - - -ir_visitor_status -ir_function_inlining_visitor::visit_enter(ir_call *ir) -{ - if (can_inline(ir)) { - ir->generate_inline(ir); - ir->remove(); - this->progress = true; - } - - return visit_continue; -} - - -/** - * Replaces references to the "orig" variable with a clone of "repl." - * - * From the spec, opaque types can appear in the tree as function - * (non-out) parameters and as the result of array indexing and - * structure field selection. In our builtin implementation, they - * also appear in the sampler field of an ir_tex instruction. - */ - -class ir_variable_replacement_visitor : public ir_hierarchical_visitor { -public: - ir_variable_replacement_visitor(ir_variable *orig, ir_dereference *repl) - { - this->orig = orig; - this->repl = repl; - } - - virtual ~ir_variable_replacement_visitor() - { - } - - virtual ir_visitor_status visit_leave(ir_call *); - virtual ir_visitor_status visit_leave(ir_dereference_array *); - virtual ir_visitor_status visit_leave(ir_dereference_record *); - virtual ir_visitor_status visit_leave(ir_texture *); - - void replace_deref(ir_dereference **deref); - void replace_rvalue(ir_rvalue **rvalue); - - ir_variable *orig; - ir_dereference *repl; -}; - -void -ir_variable_replacement_visitor::replace_deref(ir_dereference **deref) -{ - ir_dereference_variable *deref_var = (*deref)->as_dereference_variable(); - if (deref_var && deref_var->var == this->orig) { - *deref = this->repl->clone(ralloc_parent(*deref), NULL); - } -} - -void -ir_variable_replacement_visitor::replace_rvalue(ir_rvalue **rvalue) -{ - if (!*rvalue) - return; - - ir_dereference *deref = (*rvalue)->as_dereference(); - - if (!deref) - return; - - replace_deref(&deref); - *rvalue = deref; -} - -ir_visitor_status -ir_variable_replacement_visitor::visit_leave(ir_texture *ir) -{ - replace_deref(&ir->sampler); - - return visit_continue; -} - -ir_visitor_status -ir_variable_replacement_visitor::visit_leave(ir_dereference_array *ir) -{ - replace_rvalue(&ir->array); - return visit_continue; -} - -ir_visitor_status -ir_variable_replacement_visitor::visit_leave(ir_dereference_record *ir) -{ - replace_rvalue(&ir->record); - return visit_continue; -} - -ir_visitor_status -ir_variable_replacement_visitor::visit_leave(ir_call *ir) -{ - foreach_in_list_safe(ir_rvalue, param, &ir->actual_parameters) { - ir_rvalue *new_param = param; - replace_rvalue(&new_param); - - if (new_param != param) { - param->replace_with(new_param); - } - } - return visit_continue; -} - -static void -do_variable_replacement(exec_list *instructions, - ir_variable *orig, - ir_dereference *repl) -{ - ir_variable_replacement_visitor v(orig, repl); - - visit_list_elements(&v, instructions); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_if_simplification.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_if_simplification.cpp deleted file mode 100644 index e05f03190..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_if_simplification.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_if_simplification.cpp - * - * Moves constant branches of if statements out to the surrounding - * instruction stream, and inverts if conditionals to avoid empty - * "then" blocks. - */ - -#include "ir.h" - -namespace { - -class ir_if_simplification_visitor : public ir_hierarchical_visitor { -public: - ir_if_simplification_visitor() - { - this->made_progress = false; - } - - ir_visitor_status visit_leave(ir_if *); - ir_visitor_status visit_enter(ir_assignment *); - - bool made_progress; -}; - -} /* unnamed namespace */ - -/* We only care about the top level "if" instructions, so don't - * descend into expressions. - */ -ir_visitor_status -ir_if_simplification_visitor::visit_enter(ir_assignment *ir) -{ - (void) ir; - return visit_continue_with_parent; -} - -bool -do_if_simplification(exec_list *instructions) -{ - ir_if_simplification_visitor v; - - v.run(instructions); - return v.made_progress; -} - - -ir_visitor_status -ir_if_simplification_visitor::visit_leave(ir_if *ir) -{ - /* If the if statement has nothing on either side, remove it. */ - if (ir->then_instructions.is_empty() && - ir->else_instructions.is_empty()) { - ir->remove(); - this->made_progress = true; - return visit_continue; - } - - /* FINISHME: Ideally there would be a way to note that the condition results - * FINISHME: in a constant before processing both of the other subtrees. - * FINISHME: This can probably be done with some flags, but it would take - * FINISHME: some work to get right. - */ - ir_constant *condition_constant = ir->condition->constant_expression_value(); - if (condition_constant) { - /* Move the contents of the one branch of the conditional - * that matters out. - */ - if (condition_constant->value.b[0]) { - ir->insert_before(&ir->then_instructions); - } else { - ir->insert_before(&ir->else_instructions); - } - ir->remove(); - this->made_progress = true; - return visit_continue; - } - - /* Turn: - * - * if (cond) { - * } else { - * do_work(); - * } - * - * into : - * - * if (!cond) - * do_work(); - * - * which avoids control flow for "else" (which is usually more - * expensive than normal operations), and the "not" can usually be - * folded into the generation of "cond" anyway. - */ - if (ir->then_instructions.is_empty()) { - ir->condition = new(ralloc_parent(ir->condition)) - ir_expression(ir_unop_logic_not, ir->condition); - ir->else_instructions.move_nodes_to(&ir->then_instructions); - this->made_progress = true; - } - - return visit_continue; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_minmax.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_minmax.cpp deleted file mode 100644 index 32fb2d7ea..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_minmax.cpp +++ /dev/null @@ -1,475 +0,0 @@ -/* - * Copyright © 2014 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_minmax.cpp - * - * Drop operands from an expression tree of only min/max operations if they - * can be proven to not contribute to the final result. - * - * The algorithm is similar to alpha-beta pruning on a minmax search. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_rvalue_visitor.h" -#include "ir_optimization.h" -#include "ir_builder.h" -#include "program/prog_instruction.h" -#include "glsl_types.h" -#include "main/macros.h" - -using namespace ir_builder; - -namespace { - -enum compare_components_result { - LESS, - LESS_OR_EQUAL, - EQUAL, - GREATER_OR_EQUAL, - GREATER, - MIXED -}; - -class minmax_range { -public: - minmax_range(ir_constant *low = NULL, ir_constant *high = NULL) - { - this->low = low; - this->high = high; - } - - /* low is the lower limit of the range, high is the higher limit. NULL on - * low means negative infinity (unlimited) and on high positive infinity - * (unlimited). Because of the two interpretations of the value NULL, - * arbitrary comparison between ir_constants is impossible. - */ - ir_constant *low; - ir_constant *high; -}; - -class ir_minmax_visitor : public ir_rvalue_enter_visitor { -public: - ir_minmax_visitor() - : progress(false) - { - } - - ir_rvalue *prune_expression(ir_expression *expr, minmax_range baserange); - - void handle_rvalue(ir_rvalue **rvalue); - - bool progress; -}; - -/* - * Returns LESS if all vector components of `a' are strictly lower than of `b', - * GREATER if all vector components of `a' are strictly greater than of `b', - * MIXED if some vector components of `a' are strictly lower than of `b' while - * others are strictly greater, or EQUAL otherwise. - */ -static enum compare_components_result -compare_components(ir_constant *a, ir_constant *b) -{ - assert(a != NULL); - assert(b != NULL); - - assert(a->type->base_type == b->type->base_type); - - unsigned a_inc = a->type->is_scalar() ? 0 : 1; - unsigned b_inc = b->type->is_scalar() ? 0 : 1; - unsigned components = MAX2(a->type->components(), b->type->components()); - - bool foundless = false; - bool foundgreater = false; - bool foundequal = false; - - for (unsigned i = 0, c0 = 0, c1 = 0; - i < components; - c0 += a_inc, c1 += b_inc, ++i) { - switch (a->type->base_type) { - case GLSL_TYPE_UINT: - if (a->value.u[c0] < b->value.u[c1]) - foundless = true; - else if (a->value.u[c0] > b->value.u[c1]) - foundgreater = true; - else - foundequal = true; - break; - case GLSL_TYPE_INT: - if (a->value.i[c0] < b->value.i[c1]) - foundless = true; - else if (a->value.i[c0] > b->value.i[c1]) - foundgreater = true; - else - foundequal = true; - break; - case GLSL_TYPE_FLOAT: - if (a->value.f[c0] < b->value.f[c1]) - foundless = true; - else if (a->value.f[c0] > b->value.f[c1]) - foundgreater = true; - else - foundequal = true; - break; - default: - unreachable("not reached"); - } - } - - if (foundless && foundgreater) { - /* Some components are strictly lower, others are strictly greater */ - return MIXED; - } - - if (foundequal) { - /* It is not mixed, but it is not strictly lower or greater */ - if (foundless) - return LESS_OR_EQUAL; - if (foundgreater) - return GREATER_OR_EQUAL; - return EQUAL; - } - - /* All components are strictly lower or strictly greater */ - return foundless ? LESS : GREATER; -} - -static ir_constant * -combine_constant(bool ismin, ir_constant *a, ir_constant *b) -{ - void *mem_ctx = ralloc_parent(a); - ir_constant *c = a->clone(mem_ctx, NULL); - for (unsigned i = 0; i < c->type->components(); i++) { - switch (c->type->base_type) { - case GLSL_TYPE_UINT: - if ((ismin && b->value.u[i] < c->value.u[i]) || - (!ismin && b->value.u[i] > c->value.u[i])) - c->value.u[i] = b->value.u[i]; - break; - case GLSL_TYPE_INT: - if ((ismin && b->value.i[i] < c->value.i[i]) || - (!ismin && b->value.i[i] > c->value.i[i])) - c->value.i[i] = b->value.i[i]; - break; - case GLSL_TYPE_FLOAT: - if ((ismin && b->value.f[i] < c->value.f[i]) || - (!ismin && b->value.f[i] > c->value.f[i])) - c->value.f[i] = b->value.f[i]; - break; - default: - assert(!"not reached"); - } - } - return c; -} - -static ir_constant * -smaller_constant(ir_constant *a, ir_constant *b) -{ - assert(a != NULL); - assert(b != NULL); - - enum compare_components_result ret = compare_components(a, b); - if (ret == MIXED) - return combine_constant(true, a, b); - else if (ret < EQUAL) - return a; - else - return b; -} - -static ir_constant * -larger_constant(ir_constant *a, ir_constant *b) -{ - assert(a != NULL); - assert(b != NULL); - - enum compare_components_result ret = compare_components(a, b); - if (ret == MIXED) - return combine_constant(false, a, b); - else if (ret < EQUAL) - return b; - else - return a; -} - -/* Combines two ranges by doing an element-wise min() / max() depending on the - * operation. - */ -static minmax_range -combine_range(minmax_range r0, minmax_range r1, bool ismin) -{ - minmax_range ret; - - if (!r0.low) { - ret.low = ismin ? r0.low : r1.low; - } else if (!r1.low) { - ret.low = ismin ? r1.low : r0.low; - } else { - ret.low = ismin ? smaller_constant(r0.low, r1.low) : - larger_constant(r0.low, r1.low); - } - - if (!r0.high) { - ret.high = ismin ? r1.high : r0.high; - } else if (!r1.high) { - ret.high = ismin ? r0.high : r1.high; - } else { - ret.high = ismin ? smaller_constant(r0.high, r1.high) : - larger_constant(r0.high, r1.high); - } - - return ret; -} - -/* Returns a range so that lower limit is the larger of the two lower limits, - * and higher limit is the smaller of the two higher limits. - */ -static minmax_range -range_intersection(minmax_range r0, minmax_range r1) -{ - minmax_range ret; - - if (!r0.low) - ret.low = r1.low; - else if (!r1.low) - ret.low = r0.low; - else - ret.low = larger_constant(r0.low, r1.low); - - if (!r0.high) - ret.high = r1.high; - else if (!r1.high) - ret.high = r0.high; - else - ret.high = smaller_constant(r0.high, r1.high); - - return ret; -} - -static minmax_range -get_range(ir_rvalue *rval) -{ - ir_expression *expr = rval->as_expression(); - if (expr && (expr->operation == ir_binop_min || - expr->operation == ir_binop_max)) { - minmax_range r0 = get_range(expr->operands[0]); - minmax_range r1 = get_range(expr->operands[1]); - return combine_range(r0, r1, expr->operation == ir_binop_min); - } - - ir_constant *c = rval->as_constant(); - if (c) { - return minmax_range(c, c); - } - - return minmax_range(); -} - -/** - * Prunes a min/max expression considering the base range of the parent - * min/max expression. - * - * @param baserange the range that the parents of this min/max expression - * in the min/max tree will clamp its value to. - */ -ir_rvalue * -ir_minmax_visitor::prune_expression(ir_expression *expr, minmax_range baserange) -{ - assert(expr->operation == ir_binop_min || - expr->operation == ir_binop_max); - - bool ismin = expr->operation == ir_binop_min; - minmax_range limits[2]; - - /* Recurse to get the ranges for each of the subtrees of this - * expression. We need to do this as a separate step because we need to - * know the ranges of each of the subtrees before we prune either one. - * Consider something like this: - * - * max - * / \ - * max max - * / \ / \ - * 3 a b 2 - * - * We would like to prune away the max on the bottom-right, but to do so - * we need to know the range of the expression on the left beforehand, - * and there's no guarantee that we will visit either subtree in a - * particular order. - */ - for (unsigned i = 0; i < 2; ++i) - limits[i] = get_range(expr->operands[i]); - - for (unsigned i = 0; i < 2; ++i) { - bool is_redundant = false; - - enum compare_components_result cr = LESS; - if (ismin) { - /* If this operand will always be greater than the other one, it's - * redundant. - */ - if (limits[i].low && limits[1 - i].high) { - cr = compare_components(limits[i].low, limits[1 - i].high); - if (cr >= EQUAL && cr != MIXED) - is_redundant = true; - } - /* If this operand is always greater than baserange, then even if - * it's smaller than the other one it'll get clamped, so it's - * redundant. - */ - if (!is_redundant && limits[i].low && baserange.high) { - cr = compare_components(limits[i].low, baserange.high); - if (cr >= EQUAL && cr != MIXED) - is_redundant = true; - } - } else { - /* If this operand will always be lower than the other one, it's - * redundant. - */ - if (limits[i].high && limits[1 - i].low) { - cr = compare_components(limits[i].high, limits[1 - i].low); - if (cr <= EQUAL) - is_redundant = true; - } - /* If this operand is always lower than baserange, then even if - * it's greater than the other one it'll get clamped, so it's - * redundant. - */ - if (!is_redundant && limits[i].high && baserange.low) { - cr = compare_components(limits[i].high, baserange.low); - if (cr <= EQUAL) - is_redundant = true; - } - } - - if (is_redundant) { - progress = true; - - /* Recurse if necessary. */ - ir_expression *op_expr = expr->operands[1 - i]->as_expression(); - if (op_expr && (op_expr->operation == ir_binop_min || - op_expr->operation == ir_binop_max)) { - return prune_expression(op_expr, baserange); - } - - return expr->operands[1 - i]; - } else if (cr == MIXED) { - /* If we have mixed vector operands, we can try to resolve the minmax - * expression by doing a component-wise minmax: - * - * min min - * / \ / \ - * min a ===> [1,1] a - * / \ - * [1,3] [3,1] - * - */ - ir_constant *a = expr->operands[0]->as_constant(); - ir_constant *b = expr->operands[1]->as_constant(); - if (a && b) - return combine_constant(ismin, a, b); - } - } - - /* Now recurse to operands giving them the proper baserange. The baserange - * to pass is the intersection of our baserange and the other operand's - * limit with one of the ranges unlimited. If we can't compute a valid - * intersection, we use the current baserange. - */ - for (unsigned i = 0; i < 2; ++i) { - ir_expression *op_expr = expr->operands[i]->as_expression(); - if (op_expr && (op_expr->operation == ir_binop_min || - op_expr->operation == ir_binop_max)) { - /* We can only compute a new baserange for this operand if we managed - * to compute a valid range for the other operand. - */ - if (ismin) - limits[1 - i].low = NULL; - else - limits[1 - i].high = NULL; - minmax_range base = range_intersection(limits[1 - i], baserange); - expr->operands[i] = prune_expression(op_expr, base); - } - } - - /* If we got here we could not discard any of the operands of the minmax - * expression, but we can still try to resolve the expression if both - * operands are constant. We do this after the loop above, to make sure - * that if our operands are minmax expressions we have tried to prune them - * first (hopefully reducing them to constants). - */ - ir_constant *a = expr->operands[0]->as_constant(); - ir_constant *b = expr->operands[1]->as_constant(); - if (a && b) - return combine_constant(ismin, a, b); - - return expr; -} - -static ir_rvalue * -swizzle_if_required(ir_expression *expr, ir_rvalue *rval) -{ - if (expr->type->is_vector() && rval->type->is_scalar()) { - return swizzle(rval, SWIZZLE_XXXX, expr->type->vector_elements); - } else { - return rval; - } -} - -void -ir_minmax_visitor::handle_rvalue(ir_rvalue **rvalue) -{ - if (!*rvalue) - return; - - ir_expression *expr = (*rvalue)->as_expression(); - if (!expr || (expr->operation != ir_binop_min && - expr->operation != ir_binop_max)) - return; - - ir_rvalue *new_rvalue = prune_expression(expr, minmax_range()); - if (new_rvalue == *rvalue) - return; - - /* If the expression type is a vector and the optimization leaves a scalar - * as the result, we need to turn it into a vector. - */ - *rvalue = swizzle_if_required(expr, new_rvalue); - - progress = true; -} - -} - -bool -do_minmax_prune(exec_list *instructions) -{ - ir_minmax_visitor v; - - visit_list_elements(&v, instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_noop_swizzle.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_noop_swizzle.cpp deleted file mode 100644 index 586ad5e61..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_noop_swizzle.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_noop_swizzle.cpp - * - * If a swizzle doesn't change the order or count of components, then - * remove the swizzle so that other optimization passes see the value - * behind it. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_rvalue_visitor.h" -#include "glsl_types.h" - -namespace { - -class ir_noop_swizzle_visitor : public ir_rvalue_visitor { -public: - ir_noop_swizzle_visitor() - { - this->progress = false; - } - - void handle_rvalue(ir_rvalue **rvalue); - bool progress; -}; - -} /* unnamed namespace */ - -void -ir_noop_swizzle_visitor::handle_rvalue(ir_rvalue **rvalue) -{ - if (!*rvalue) - return; - - ir_swizzle *swiz = (*rvalue)->as_swizzle(); - if (!swiz || swiz->type != swiz->val->type) - return; - - int elems = swiz->val->type->vector_elements; - if (swiz->mask.x != 0) - return; - if (elems >= 2 && swiz->mask.y != 1) - return; - if (elems >= 3 && swiz->mask.z != 2) - return; - if (elems >= 4 && swiz->mask.w != 3) - return; - - this->progress = true; - *rvalue = swiz->val; -} - -bool -do_noop_swizzle(exec_list *instructions) -{ - ir_noop_swizzle_visitor v; - visit_list_elements(&v, instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_rebalance_tree.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_rebalance_tree.cpp deleted file mode 100644 index 095f2d7d2..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_rebalance_tree.cpp +++ /dev/null @@ -1,321 +0,0 @@ -/* - * Copyright © 2014 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_rebalance_tree.cpp - * - * Rebalances a reduction expression tree. - * - * For reduction operations (e.g., x + y + z + w) we generate an expression - * tree like - * - * + - * / \ - * + w - * / \ - * + z - * / \ - * x y - * - * which we can rebalance into - * - * + - * / \ - * / \ - * + + - * / \ / \ - * x y z w - * - * to get a better instruction scheduling. - * - * See "Tree Rebalancing in Optimal Editor Time and Space" by Quentin F. Stout - * and Bette L. Warren. - * - * Also see http://penguin.ewu.edu/~trolfe/DSWpaper/ for a very readable - * explanation of the of the tree_to_vine() (rightward rotation) and - * vine_to_tree() (leftward rotation) algorithms. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_rvalue_visitor.h" -#include "ir_optimization.h" -#include "main/macros.h" /* for MAX2 */ - -/* The DSW algorithm generates a degenerate tree (really, a linked list) in - * tree_to_vine(). We'd rather not leave a binary expression with only one - * operand, so trivial modifications (the ternary operators below) are needed - * to ensure that we only rotate around the ir_expression nodes of the tree. - */ -static unsigned -tree_to_vine(ir_expression *root) -{ - unsigned size = 0; - ir_rvalue *vine_tail = root; - ir_rvalue *remainder = root->operands[1]; - - while (remainder != NULL) { - ir_expression *remainder_temp = remainder->as_expression(); - ir_expression *remainder_left = remainder_temp ? - remainder_temp->operands[0]->as_expression() : NULL; - - if (remainder_left == NULL) { - /* move vine_tail down one */ - vine_tail = remainder; - remainder = remainder->as_expression() ? - ((ir_expression *)remainder)->operands[1] : NULL; - size++; - } else { - /* rotate */ - ir_expression *tempptr = remainder_left; - ((ir_expression *)remainder)->operands[0] = tempptr->operands[1]; - tempptr->operands[1] = remainder; - remainder = tempptr; - ((ir_expression *)vine_tail)->operands[1] = tempptr; - } - } - - return size; -} - -static void -compression(ir_expression *root, unsigned count) -{ - ir_expression *scanner = root; - - for (unsigned i = 0; i < count; i++) { - ir_expression *child = (ir_expression *)scanner->operands[1]; - scanner->operands[1] = child->operands[1]; - scanner = (ir_expression *)scanner->operands[1]; - child->operands[1] = scanner->operands[0]; - scanner->operands[0] = child; - } -} - -static void -vine_to_tree(ir_expression *root, unsigned size) -{ - int n = size - 1; - for (int m = n / 2; m > 0; m = n / 2) { - compression(root, m); - n -= m + 1; - } -} - -namespace { - -class ir_rebalance_visitor : public ir_rvalue_enter_visitor { -public: - ir_rebalance_visitor() - { - progress = false; - } - - void handle_rvalue(ir_rvalue **rvalue); - - bool progress; -}; - -struct is_reduction_data { - ir_expression_operation operation; - const glsl_type *type; - unsigned num_expr; - bool is_reduction; - bool contains_constant; -}; - -} /* anonymous namespace */ - -static bool -is_reduction_operation(ir_expression_operation operation) -{ - switch (operation) { - case ir_binop_add: - case ir_binop_mul: - case ir_binop_bit_and: - case ir_binop_bit_xor: - case ir_binop_bit_or: - case ir_binop_logic_and: - case ir_binop_logic_xor: - case ir_binop_logic_or: - case ir_binop_min: - case ir_binop_max: - return true; - default: - return false; - } -} - -/* Note that this function does not attempt to recognize that reduction trees - * are already balanced. - * - * We return false from this function for a number of reasons other than an - * expression tree not being a mathematical reduction. Namely, - * - * - if the tree contains multiple constants that we may be able to combine. - * - if the tree contains matrices: - * - they might contain vec4's with many constant components that we can - * simplify after splitting. - * - applying the matrix chain ordering optimization is more than just - * balancing an expression tree. - * - if the tree contains operations on multiple types. - * - if the tree contains ir_dereference_{array,record}, since foo[a+b] + c - * would trick the visiting pass. - */ -static void -is_reduction(ir_instruction *ir, void *data) -{ - struct is_reduction_data *ird = (struct is_reduction_data *)data; - if (!ird->is_reduction) - return; - - /* We don't want to balance a tree that contains multiple constants, since - * we'll be able to constant fold them if they're not in separate subtrees. - */ - if (ir->as_constant()) { - if (ird->contains_constant) { - ird->is_reduction = false; - } - ird->contains_constant = true; - return; - } - - /* Array/record dereferences have subtrees that are not part of the expr - * tree we're balancing. Skip trees containing them. - */ - if (ir->ir_type == ir_type_dereference_array || - ir->ir_type == ir_type_dereference_record) { - ird->is_reduction = false; - return; - } - - ir_expression *expr = ir->as_expression(); - if (!expr) - return; - - /* Non-constant matrices might still contain constant vec4 that we can - * constant fold once split up. Handling matrices will need some more - * work. - */ - if (expr->type->is_matrix() || - expr->operands[0]->type->is_matrix() || - (expr->operands[1] && expr->operands[1]->type->is_matrix())) { - ird->is_reduction = false; - return; - } - - if (ird->type != NULL && ird->type != expr->type) { - ird->is_reduction = false; - return; - } - ird->type = expr->type; - - ird->num_expr++; - if (is_reduction_operation(expr->operation)) { - if (ird->operation != 0 && ird->operation != expr->operation) - ird->is_reduction = false; - ird->operation = expr->operation; - } else { - ird->is_reduction = false; - } -} - -static ir_rvalue * -handle_expression(ir_expression *expr) -{ - struct is_reduction_data ird; - ird.operation = (ir_expression_operation)0; - ird.type = NULL; - ird.num_expr = 0; - ird.is_reduction = true; - ird.contains_constant = false; - - visit_tree(expr, is_reduction, (void *)&ird); - - if (ird.is_reduction && ird.num_expr > 2) { - ir_constant z = ir_constant(0.0f); - ir_expression pseudo_root = ir_expression(ir_binop_add, &z, expr); - - unsigned size = tree_to_vine(&pseudo_root); - vine_to_tree(&pseudo_root, size); - - expr = (ir_expression *)pseudo_root.operands[1]; - } - return expr; -} - -static void -update_types(ir_instruction *ir, void *) -{ - ir_expression *expr = ir->as_expression(); - if (!expr) - return; - - const glsl_type *const new_type = - glsl_type::get_instance(expr->type->base_type, - MAX2(expr->operands[0]->type->vector_elements, - expr->operands[1]->type->vector_elements), - 1); - assert(new_type != glsl_type::error_type); - expr->type = new_type; -} - -void -ir_rebalance_visitor::handle_rvalue(ir_rvalue **rvalue) -{ - if (!*rvalue) - return; - - ir_expression *expr = (*rvalue)->as_expression(); - if (!expr || !is_reduction_operation(expr->operation)) - return; - - ir_rvalue *new_rvalue = handle_expression(expr); - - /* If we failed to rebalance the tree (e.g., because it wasn't a reduction, - * or some other set of cases) new_rvalue will point to the same root as - * before. - * - * Similarly, if the tree rooted at *rvalue was a reduction and was already - * balanced, the algorithm will rearrange the tree but will ultimately - * return an identical tree, so this check will handle that as well and - * will not set progress = true. - */ - if (new_rvalue == *rvalue) - return; - - visit_tree(new_rvalue, NULL, NULL, update_types); - - *rvalue = new_rvalue; - this->progress = true; -} - -bool -do_rebalance_tree(exec_list *instructions) -{ - ir_rebalance_visitor v; - - v.run(instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_redundant_jumps.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_redundant_jumps.cpp deleted file mode 100644 index ee384d0f2..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_redundant_jumps.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_redundant_jumps.cpp - * Remove certain types of redundant jumps - */ - -#include "ir.h" - -namespace { - -class redundant_jumps_visitor : public ir_hierarchical_visitor { -public: - redundant_jumps_visitor() - { - this->progress = false; - } - - virtual ir_visitor_status visit_leave(ir_if *); - virtual ir_visitor_status visit_leave(ir_loop *); - virtual ir_visitor_status visit_enter(ir_assignment *); - - bool progress; -}; - -} /* unnamed namespace */ - -/* We only care about the top level instructions, so don't descend - * into expressions. - */ -ir_visitor_status -redundant_jumps_visitor::visit_enter(ir_assignment *) -{ - return visit_continue_with_parent; -} - -ir_visitor_status -redundant_jumps_visitor::visit_leave(ir_if *ir) -{ - /* If the last instruction in both branches is a 'break' or a 'continue', - * pull it out of the branches and insert it after the if-statment. Note - * that both must be the same type (either 'break' or 'continue'). - */ - ir_instruction *const last_then = - (ir_instruction *) ir->then_instructions.get_tail(); - ir_instruction *const last_else = - (ir_instruction *) ir->else_instructions.get_tail(); - - if ((last_then == NULL) || (last_else == NULL)) - return visit_continue; - - if ((last_then->ir_type != ir_type_loop_jump) - || (last_else->ir_type != ir_type_loop_jump)) - return visit_continue; - - ir_loop_jump *const then_jump = (ir_loop_jump *) last_then; - ir_loop_jump *const else_jump = (ir_loop_jump *) last_else; - - if (then_jump->mode != else_jump->mode) - return visit_continue; - - then_jump->remove(); - else_jump->remove(); - this->progress = true; - - ir->insert_after(then_jump); - - /* If both branchs of the if-statement are now empty, remove the - * if-statement. - */ - if (ir->then_instructions.is_empty() && ir->else_instructions.is_empty()) - ir->remove(); - - return visit_continue; -} - - -ir_visitor_status -redundant_jumps_visitor::visit_leave(ir_loop *ir) -{ - /* If the last instruction of a loop body is a 'continue', remove it. - */ - ir_instruction *const last = - (ir_instruction *) ir->body_instructions.get_tail(); - - if (last && (last->ir_type == ir_type_loop_jump) - && (((ir_loop_jump *) last)->mode == ir_loop_jump::jump_continue)) { - last->remove(); - this->progress = true; - } - - return visit_continue; -} - - -bool -optimize_redundant_jumps(exec_list *instructions) -{ - redundant_jumps_visitor v; - - v.run(instructions); - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_structure_splitting.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_structure_splitting.cpp deleted file mode 100644 index 4d240a661..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_structure_splitting.cpp +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_structure_splitting.cpp - * - * If a structure is only ever referenced by its components, then - * split those components out to individual variables so they can be - * handled normally by other optimization passes. - * - * This skips structures like uniforms, which need to be accessible as - * structures for their access by the GL. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_rvalue_visitor.h" -#include "glsl_types.h" - -namespace { - -static bool debug = false; - -class variable_entry : public exec_node -{ -public: - variable_entry(ir_variable *var) - { - this->var = var; - this->whole_structure_access = 0; - this->declaration = false; - this->components = NULL; - this->mem_ctx = NULL; - } - - ir_variable *var; /* The key: the variable's pointer. */ - - /** Number of times the variable is referenced, including assignments. */ - unsigned whole_structure_access; - - /* If the variable had a decl we can work with in the instruction - * stream. We can't do splitting on function arguments, which - * don't get this variable set. - */ - bool declaration; - - ir_variable **components; - - /** ralloc_parent(this->var) -- the shader's ralloc context. */ - void *mem_ctx; -}; - - -class ir_structure_reference_visitor : public ir_hierarchical_visitor { -public: - ir_structure_reference_visitor(void) - { - this->mem_ctx = ralloc_context(NULL); - this->variable_list.make_empty(); - } - - ~ir_structure_reference_visitor(void) - { - ralloc_free(mem_ctx); - } - - virtual ir_visitor_status visit(ir_variable *); - virtual ir_visitor_status visit(ir_dereference_variable *); - virtual ir_visitor_status visit_enter(ir_dereference_record *); - virtual ir_visitor_status visit_enter(ir_assignment *); - virtual ir_visitor_status visit_enter(ir_function_signature *); - - variable_entry *get_variable_entry(ir_variable *var); - - /* List of split_var_entry */ - exec_list variable_list; - - void *mem_ctx; -}; - -variable_entry * -ir_structure_reference_visitor::get_variable_entry(ir_variable *var) -{ - assert(var); - - if (!var->type->is_record() || var->data.mode == ir_var_uniform - || var->data.mode == ir_var_shader_in || var->data.mode == ir_var_shader_out) - return NULL; - - foreach_in_list(variable_entry, entry, &this->variable_list) { - if (entry->var == var) - return entry; - } - - variable_entry *entry = new(mem_ctx) variable_entry(var); - this->variable_list.push_tail(entry); - return entry; -} - - -ir_visitor_status -ir_structure_reference_visitor::visit(ir_variable *ir) -{ - variable_entry *entry = this->get_variable_entry(ir); - - if (entry) - entry->declaration = true; - - return visit_continue; -} - -ir_visitor_status -ir_structure_reference_visitor::visit(ir_dereference_variable *ir) -{ - ir_variable *const var = ir->variable_referenced(); - variable_entry *entry = this->get_variable_entry(var); - - if (entry) - entry->whole_structure_access++; - - return visit_continue; -} - -ir_visitor_status -ir_structure_reference_visitor::visit_enter(ir_dereference_record *ir) -{ - (void) ir; - /* Don't descend into the ir_dereference_variable below. */ - return visit_continue_with_parent; -} - -ir_visitor_status -ir_structure_reference_visitor::visit_enter(ir_assignment *ir) -{ - /* If there are no structure references yet, no need to bother with - * processing the expression tree. - */ - if (this->variable_list.is_empty()) - return visit_continue_with_parent; - - if (ir->lhs->as_dereference_variable() && - ir->rhs->as_dereference_variable() && - !ir->condition) { - /* We'll split copies of a structure to copies of components, so don't - * descend to the ir_dereference_variables. - */ - return visit_continue_with_parent; - } - return visit_continue; -} - -ir_visitor_status -ir_structure_reference_visitor::visit_enter(ir_function_signature *ir) -{ - /* We don't have logic for structure-splitting function arguments, - * so just look at the body instructions and not the parameter - * declarations. - */ - visit_list_elements(this, &ir->body); - return visit_continue_with_parent; -} - -class ir_structure_splitting_visitor : public ir_rvalue_visitor { -public: - ir_structure_splitting_visitor(exec_list *vars) - { - this->variable_list = vars; - } - - virtual ~ir_structure_splitting_visitor() - { - } - - virtual ir_visitor_status visit_leave(ir_assignment *); - - void split_deref(ir_dereference **deref); - void handle_rvalue(ir_rvalue **rvalue); - variable_entry *get_splitting_entry(ir_variable *var); - - exec_list *variable_list; -}; - -variable_entry * -ir_structure_splitting_visitor::get_splitting_entry(ir_variable *var) -{ - assert(var); - - if (!var->type->is_record()) - return NULL; - - foreach_in_list(variable_entry, entry, this->variable_list) { - if (entry->var == var) { - return entry; - } - } - - return NULL; -} - -void -ir_structure_splitting_visitor::split_deref(ir_dereference **deref) -{ - if ((*deref)->ir_type != ir_type_dereference_record) - return; - - ir_dereference_record *deref_record = (ir_dereference_record *)*deref; - ir_dereference_variable *deref_var = deref_record->record->as_dereference_variable(); - if (!deref_var) - return; - - variable_entry *entry = get_splitting_entry(deref_var->var); - if (!entry) - return; - - unsigned int i; - for (i = 0; i < entry->var->type->length; i++) { - if (strcmp(deref_record->field, - entry->var->type->fields.structure[i].name) == 0) - break; - } - assert(i != entry->var->type->length); - - *deref = new(entry->mem_ctx) ir_dereference_variable(entry->components[i]); -} - -void -ir_structure_splitting_visitor::handle_rvalue(ir_rvalue **rvalue) -{ - if (!*rvalue) - return; - - ir_dereference *deref = (*rvalue)->as_dereference(); - - if (!deref) - return; - - split_deref(&deref); - *rvalue = deref; -} - -ir_visitor_status -ir_structure_splitting_visitor::visit_leave(ir_assignment *ir) -{ - ir_dereference_variable *lhs_deref = ir->lhs->as_dereference_variable(); - ir_dereference_variable *rhs_deref = ir->rhs->as_dereference_variable(); - variable_entry *lhs_entry = lhs_deref ? get_splitting_entry(lhs_deref->var) : NULL; - variable_entry *rhs_entry = rhs_deref ? get_splitting_entry(rhs_deref->var) : NULL; - const glsl_type *type = ir->rhs->type; - - if ((lhs_entry || rhs_entry) && !ir->condition) { - for (unsigned int i = 0; i < type->length; i++) { - ir_dereference *new_lhs, *new_rhs; - void *mem_ctx = lhs_entry ? lhs_entry->mem_ctx : rhs_entry->mem_ctx; - - if (lhs_entry) { - new_lhs = new(mem_ctx) ir_dereference_variable(lhs_entry->components[i]); - } else { - new_lhs = new(mem_ctx) - ir_dereference_record(ir->lhs->clone(mem_ctx, NULL), - type->fields.structure[i].name); - } - - if (rhs_entry) { - new_rhs = new(mem_ctx) ir_dereference_variable(rhs_entry->components[i]); - } else { - new_rhs = new(mem_ctx) - ir_dereference_record(ir->rhs->clone(mem_ctx, NULL), - type->fields.structure[i].name); - } - - ir->insert_before(new(mem_ctx) ir_assignment(new_lhs, - new_rhs, - NULL)); - } - ir->remove(); - } else { - handle_rvalue(&ir->rhs); - split_deref(&ir->lhs); - } - - handle_rvalue(&ir->condition); - - return visit_continue; -} - -} /* unnamed namespace */ - -bool -do_structure_splitting(exec_list *instructions) -{ - ir_structure_reference_visitor refs; - - visit_list_elements(&refs, instructions); - - /* Trim out variables we can't split. */ - foreach_in_list_safe(variable_entry, entry, &refs.variable_list) { - if (debug) { - printf("structure %s@%p: decl %d, whole_access %d\n", - entry->var->name, (void *) entry->var, entry->declaration, - entry->whole_structure_access); - } - - if (!entry->declaration || entry->whole_structure_access) { - entry->remove(); - } - } - - if (refs.variable_list.is_empty()) - return false; - - void *mem_ctx = ralloc_context(NULL); - - /* Replace the decls of the structures to be split with their split - * components. - */ - foreach_in_list_safe(variable_entry, entry, &refs.variable_list) { - const struct glsl_type *type = entry->var->type; - - entry->mem_ctx = ralloc_parent(entry->var); - - entry->components = ralloc_array(mem_ctx, - ir_variable *, - type->length); - - for (unsigned int i = 0; i < entry->var->type->length; i++) { - const char *name = ralloc_asprintf(mem_ctx, "%s_%s", - entry->var->name, - type->fields.structure[i].name); - - entry->components[i] = - new(entry->mem_ctx) ir_variable(type->fields.structure[i].type, - name, - ir_var_temporary, type->fields.structure[i].precision); - entry->var->insert_before(entry->components[i]); - } - - entry->var->remove(); - } - - ir_structure_splitting_visitor split(&refs.variable_list); - visit_list_elements(&split, instructions); - - ralloc_free(mem_ctx); - - return true; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_swizzle_swizzle.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_swizzle_swizzle.cpp deleted file mode 100644 index 7564c6b3b..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_swizzle_swizzle.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_swizzle_swizzle.cpp - * - * Eliminates the second swizzle in a swizzle chain. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_optimization.h" -#include "glsl_types.h" - -namespace { - -class ir_swizzle_swizzle_visitor : public ir_hierarchical_visitor { -public: - ir_swizzle_swizzle_visitor() - { - progress = false; - } - - virtual ir_visitor_status visit_enter(ir_swizzle *); - - bool progress; -}; - -} /* unnamed namespace */ - -ir_visitor_status -ir_swizzle_swizzle_visitor::visit_enter(ir_swizzle *ir) -{ - int mask2[4]; - - ir_swizzle *swiz2 = ir->val->as_swizzle(); - if (!swiz2) - return visit_continue; - - memset(&mask2, 0, sizeof(mask2)); - if (swiz2->mask.num_components >= 1) - mask2[0] = swiz2->mask.x; - if (swiz2->mask.num_components >= 2) - mask2[1] = swiz2->mask.y; - if (swiz2->mask.num_components >= 3) - mask2[2] = swiz2->mask.z; - if (swiz2->mask.num_components >= 4) - mask2[3] = swiz2->mask.w; - - if (ir->mask.num_components >= 1) - ir->mask.x = mask2[ir->mask.x]; - if (ir->mask.num_components >= 2) - ir->mask.y = mask2[ir->mask.y]; - if (ir->mask.num_components >= 3) - ir->mask.z = mask2[ir->mask.z]; - if (ir->mask.num_components >= 4) - ir->mask.w = mask2[ir->mask.w]; - - ir->val = swiz2->val; - - this->progress = true; - - return visit_continue; -} - -/** - * Does a copy propagation pass on the code present in the instruction stream. - */ -bool -do_swizzle_swizzle(exec_list *instructions) -{ - ir_swizzle_swizzle_visitor v; - - v.run(instructions); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_tree_grafting.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_tree_grafting.cpp deleted file mode 100644 index ddaab7609..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_tree_grafting.cpp +++ /dev/null @@ -1,421 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_tree_grafting.cpp - * - * Takes assignments to variables that are dereferenced only once and - * pastes the RHS expression into where the variable is dereferenced. - * - * In the process of various operations like function inlining and - * tertiary op handling, we'll end up with our expression trees having - * been chopped up into a series of assignments of short expressions - * to temps. Other passes like ir_algebraic.cpp would prefer to see - * the deepest expression trees they can to try to optimize them. - * - * This is a lot like copy propagaton. In comparison, copy - * propagation only acts on plain copies, not arbitrary expressions on - * the RHS. Generally, we wouldn't want to go pasting some - * complicated expression everywhere it got used, though, so we don't - * handle expressions in that pass. - * - * The hard part is making sure we don't move an expression across - * some other assignments that would change the value of the - * expression. So we split this into two passes: First, find the - * variables in our scope which are written to once and read once, and - * then go through basic blocks seeing if we find an opportunity to - * move those expressions safely. - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_variable_refcount.h" -#include "ir_basic_block.h" -#include "ir_optimization.h" -#include "glsl_types.h" - -namespace { - -static bool debug = false; - -class ir_tree_grafting_visitor : public ir_hierarchical_visitor { -public: - ir_tree_grafting_visitor(ir_assignment *graft_assign, - ir_variable *graft_var) - { - this->progress = false; - this->graft_assign = graft_assign; - this->graft_var = graft_var; - } - - virtual ir_visitor_status visit_leave(class ir_assignment *); - virtual ir_visitor_status visit_enter(class ir_assignment *); - virtual ir_visitor_status visit_enter(class ir_call *); - virtual ir_visitor_status visit_enter(class ir_expression *); - virtual ir_visitor_status visit_enter(class ir_function *); - virtual ir_visitor_status visit_enter(class ir_function_signature *); - virtual ir_visitor_status visit_enter(class ir_if *); - virtual ir_visitor_status visit_enter(class ir_loop *); - virtual ir_visitor_status visit_enter(class ir_swizzle *); - virtual ir_visitor_status visit_enter(class ir_texture *); - - ir_visitor_status check_graft(ir_instruction *ir, ir_variable *var); - - bool do_graft(ir_rvalue **rvalue); - - bool progress; - ir_variable *graft_var; - ir_assignment *graft_assign; -}; - -struct find_deref_info { - ir_variable *var; - bool found; -}; - -void -dereferences_variable_callback(ir_instruction *ir, void *data) -{ - struct find_deref_info *info = (struct find_deref_info *)data; - ir_dereference_variable *deref = ir->as_dereference_variable(); - - if (deref && deref->var == info->var) - info->found = true; -} - -static bool -dereferences_variable(ir_instruction *ir, ir_variable *var) -{ - struct find_deref_info info; - - info.var = var; - info.found = false; - - visit_tree(ir, dereferences_variable_callback, &info); - - return info.found; -} - -bool -ir_tree_grafting_visitor::do_graft(ir_rvalue **rvalue) -{ - if (!*rvalue) - return false; - - ir_dereference_variable *deref = (*rvalue)->as_dereference_variable(); - - if (!deref || deref->var != this->graft_var) - return false; - - glsl_precision rvl_prec = deref->get_precision(); - glsl_precision rhs_prec = this->graft_assign->rhs->get_precision(); - if (rvl_prec != rhs_prec && rvl_prec != glsl_precision_undefined && rhs_prec != glsl_precision_undefined) - return false; - - if (debug) { - fprintf(stderr, "GRAFTING:\n"); - this->graft_assign->fprint(stderr); - fprintf(stderr, "\n"); - fprintf(stderr, "TO:\n"); - (*rvalue)->fprint(stderr); - fprintf(stderr, "\n"); - } - - this->graft_assign->remove(); - *rvalue = this->graft_assign->rhs; - - this->progress = true; - return true; -} - -ir_visitor_status -ir_tree_grafting_visitor::visit_enter(ir_loop *ir) -{ - (void)ir; - /* Do not traverse into the body of the loop since that is a - * different basic block. - */ - return visit_stop; -} - -/** - * Check if we can continue grafting after writing to a variable. If the - * expression we're trying to graft references the variable, we must stop. - * - * \param ir An instruction that writes to a variable. - * \param var The variable being updated. - */ -ir_visitor_status -ir_tree_grafting_visitor::check_graft(ir_instruction *ir, ir_variable *var) -{ - if (dereferences_variable(this->graft_assign->rhs, var)) { - if (debug) { - fprintf(stderr, "graft killed by: "); - ir->fprint(stderr); - fprintf(stderr, "\n"); - } - return visit_stop; - } - - return visit_continue; -} - -ir_visitor_status -ir_tree_grafting_visitor::visit_enter(ir_assignment *ir) -{ - // if we're entering into assignment of different precision, leave now - if (ir->lhs->get_precision() != this->graft_var->data.precision && ir->lhs->get_precision() != glsl_precision_undefined && this->graft_var->data.precision != glsl_precision_undefined) - return visit_continue_with_parent; - return visit_continue; -} - -ir_visitor_status -ir_tree_grafting_visitor::visit_leave(ir_assignment *ir) -{ - if (do_graft(&ir->rhs) || - do_graft(&ir->condition)) - return visit_stop; - - /* If this assignment updates a variable used in the assignment - * we're trying to graft, then we're done. - */ - return check_graft(ir, ir->lhs->variable_referenced()); -} - -ir_visitor_status -ir_tree_grafting_visitor::visit_enter(ir_function *ir) -{ - (void) ir; - return visit_continue_with_parent; -} - -ir_visitor_status -ir_tree_grafting_visitor::visit_enter(ir_function_signature *ir) -{ - (void)ir; - return visit_continue_with_parent; -} - -ir_visitor_status -ir_tree_grafting_visitor::visit_enter(ir_call *ir) -{ - foreach_two_lists(formal_node, &ir->callee->parameters, - actual_node, &ir->actual_parameters) { - ir_variable *sig_param = (ir_variable *) formal_node; - ir_rvalue *ir = (ir_rvalue *) actual_node; - ir_rvalue *new_ir = ir; - - if (sig_param->data.mode != ir_var_function_in - && sig_param->data.mode != ir_var_const_in) { - if (check_graft(ir, sig_param) == visit_stop) - return visit_stop; - continue; - } - - if (do_graft(&new_ir)) { - ir->replace_with(new_ir); - return visit_stop; - } - } - - if (ir->return_deref && check_graft(ir, ir->return_deref->var) == visit_stop) - return visit_stop; - - return visit_continue; -} - -ir_visitor_status -ir_tree_grafting_visitor::visit_enter(ir_expression *ir) -{ - for (unsigned int i = 0; i < ir->get_num_operands(); i++) { - if (do_graft(&ir->operands[i])) - return visit_stop; - } - - return visit_continue; -} - -ir_visitor_status -ir_tree_grafting_visitor::visit_enter(ir_if *ir) -{ - if (do_graft(&ir->condition)) - return visit_stop; - - /* Do not traverse into the body of the if-statement since that is a - * different basic block. - */ - return visit_continue_with_parent; -} - -ir_visitor_status -ir_tree_grafting_visitor::visit_enter(ir_swizzle *ir) -{ - if (do_graft(&ir->val)) - return visit_stop; - - return visit_continue; -} - -ir_visitor_status -ir_tree_grafting_visitor::visit_enter(ir_texture *ir) -{ - if (do_graft(&ir->coordinate) || - do_graft(&ir->offset)) - return visit_stop; - - switch (ir->op) { - case ir_tex: - case ir_lod: - case ir_query_levels: - break; - case ir_txb: - if (do_graft(&ir->lod_info.bias)) - return visit_stop; - break; - case ir_txf: - case ir_txl: - case ir_txs: - if (do_graft(&ir->lod_info.lod)) - return visit_stop; - break; - case ir_txf_ms: - if (do_graft(&ir->lod_info.sample_index)) - return visit_stop; - break; - case ir_txd: - if (do_graft(&ir->lod_info.grad.dPdx) || - do_graft(&ir->lod_info.grad.dPdy)) - return visit_stop; - break; - case ir_tg4: - if (do_graft(&ir->lod_info.component)) - return visit_stop; - break; - } - - return visit_continue; -} - -struct tree_grafting_info { - ir_variable_refcount_visitor *refs; - bool progress; -}; - -static bool -try_tree_grafting(ir_assignment *start, - ir_variable *lhs_var, - ir_instruction *bb_last) -{ - ir_tree_grafting_visitor v(start, lhs_var); - - if (debug) { - fprintf(stderr, "trying to graft: "); - lhs_var->fprint(stderr); - fprintf(stderr, "\n"); - } - - for (ir_instruction *ir = (ir_instruction *)start->next; - ir != bb_last->next; - ir = (ir_instruction *)ir->next) { - - if (debug) { - fprintf(stderr, "- "); - ir->fprint(stderr); - fprintf(stderr, "\n"); - } - - ir_visitor_status s = ir->accept(&v); - if (s == visit_stop) - return v.progress; - } - - return false; -} - -static void -tree_grafting_basic_block(ir_instruction *bb_first, - ir_instruction *bb_last, - void *data) -{ - struct tree_grafting_info *info = (struct tree_grafting_info *)data; - ir_instruction *ir, *next; - - for (ir = bb_first, next = (ir_instruction *)ir->next; - ir != bb_last->next; - ir = next, next = (ir_instruction *)ir->next) { - ir_assignment *assign = ir->as_assignment(); - - if (!assign) - continue; - - ir_variable *lhs_var = assign->whole_variable_written(); - if (!lhs_var) - continue; - - if (lhs_var->data.mode == ir_var_function_out || - lhs_var->data.mode == ir_var_function_inout || - lhs_var->data.mode == ir_var_shader_out) - continue; - - ir_variable_refcount_entry *entry = info->refs->get_variable_entry(lhs_var); - - if (!entry->declaration || - entry->assigned_count != 1 || - entry->referenced_count != 2) - continue; - - glsl_precision var_prec = (glsl_precision)lhs_var->data.precision; - glsl_precision rhs_prec = assign->rhs->get_precision(); - if (var_prec != rhs_prec && var_prec != glsl_precision_undefined && rhs_prec != glsl_precision_undefined) - continue; - - assert(assign == entry->assign); - - /* Found a possibly graftable assignment. Now, walk through the - * rest of the BB seeing if the deref is here, and if nothing interfered with - * pasting its expression's values in between. - */ - info->progress |= try_tree_grafting(assign, lhs_var, bb_last); - } -} - -} /* unnamed namespace */ - -/** - * Does a copy propagation pass on the code present in the instruction stream. - */ -bool -do_tree_grafting(exec_list *instructions) -{ - ir_variable_refcount_visitor refs; - struct tree_grafting_info info; - - info.progress = false; - info.refs = &refs; - - visit_list_elements(info.refs, instructions); - - call_for_basic_blocks(instructions, tree_grafting_basic_block, &info); - - return info.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/opt_vectorize.cpp b/3rdparty/glsl-optimizer/src/glsl/opt_vectorize.cpp deleted file mode 100644 index 1973d0725..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/opt_vectorize.cpp +++ /dev/null @@ -1,408 +0,0 @@ -/* - * Copyright © 2013 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file opt_vectorize.cpp - * - * Combines scalar assignments of the same expression (modulo swizzle) to - * multiple channels of the same variable into a single vectorized expression - * and assignment. - * - * Many generated shaders contain scalarized code. That is, they contain - * - * r1.x = log2(v0.x); - * r1.y = log2(v0.y); - * r1.z = log2(v0.z); - * - * rather than - * - * r1.xyz = log2(v0.xyz); - * - * We look for consecutive assignments of the same expression (modulo swizzle) - * to each channel of the same variable. - * - * For instance, we want to convert these three scalar operations - * - * (assign (x) (var_ref r1) (expression float log2 (swiz x (var_ref v0)))) - * (assign (y) (var_ref r1) (expression float log2 (swiz y (var_ref v0)))) - * (assign (z) (var_ref r1) (expression float log2 (swiz z (var_ref v0)))) - * - * into a single vector operation - * - * (assign (xyz) (var_ref r1) (expression vec3 log2 (swiz xyz (var_ref v0)))) - */ - -#include "ir.h" -#include "ir_visitor.h" -#include "ir_optimization.h" -#include "glsl_types.h" -#include "program/prog_instruction.h" - -namespace { - -class ir_vectorize_visitor : public ir_hierarchical_visitor { -public: - void clear() - { - assignment[0] = NULL; - assignment[1] = NULL; - assignment[2] = NULL; - assignment[3] = NULL; - current_assignment = NULL; - last_assignment = NULL; - channels = 0; - has_swizzle = false; - } - - ir_vectorize_visitor() - { - clear(); - progress = false; - } - - virtual ir_visitor_status visit_enter(ir_assignment *); - virtual ir_visitor_status visit_enter(ir_swizzle *); - virtual ir_visitor_status visit_enter(ir_dereference_array *); - virtual ir_visitor_status visit_enter(ir_expression *); - virtual ir_visitor_status visit_enter(ir_if *); - virtual ir_visitor_status visit_enter(ir_loop *); - virtual ir_visitor_status visit_enter(ir_texture *); - - virtual ir_visitor_status visit_leave(ir_assignment *); - - - void try_vectorize(); - - ir_assignment *assignment[4]; - ir_assignment *current_assignment, *last_assignment; - unsigned channels; - bool has_swizzle; - - bool progress; -}; - -} /* unnamed namespace */ - -/** - * Rewrites the swizzles and types of a right-hand side of an assignment. - * - * From the example above, this function would be called (by visit_tree()) on - * the nodes of the tree (expression float log2 (swiz z (var_ref v0))), - * rewriting it into (expression vec3 log2 (swiz xyz (var_ref v0))). - * - * The function operates on ir_expressions (and its operands) and ir_swizzles. - * For expressions it sets a new type and swizzles any non-expression and non- - * swizzle scalar operands into appropriately sized vector arguments. For - * example, if combining - * - * (assign (x) (var_ref r1) (expression float + (swiz x (var_ref v0) (var_ref v1)))) - * (assign (y) (var_ref r1) (expression float + (swiz y (var_ref v0) (var_ref v1)))) - * - * where v1 is a scalar, rewrite_swizzle() would insert a swizzle on - * (var_ref v1) such that the final result was - * - * (assign (xy) (var_ref r1) (expression vec2 + (swiz xy (var_ref v0)) - * (swiz xx (var_ref v1)))) - * - * For swizzles, it sets a new type, and if the variable being swizzled is a - * vector it overwrites the swizzle mask with the ir_swizzle_mask passed as the - * data parameter. If the swizzled variable is scalar, then the swizzle was - * added by an earlier call to rewrite_swizzle() on an expression, so the - * mask should not be modified. - */ -static void -rewrite_swizzle(ir_instruction *ir, void *data) -{ - ir_swizzle_mask *mask = (ir_swizzle_mask *)data; - - switch (ir->ir_type) { - case ir_type_swizzle: { - ir_swizzle *swz = (ir_swizzle *)ir; - if (swz->val->type->is_vector()) { - swz->mask = *mask; - } - swz->type = glsl_type::get_instance(swz->type->base_type, - mask->num_components, 1); - break; - } - case ir_type_expression: { - ir_expression *expr = (ir_expression *)ir; - expr->type = glsl_type::get_instance(expr->type->base_type, - mask->num_components, 1); - for (unsigned i = 0; i < 4; i++) { - if (expr->operands[i]) { - ir_rvalue *rval = expr->operands[i]->as_rvalue(); - if (rval && rval->type->is_scalar() && - !rval->as_expression() && !rval->as_swizzle()) { - expr->operands[i] = new(ir) ir_swizzle(rval, 0, 0, 0, 0, - mask->num_components); - } - } - } - break; - } - default: - break; - } -} - -/** - * Attempt to vectorize the previously saved assignments, and clear them from - * consideration. - * - * If the assignments are able to be combined, it modifies in-place the last - * assignment seen to be an equivalent vector form of the scalar assignments. - * It then removes the other now obsolete scalar assignments. - */ -void -ir_vectorize_visitor::try_vectorize() -{ - if (this->last_assignment && this->channels > 1) { - ir_swizzle_mask mask = {0, 0, 0, 0, channels, 0}; - - this->last_assignment->write_mask = 0; - - for (unsigned i = 0, j = 0; i < 4; i++) { - if (this->assignment[i]) { - this->last_assignment->write_mask |= 1 << i; - - if (this->assignment[i] != this->last_assignment) { - this->assignment[i]->remove(); - } - - switch (j) { - case 0: mask.x = i; break; - case 1: mask.y = i; break; - case 2: mask.z = i; break; - case 3: mask.w = i; break; - } - - j++; - } - } - - visit_tree(this->last_assignment->rhs, rewrite_swizzle, &mask); - - this->progress = true; - } - clear(); -} - -/** - * Returns whether the write mask is a single channel. - */ -static bool -single_channel_write_mask(unsigned write_mask) -{ - return write_mask != 0 && (write_mask & (write_mask - 1)) == 0; -} - -/** - * Translates single-channeled write mask to single-channeled swizzle. - */ -static unsigned -write_mask_to_swizzle(unsigned write_mask) -{ - switch (write_mask) { - case WRITEMASK_X: return SWIZZLE_X; - case WRITEMASK_Y: return SWIZZLE_Y; - case WRITEMASK_Z: return SWIZZLE_Z; - case WRITEMASK_W: break; - } - return SWIZZLE_W; -} - -/** - * Returns whether a single-channeled write mask matches a swizzle. - */ -static bool -write_mask_matches_swizzle(unsigned write_mask, - const ir_swizzle *swz) -{ - return ((write_mask == WRITEMASK_X && swz->mask.x == SWIZZLE_X) || - (write_mask == WRITEMASK_Y && swz->mask.x == SWIZZLE_Y) || - (write_mask == WRITEMASK_Z && swz->mask.x == SWIZZLE_Z) || - (write_mask == WRITEMASK_W && swz->mask.x == SWIZZLE_W)); -} - -/** - * Upon entering an ir_assignment, attempt to vectorize the currently tracked - * assignments if the current assignment is not suitable. Keep a pointer to - * the current assignment. - */ -ir_visitor_status -ir_vectorize_visitor::visit_enter(ir_assignment *ir) -{ - ir_dereference *lhs = this->last_assignment != NULL ? - this->last_assignment->lhs : NULL; - ir_rvalue *rhs = this->last_assignment != NULL ? - this->last_assignment->rhs : NULL; - - if (ir->condition || - this->channels >= 4 || - !single_channel_write_mask(ir->write_mask) || - this->assignment[write_mask_to_swizzle(ir->write_mask)] != NULL || - (lhs && !ir->lhs->equals(lhs)) || - (rhs && !ir->rhs->equals(rhs, ir_type_swizzle))) { - try_vectorize(); - } - - this->current_assignment = ir; - - return visit_continue; -} - -/** - * Upon entering an ir_swizzle, set ::has_swizzle if we're visiting from an - * ir_assignment (i.e., that ::current_assignment is set) and the swizzle mask - * matches the current assignment's write mask. - * - * If the write mask doesn't match the swizzle mask, remove the current - * assignment from further consideration. - */ -ir_visitor_status -ir_vectorize_visitor::visit_enter(ir_swizzle *ir) -{ - if (this->current_assignment) { - if (write_mask_matches_swizzle(this->current_assignment->write_mask, ir)) { - this->has_swizzle = true; - } else { - this->current_assignment = NULL; - } - } - return visit_continue; -} - -/* Upon entering an ir_array_dereference, remove the current assignment from - * further consideration. Since the index of an array dereference must scalar, - * we are not able to vectorize it. - * - * FINISHME: If all of scalar indices are identical we could vectorize. - */ -ir_visitor_status -ir_vectorize_visitor::visit_enter(ir_dereference_array *) -{ - this->current_assignment = NULL; - return visit_continue_with_parent; -} - -/** - * Upon entering an ir_expression, remove the current assignment from further - * consideration if the expression operates horizontally on vectors. - */ -ir_visitor_status -ir_vectorize_visitor::visit_enter(ir_expression *ir) -{ - if (ir->is_horizontal()) { - this->current_assignment = NULL; - return visit_continue_with_parent; - } - return visit_continue; -} - -/* Since there is no statement to visit between the "then" and "else" - * instructions try to vectorize before, in between, and after them to avoid - * combining statements from different basic blocks. - */ -ir_visitor_status -ir_vectorize_visitor::visit_enter(ir_if *ir) -{ - try_vectorize(); - - visit_list_elements(this, &ir->then_instructions); - try_vectorize(); - - visit_list_elements(this, &ir->else_instructions); - try_vectorize(); - - return visit_continue_with_parent; -} - -/* Since there is no statement to visit between the instructions in the body of - * the loop and the instructions after it try to vectorize before and after the - * body to avoid combining statements from different basic blocks. - */ -ir_visitor_status -ir_vectorize_visitor::visit_enter(ir_loop *ir) -{ - try_vectorize(); - - visit_list_elements(this, &ir->body_instructions); - try_vectorize(); - - return visit_continue_with_parent; -} - -/** - * Upon entering an ir_texture, remove the current assignment from - * further consideration. Vectorizing multiple texture lookups into one - * is wrong. - */ -ir_visitor_status -ir_vectorize_visitor::visit_enter(ir_texture *) -{ - this->current_assignment = NULL; - return visit_continue_with_parent; -} - -/** - * Upon leaving an ir_assignment, save a pointer to it in ::assignment[] if - * the swizzle mask(s) found were appropriate. Also save a pointer in - * ::last_assignment so that we can compare future assignments with it. - * - * Finally, clear ::current_assignment and ::has_swizzle. - */ -ir_visitor_status -ir_vectorize_visitor::visit_leave(ir_assignment *ir) -{ - if (this->has_swizzle && this->current_assignment) { - assert(this->current_assignment == ir); - - unsigned channel = write_mask_to_swizzle(this->current_assignment->write_mask); - this->assignment[channel] = ir; - this->channels++; - - this->last_assignment = this->current_assignment; - } - this->current_assignment = NULL; - this->has_swizzle = false; - return visit_continue; -} - -/** - * Combines scalar assignments of the same expression (modulo swizzle) to - * multiple channels of the same variable into a single vectorized expression - * and assignment. - */ -bool -do_vectorize(exec_list *instructions) -{ - ir_vectorize_visitor v; - - v.run(instructions); - - /* Try to vectorize the last assignments seen. */ - v.try_vectorize(); - - return v.progress; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/program.h b/3rdparty/glsl-optimizer/src/glsl/program.h deleted file mode 100644 index f15113a08..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/program.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. - * Copyright (C) 2009 VMware, Inc. All Rights Reserved. - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "main/core.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern void -_mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, - bool dump_ast, bool dump_hir); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -extern void -link_shaders(struct gl_context *ctx, struct gl_shader_program *prog); - -extern void -linker_error(struct gl_shader_program *prog, const char *fmt, ...) - PRINTFLIKE(2, 3); - -extern void -linker_warning(struct gl_shader_program *prog, const char *fmt, ...) - PRINTFLIKE(2, 3); - -extern long -parse_program_resource_name(const GLchar *name, - const GLchar **out_base_name_end); diff --git a/3rdparty/glsl-optimizer/src/glsl/s_expression.cpp b/3rdparty/glsl-optimizer/src/glsl/s_expression.cpp deleted file mode 100644 index 24d4af298..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/s_expression.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include -#include -#include "s_expression.h" - -s_symbol::s_symbol(const char *str, size_t n) -{ - /* Assume the given string is already nul-terminated and in memory that - * will live as long as this node. - */ - assert(str[n] == '\0'); - this->str = str; -} - -s_list::s_list() -{ -} - -static void -skip_whitespace(const char *&src, char *&symbol_buffer) -{ - size_t n = strspn(src, " \v\t\r\n"); - src += n; - symbol_buffer += n; - /* Also skip Scheme-style comments: semi-colon 'til end of line */ - if (src[0] == ';') { - n = strcspn(src, "\n"); - src += n; - symbol_buffer += n; - skip_whitespace(src, symbol_buffer); - } -} - -static s_expression * -read_atom(void *ctx, const char *&src, char *&symbol_buffer) -{ - s_expression *expr = NULL; - - skip_whitespace(src, symbol_buffer); - - size_t n = strcspn(src, "( \v\t\r\n);"); - if (n == 0) - return NULL; // no atom - - // Check for the special symbol '+INF', which means +Infinity. Note: C99 - // requires strtof to parse '+INF' as +Infinity, but we still support some - // non-C99-compliant compilers (e.g. MSVC). - if (n == 4 && strncmp(src, "+INF", 4) == 0) { - expr = new(ctx) s_float(std::numeric_limits::infinity()); - } else { - // Check if the atom is a number. - char *float_end = NULL; - float f = glsl_strtof(src, &float_end); - if (float_end != src) { - char *int_end = NULL; - int i = strtol(src, &int_end, 10); - // If strtof matched more characters, it must have a decimal part - if (float_end > int_end) - expr = new(ctx) s_float((float)f); - else - expr = new(ctx) s_int(i); - } else { - // Not a number; return a symbol. - symbol_buffer[n] = '\0'; - expr = new(ctx) s_symbol(symbol_buffer, n); - } - } - - src += n; - symbol_buffer += n; - - return expr; -} - -static s_expression * -__read_expression(void *ctx, const char *&src, char *&symbol_buffer) -{ - s_expression *atom = read_atom(ctx, src, symbol_buffer); - if (atom != NULL) - return atom; - - skip_whitespace(src, symbol_buffer); - if (src[0] == '(') { - ++src; - ++symbol_buffer; - - s_list *list = new(ctx) s_list; - s_expression *expr; - - while ((expr = __read_expression(ctx, src, symbol_buffer)) != NULL) { - list->subexpressions.push_tail(expr); - } - skip_whitespace(src, symbol_buffer); - if (src[0] != ')') { - printf("Unclosed expression (check your parenthesis).\n"); - return NULL; - } - ++src; - ++symbol_buffer; - return list; - } - return NULL; -} - -s_expression * -s_expression::read_expression(void *ctx, const char *&src) -{ - assert(src != NULL); - - /* When we encounter a Symbol, we need to save a nul-terminated copy of - * the string. However, ralloc_strndup'ing every individual Symbol is - * extremely expensive. We could avoid this by simply overwriting the - * next character (guaranteed to be whitespace, parens, or semicolon) with - * a nul-byte. But overwriting non-whitespace would mess up parsing. - * - * So, just copy the whole buffer ahead of time. Walk both, leaving the - * original source string unmodified, and altering the copy to contain the - * necessary nul-bytes whenever we encounter a symbol. - */ - char *symbol_buffer = ralloc_strdup(ctx, src); - return __read_expression(ctx, src, symbol_buffer); -} - -void s_int::print() -{ - printf("%d", this->val); -} - -void s_float::print() -{ - printf("%f", this->val); -} - -void s_symbol::print() -{ - printf("%s", this->str); -} - -void s_list::print() -{ - printf("("); - foreach_in_list(s_expression, expr, &this->subexpressions) { - expr->print(); - if (!expr->next->is_tail_sentinel()) - printf(" "); - } - printf(")"); -} - -// -------------------------------------------------- - -bool -s_pattern::match(s_expression *expr) -{ - switch (type) - { - case EXPR: *p_expr = expr; break; - case LIST: if (expr->is_list()) *p_list = (s_list *) expr; break; - case SYMBOL: if (expr->is_symbol()) *p_symbol = (s_symbol *) expr; break; - case NUMBER: if (expr->is_number()) *p_number = (s_number *) expr; break; - case INT: if (expr->is_int()) *p_int = (s_int *) expr; break; - case STRING: - s_symbol *sym = SX_AS_SYMBOL(expr); - if (sym != NULL && strcmp(sym->value(), literal) == 0) - return true; - return false; - }; - - return *p_expr == expr; -} - -bool -s_match(s_expression *top, unsigned n, s_pattern *pattern, bool partial) -{ - s_list *list = SX_AS_LIST(top); - if (list == NULL) - return false; - - unsigned i = 0; - foreach_in_list(s_expression, expr, &list->subexpressions) { - if (i >= n) - return partial; /* More actual items than the pattern expected */ - - if (expr == NULL || !pattern[i].match(expr)) - return false; - - i++; - } - - if (i < n) - return false; /* Less actual items than the pattern expected */ - - return true; -} diff --git a/3rdparty/glsl-optimizer/src/glsl/s_expression.h b/3rdparty/glsl-optimizer/src/glsl/s_expression.h deleted file mode 100644 index 642af19b4..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/s_expression.h +++ /dev/null @@ -1,180 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#pragma once -#ifndef S_EXPRESSION_H -#define S_EXPRESSION_H - -#include "main/core.h" /* for Elements */ -#include "strtod.h" -#include "list.h" - -/* Type-safe downcasting macros (also safe to pass NULL) */ -#define SX_AS_(t,x) ((x) && ((s_expression*) x)->is_##t()) ? ((s_##t*) (x)) \ - : NULL -#define SX_AS_LIST(x) SX_AS_(list, x) -#define SX_AS_SYMBOL(x) SX_AS_(symbol, x) -#define SX_AS_NUMBER(x) SX_AS_(number, x) -#define SX_AS_INT(x) SX_AS_(int, x) - -/* Pattern matching macros */ -#define MATCH(list, pat) s_match(list, Elements(pat), pat, false) -#define PARTIAL_MATCH(list, pat) s_match(list, Elements(pat), pat, true) - -/* For our purposes, S-Expressions are: - * - - * - - * - symbol - * - (expr1 expr2 ... exprN) where exprN is an S-Expression - * - * Unlike LISP/Scheme, we do not support (foo . bar) pairs. - */ -class s_expression : public exec_node -{ -public: - /** - * Read an S-Expression from the given string. - * Advances the supplied pointer to just after the expression read. - * - * Any allocation will be performed with 'ctx' as the ralloc owner. - */ - static s_expression *read_expression(void *ctx, const char *&src); - - /** - * Print out an S-Expression. Useful for debugging. - */ - virtual void print() = 0; - - virtual bool is_list() const { return false; } - virtual bool is_symbol() const { return false; } - virtual bool is_number() const { return false; } - virtual bool is_int() const { return false; } - -protected: - s_expression() { } -}; - -/* Atoms */ - -class s_number : public s_expression -{ -public: - bool is_number() const { return true; } - - virtual float fvalue() = 0; - -protected: - s_number() { } -}; - -class s_int : public s_number -{ -public: - s_int(int x) : val(x) { } - - bool is_int() const { return true; } - - float fvalue() { return float(this->val); } - int value() { return this->val; } - - void print(); - -private: - int val; -}; - -class s_float : public s_number -{ -public: - s_float(float x) : val(x) { } - - float fvalue() { return this->val; } - - void print(); - -private: - float val; -}; - -class s_symbol : public s_expression -{ -public: - s_symbol(const char *, size_t); - - bool is_symbol() const { return true; } - - const char *value() { return this->str; } - - void print(); - -private: - const char *str; -}; - -/* Lists of expressions: (expr1 ... exprN) */ -class s_list : public s_expression -{ -public: - s_list(); - - virtual bool is_list() const { return true; } - - void print(); - - exec_list subexpressions; -}; - -// ------------------------------------------------------------ - -/** - * Part of a pattern to match - essentially a record holding a pointer to the - * storage for the component to match, along with the appropriate type. - */ -class s_pattern { -public: - s_pattern(s_expression *&s) : p_expr(&s), type(EXPR) { } - s_pattern(s_list *&s) : p_list(&s), type(LIST) { } - s_pattern(s_symbol *&s) : p_symbol(&s), type(SYMBOL) { } - s_pattern(s_number *&s) : p_number(&s), type(NUMBER) { } - s_pattern(s_int *&s) : p_int(&s), type(INT) { } - s_pattern(const char *str) : literal(str), type(STRING) { } - - bool match(s_expression *expr); - -private: - union { - s_expression **p_expr; - s_list **p_list; - s_symbol **p_symbol; - s_number **p_number; - s_int **p_int; - const char *literal; - }; - enum { EXPR, LIST, SYMBOL, NUMBER, INT, STRING } type; -}; - -bool -s_match(s_expression *top, unsigned n, s_pattern *pattern, bool partial); - -#endif /* S_EXPRESSION_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/standalone_scaffolding.cpp b/3rdparty/glsl-optimizer/src/glsl/standalone_scaffolding.cpp deleted file mode 100644 index a358cfd00..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/standalone_scaffolding.cpp +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/* This file declares stripped-down versions of functions that - * normally exist outside of the glsl folder, so that they can be used - * when running the GLSL compiler standalone (for unit testing or - * compiling builtins). - */ - -#include "standalone_scaffolding.h" - -#include -#include -#include -#include "util/ralloc.h" - - -void -_mesa_reference_shader(struct gl_context *, struct gl_shader **ptr, - struct gl_shader *sh) -{ - *ptr = sh; -} - -void -_mesa_shader_debug(struct gl_context *, GLenum, GLuint *, - const char *, int) -{ -} - -extern "C" void -_mesa_error_no_memory(const char *) -{ -} - - -struct gl_shader * -_mesa_new_shader(struct gl_context *ctx, GLuint name, GLenum type) -{ - struct gl_shader *shader; - - (void) ctx; - - assert(type == GL_FRAGMENT_SHADER || type == GL_VERTEX_SHADER); - shader = rzalloc(NULL, struct gl_shader); - if (shader) { - shader->Type = type; - shader->Stage = _mesa_shader_enum_to_shader_stage(type); - shader->Name = name; - shader->RefCount = 1; - } - return shader; -} - -void initialize_context_to_defaults(struct gl_context *ctx, gl_api api) -{ - memset(ctx, 0, sizeof(*ctx)); - - ctx->API = api; - - ctx->Extensions.dummy_false = false; - ctx->Extensions.dummy_true = true; - ctx->Extensions.ARB_compute_shader = true; - ctx->Extensions.ARB_conservative_depth = true; - ctx->Extensions.ARB_draw_instanced = true; - ctx->Extensions.ARB_ES2_compatibility = true; - ctx->Extensions.ARB_ES3_compatibility = true; - ctx->Extensions.ARB_explicit_attrib_location = true; - ctx->Extensions.ARB_fragment_coord_conventions = true; - ctx->Extensions.ARB_fragment_layer_viewport = true; - ctx->Extensions.ARB_gpu_shader5 = true; - ctx->Extensions.ARB_sample_shading = true; - ctx->Extensions.ARB_shader_bit_encoding = true; - ctx->Extensions.ARB_shader_stencil_export = true; - ctx->Extensions.ARB_shader_texture_lod = true; - ctx->Extensions.ARB_shader_viewport_layer_array = true; - ctx->Extensions.ARB_shading_language_420pack = true; - ctx->Extensions.ARB_shading_language_packing = true; - ctx->Extensions.ARB_texture_cube_map_array = true; - ctx->Extensions.ARB_texture_gather = true; - ctx->Extensions.ARB_texture_multisample = true; - ctx->Extensions.ARB_texture_query_levels = true; - ctx->Extensions.ARB_texture_query_lod = true; - ctx->Extensions.ARB_uniform_buffer_object = true; - ctx->Extensions.ARB_viewport_array = true; - - ctx->Extensions.OES_EGL_image_external = true; - ctx->Extensions.OES_standard_derivatives = true; - - ctx->Extensions.EXT_draw_instanced = true; - ctx->Extensions.EXT_gpu_shader4 = true; - ctx->Extensions.EXT_shader_integer_mix = true; - ctx->Extensions.EXT_texture3D = true; - ctx->Extensions.EXT_texture_array = true; - ctx->Extensions.EXT_draw_buffers = true; - - ctx->Extensions.NV_texture_rectangle = true; - - ctx->Const.AllowGLSLExtensionDirectiveMidShader = true; // makes it easier to run tests - - ctx->Const.GLSLVersion = 120; - - /* 1.20 minimums. */ - ctx->Const.MaxLights = 8; - ctx->Const.MaxClipPlanes = 6; - ctx->Const.MaxTextureUnits = 2; - ctx->Const.MaxTextureCoordUnits = 2; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16; - - ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 512; - ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 32; - ctx->Const.MaxVarying = 8; /* == gl_MaxVaryingFloats / 4 */ - ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 0; - ctx->Const.MaxCombinedTextureImageUnits = 2; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = 2; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 64; - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = 32; - - ctx->Const.MaxDrawBuffers = 1; - ctx->Const.MaxComputeWorkGroupCount[0] = 65535; - ctx->Const.MaxComputeWorkGroupCount[1] = 65535; - ctx->Const.MaxComputeWorkGroupCount[2] = 65535; - ctx->Const.MaxComputeWorkGroupSize[0] = 1024; - ctx->Const.MaxComputeWorkGroupSize[1] = 1024; - ctx->Const.MaxComputeWorkGroupSize[2] = 64; - ctx->Const.MaxComputeWorkGroupInvocations = 1024; - ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = 16; - ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformComponents = 1024; - ctx->Const.Program[MESA_SHADER_COMPUTE].MaxInputComponents = 0; /* not used */ - ctx->Const.Program[MESA_SHADER_COMPUTE].MaxOutputComponents = 0; /* not used */ - - /* Set up default shader compiler options. */ - struct gl_shader_compiler_options options; - memset(&options, 0, sizeof(options)); - options.MaxUnrollIterations = 8; - options.MaxIfDepth = UINT_MAX; - - /* Default pragma settings */ - options.DefaultPragmas.Optimize = true; - - for (int sh = 0; sh < MESA_SHADER_STAGES; ++sh) - memcpy(&ctx->Const.ShaderCompilerOptions[sh], &options, sizeof(options)); -} diff --git a/3rdparty/glsl-optimizer/src/glsl/standalone_scaffolding.h b/3rdparty/glsl-optimizer/src/glsl/standalone_scaffolding.h deleted file mode 100644 index f0f9d872e..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/standalone_scaffolding.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/* This file declares stripped-down versions of functions that - * normally exist outside of the glsl folder, so that they can be used - * when running the GLSL compiler standalone (for unit testing or - * compiling builtins). - */ - -#pragma once -#ifndef STANDALONE_SCAFFOLDING_H -#define STANDALONE_SCAFFOLDING_H - -#include -#include "main/mtypes.h" - -extern "C" void -_mesa_reference_shader(struct gl_context *ctx, struct gl_shader **ptr, - struct gl_shader *sh); - -extern "C" struct gl_shader * -_mesa_new_shader(struct gl_context *ctx, GLuint name, GLenum type); - -extern "C" void -_mesa_shader_debug(struct gl_context *ctx, GLenum type, GLuint *id, - const char *msg, int len); - -static inline gl_shader_stage -_mesa_shader_enum_to_shader_stage(GLenum v) -{ - switch (v) { - case GL_VERTEX_SHADER: - return MESA_SHADER_VERTEX; - case GL_FRAGMENT_SHADER: - return MESA_SHADER_FRAGMENT; - case GL_GEOMETRY_SHADER: - return MESA_SHADER_GEOMETRY; - case GL_COMPUTE_SHADER: - return MESA_SHADER_COMPUTE; - default: - assert(!"bad value in _mesa_shader_enum_to_shader_stage()"); - return MESA_SHADER_VERTEX; - } -} - -/** - * Initialize the given gl_context structure to a reasonable set of - * defaults representing the minimum capabilities required by the - * OpenGL spec. - * - * This is used when compiling builtin functions and in testing, when - * we don't have a connection to an actual driver. - */ -void initialize_context_to_defaults(struct gl_context *ctx, gl_api api); - - -#endif /* STANDALONE_SCAFFOLDING_H */ diff --git a/3rdparty/glsl-optimizer/src/glsl/strtod.c b/3rdparty/glsl-optimizer/src/glsl/strtod.c deleted file mode 100644 index cb1d59fb8..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/strtod.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2010 VMware, Inc. - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - - -#include - -#ifdef _GNU_SOURCE -#include -#ifdef __APPLE__ -#include -#endif -#endif - -#include "strtod.h" - - - -/** - * Wrapper around strtod which uses the "C" locale so the decimal - * point is always '.' - */ -double -glsl_strtod(const char *s, char **end) -{ -#if defined(_GNU_SOURCE) && !defined(__CYGWIN__) && !defined(__FreeBSD__) && \ - !defined(__HAIKU__) && !defined(__UCLIBC__) - static locale_t loc = NULL; - if (!loc) { - loc = newlocale(LC_CTYPE_MASK, "C", NULL); - } - return strtod_l(s, end, loc); -#else - return strtod(s, end); -#endif -} - - -/** - * Wrapper around strtof which uses the "C" locale so the decimal - * point is always '.' - */ -float -glsl_strtof(const char *s, char **end) -{ -#if defined(_GNU_SOURCE) && !defined(__CYGWIN__) && !defined(__FreeBSD__) && \ - !defined(__HAIKU__) && !defined(__UCLIBC__) - static locale_t loc = NULL; - if (!loc) { - loc = newlocale(LC_CTYPE_MASK, "C", NULL); - } - return strtof_l(s, end, loc); -#elif (defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE >= 600)) || (defined(_ISOC99_SOURCE) && _ISOC99_SOURCE) - return strtof(s, end); -#else - return (float) strtod(s, end); -#endif -} diff --git a/3rdparty/glsl-optimizer/src/glsl/strtod.h b/3rdparty/glsl-optimizer/src/glsl/strtod.h deleted file mode 100644 index ad847dbb0..000000000 --- a/3rdparty/glsl-optimizer/src/glsl/strtod.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2010 VMware, Inc. - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - - -#ifndef STRTOD_H -#define STRTOD_H - -#ifdef __cplusplus -extern "C" { -#endif - -extern double -glsl_strtod(const char *s, char **end); - -extern float -glsl_strtof(const char *s, char **end); - - -#ifdef __cplusplus -} -#endif - - -#endif diff --git a/3rdparty/glsl-optimizer/src/glsl_optimizer_lib.gyp b/3rdparty/glsl-optimizer/src/glsl_optimizer_lib.gyp deleted file mode 100644 index eb0d04897..000000000 --- a/3rdparty/glsl-optimizer/src/glsl_optimizer_lib.gyp +++ /dev/null @@ -1,190 +0,0 @@ -{ - 'includes': [ - '../target_defaults.gypi', - ], - 'targets': [ - { - 'target_name': 'glsl_optimizer_lib', - 'type': 'static_library', - 'include_dirs': [ - '.', - 'glsl', - 'mesa', - '../include', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - 'glsl', - ], - }, - 'sources': [ - 'glsl/glcpp/glcpp-lex.c', - 'glsl/glcpp/glcpp-parse.c', - 'glsl/glcpp/glcpp-parse.h', - 'glsl/glcpp/glcpp.h', - 'glsl/glcpp/pp.c', - 'glsl/ast.h', - 'glsl/ast_array_index.cpp', - 'glsl/ast_expr.cpp', - 'glsl/ast_function.cpp', - 'glsl/ast_to_hir.cpp', - 'glsl/ast_type.cpp', - 'glsl/builtin_functions.cpp', - 'glsl/builtin_types.cpp', - 'glsl/builtin_type_macros.h', - 'glsl/builtin_variables.cpp', - 'glsl/glsl_lexer.cpp', - 'glsl/glsl_optimizer.cpp', - 'glsl/glsl_optimizer.h', - 'glsl/glsl_parser.cpp', - 'glsl/glsl_parser.h', - 'glsl/glsl_parser_extras.cpp', - 'glsl/glsl_parser_extras.h', - 'glsl/glsl_symbol_table.cpp', - 'glsl/glsl_symbol_table.h', - 'glsl/glsl_types.cpp', - 'glsl/glsl_types.h', - 'glsl/hir_field_selection.cpp', - 'glsl/ir.cpp', - 'glsl/ir.h', - 'glsl/ir_stats.h', - 'glsl/ir_stats.cpp', - 'glsl/ir_basic_block.cpp', - 'glsl/ir_basic_block.h', - 'glsl/ir_builder.cpp', - 'glsl/ir_builder.h', - 'glsl/ir_clone.cpp', - 'glsl/ir_constant_expression.cpp', - 'glsl/ir_equals.cpp', - 'glsl/ir_expression_flattening.cpp', - 'glsl/ir_expression_flattening.h', - 'glsl/ir_function.cpp', - 'glsl/ir_function_can_inline.cpp', - 'glsl/ir_function_detect_recursion.cpp', - 'glsl/ir_function_inlining.h', - 'glsl/ir_hierarchical_visitor.cpp', - 'glsl/ir_hierarchical_visitor.h', - 'glsl/ir_hv_accept.cpp', - 'glsl/ir_import_prototypes.cpp', - 'glsl/ir_optimization.h', - 'glsl/ir_print_glsl_visitor.cpp', - 'glsl/ir_print_glsl_visitor.h', - 'glsl/ir_print_metal_visitor.cpp', - 'glsl/ir_print_metal_visitor.h', - 'glsl/ir_print_visitor.cpp', - 'glsl/ir_print_visitor.h', - 'glsl/ir_rvalue_visitor.cpp', - 'glsl/ir_rvalue_visitor.h', - 'glsl/ir_uniform.h', - 'glsl/ir_unused_structs.cpp', - 'glsl/ir_unused_structs.h', - 'glsl/ir_validate.cpp', - 'glsl/ir_variable_refcount.cpp', - 'glsl/ir_variable_refcount.h', - 'glsl/ir_visitor.h', - 'glsl/link_atomics.cpp', - 'glsl/link_functions.cpp', - 'glsl/link_interface_blocks.cpp', - 'glsl/link_uniform_block_active_visitor.cpp', - 'glsl/link_uniform_block_active_visitor.h', - 'glsl/link_uniform_blocks.cpp', - 'glsl/link_uniform_initializers.cpp', - 'glsl/link_uniforms.cpp', - 'glsl/link_varyings.cpp', - 'glsl/link_varyings.h', - 'glsl/linker.cpp', - 'glsl/linker.h', - 'glsl/list.h', - 'glsl/loop_analysis.cpp', - 'glsl/loop_analysis.h', - 'glsl/loop_controls.cpp', - 'glsl/loop_unroll.cpp', - 'glsl/lower_clip_distance.cpp', - 'glsl/lower_discard.cpp', - 'glsl/lower_discard_flow.cpp', - 'glsl/lower_if_to_cond_assign.cpp', - 'glsl/lower_instructions.cpp', - 'glsl/lower_jumps.cpp', - 'glsl/lower_mat_op_to_vec.cpp', - 'glsl/lower_noise.cpp', - 'glsl/lower_packed_varyings.cpp', - 'glsl/lower_packing_builtins.cpp', - 'glsl/lower_variable_index_to_cond_assign.cpp', - 'glsl/lower_vec_index_to_cond_assign.cpp', - 'glsl/lower_vec_index_to_swizzle.cpp', - 'glsl/lower_vector.cpp', - 'glsl/lower_vector_insert.cpp', - 'glsl/lower_named_interface_blocks.cpp', - 'glsl/opt_algebraic.cpp', - 'glsl/opt_array_splitting.cpp', - 'glsl/opt_constant_folding.cpp', - 'glsl/opt_constant_propagation.cpp', - 'glsl/opt_constant_variable.cpp', - 'glsl/opt_copy_propagation.cpp', - 'glsl/opt_copy_propagation_elements.cpp', - 'glsl/opt_cse.cpp', - 'glsl/opt_dead_code.cpp', - 'glsl/opt_dead_code_local.cpp', - 'glsl/opt_dead_functions.cpp', - 'glsl/opt_flatten_nested_if_blocks.cpp', - 'glsl/opt_function_inlining.cpp', - 'glsl/opt_if_simplification.cpp', - 'glsl/opt_noop_swizzle.cpp', - 'glsl/opt_redundant_jumps.cpp', - 'glsl/opt_structure_splitting.cpp', - 'glsl/opt_swizzle_swizzle.cpp', - 'glsl/opt_tree_grafting.cpp', - 'glsl/opt_vectorize.cpp', - 'glsl/opt_flip_matrices.cpp', - 'glsl/opt_dead_builtin_varyings.cpp', - 'glsl/program.h', - 'glsl/s_expression.cpp', - 'glsl/s_expression.h', - 'glsl/standalone_scaffolding.cpp', - 'glsl/standalone_scaffolding.h', - 'glsl/strtod.c', - 'glsl/strtod.h', - 'mesa/main/compiler.h', - 'mesa/main/config.h', - 'mesa/main/context.h', - 'mesa/main/core.h', - 'mesa/main/dd.h', - 'mesa/main/glheader.h', - 'mesa/main/glminimal.h', - 'mesa/main/imports.c', - 'mesa/main/imports.h', - 'mesa/main/macros.h', - 'mesa/main/mtypes.h', - 'mesa/main/simple_list.h', - 'mesa/program/hash_table.h', - 'mesa/program/prog_hash_table.c', - 'mesa/program/prog_instruction.h', - 'mesa/program/prog_parameter.h', - 'mesa/program/prog_statevars.h', - 'mesa/program/symbol_table.c', - 'mesa/program/symbol_table.h', - 'util/hash_table.c', - 'util/hash_table.h', - 'util/ralloc.c', - 'util/ralloc.h', - ], - 'conditions': [ - ['OS=="win"', { - 'include_dirs': [ - '../include/c99', - ], - 'defines': [ - '_LIB', - 'NOMINMAX', - '_CRT_SECURE_NO_WARNINGS', - '_CRT_SECURE_NO_DEPRECATE', - '__STDC_VERSION__=199901L', - '__STDC__', - 'strdup=_strdup', - ], - 'msvs_disabled_warnings': [4028, 4244, 4267, 4996], - }], - ], - } - ] -} diff --git a/3rdparty/glsl-optimizer/src/mesa/main/compiler.h b/3rdparty/glsl-optimizer/src/mesa/main/compiler.h deleted file mode 100644 index ce85e8f1f..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/main/compiler.h +++ /dev/null @@ -1,364 +0,0 @@ -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. - * Copyright (C) 2009 VMware, Inc. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - -/** - * \file compiler.h - * Compiler-related stuff. - */ - - -#ifndef COMPILER_H -#define COMPILER_H - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "util/macros.h" - -#include "c99_compat.h" /* inline, __func__, etc. */ - - -#ifdef __cplusplus -extern "C" { -#endif - - -/** - * Get standard integer types - */ -#include - - -/** - * Sun compilers define __i386 instead of the gcc-style __i386__ - */ -#ifdef __SUNPRO_C -# if !defined(__i386__) && defined(__i386) -# define __i386__ -# elif !defined(__amd64__) && defined(__amd64) -# define __amd64__ -# elif !defined(__sparc__) && defined(__sparc) -# define __sparc__ -# endif -# if !defined(__volatile) -# define __volatile volatile -# endif -#endif - - -/** - * finite macro. - */ -#if defined(_MSC_VER) -# define finite _finite -#endif - - -/** - * Disable assorted warnings - */ -#if defined(_WIN32) && !defined(__CYGWIN__) -# if !defined(__GNUC__) /* mingw environment */ -# pragma warning( disable : 4068 ) /* unknown pragma */ -# pragma warning( disable : 4710 ) /* function 'foo' not inlined */ -# pragma warning( disable : 4711 ) /* function 'foo' selected for automatic inline expansion */ -# pragma warning( disable : 4127 ) /* conditional expression is constant */ -# if defined(MESA_MINWARN) -# pragma warning( disable : 4244 ) /* '=' : conversion from 'const double ' to 'float ', possible loss of data */ -# pragma warning( disable : 4018 ) /* '<' : signed/unsigned mismatch */ -# pragma warning( disable : 4305 ) /* '=' : truncation from 'const double ' to 'float ' */ -# pragma warning( disable : 4550 ) /* 'function' undefined; assuming extern returning int */ -# pragma warning( disable : 4761 ) /* integral size mismatch in argument; conversion supplied */ -# endif -# endif -#endif - - - -/* XXX: Use standard `inline` keyword instead */ -#ifndef INLINE -# define INLINE inline -#endif - - -/** - * PUBLIC/USED macros - * - * If we build the library with gcc's -fvisibility=hidden flag, we'll - * use the PUBLIC macro to mark functions that are to be exported. - * - * We also need to define a USED attribute, so the optimizer doesn't - * inline a static function that we later use in an alias. - ajax - */ -#ifndef PUBLIC -# if (defined(__GNUC__) && __GNUC__ >= 4) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) -# define PUBLIC __attribute__((visibility("default"))) -# define USED __attribute__((used)) -# else -# define PUBLIC -# define USED -# endif -#endif - - -/* XXX: Use standard `__func__` instead */ -#ifndef __FUNCTION__ -# define __FUNCTION__ __func__ -#endif - -/** - * Either define MESA_BIG_ENDIAN or MESA_LITTLE_ENDIAN, and CPU_TO_LE32. - * Do not use these unless absolutely necessary! - * Try to use a runtime test instead. - * For now, only used by some DRI hardware drivers for color/texel packing. - */ -#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN -#if defined(__linux__) -#include -#define CPU_TO_LE32( x ) bswap_32( x ) -#elif defined(__APPLE__) -#include -#define CPU_TO_LE32( x ) CFSwapInt32HostToLittle( x ) -#elif (defined(_AIX)) -static inline GLuint CPU_TO_LE32(GLuint x) -{ - return (((x & 0x000000ff) << 24) | - ((x & 0x0000ff00) << 8) | - ((x & 0x00ff0000) >> 8) | - ((x & 0xff000000) >> 24)); -} -#elif defined(__OpenBSD__) -#include -#define CPU_TO_LE32( x ) htole32( x ) -#else /*__linux__ */ -#include -#define CPU_TO_LE32( x ) bswap32( x ) -#endif /*__linux__*/ -#define MESA_BIG_ENDIAN 1 -#else -#define CPU_TO_LE32( x ) ( x ) -#define MESA_LITTLE_ENDIAN 1 -#endif -#define LE32_TO_CPU( x ) CPU_TO_LE32( x ) - - - -#if !defined(CAPI) && defined(_WIN32) -#define CAPI _cdecl -#endif - - -/** - * Create a macro so that asm functions can be linked into compilers other - * than GNU C - */ -#ifndef _ASMAPI -#if defined(_WIN32) -#define _ASMAPI __cdecl -#else -#define _ASMAPI -#endif -#ifdef PTR_DECL_IN_FRONT -#define _ASMAPIP * _ASMAPI -#else -#define _ASMAPIP _ASMAPI * -#endif -#endif - -#ifdef USE_X86_ASM -#define _NORMAPI _ASMAPI -#define _NORMAPIP _ASMAPIP -#else -#define _NORMAPI -#define _NORMAPIP * -#endif - - -/* Turn off macro checking systems used by other libraries */ -#ifdef CHECK -#undef CHECK -#endif - - -/** - * ASSERT macro - */ -#if defined(DEBUG) -# define ASSERT(X) assert(X) -#else -# define ASSERT(X) -#endif - - -/* - * A trick to suppress uninitialized variable warning without generating any - * code - */ -#define uninitialized_var(x) x = x - -#ifndef NULL -#define NULL 0 -#endif - - -/** - * LONGSTRING macro - * gcc -pedantic warns about long string literals, LONGSTRING silences that. - */ -#if !defined(__GNUC__) -# define LONGSTRING -#else -# define LONGSTRING __extension__ -#endif - - -#ifndef M_PI -#define M_PI (3.14159265358979323846) -#endif - -#ifndef M_PI_2 -#define M_PI_2 (1.57079632679489661923) -#endif - -#ifndef M_PI_4 -#define M_PI_4 (0.785398163397448309616) -#endif - -#ifndef M_E -#define M_E (2.7182818284590452354) -#endif - -#ifndef M_LOG2E -#define M_LOG2E (1.4426950408889634074) -#endif - -#ifndef ONE_DIV_SQRT_LN2 -#define ONE_DIV_SQRT_LN2 (1.201122408786449815) -#endif - -#ifndef FLT_MAX_EXP -#define FLT_MAX_EXP 128 -#endif - -#define IEEE_ONE 0x3f800000 - -/** - * START/END_FAST_MATH macros: - * - * START_FAST_MATH: Set x86 FPU to faster, 32-bit precision mode (and save - * original mode to a temporary). - * END_FAST_MATH: Restore x86 FPU to original mode. - */ -#if defined(__GNUC__) && defined(__i386__) -/* - * Set the x86 FPU control word to guarentee only 32 bits of precision - * are stored in registers. Allowing the FPU to store more introduces - * differences between situations where numbers are pulled out of memory - * vs. situations where the compiler is able to optimize register usage. - * - * In the worst case, we force the compiler to use a memory access to - * truncate the float, by specifying the 'volatile' keyword. - */ -/* Hardware default: All exceptions masked, extended double precision, - * round to nearest (IEEE compliant): - */ -#define DEFAULT_X86_FPU 0x037f -/* All exceptions masked, single precision, round to nearest: - */ -#define FAST_X86_FPU 0x003f -/* The fldcw instruction will cause any pending FP exceptions to be - * raised prior to entering the block, and we clear any pending - * exceptions before exiting the block. Hence, asm code has free - * reign over the FPU while in the fast math block. - */ -#if defined(NO_FAST_MATH) -#define START_FAST_MATH(x) \ -do { \ - static GLuint mask = DEFAULT_X86_FPU; \ - __asm__ ( "fnstcw %0" : "=m" (*&(x)) ); \ - __asm__ ( "fldcw %0" : : "m" (mask) ); \ -} while (0) -#else -#define START_FAST_MATH(x) \ -do { \ - static GLuint mask = FAST_X86_FPU; \ - __asm__ ( "fnstcw %0" : "=m" (*&(x)) ); \ - __asm__ ( "fldcw %0" : : "m" (mask) ); \ -} while (0) -#endif -/* Restore original FPU mode, and clear any exceptions that may have - * occurred in the FAST_MATH block. - */ -#define END_FAST_MATH(x) \ -do { \ - __asm__ ( "fnclex ; fldcw %0" : : "m" (*&(x)) ); \ -} while (0) - -#elif defined(_MSC_VER) && defined(_M_IX86) -#define DEFAULT_X86_FPU 0x037f /* See GCC comments above */ -#define FAST_X86_FPU 0x003f /* See GCC comments above */ -#if defined(NO_FAST_MATH) -#define START_FAST_MATH(x) do {\ - static GLuint mask = DEFAULT_X86_FPU;\ - __asm fnstcw word ptr [x]\ - __asm fldcw word ptr [mask]\ -} while(0) -#else -#define START_FAST_MATH(x) do {\ - static GLuint mask = FAST_X86_FPU;\ - __asm fnstcw word ptr [x]\ - __asm fldcw word ptr [mask]\ -} while(0) -#endif -#define END_FAST_MATH(x) do {\ - __asm fnclex\ - __asm fldcw word ptr [x]\ -} while(0) - -#else -#define START_FAST_MATH(x) x = 0 -#define END_FAST_MATH(x) (void)(x) -#endif - - -#ifndef Elements -#define Elements(x) (sizeof(x)/sizeof(*(x))) -#endif - -#ifdef __cplusplus -} -#endif - - -#endif /* COMPILER_H */ diff --git a/3rdparty/glsl-optimizer/src/mesa/main/config.h b/3rdparty/glsl-optimizer/src/mesa/main/config.h deleted file mode 100644 index 4ec4b7502..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/main/config.h +++ /dev/null @@ -1,322 +0,0 @@ -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. - * Copyright (C) 2008 VMware, Inc. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -/** - * \file config.h - * Tunable configuration parameters. - */ - -#ifndef MESA_CONFIG_H_INCLUDED -#define MESA_CONFIG_H_INCLUDED - - -/** - * \name OpenGL implementation limits - */ -/*@{*/ - -/** Maximum modelview matrix stack depth */ -#define MAX_MODELVIEW_STACK_DEPTH 32 - -/** Maximum projection matrix stack depth */ -#define MAX_PROJECTION_STACK_DEPTH 32 - -/** Maximum texture matrix stack depth */ -#define MAX_TEXTURE_STACK_DEPTH 10 - -/** Maximum attribute stack depth */ -#define MAX_ATTRIB_STACK_DEPTH 16 - -/** Maximum client attribute stack depth */ -#define MAX_CLIENT_ATTRIB_STACK_DEPTH 16 - -/** Maximum recursion depth of display list calls */ -#define MAX_LIST_NESTING 64 - -/** Maximum number of lights */ -#define MAX_LIGHTS 8 - -/** - * Maximum number of user-defined clipping planes supported by any driver in - * Mesa. This is used to size arrays. - */ -#define MAX_CLIP_PLANES 8 - -/** Maximum pixel map lookup table size */ -#define MAX_PIXEL_MAP_TABLE 256 - -/** Maximum number of auxillary color buffers */ -#define MAX_AUX_BUFFERS 1 - -/** Maximum order (degree) of curves */ -#define MAX_EVAL_ORDER 30 - -/** Maximum Name stack depth */ -#define MAX_NAME_STACK_DEPTH 64 - -/** Minimum point size */ -#define MIN_POINT_SIZE 1.0 -/** Maximum point size */ -#define MAX_POINT_SIZE 60.0 -/** Point size granularity */ -#define POINT_SIZE_GRANULARITY 0.1 - -/** Minimum line width */ -#define MIN_LINE_WIDTH 1.0 -/** Maximum line width */ -#define MAX_LINE_WIDTH 10.0 -/** Line width granularity */ -#define LINE_WIDTH_GRANULARITY 0.1 - -/** Max memory to allow for a single texture image (in megabytes) */ -#define MAX_TEXTURE_MBYTES 1024 - -/** Number of 1D/2D texture mipmap levels */ -#define MAX_TEXTURE_LEVELS 15 - -/** Number of 3D texture mipmap levels */ -#define MAX_3D_TEXTURE_LEVELS 15 - -/** Number of cube texture mipmap levels - GL_ARB_texture_cube_map */ -#define MAX_CUBE_TEXTURE_LEVELS 15 - -/** Maximum rectangular texture size - GL_NV_texture_rectangle */ -#define MAX_TEXTURE_RECT_SIZE 16384 - -/** - * Maximum number of layers in a 1D or 2D array texture - GL_MESA_texture_array - */ -#define MAX_ARRAY_TEXTURE_LAYERS 64 - -/** - * Max number of texture coordinate units. This mainly just applies to - * the fixed-function vertex code. This will be difficult to raise above - * eight because of various vertex attribute bitvectors. - */ -#define MAX_TEXTURE_COORD_UNITS 8 - -/** - * Max number of texture image units. Also determines number of texture - * samplers in shaders. - */ -#define MAX_TEXTURE_IMAGE_UNITS 32 - -/** - * Larger of MAX_TEXTURE_COORD_UNITS and MAX_TEXTURE_IMAGE_UNITS. - * This value is only used for dimensioning arrays. - * Either MAX_TEXTURE_COORD_UNITS or MAX_TEXTURE_IMAGE_UNITS (or the - * corresponding ctx->Const.MaxTextureCoord/ImageUnits fields) should be - * used almost everywhere else. - */ -#define MAX_TEXTURE_UNITS ((MAX_TEXTURE_COORD_UNITS > MAX_TEXTURE_IMAGE_UNITS) ? MAX_TEXTURE_COORD_UNITS : MAX_TEXTURE_IMAGE_UNITS) - - -/** Maximum viewport size */ -#define MAX_VIEWPORT_WIDTH 16384 -#define MAX_VIEWPORT_HEIGHT 16384 - -/** Maximun number of viewports supported with ARB_viewport_array */ -#define MAX_VIEWPORTS 16 - -/** Maxmimum size for CVA. May be overridden by the drivers. */ -#define MAX_ARRAY_LOCK_SIZE 3000 - -/** Subpixel precision for antialiasing, window coordinate snapping */ -#define SUB_PIXEL_BITS 4 - -/** For GL_ARB_texture_compression */ -#define MAX_COMPRESSED_TEXTURE_FORMATS 25 - -/** For GL_EXT_texture_filter_anisotropic */ -#define MAX_TEXTURE_MAX_ANISOTROPY 16.0 - -/** For GL_EXT_texture_lod_bias (typically MAX_TEXTURE_LEVELS - 1) */ -#define MAX_TEXTURE_LOD_BIAS 14.0 - -/** For any program target/extension */ -/*@{*/ -#define MAX_PROGRAM_INSTRUCTIONS (16 * 1024) - -/** - * Per-program constants (power of two) - * - * \c MAX_PROGRAM_LOCAL_PARAMS and \c MAX_UNIFORMS are just the assembly shader - * and GLSL shader names for the same thing. They should \b always have the - * same value. Each refers to the number of vec4 values supplied as - * per-program parameters. - */ -/*@{*/ -#define MAX_PROGRAM_LOCAL_PARAMS 4096 -#define MAX_UNIFORMS 4096 -#define MAX_UNIFORM_BUFFERS 15 /* + 1 default uniform buffer */ -/* 6 is for vertex, hull, domain, geometry, fragment, and compute shader. */ -#define MAX_COMBINED_UNIFORM_BUFFERS (MAX_UNIFORM_BUFFERS * 6) -#define MAX_ATOMIC_COUNTERS 4096 -/* 6 is for vertex, hull, domain, geometry, fragment, and compute shader. */ -#define MAX_COMBINED_ATOMIC_BUFFERS (MAX_UNIFORM_BUFFERS * 6) -/* Size of an atomic counter in bytes according to ARB_shader_atomic_counters */ -#define ATOMIC_COUNTER_SIZE 4 -#define MAX_IMAGE_UNIFORMS 16 -/* 6 is for vertex, hull, domain, geometry, fragment, and compute shader. */ -#define MAX_IMAGE_UNITS (MAX_IMAGE_UNIFORMS * 6) -/*@}*/ - -/** - * Per-context constants (power of two) - * - * \note - * This value should always be less than or equal to \c MAX_PROGRAM_LOCAL_PARAMS - * and \c MAX_VERTEX_PROGRAM_PARAMS. Otherwise some applications will make - * incorrect assumptions. - */ -#define MAX_PROGRAM_ENV_PARAMS 256 - -#define MAX_PROGRAM_MATRICES 8 -#define MAX_PROGRAM_MATRIX_STACK_DEPTH 4 -#define MAX_PROGRAM_CALL_DEPTH 8 -#define MAX_PROGRAM_TEMPS 256 -#define MAX_PROGRAM_ADDRESS_REGS 1 -#define MAX_VARYING 32 /**< number of float[4] vectors */ -#define MAX_SAMPLERS MAX_TEXTURE_IMAGE_UNITS -#define MAX_PROGRAM_INPUTS 32 -#define MAX_PROGRAM_OUTPUTS 64 -/*@}*/ - -/** For GL_ARB_vertex_program */ -/*@{*/ -#define MAX_VERTEX_PROGRAM_ADDRESS_REGS 1 -#define MAX_VERTEX_PROGRAM_PARAMS MAX_UNIFORMS -/*@}*/ - -/** For GL_ARB_fragment_program */ -/*@{*/ -#define MAX_FRAGMENT_PROGRAM_ADDRESS_REGS 0 -/*@}*/ - -/** For GL_NV_fragment_program */ -/*@{*/ -#define MAX_NV_FRAGMENT_PROGRAM_INSTRUCTIONS 1024 /* 72 for GL_ARB_f_p */ -#define MAX_NV_FRAGMENT_PROGRAM_TEMPS 96 -#define MAX_NV_FRAGMENT_PROGRAM_PARAMS 64 -#define MAX_NV_FRAGMENT_PROGRAM_INPUTS 12 -#define MAX_NV_FRAGMENT_PROGRAM_OUTPUTS 3 -#define MAX_NV_FRAGMENT_PROGRAM_WRITE_ONLYS 2 -/*@}*/ - - -/** For GL_ARB_vertex_shader */ -/*@{*/ -#define MAX_VERTEX_GENERIC_ATTRIBS 16 -/* 6 is for vertex, hull, domain, geometry, fragment, and compute shader. */ -#define MAX_COMBINED_TEXTURE_IMAGE_UNITS (MAX_TEXTURE_IMAGE_UNITS * 6) -/*@}*/ - - -/** For GL_ARB_draw_buffers */ -/*@{*/ -#define MAX_DRAW_BUFFERS 8 -/*@}*/ - - -/** For GL_EXT_framebuffer_object */ -/*@{*/ -#define MAX_COLOR_ATTACHMENTS 8 -#define MAX_RENDERBUFFER_SIZE 16384 -/*@}*/ - -/** For GL_ATI_envmap_bump - support bump mapping on first 8 units */ -#define SUPPORTED_ATI_BUMP_UNITS 0xff - -/** For GL_EXT_transform_feedback */ -#define MAX_FEEDBACK_BUFFERS 4 -#define MAX_FEEDBACK_ATTRIBS 32 - -/** For GL_ARB_geometry_shader4 */ -/*@{*/ -#define MAX_GEOMETRY_UNIFORM_COMPONENTS 512 -#define MAX_GEOMETRY_OUTPUT_VERTICES 256 -#define MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 1024 -/*@}*/ - -/** For GL_ARB_debug_output and GL_KHR_debug */ -/*@{*/ -#define MAX_DEBUG_LOGGED_MESSAGES 10 -#define MAX_DEBUG_MESSAGE_LENGTH 4096 -/*@}*/ - -/** For GL_KHR_debug */ -/*@{*/ -#define MAX_LABEL_LENGTH 256 -#define MAX_DEBUG_GROUP_STACK_DEPTH 64 -/*@}*/ - -/** For GL_ARB_gpu_shader5 */ -/*@{*/ -#define MAX_GEOMETRY_SHADER_INVOCATIONS 32 -#define MIN_FRAGMENT_INTERPOLATION_OFFSET -0.5 -#define MAX_FRAGMENT_INTERPOLATION_OFFSET 0.5 -#define FRAGMENT_INTERPOLATION_OFFSET_BITS 4 -#define MAX_VERTEX_STREAMS 4 -/*@}*/ - -/** For GL_INTEL_performance_query */ -/*@{*/ -#define MAX_PERFQUERY_QUERY_NAME_LENGTH 256 -#define MAX_PERFQUERY_COUNTER_NAME_LENGTH 256 -#define MAX_PERFQUERY_COUNTER_DESC_LENGTH 1024 -#define PERFQUERY_HAVE_GPA_EXTENDED_COUNTERS 0 -/*@}*/ - -/** For GL_ARB_compute_shader */ -/*@{*/ -#define MAX_COMPUTE_UNIFORM_BLOCKS 12 -#define MAX_COMPUTE_TEXTURE_IMAGE_UNITS 16 -#define MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 8 -#define MAX_COMPUTE_ATOMIC_COUNTERS 8 -#define MAX_COMPUTE_SHARED_MEMORY_SIZE 32768 -#define MAX_COMPUTE_UNIFORM_COMPONENTS 512 -#define MAX_COMPUTE_IMAGE_UNIFORMS 8 -/*@}*/ - -/* - * Color channel component order - * - * \note Changes will almost certainly cause problems at this time. - */ -#define RCOMP 0 -#define GCOMP 1 -#define BCOMP 2 -#define ACOMP 3 - - -/** - * Maximum number of temporary vertices required for clipping. - * - * Used in array_cache and tnl modules. - */ -#define MAX_CLIPPED_VERTICES ((2 * (6 + MAX_CLIP_PLANES))+1) - - -#endif /* MESA_CONFIG_H_INCLUDED */ diff --git a/3rdparty/glsl-optimizer/src/mesa/main/context.h b/3rdparty/glsl-optimizer/src/mesa/main/context.h deleted file mode 100644 index 4e4149c16..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/main/context.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - -#ifndef CONTEXT_H -#define CONTEXT_H - - -#include "imports.h" -#include "mtypes.h" - - -#ifdef __cplusplus -extern "C" { -#endif - - -/** - * Checks if the context is for Desktop GL (Compatibility or Core) - */ -static inline GLboolean -_mesa_is_desktop_gl(const struct gl_context *ctx) -{ - return ctx->API == API_OPENGL_COMPAT || ctx->API == API_OPENGL_CORE; -} - - -/** - * Checks if the context is for any GLES version - */ -static inline GLboolean -_mesa_is_gles(const struct gl_context *ctx) -{ - return ctx->API == API_OPENGLES || ctx->API == API_OPENGLES2; -} - - -/** - * Checks if the context is for GLES 3.x - */ -static inline GLboolean -_mesa_is_gles3(const struct gl_context *ctx) -{ - return ctx->API == API_OPENGLES2 && ctx->Version >= 30; -} - - -/** - * Checks if the context supports geometry shaders. - */ -static inline GLboolean -_mesa_has_geometry_shaders(const struct gl_context *ctx) -{ - return _mesa_is_desktop_gl(ctx) && - (ctx->Version >= 32 || ctx->Extensions.ARB_geometry_shader4); -} - - -#ifdef __cplusplus -} -#endif - - -#endif /* CONTEXT_H */ diff --git a/3rdparty/glsl-optimizer/src/mesa/main/core.h b/3rdparty/glsl-optimizer/src/mesa/main/core.h deleted file mode 100644 index 73ed01c25..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/main/core.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Mesa 3-D graphics library - * - * Copyright (C) 2010 LunarG Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Authors: - * Chia-I Wu - */ - - -/** - * \file core.h - * The public header of core mesa. - * - * This file is the (only) public header of core mesa. It is supposed to be - * used by GLX, WGL, and GLSL. - */ - - -#ifndef CORE_H -#define CORE_H - - -#include "main/glheader.h" -#include "main/compiler.h" -#include "main/imports.h" -#include "main/macros.h" - -#include "main/mtypes.h" - -/* for GLSL */ -#include "program/prog_parameter.h" - - -#endif /* CORE_H */ diff --git a/3rdparty/glsl-optimizer/src/mesa/main/dd.h b/3rdparty/glsl-optimizer/src/mesa/main/dd.h deleted file mode 100644 index 3f60b182c..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/main/dd.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * \file dd.h - * Device driver interfaces. - */ - -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - -#ifndef DD_INCLUDED -#define DD_INCLUDED - -/* THIS FILE ONLY INCLUDED BY mtypes.h !!!!! */ - -#include "glheader.h" - -struct gl_context; -struct gl_program; -struct gl_shader; - - -struct dd_function_table { - - /** - * \name GLSL-related functions (ARB extensions and OpenGL 2.x) - */ - /*@{*/ - struct gl_shader *(*NewShader)(struct gl_context *ctx, - GLuint name, GLenum type); - void (*DeleteShader)(struct gl_context *ctx, struct gl_shader *shader); -}; - -#endif /* DD_INCLUDED */ diff --git a/3rdparty/glsl-optimizer/src/mesa/main/errors.h b/3rdparty/glsl-optimizer/src/mesa/main/errors.h deleted file mode 100644 index 593e23272..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/main/errors.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - -/** - * \file errors.h - * Mesa debugging and error handling functions. - * - * This file provides functions to record errors, warnings, and miscellaneous - * debug information. - */ - - -#ifndef ERRORS_H -#define ERRORS_H - -#include "c99_compat.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern void -_mesa_error_no_memory(const char *caller); - - -#ifdef __cplusplus -} -#endif - - -#endif /* ERRORS_H */ diff --git a/3rdparty/glsl-optimizer/src/mesa/main/glheader.h b/3rdparty/glsl-optimizer/src/mesa/main/glheader.h deleted file mode 100644 index 158a72b2f..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/main/glheader.h +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - -/** - * \file glheader.h - * Wrapper for GL/gl.h - */ - - -#ifndef GLHEADER_H -#define GLHEADER_H - - -#define GL_GLEXT_PROTOTYPES -#include "glminimal.h" - - -// just the set of constants needed from glext.h -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_GEOMETRY_SHADER 0x8DD9 -#define GL_GEOMETRY_SHADER_ARB 0x8DD9 -#define GL_COMPUTE_SHADER 0x91B9 - -#define GL_DEBUG_TYPE_ERROR_ARB 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E -#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 -#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 - -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 - -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A - -#define GL_SAMPLER_1D_ARRAY 0x8DC0 -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_UNSIGNED_INT_VEC2 0x8DC6 -#define GL_UNSIGNED_INT_VEC3 0x8DC7 -#define GL_UNSIGNED_INT_VEC4 0x8DC8 -#define GL_INT_SAMPLER_1D 0x8DC9 -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 - -#define GL_SAMPLER_2D_RECT 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 -#define GL_SAMPLER_BUFFER 0x8DC2 -#define GL_INT_SAMPLER_2D_RECT 0x8DCD -#define GL_INT_SAMPLER_BUFFER 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D -#define GL_TEXTURE_RECTANGLE 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 - -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_SEPARATE_ATTRIBS 0x8C8D - -#define GL_IMAGE_1D 0x904C -#define GL_IMAGE_2D 0x904D -#define GL_IMAGE_3D 0x904E -#define GL_IMAGE_2D_RECT 0x904F -#define GL_IMAGE_CUBE 0x9050 -#define GL_IMAGE_BUFFER 0x9051 -#define GL_IMAGE_1D_ARRAY 0x9052 -#define GL_IMAGE_2D_ARRAY 0x9053 -#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 -#define GL_IMAGE_2D_MULTISAMPLE 0x9055 -#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 -#define GL_INT_IMAGE_1D 0x9057 -#define GL_INT_IMAGE_2D 0x9058 -#define GL_INT_IMAGE_3D 0x9059 -#define GL_INT_IMAGE_2D_RECT 0x905A -#define GL_INT_IMAGE_CUBE 0x905B -#define GL_INT_IMAGE_BUFFER 0x905C -#define GL_INT_IMAGE_1D_ARRAY 0x905D -#define GL_INT_IMAGE_2D_ARRAY 0x905E -#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F -#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 -#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 -#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 -#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 -#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 -#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 -#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 -#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA - - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef int GLfixed; -typedef int GLclampx; -typedef unsigned short GLhalfARB; - - -#ifndef GL_OES_EGL_image -typedef void *GLeglImageOES; -#endif - - -#ifndef GL_OES_EGL_image_external -#define GL_TEXTURE_EXTERNAL_OES 0x8D65 -#define GL_SAMPLER_EXTERNAL_OES 0x8D66 -#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 -#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 -#endif - -#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB - - -#ifndef GL_OES_point_size_array -#define GL_POINT_SIZE_ARRAY_OES 0x8B9C -#define GL_POINT_SIZE_ARRAY_TYPE_OES 0x898A -#define GL_POINT_SIZE_ARRAY_STRIDE_OES 0x898B -#define GL_POINT_SIZE_ARRAY_POINTER_OES 0x898C -#define GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES 0x8B9F -#endif - - -#ifndef GL_OES_draw_texture -#define GL_TEXTURE_CROP_RECT_OES 0x8B9D -#endif - - -#ifndef GL_PROGRAM_BINARY_LENGTH_OES -#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 -#endif - -#ifndef GL_TEXTURE_GEN_STR_OES -#define GL_TEXTURE_GEN_STR_OES 0x8D60 -#endif - -#ifndef GL_OES_compressed_paletted_texture -#define GL_PALETTE4_RGB8_OES 0x8B90 -#define GL_PALETTE4_RGBA8_OES 0x8B91 -#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 -#define GL_PALETTE4_RGBA4_OES 0x8B93 -#define GL_PALETTE4_RGB5_A1_OES 0x8B94 -#define GL_PALETTE8_RGB8_OES 0x8B95 -#define GL_PALETTE8_RGBA8_OES 0x8B96 -#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 -#define GL_PALETTE8_RGBA4_OES 0x8B98 -#define GL_PALETTE8_RGB5_A1_OES 0x8B99 -#endif - -#ifndef GL_ES_VERSION_2_0 -#define GL_SHADER_BINARY_FORMATS 0x8DF8 -#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 -#define GL_SHADER_COMPILER 0x8DFA -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD -#endif - -#ifndef GL_ATI_texture_compression_3dc -#define GL_ATI_texture_compression_3dc 1 -#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837 -#endif - -#ifndef GL_OES_compressed_ETC1_RGB8_texture -#define GL_ETC1_RGB8_OES 0x8D64 -#endif - - -/* Inexplicably, GL_HALF_FLOAT_OES has a different value than GL_HALF_FLOAT. - */ -#ifndef GL_HALF_FLOAT_OES -#define GL_HALF_FLOAT_OES 0x8D61 -#endif - - -/** - * Internal token to represent a GLSL shader program (a collection of - * one or more shaders that get linked together). Note that GLSL - * shaders and shader programs share one name space (one hash table) - * so we need a value that's different from any of the - * GL_VERTEX/FRAGMENT/GEOMETRY_PROGRAM tokens. - */ -#define GL_SHADER_PROGRAM_MESA 0x9999 - - -/** - * Internal token for geometry programs. - * Use the value for GL_GEOMETRY_PROGRAM_NV for now. - */ -#define MESA_GEOMETRY_PROGRAM 0x8c26 - - -#ifdef __cplusplus -} -#endif - -#endif /* GLHEADER_H */ diff --git a/3rdparty/glsl-optimizer/src/mesa/main/glminimal.h b/3rdparty/glsl-optimizer/src/mesa/main/glminimal.h deleted file mode 100644 index 53803e2b1..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/main/glminimal.h +++ /dev/null @@ -1,479 +0,0 @@ -/* - * Mesa 3-D graphics library - * Version: 7.6 - * - * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. - * Copyright (C) 2009 VMware, Inc. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - Minimized version of gl.h with only things that the GLSL compiler needs. -*/ - -#ifndef __gl_minimal_h_ -#define __gl_minimal_h_ - -#include "stdint.h" - - -/********************************************************************** - * Begin system-specific stuff. Do not do any of this when building - * for SciTech SNAP, as this is all done before this header file is - * included. - */ -#if !defined(__SCITECH_SNAP__) - -#if defined(__BEOS__) -#include /* to get some BeOS-isms */ -#endif - -#if !defined(OPENSTEP) && (defined(NeXT) || defined(NeXT_PDO)) -#define OPENSTEP -#endif - -#if defined(_WIN32) && !defined(__WIN32__) && !defined(__CYGWIN__) -#define __WIN32__ -#endif - -#if (defined(__BEOS__) && defined(__POWERPC__)) || defined(__QUICKDRAW__) -# define PRAGMA_EXPORT_SUPPORTED 1 -#endif - -#if defined(macintosh) && PRAGMA_IMPORT_SUPPORTED -#pragma import on -#endif - -#ifdef CENTERLINE_CLPP -#define signed -#endif - -#if defined(PRAGMA_EXPORT_SUPPORTED) -#pragma export on -#endif - -#endif /* !__SCITECH_SNAP__ */ -/* - * End system-specific stuff. - **********************************************************************/ - - - - -#define GL_VERSION_1_1 1 -#define GL_VERSION_1_2 1 -#define GL_VERSION_1_3 1 -#define GL_ARB_imaging 1 - - -/* - * Datatypes - */ -typedef unsigned int GLenum; -typedef unsigned char GLboolean; -typedef unsigned int GLbitfield; -typedef void GLvoid; -typedef signed char GLbyte; /* 1-byte signed */ -typedef short GLshort; /* 2-byte signed */ -typedef int GLint; /* 4-byte signed */ -typedef unsigned char GLubyte; /* 1-byte unsigned */ -typedef unsigned short GLushort; /* 2-byte unsigned */ -typedef unsigned int GLuint; /* 4-byte unsigned */ -typedef int GLsizei; /* 4-byte signed */ -typedef float GLfloat; /* single precision float */ -typedef float GLclampf; /* single precision float in [0,1] */ -typedef double GLdouble; /* double precision float */ -typedef double GLclampd; /* double precision float in [0,1] */ -typedef char GLchar; -typedef char GLcharARB; -typedef int64_t GLint64; -typedef uint64_t GLuint64; - - - - -/* - * Constants - */ - -/* Boolean values */ -#define GL_FALSE 0x0 -#define GL_TRUE 0x1 - -/* Data types */ -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_2_BYTES 0x1407 -#define GL_3_BYTES 0x1408 -#define GL_4_BYTES 0x1409 -#define GL_DOUBLE 0x140A - -/* Primitives */ -#define GL_POINTS 0x0000 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_QUADS 0x0007 -#define GL_QUAD_STRIP 0x0008 -#define GL_POLYGON 0x0009 -#define GL_LINES_ADJACENCY 0x000A -#define GL_LINE_STRIP_ADJACENCY 0x000B -#define GL_TRIANGLES_ADJACENCY 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D - - -/* Matrix Mode */ -#define GL_MATRIX_MODE 0x0BA0 -#define GL_MODELVIEW 0x1700 -#define GL_PROJECTION 0x1701 -#define GL_TEXTURE 0x1702 - -/* Points */ -#define GL_POINT_SMOOTH 0x0B10 -#define GL_POINT_SIZE 0x0B11 -#define GL_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_POINT_SIZE_RANGE 0x0B12 - - -/* Polygons */ -#define GL_POINT 0x1B00 -#define GL_LINE 0x1B01 -#define GL_FILL 0x1B02 -#define GL_CW 0x0900 -#define GL_CCW 0x0901 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_POLYGON_MODE 0x0B40 -#define GL_POLYGON_SMOOTH 0x0B41 -#define GL_POLYGON_STIPPLE 0x0B42 -#define GL_EDGE_FLAG 0x0B43 -#define GL_CULL_FACE 0x0B44 -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_POINT 0x2A01 -#define GL_POLYGON_OFFSET_LINE 0x2A02 -#define GL_POLYGON_OFFSET_FILL 0x8037 - -/* Display Lists */ -#define GL_COMPILE 0x1300 -#define GL_COMPILE_AND_EXECUTE 0x1301 -#define GL_LIST_BASE 0x0B32 -#define GL_LIST_INDEX 0x0B33 -#define GL_LIST_MODE 0x0B30 - -/* Depth buffer */ -#define GL_NEVER 0x0200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 -#define GL_DEPTH_TEST 0x0B71 -#define GL_DEPTH_BITS 0x0D56 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_COMPONENT 0x1902 - - -/* Blending */ -#define GL_BLEND 0x0BE2 -#define GL_BLEND_SRC 0x0BE1 -#define GL_BLEND_DST 0x0BE0 -#define GL_ZERO 0x0 -#define GL_ONE 0x1 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 - -/* Render Mode */ -#define GL_FEEDBACK 0x1C01 -#define GL_RENDER 0x1C00 -#define GL_SELECT 0x1C02 - - -/* Buffers, Pixel Drawing/Reading */ -#define GL_NONE 0x0 -#define GL_LEFT 0x0406 -#define GL_RIGHT 0x0407 -/*GL_FRONT 0x0404 */ -/*GL_BACK 0x0405 */ -/*GL_FRONT_AND_BACK 0x0408 */ -#define GL_FRONT_LEFT 0x0400 -#define GL_FRONT_RIGHT 0x0401 -#define GL_BACK_LEFT 0x0402 -#define GL_BACK_RIGHT 0x0403 -#define GL_COLOR_INDEX 0x1900 -#define GL_INDEX_BITS 0x0D51 -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_READ_BUFFER 0x0C02 -#define GL_DRAW_BUFFER 0x0C01 -#define GL_DOUBLEBUFFER 0x0C32 -#define GL_BITMAP 0x1A00 -#define GL_COLOR 0x1800 -#define GL_DEPTH 0x1801 -#define GL_DITHER 0x0BD0 - -/* Implementation limits */ -#define GL_MAX_LIST_NESTING 0x0B31 -#define GL_MAX_EVAL_ORDER 0x0D30 -#define GL_MAX_LIGHTS 0x0D31 -#define GL_MAX_CLIP_PLANES 0x0D32 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 -#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 -#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 -#define GL_MAX_NAME_STACK_DEPTH 0x0D37 -#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 -#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B - -/* Gets */ -#define GL_ATTRIB_STACK_DEPTH 0x0BB0 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_CURRENT_INDEX 0x0B01 -#define GL_CURRENT_COLOR 0x0B00 -#define GL_CURRENT_NORMAL 0x0B02 -#define GL_CURRENT_RASTER_COLOR 0x0B04 -#define GL_CURRENT_RASTER_DISTANCE 0x0B09 -#define GL_CURRENT_RASTER_INDEX 0x0B05 -#define GL_CURRENT_RASTER_POSITION 0x0B07 -#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 -#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 -#define GL_CURRENT_TEXTURE_COORDS 0x0B03 -#define GL_INDEX_CLEAR_VALUE 0x0C20 -#define GL_INDEX_MODE 0x0C30 -#define GL_INDEX_WRITEMASK 0x0C21 -#define GL_MODELVIEW_MATRIX 0x0BA6 -#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 -#define GL_NAME_STACK_DEPTH 0x0D70 -#define GL_PROJECTION_MATRIX 0x0BA7 -#define GL_PROJECTION_STACK_DEPTH 0x0BA4 -#define GL_RENDER_MODE 0x0C40 -#define GL_TEXTURE_MATRIX 0x0BA8 -#define GL_TEXTURE_STACK_DEPTH 0x0BA5 -#define GL_VIEWPORT 0x0BA2 - - -/* Scissor box */ -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 - -/* Pixel Mode / Transfer */ -#define GL_MAP_COLOR 0x0D10 -#define GL_MAP_STENCIL 0x0D11 -#define GL_INDEX_SHIFT 0x0D12 -#define GL_INDEX_OFFSET 0x0D13 -#define GL_DEPTH_SCALE 0x0D1E -#define GL_DEPTH_BIAS 0x0D1F -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_PACK_LSB_FIRST 0x0D01 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_PACK_SKIP_ROWS 0x0D03 -#define GL_PACK_SWAP_BYTES 0x0D00 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_UNPACK_LSB_FIRST 0x0CF1 -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SWAP_BYTES 0x0CF0 -#define GL_ZOOM_X 0x0D16 -#define GL_ZOOM_Y 0x0D17 - -/* Texture mapping */ -#define GL_TEXTURE_ENV 0x2300 -#define GL_TEXTURE_ENV_MODE 0x2200 -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_ENV_COLOR 0x2201 -#define GL_TEXTURE_GEN_S 0x0C60 -#define GL_TEXTURE_GEN_T 0x0C61 -#define GL_TEXTURE_GEN_R 0x0C62 -#define GL_TEXTURE_GEN_Q 0x0C63 -#define GL_TEXTURE_GEN_MODE 0x2500 -#define GL_TEXTURE_BORDER_COLOR 0x1004 -#define GL_TEXTURE_WIDTH 0x1000 -#define GL_TEXTURE_HEIGHT 0x1001 -#define GL_TEXTURE_BORDER 0x1005 -#define GL_TEXTURE_COMPONENTS 0x1003 -#define GL_TEXTURE_RED_SIZE 0x805C -#define GL_TEXTURE_GREEN_SIZE 0x805D -#define GL_TEXTURE_BLUE_SIZE 0x805E -#define GL_TEXTURE_ALPHA_SIZE 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE 0x8061 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_OBJECT_LINEAR 0x2401 -#define GL_OBJECT_PLANE 0x2501 -#define GL_EYE_LINEAR 0x2400 -#define GL_EYE_PLANE 0x2502 -#define GL_SPHERE_MAP 0x2402 -#define GL_DECAL 0x2101 -#define GL_MODULATE 0x2100 -#define GL_NEAREST 0x2600 -#define GL_REPEAT 0x2901 -#define GL_CLAMP 0x2900 -#define GL_S 0x2000 -#define GL_T 0x2001 -#define GL_R 0x2002 -#define GL_Q 0x2003 - -/* Utility */ -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 - -/* Errors */ -#define GL_NO_ERROR 0x0 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#define GL_OUT_OF_MEMORY 0x0505 - -/* glPush/PopAttrib bits */ -#define GL_CURRENT_BIT 0x00000001 -#define GL_POINT_BIT 0x00000002 -#define GL_LINE_BIT 0x00000004 -#define GL_POLYGON_BIT 0x00000008 -#define GL_POLYGON_STIPPLE_BIT 0x00000010 -#define GL_PIXEL_MODE_BIT 0x00000020 -#define GL_LIGHTING_BIT 0x00000040 -#define GL_FOG_BIT 0x00000080 -#define GL_VIEWPORT_BIT 0x00000800 -#define GL_TRANSFORM_BIT 0x00001000 -#define GL_ENABLE_BIT 0x00002000 -#define GL_HINT_BIT 0x00008000 -#define GL_EVAL_BIT 0x00010000 -#define GL_LIST_BIT 0x00020000 -#define GL_TEXTURE_BIT 0x00040000 -#define GL_SCISSOR_BIT 0x00080000 -#define GL_ALL_ATTRIB_BITS 0x000FFFFF - - -/* OpenGL 1.1 */ -#define GL_TEXTURE_PRIORITY 0x8066 -#define GL_TEXTURE_RESIDENT 0x8067 -#define GL_TEXTURE_BINDING_1D 0x8068 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 - - -#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F - -#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 -#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D - -/* Texture formats */ -#define GL_RGBA32F 0x8814 -#define GL_RGB32F 0x8815 -#define GL_RGBA16F 0x881A -#define GL_RGB16F 0x881B -#define GL_R8 0x8229 -#define GL_R16 0x822A -#define GL_RG8 0x822B -#define GL_RG16 0x822C -#define GL_R16F 0x822D -#define GL_R32F 0x822E -#define GL_RG16F 0x822F -#define GL_RG32F 0x8230 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C -#define GL_RGBA32UI 0x8D70 -#define GL_RGB32UI 0x8D71 -#define GL_RGBA16UI 0x8D76 -#define GL_RGB16UI 0x8D77 -#define GL_RGBA8UI 0x8D7C -#define GL_RGB8UI 0x8D7D -#define GL_RGBA32I 0x8D82 -#define GL_RGB32I 0x8D83 -#define GL_RGBA16I 0x8D88 -#define GL_RGB16I 0x8D89 -#define GL_RGBA8I 0x8D8E -#define GL_RGB8I 0x8D8F -#define GL_RGBA8 0x8058 -#define GL_RGB10_A2 0x8059 -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGBA16_SNORM 0x8F9B -#define GL_RGB10_A2UI 0x906F -#define GL_RGBA16 0x805B - - -#define GL_INVALID_INDEX 0xFFFFFFFF - - -#endif /* __gl_h_ */ diff --git a/3rdparty/glsl-optimizer/src/mesa/main/imports.c b/3rdparty/glsl-optimizer/src/mesa/main/imports.c deleted file mode 100644 index 300c8f327..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/main/imports.c +++ /dev/null @@ -1,554 +0,0 @@ -/** - * \file imports.c - * Standard C library function wrappers. - * - * Imports are services which the device driver or window system or - * operating system provides to the core renderer. The core renderer (Mesa) - * will call these functions in order to do memory allocation, simple I/O, - * etc. - * - * Some drivers will want to override/replace this file with something - * specialized, but that'll be rare. - * - * Eventually, I want to move roll the glheader.h file into this. - * - * \todo Functions still needed: - * - scanf - * - qsort - * - rand and RAND_MAX - */ - -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - - -#include "imports.h" - -#ifdef _GNU_SOURCE -#include -#ifdef __APPLE__ -#include -#endif -#endif - - -#ifdef _WIN32 -#define vsnprintf _vsnprintf -#elif defined(__IBMC__) || defined(__IBMCPP__) -extern int vsnprintf(char *str, size_t count, const char *fmt, va_list arg); -#endif - -/**********************************************************************/ -/** \name Memory */ -/*@{*/ - -/** - * Allocate aligned memory. - * - * \param bytes number of bytes to allocate. - * \param alignment alignment (must be greater than zero). - * - * Allocates extra memory to accommodate rounding up the address for - * alignment and to record the real malloc address. - * - * \sa _mesa_align_free(). - */ -void * -_mesa_align_malloc(size_t bytes, unsigned long alignment) -{ -#if defined(HAVE_POSIX_MEMALIGN) - void *mem; - int err = posix_memalign(& mem, alignment, bytes); - if (err) - return NULL; - return mem; -#elif defined(_WIN32) && defined(_MSC_VER) - return _aligned_malloc(bytes, alignment); -#else - uintptr_t ptr, buf; - - ASSERT( alignment > 0 ); - - ptr = (uintptr_t)malloc(bytes + alignment + sizeof(void *)); - if (!ptr) - return NULL; - - buf = (ptr + alignment + sizeof(void *)) & ~(uintptr_t)(alignment - 1); - *(uintptr_t *)(buf - sizeof(void *)) = ptr; - -#ifdef DEBUG - /* mark the non-aligned area */ - while ( ptr < buf - sizeof(void *) ) { - *(unsigned long *)ptr = 0xcdcdcdcd; - ptr += sizeof(unsigned long); - } -#endif - - return (void *) buf; -#endif /* defined(HAVE_POSIX_MEMALIGN) */ -} - -/** - * Same as _mesa_align_malloc(), but using calloc(1, ) instead of - * malloc() - */ -void * -_mesa_align_calloc(size_t bytes, unsigned long alignment) -{ -#if defined(HAVE_POSIX_MEMALIGN) - void *mem; - - mem = _mesa_align_malloc(bytes, alignment); - if (mem != NULL) { - (void) memset(mem, 0, bytes); - } - - return mem; -#elif defined(_WIN32) && defined(_MSC_VER) - void *mem; - - mem = _aligned_malloc(bytes, alignment); - if (mem != NULL) { - (void) memset(mem, 0, bytes); - } - - return mem; -#else - uintptr_t ptr, buf; - - ASSERT( alignment > 0 ); - - ptr = (uintptr_t)calloc(1, bytes + alignment + sizeof(void *)); - if (!ptr) - return NULL; - - buf = (ptr + alignment + sizeof(void *)) & ~(uintptr_t)(alignment - 1); - *(uintptr_t *)(buf - sizeof(void *)) = ptr; - -#ifdef DEBUG - /* mark the non-aligned area */ - while ( ptr < buf - sizeof(void *) ) { - *(unsigned long *)ptr = 0xcdcdcdcd; - ptr += sizeof(unsigned long); - } -#endif - - return (void *)buf; -#endif /* defined(HAVE_POSIX_MEMALIGN) */ -} - -/** - * Free memory which was allocated with either _mesa_align_malloc() - * or _mesa_align_calloc(). - * \param ptr pointer to the memory to be freed. - * The actual address to free is stored in the word immediately before the - * address the client sees. - * Note that it is legal to pass NULL pointer to this function and will be - * handled accordingly. - */ -void -_mesa_align_free(void *ptr) -{ -#if defined(HAVE_POSIX_MEMALIGN) - free(ptr); -#elif defined(_WIN32) && defined(_MSC_VER) - _aligned_free(ptr); -#else - if (ptr) { - void **cubbyHole = (void **) ((char *) ptr - sizeof(void *)); - void *realAddr = *cubbyHole; - free(realAddr); - } -#endif /* defined(HAVE_POSIX_MEMALIGN) */ -} - -/** - * Reallocate memory, with alignment. - */ -void * -_mesa_align_realloc(void *oldBuffer, size_t oldSize, size_t newSize, - unsigned long alignment) -{ -#if defined(_WIN32) && defined(_MSC_VER) - (void) oldSize; - return _aligned_realloc(oldBuffer, newSize, alignment); -#else - const size_t copySize = (oldSize < newSize) ? oldSize : newSize; - void *newBuf = _mesa_align_malloc(newSize, alignment); - if (newBuf && oldBuffer && copySize > 0) { - memcpy(newBuf, oldBuffer, copySize); - } - - _mesa_align_free(oldBuffer); - return newBuf; -#endif -} - -/*@}*/ - - -/**********************************************************************/ -/** \name Math */ -/*@{*/ - - -#ifndef HAVE___BUILTIN_FFS -/** - * Find the first bit set in a word. - */ -int -ffs(int i) -{ - register int bit = 0; - if (i != 0) { - if ((i & 0xffff) == 0) { - bit += 16; - i >>= 16; - } - if ((i & 0xff) == 0) { - bit += 8; - i >>= 8; - } - if ((i & 0xf) == 0) { - bit += 4; - i >>= 4; - } - while ((i & 1) == 0) { - bit++; - i >>= 1; - } - bit++; - } - return bit; -} -#endif - -#ifndef HAVE___BUILTIN_FFSLL -/** - * Find position of first bit set in given value. - * XXX Warning: this function can only be used on 64-bit systems! - * \return position of least-significant bit set, starting at 1, return zero - * if no bits set. - */ -int -ffsll(long long int val) -{ - int bit; - - assert(sizeof(val) == 8); - - bit = ffs((int) val); - if (bit != 0) - return bit; - - bit = ffs((int) (val >> 32)); - if (bit != 0) - return 32 + bit; - - return 0; -} -#endif - - -#ifndef HAVE___BUILTIN_POPCOUNT -/** - * Return number of bits set in given GLuint. - */ -unsigned int -_mesa_bitcount(unsigned int n) -{ - unsigned int bits; - for (bits = 0; n > 0; n = n >> 1) { - bits += (n & 1); - } - return bits; -} -#endif - -#ifndef HAVE___BUILTIN_POPCOUNTLL -/** - * Return number of bits set in given 64-bit uint. - */ -unsigned int -_mesa_bitcount_64(uint64_t n) -{ - unsigned int bits; - for (bits = 0; n > 0; n = n >> 1) { - bits += (n & 1); - } - return bits; -} -#endif - - -/* Using C99 rounding functions for roundToEven() implementation is - * difficult, because round(), rint, and nearbyint() are affected by - * fesetenv(), which the application may have done for its own - * purposes. Mesa's IROUND macro is close to what we want, but it - * rounds away from 0 on n + 0.5. - */ -int -_mesa_round_to_even(float val) -{ - int rounded = IROUND(val); - - if (val - floor(val) == 0.5) { - if (rounded % 2 != 0) - rounded += val > 0 ? -1 : 1; - } - - return rounded; -} - - -/** - * Convert a 4-byte float to a 2-byte half float. - * - * Not all float32 values can be represented exactly as a float16 value. We - * round such intermediate float32 values to the nearest float16. When the - * float32 lies exactly between to float16 values, we round to the one with - * an even mantissa. - * - * This rounding behavior has several benefits: - * - It has no sign bias. - * - * - It reproduces the behavior of real hardware: opcode F32TO16 in Intel's - * GPU ISA. - * - * - By reproducing the behavior of the GPU (at least on Intel hardware), - * compile-time evaluation of constant packHalf2x16 GLSL expressions will - * result in the same value as if the expression were executed on the GPU. - */ -GLhalfARB -_mesa_float_to_half(float val) -{ - const fi_type fi = {val}; - const int flt_m = fi.i & 0x7fffff; - const int flt_e = (fi.i >> 23) & 0xff; - const int flt_s = (fi.i >> 31) & 0x1; - int s, e, m = 0; - GLhalfARB result; - - /* sign bit */ - s = flt_s; - - /* handle special cases */ - if ((flt_e == 0) && (flt_m == 0)) { - /* zero */ - /* m = 0; - already set */ - e = 0; - } - else if ((flt_e == 0) && (flt_m != 0)) { - /* denorm -- denorm float maps to 0 half */ - /* m = 0; - already set */ - e = 0; - } - else if ((flt_e == 0xff) && (flt_m == 0)) { - /* infinity */ - /* m = 0; - already set */ - e = 31; - } - else if ((flt_e == 0xff) && (flt_m != 0)) { - /* NaN */ - m = 1; - e = 31; - } - else { - /* regular number */ - const int new_exp = flt_e - 127; - if (new_exp < -14) { - /* The float32 lies in the range (0.0, min_normal16) and is rounded - * to a nearby float16 value. The result will be either zero, subnormal, - * or normal. - */ - e = 0; - m = _mesa_round_to_even((1 << 24) * fabsf(fi.f)); - } - else if (new_exp > 15) { - /* map this value to infinity */ - /* m = 0; - already set */ - e = 31; - } - else { - /* The float32 lies in the range - * [min_normal16, max_normal16 + max_step16) - * and is rounded to a nearby float16 value. The result will be - * either normal or infinite. - */ - e = new_exp + 15; - m = _mesa_round_to_even(flt_m / (float) (1 << 13)); - } - } - - assert(0 <= m && m <= 1024); - if (m == 1024) { - /* The float32 was rounded upwards into the range of the next exponent, - * so bump the exponent. This correctly handles the case where f32 - * should be rounded up to float16 infinity. - */ - ++e; - m = 0; - } - - result = (s << 15) | (e << 10) | m; - return result; -} - - -/** - * Convert a 2-byte half float to a 4-byte float. - * Based on code from: - * http://www.opengl.org/discussion_boards/ubb/Forum3/HTML/008786.html - */ -float -_mesa_half_to_float(GLhalfARB val) -{ - /* XXX could also use a 64K-entry lookup table */ - const int m = val & 0x3ff; - const int e = (val >> 10) & 0x1f; - const int s = (val >> 15) & 0x1; - int flt_m, flt_e, flt_s; - fi_type fi; - float result; - - /* sign bit */ - flt_s = s; - - /* handle special cases */ - if ((e == 0) && (m == 0)) { - /* zero */ - flt_m = 0; - flt_e = 0; - } - else if ((e == 0) && (m != 0)) { - /* denorm -- denorm half will fit in non-denorm single */ - const float half_denorm = 1.0f / 16384.0f; /* 2^-14 */ - float mantissa = ((float) (m)) / 1024.0f; - float sign = s ? -1.0f : 1.0f; - return sign * mantissa * half_denorm; - } - else if ((e == 31) && (m == 0)) { - /* infinity */ - flt_e = 0xff; - flt_m = 0; - } - else if ((e == 31) && (m != 0)) { - /* NaN */ - flt_e = 0xff; - flt_m = 1; - } - else { - /* regular */ - flt_e = e + 112; - flt_m = m << 13; - } - - fi.i = (flt_s << 31) | (flt_e << 23) | flt_m; - result = fi.f; - return result; -} - -/*@}*/ - - -/**********************************************************************/ -/** \name String */ -/*@{*/ - -/** - * Implemented using malloc() and strcpy. - * Note that NULL is handled accordingly. - */ -char * -_mesa_strdup( const char *s ) -{ - if (s) { - size_t l = strlen(s); - char *s2 = malloc(l + 1); - if (s2) - strcpy(s2, s); - return s2; - } - else { - return NULL; - } -} - -/** Wrapper around strtof() */ -float -_mesa_strtof( const char *s, char **end ) -{ -#if defined(_GNU_SOURCE) && !defined(__CYGWIN__) && !defined(__FreeBSD__) && \ - !defined(ANDROID) && !defined(__HAIKU__) && !defined(__UCLIBC__) && \ - !defined(__NetBSD__) - static locale_t loc = NULL; - if (!loc) { - loc = newlocale(LC_CTYPE_MASK, "C", NULL); - } - return strtof_l(s, end, loc); -#elif defined(_ISOC99_SOURCE) || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600) - return strtof(s, end); -#else - return (float)strtod(s, end); -#endif -} - -/** Compute simple checksum/hash for a string */ -unsigned int -_mesa_str_checksum(const char *str) -{ - /* This could probably be much better */ - unsigned int sum, i; - const char *c; - sum = i = 1; - for (c = str; *c; c++, i++) - sum += *c * (i % 100); - return sum + i; -} - - -/*@}*/ - - -/** Needed due to #ifdef's, above. */ -int -_mesa_vsnprintf(char *str, size_t size, const char *fmt, va_list args) -{ - return vsnprintf( str, size, fmt, args); -} - -/** Wrapper around vsnprintf() */ -int -_mesa_snprintf( char *str, size_t size, const char *fmt, ... ) -{ - int r; - va_list args; - va_start( args, fmt ); - r = vsnprintf( str, size, fmt, args ); - va_end( args ); - return r; -} - - diff --git a/3rdparty/glsl-optimizer/src/mesa/main/imports.h b/3rdparty/glsl-optimizer/src/mesa/main/imports.h deleted file mode 100644 index 1fbc293d7..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/main/imports.h +++ /dev/null @@ -1,551 +0,0 @@ -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - -/** - * \file imports.h - * Standard C library function wrappers. - * - * This file provides wrappers for all the standard C library functions - * like malloc(), free(), printf(), getenv(), etc. - */ - - -#ifndef IMPORTS_H -#define IMPORTS_H - - -#include "compiler.h" -#include "glheader.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/**********************************************************************/ -/** Memory macros */ -/*@{*/ - -/** Allocate a structure of type \p T */ -#define MALLOC_STRUCT(T) (struct T *) malloc(sizeof(struct T)) -/** Allocate and zero a structure of type \p T */ -#define CALLOC_STRUCT(T) (struct T *) calloc(1, sizeof(struct T)) - -/*@}*/ - - -/* - * For GL_ARB_vertex_buffer_object we need to treat vertex array pointers - * as offsets into buffer stores. Since the vertex array pointer and - * buffer store pointer are both pointers and we need to add them, we use - * this macro. - * Both pointers/offsets are expressed in bytes. - */ -#define ADD_POINTERS(A, B) ( (GLubyte *) (A) + (uintptr_t) (B) ) - - -/** - * Sometimes we treat GLfloats as GLints. On x86 systems, moving a float - * as a int (thereby using integer registers instead of FP registers) is - * a performance win. Typically, this can be done with ordinary casts. - * But with gcc's -fstrict-aliasing flag (which defaults to on in gcc 3.0) - * these casts generate warnings. - * The following union typedef is used to solve that. - */ -typedef union { GLfloat f; GLint i; GLuint u; } fi_type; - - - -/********************************************************************** - * Math macros - */ - -#define MAX_GLUSHORT 0xffff -#define MAX_GLUINT 0xffffffff - -/* Degrees to radians conversion: */ -#define DEG2RAD (M_PI/180.0) - - -/** - * \name Work-arounds for platforms that lack C99 math functions - */ -/*@{*/ -#if (!defined(_XOPEN_SOURCE) || (_XOPEN_SOURCE < 600)) && !defined(_ISOC99_SOURCE) \ - && (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L)) \ - && (!defined(_MSC_VER) || (_MSC_VER < 1400)) -#define acosf(f) ((float) acos(f)) -#define asinf(f) ((float) asin(f)) -#define atan2f(x,y) ((float) atan2(x,y)) -#define atanf(f) ((float) atan(f)) -#define ceilf(f) ((float) ceil(f)) -#define cosf(f) ((float) cos(f)) -#define coshf(f) ((float) cosh(f)) -#define expf(f) ((float) exp(f)) -#define exp2f(f) ((float) exp2(f)) -#define floorf(f) ((float) floor(f)) -#define logf(f) ((float) log(f)) - -#ifdef ANDROID -#define log2f(f) (logf(f) * (float) (1.0 / M_LN2)) -#else -#define log2f(f) ((float) log2(f)) -#endif - -#define powf(x,y) ((float) pow(x,y)) -#define sinf(f) ((float) sin(f)) -#define sinhf(f) ((float) sinh(f)) -#define sqrtf(f) ((float) sqrt(f)) -#define tanf(f) ((float) tan(f)) -#define tanhf(f) ((float) tanh(f)) -#define acoshf(f) ((float) acosh(f)) -#define asinhf(f) ((float) asinh(f)) -#define atanhf(f) ((float) atanh(f)) -#endif - -#if defined(_MSC_VER) -#if _MSC_VER < 1800 /* Not req'd on VS2013 and above */ -static inline float truncf(float x) { return x < 0.0f ? ceilf(x) : floorf(x); } -static inline float exp2f(float x) { return powf(2.0f, x); } -static inline float log2f(float x) { return logf(x) * 1.442695041f; } -static inline float asinhf(float x) { return logf(x + sqrtf(x * x + 1.0f)); } -static inline float acoshf(float x) { return logf(x + sqrtf(x * x - 1.0f)); } -static inline float atanhf(float x) { return (logf(1.0f + x) - logf(1.0f - x)) / 2.0f; } -static inline int isblank(int ch) { return ch == ' ' || ch == '\t'; } -#define strtoll(p, e, b) _strtoi64(p, e, b) -#endif /* _MSC_VER < 1800 */ -#define strcasecmp(s1, s2) _stricmp(s1, s2) -#endif -/*@}*/ - - -/* - * signbit() is a macro on Linux. Not available on Windows. - */ -#ifndef signbit -#define signbit(x) ((x) < 0.0f) -#endif - - -/** single-precision inverse square root */ -static inline float -INV_SQRTF(float x) -{ - /* XXX we could try Quake's fast inverse square root function here */ - return 1.0F / sqrtf(x); -} - - -/*** - *** LOG2: Log base 2 of float - ***/ -static inline GLfloat LOG2(GLfloat x) -{ -#if 0 - /* This is pretty fast, but not accurate enough (only 2 fractional bits). - * Based on code from http://www.stereopsis.com/log2.html - */ - const GLfloat y = x * x * x * x; - const GLuint ix = *((GLuint *) &y); - const GLuint exp = (ix >> 23) & 0xFF; - const GLint log2 = ((GLint) exp) - 127; - return (GLfloat) log2 * (1.0 / 4.0); /* 4, because of x^4 above */ -#endif - /* Pretty fast, and accurate. - * Based on code from http://www.flipcode.com/totd/ - */ - fi_type num; - GLint log_2; - num.f = x; - log_2 = ((num.i >> 23) & 255) - 128; - num.i &= ~(255 << 23); - num.i += 127 << 23; - num.f = ((-1.0f/3) * num.f + 2) * num.f - 2.0f/3; - return num.f + log_2; -} - - - -/*** - *** IS_INF_OR_NAN: test if float is infinite or NaN - ***/ -#if defined(isfinite) -#define IS_INF_OR_NAN(x) (!isfinite(x)) -#elif defined(finite) -#define IS_INF_OR_NAN(x) (!finite(x)) -#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#define IS_INF_OR_NAN(x) (!isfinite(x)) -#else -#define IS_INF_OR_NAN(x) (!finite(x)) -#endif - - -/*** - *** CEILF: ceiling of float - *** FLOORF: floor of float - *** FABSF: absolute value of float - *** LOGF: the natural logarithm (base e) of the value - *** EXPF: raise e to the value - *** LDEXPF: multiply value by an integral power of two - *** FREXPF: extract mantissa and exponent from value - ***/ -#if defined(__gnu_linux__) -/* C99 functions */ -#define CEILF(x) ceilf(x) -#define FLOORF(x) floorf(x) -#define FABSF(x) fabsf(x) -#define LOGF(x) logf(x) -#define EXPF(x) expf(x) -#define LDEXPF(x,y) ldexpf(x,y) -#define FREXPF(x,y) frexpf(x,y) -#else -#define CEILF(x) ((GLfloat) ceil(x)) -#define FLOORF(x) ((GLfloat) floor(x)) -#define FABSF(x) ((GLfloat) fabs(x)) -#define LOGF(x) ((GLfloat) log(x)) -#define EXPF(x) ((GLfloat) exp(x)) -#define LDEXPF(x,y) ((GLfloat) ldexp(x,y)) -#define FREXPF(x,y) ((GLfloat) frexp(x,y)) -#endif - - -/** - * Convert float to int by rounding to nearest integer, away from zero. - */ -static inline int IROUND(float f) -{ - return (int) ((f >= 0.0F) ? (f + 0.5F) : (f - 0.5F)); -} - - - -/** - * Convert positive float to int by rounding to nearest integer. - */ -static inline int IROUND_POS(float f) -{ - assert(f >= 0.0F); - return (int) (f + 0.5F); -} - -#ifdef __x86_64__ -# include -#endif - -/** - * Convert float to int using a fast method. The rounding mode may vary. - */ -static inline int F_TO_I(float f) -{ -#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__) - int r; - __asm__ ("fistpl %0" : "=m" (r) : "t" (f) : "st"); - return r; -#elif defined(USE_X86_ASM) && defined(_MSC_VER) - int r; - _asm { - fld f - fistp r - } - return r; -#elif defined(__x86_64__) - return _mm_cvt_ss2si(_mm_load_ss(&f)); -#else - return IROUND(f); -#endif -} - - -/** Return (as an integer) floor of float */ -static inline int IFLOOR(float f) -{ -#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__) - /* - * IEEE floor for computers that round to nearest or even. - * 'f' must be between -4194304 and 4194303. - * This floor operation is done by "(iround(f + .5) + iround(f - .5)) >> 1", - * but uses some IEEE specific tricks for better speed. - * Contributed by Josh Vanderhoof - */ - int ai, bi; - double af, bf; - af = (3 << 22) + 0.5 + (double)f; - bf = (3 << 22) + 0.5 - (double)f; - /* GCC generates an extra fstp/fld without this. */ - __asm__ ("fstps %0" : "=m" (ai) : "t" (af) : "st"); - __asm__ ("fstps %0" : "=m" (bi) : "t" (bf) : "st"); - return (ai - bi) >> 1; -#else - int ai, bi; - double af, bf; - fi_type u; - af = (3 << 22) + 0.5 + (double)f; - bf = (3 << 22) + 0.5 - (double)f; - u.f = (float) af; ai = u.i; - u.f = (float) bf; bi = u.i; - return (ai - bi) >> 1; -#endif -} - - -/** Return (as an integer) ceiling of float */ -static inline int ICEIL(float f) -{ -#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__) - /* - * IEEE ceil for computers that round to nearest or even. - * 'f' must be between -4194304 and 4194303. - * This ceil operation is done by "(iround(f + .5) + iround(f - .5) + 1) >> 1", - * but uses some IEEE specific tricks for better speed. - * Contributed by Josh Vanderhoof - */ - int ai, bi; - double af, bf; - af = (3 << 22) + 0.5 + (double)f; - bf = (3 << 22) + 0.5 - (double)f; - /* GCC generates an extra fstp/fld without this. */ - __asm__ ("fstps %0" : "=m" (ai) : "t" (af) : "st"); - __asm__ ("fstps %0" : "=m" (bi) : "t" (bf) : "st"); - return (ai - bi + 1) >> 1; -#else - int ai, bi; - double af, bf; - fi_type u; - af = (3 << 22) + 0.5 + (double)f; - bf = (3 << 22) + 0.5 - (double)f; - u.f = (float) af; ai = u.i; - u.f = (float) bf; bi = u.i; - return (ai - bi + 1) >> 1; -#endif -} - - -/** - * Is x a power of two? - */ -static inline int -_mesa_is_pow_two(int x) -{ - return !(x & (x - 1)); -} - -/** - * Round given integer to next higer power of two - * If X is zero result is undefined. - * - * Source for the fallback implementation is - * Sean Eron Anderson's webpage "Bit Twiddling Hacks" - * http://graphics.stanford.edu/~seander/bithacks.html - * - * When using builtin function have to do some work - * for case when passed values 1 to prevent hiting - * undefined result from __builtin_clz. Undefined - * results would be different depending on optimization - * level used for build. - */ -static inline int32_t -_mesa_next_pow_two_32(uint32_t x) -{ -#ifdef HAVE___BUILTIN_CLZ - uint32_t y = (x != 1); - return (1 + y) << ((__builtin_clz(x - y) ^ 31) ); -#else - x--; - x |= x >> 1; - x |= x >> 2; - x |= x >> 4; - x |= x >> 8; - x |= x >> 16; - x++; - return x; -#endif -} - -static inline int64_t -_mesa_next_pow_two_64(uint64_t x) -{ -#ifdef HAVE___BUILTIN_CLZLL - uint64_t y = (x != 1); - STATIC_ASSERT(sizeof(x) == sizeof(long long)); - return (1 + y) << ((__builtin_clzll(x - y) ^ 63)); -#else - x--; - x |= x >> 1; - x |= x >> 2; - x |= x >> 4; - x |= x >> 8; - x |= x >> 16; - x |= x >> 32; - x++; - return x; -#endif -} - - -/* - * Returns the floor form of binary logarithm for a 32-bit integer. - */ -static inline GLuint -_mesa_logbase2(GLuint n) -{ -#ifdef HAVE___BUILTIN_CLZ - return (31 - __builtin_clz(n | 1)); -#else - GLuint pos = 0; - if (n >= 1<<16) { n >>= 16; pos += 16; } - if (n >= 1<< 8) { n >>= 8; pos += 8; } - if (n >= 1<< 4) { n >>= 4; pos += 4; } - if (n >= 1<< 2) { n >>= 2; pos += 2; } - if (n >= 1<< 1) { pos += 1; } - return pos; -#endif -} - - -/** - * Return 1 if this is a little endian machine, 0 if big endian. - */ -static inline GLboolean -_mesa_little_endian(void) -{ - const GLuint ui = 1; /* intentionally not static */ - return *((const GLubyte *) &ui); -} - - - -/********************************************************************** - * Functions - */ - -extern void * -_mesa_align_malloc( size_t bytes, unsigned long alignment ); - -extern void * -_mesa_align_calloc( size_t bytes, unsigned long alignment ); - -extern void -_mesa_align_free( void *ptr ); - -extern void * -_mesa_align_realloc(void *oldBuffer, size_t oldSize, size_t newSize, - unsigned long alignment); - -extern void * -_mesa_exec_malloc( GLuint size ); - -extern void -_mesa_exec_free( void *addr ); - - -#ifndef FFS_DEFINED -#define FFS_DEFINED 1 -#ifdef HAVE___BUILTIN_FFS -#define ffs __builtin_ffs -#else -extern int ffs(int i); -#endif - -#ifdef HAVE___BUILTIN_FFSLL -#define ffsll __builtin_ffsll -#else -extern int ffsll(long long int i); -#endif -#endif /* FFS_DEFINED */ - - -#ifdef HAVE___BUILTIN_POPCOUNT -#define _mesa_bitcount(i) __builtin_popcount(i) -#else -extern unsigned int -_mesa_bitcount(unsigned int n); -#endif - -#ifdef HAVE___BUILTIN_POPCOUNTLL -#define _mesa_bitcount_64(i) __builtin_popcountll(i) -#else -extern unsigned int -_mesa_bitcount_64(uint64_t n); -#endif - -/** - * Find the last (most significant) bit set in a word. - * - * Essentially ffs() in the reverse direction. - */ -static inline unsigned int -_mesa_fls(unsigned int n) -{ -#ifdef HAVE___BUILTIN_CLZ - return n == 0 ? 0 : 32 - __builtin_clz(n); -#else - unsigned int v = 1; - - if (n == 0) - return 0; - - while (n >>= 1) - v++; - - return v; -#endif -} - -extern int -_mesa_round_to_even(float val); - -extern GLhalfARB -_mesa_float_to_half(float f); - -extern float -_mesa_half_to_float(GLhalfARB h); - -extern char * -_mesa_strdup( const char *s ); - -extern float -_mesa_strtof( const char *s, char **end ); - -extern unsigned int -_mesa_str_checksum(const char *str); - -extern int -_mesa_snprintf( char *str, size_t size, const char *fmt, ... ) PRINTFLIKE(3, 4); - -extern int -_mesa_vsnprintf(char *str, size_t size, const char *fmt, va_list arg); - - -#if defined(_MSC_VER) && !defined(snprintf) -#define snprintf _snprintf -#endif - - -#ifdef __cplusplus -} -#endif - - -#endif /* IMPORTS_H */ diff --git a/3rdparty/glsl-optimizer/src/mesa/main/macros.h b/3rdparty/glsl-optimizer/src/mesa/main/macros.h deleted file mode 100644 index 5b7b8aa02..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/main/macros.h +++ /dev/null @@ -1,824 +0,0 @@ -/** - * \file macros.h - * A collection of useful macros. - */ - -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - -#ifndef MACROS_H -#define MACROS_H - -#include "imports.h" - - -/** - * \name Integer / float conversion for colors, normals, etc. - */ -/*@{*/ - -/** Convert GLubyte in [0,255] to GLfloat in [0.0,1.0] */ -extern GLfloat _mesa_ubyte_to_float_color_tab[256]; -#define UBYTE_TO_FLOAT(u) _mesa_ubyte_to_float_color_tab[(unsigned int)(u)] - -/** Convert GLfloat in [0.0,1.0] to GLubyte in [0,255] */ -#define FLOAT_TO_UBYTE(X) ((GLubyte) (GLint) ((X) * 255.0F)) - - -/** Convert GLbyte in [-128,127] to GLfloat in [-1.0,1.0] */ -#define BYTE_TO_FLOAT(B) ((2.0F * (B) + 1.0F) * (1.0F/255.0F)) - -/** Convert GLfloat in [-1.0,1.0] to GLbyte in [-128,127] */ -#define FLOAT_TO_BYTE(X) ( (((GLint) (255.0F * (X))) - 1) / 2 ) - - -/** Convert GLbyte to GLfloat while preserving zero */ -#define BYTE_TO_FLOATZ(B) ((B) == 0 ? 0.0F : BYTE_TO_FLOAT(B)) - - -/** Convert GLbyte in [-128,127] to GLfloat in [-1.0,1.0], texture/fb data */ -#define BYTE_TO_FLOAT_TEX(B) ((B) == -128 ? -1.0F : (B) * (1.0F/127.0F)) - -/** Convert GLfloat in [-1.0,1.0] to GLbyte in [-128,127], texture/fb data */ -#define FLOAT_TO_BYTE_TEX(X) CLAMP( (GLint) (127.0F * (X)), -128, 127 ) - -/** Convert GLushort in [0,65535] to GLfloat in [0.0,1.0] */ -#define USHORT_TO_FLOAT(S) ((GLfloat) (S) * (1.0F / 65535.0F)) - -/** Convert GLfloat in [0.0,1.0] to GLushort in [0, 65535] */ -#define FLOAT_TO_USHORT(X) ((GLuint) ((X) * 65535.0F)) - - -/** Convert GLshort in [-32768,32767] to GLfloat in [-1.0,1.0] */ -#define SHORT_TO_FLOAT(S) ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)) - -/** Convert GLfloat in [-1.0,1.0] to GLshort in [-32768,32767] */ -#define FLOAT_TO_SHORT(X) ( (((GLint) (65535.0F * (X))) - 1) / 2 ) - -/** Convert GLshort to GLfloat while preserving zero */ -#define SHORT_TO_FLOATZ(S) ((S) == 0 ? 0.0F : SHORT_TO_FLOAT(S)) - - -/** Convert GLshort in [-32768,32767] to GLfloat in [-1.0,1.0], texture/fb data */ -#define SHORT_TO_FLOAT_TEX(S) ((S) == -32768 ? -1.0F : (S) * (1.0F/32767.0F)) - -/** Convert GLfloat in [-1.0,1.0] to GLshort in [-32768,32767], texture/fb data */ -#define FLOAT_TO_SHORT_TEX(X) ( (GLint) (32767.0F * (X)) ) - - -/** Convert GLuint in [0,4294967295] to GLfloat in [0.0,1.0] */ -#define UINT_TO_FLOAT(U) ((GLfloat) ((U) * (1.0F / 4294967295.0))) - -/** Convert GLfloat in [0.0,1.0] to GLuint in [0,4294967295] */ -#define FLOAT_TO_UINT(X) ((GLuint) ((X) * 4294967295.0)) - - -/** Convert GLint in [-2147483648,2147483647] to GLfloat in [-1.0,1.0] */ -#define INT_TO_FLOAT(I) ((GLfloat) ((2.0F * (I) + 1.0F) * (1.0F/4294967294.0))) - -/** Convert GLfloat in [-1.0,1.0] to GLint in [-2147483648,2147483647] */ -/* causes overflow: -#define FLOAT_TO_INT(X) ( (((GLint) (4294967294.0 * (X))) - 1) / 2 ) -*/ -/* a close approximation: */ -#define FLOAT_TO_INT(X) ( (GLint) (2147483647.0 * (X)) ) - -/** Convert GLint in [-2147483648,2147483647] to GLfloat in [-1.0,1.0], texture/fb data */ -#define INT_TO_FLOAT_TEX(I) ((I) == -2147483648 ? -1.0F : (I) * (1.0F/2147483647.0)) - -/** Convert GLfloat in [-1.0,1.0] to GLint in [-2147483648,2147483647], texture/fb data */ -#define FLOAT_TO_INT_TEX(X) ( (GLint) (2147483647.0 * (X)) ) - - -#define BYTE_TO_UBYTE(b) ((GLubyte) ((b) < 0 ? 0 : (GLubyte) (b))) -#define SHORT_TO_UBYTE(s) ((GLubyte) ((s) < 0 ? 0 : (GLubyte) ((s) >> 7))) -#define USHORT_TO_UBYTE(s) ((GLubyte) ((s) >> 8)) -#define INT_TO_UBYTE(i) ((GLubyte) ((i) < 0 ? 0 : (GLubyte) ((i) >> 23))) -#define UINT_TO_UBYTE(i) ((GLubyte) ((i) >> 24)) - - -#define BYTE_TO_USHORT(b) ((b) < 0 ? 0 : ((GLushort) (((b) * 65535) / 255))) -#define UBYTE_TO_USHORT(b) (((GLushort) (b) << 8) | (GLushort) (b)) -#define SHORT_TO_USHORT(s) ((s) < 0 ? 0 : ((GLushort) (((s) * 65535 / 32767)))) -#define INT_TO_USHORT(i) ((i) < 0 ? 0 : ((GLushort) ((i) >> 15))) -#define UINT_TO_USHORT(i) ((i) < 0 ? 0 : ((GLushort) ((i) >> 16))) -#define UNCLAMPED_FLOAT_TO_USHORT(us, f) \ - us = ( (GLushort) F_TO_I( CLAMP((f), 0.0F, 1.0F) * 65535.0F) ) -#define CLAMPED_FLOAT_TO_USHORT(us, f) \ - us = ( (GLushort) F_TO_I( (f) * 65535.0F) ) - -#define UNCLAMPED_FLOAT_TO_SHORT(s, f) \ - s = ( (GLshort) F_TO_I( CLAMP((f), -1.0F, 1.0F) * 32767.0F) ) - -/*** - *** UNCLAMPED_FLOAT_TO_UBYTE: clamp float to [0,1] and map to ubyte in [0,255] - *** CLAMPED_FLOAT_TO_UBYTE: map float known to be in [0,1] to ubyte in [0,255] - ***/ -#ifndef DEBUG -/* This function/macro is sensitive to precision. Test very carefully - * if you change it! - */ -#define UNCLAMPED_FLOAT_TO_UBYTE(UB, FLT) \ - do { \ - fi_type __tmp; \ - __tmp.f = (FLT); \ - if (__tmp.i < 0) \ - UB = (GLubyte) 0; \ - else if (__tmp.i >= IEEE_ONE) \ - UB = (GLubyte) 255; \ - else { \ - __tmp.f = __tmp.f * (255.0F/256.0F) + 32768.0F; \ - UB = (GLubyte) __tmp.i; \ - } \ - } while (0) -#define CLAMPED_FLOAT_TO_UBYTE(UB, FLT) \ - do { \ - fi_type __tmp; \ - __tmp.f = (FLT) * (255.0F/256.0F) + 32768.0F; \ - UB = (GLubyte) __tmp.i; \ - } while (0) -#else -#define UNCLAMPED_FLOAT_TO_UBYTE(ub, f) \ - ub = ((GLubyte) F_TO_I(CLAMP((f), 0.0F, 1.0F) * 255.0F)) -#define CLAMPED_FLOAT_TO_UBYTE(ub, f) \ - ub = ((GLubyte) F_TO_I((f) * 255.0F)) -#endif - -static inline GLfloat INT_AS_FLT(GLint i) -{ - fi_type tmp; - tmp.i = i; - return tmp.f; -} - -static inline GLfloat UINT_AS_FLT(GLuint u) -{ - fi_type tmp; - tmp.u = u; - return tmp.f; -} - -static inline unsigned FLT_AS_UINT(float f) -{ - fi_type tmp; - tmp.f = f; - return tmp.u; -} - -/** - * Convert a floating point value to an unsigned fixed point value. - * - * \param frac_bits The number of bits used to store the fractional part. - */ -static inline uint32_t -U_FIXED(float value, uint32_t frac_bits) -{ - value *= (1 << frac_bits); - return value < 0.0f ? 0 : (uint32_t) value; -} - -/** - * Convert a floating point value to an signed fixed point value. - * - * \param frac_bits The number of bits used to store the fractional part. - */ -static inline int32_t -S_FIXED(float value, uint32_t frac_bits) -{ - return (int32_t) (value * (1 << frac_bits)); -} -/*@}*/ - - -/** Stepping a GLfloat pointer by a byte stride */ -#define STRIDE_F(p, i) (p = (GLfloat *)((GLubyte *)p + i)) -/** Stepping a GLuint pointer by a byte stride */ -#define STRIDE_UI(p, i) (p = (GLuint *)((GLubyte *)p + i)) -/** Stepping a GLubyte[4] pointer by a byte stride */ -#define STRIDE_4UB(p, i) (p = (GLubyte (*)[4])((GLubyte *)p + i)) -/** Stepping a GLfloat[4] pointer by a byte stride */ -#define STRIDE_4F(p, i) (p = (GLfloat (*)[4])((GLubyte *)p + i)) -/** Stepping a \p t pointer by a byte stride */ -#define STRIDE_T(p, t, i) (p = (t)((GLubyte *)p + i)) - - -/**********************************************************************/ -/** \name 4-element vector operations */ -/*@{*/ - -/** Zero */ -#define ZERO_4V( DST ) (DST)[0] = (DST)[1] = (DST)[2] = (DST)[3] = 0 - -/** Test for equality */ -#define TEST_EQ_4V(a,b) ((a)[0] == (b)[0] && \ - (a)[1] == (b)[1] && \ - (a)[2] == (b)[2] && \ - (a)[3] == (b)[3]) - -/** Test for equality (unsigned bytes) */ -static inline GLboolean -TEST_EQ_4UBV(const GLubyte a[4], const GLubyte b[4]) -{ -#if defined(__i386__) - return *((const GLuint *) a) == *((const GLuint *) b); -#else - return TEST_EQ_4V(a, b); -#endif -} - - -/** Copy a 4-element vector */ -#define COPY_4V( DST, SRC ) \ -do { \ - (DST)[0] = (SRC)[0]; \ - (DST)[1] = (SRC)[1]; \ - (DST)[2] = (SRC)[2]; \ - (DST)[3] = (SRC)[3]; \ -} while (0) - -/** Copy a 4-element unsigned byte vector */ -static inline void -COPY_4UBV(GLubyte dst[4], const GLubyte src[4]) -{ -#if defined(__i386__) - *((GLuint *) dst) = *((GLuint *) src); -#else - /* The GLuint cast might fail if DST or SRC are not dword-aligned (RISC) */ - COPY_4V(dst, src); -#endif -} - -/** Copy a 4-element float vector */ -static inline void -COPY_4FV(GLfloat dst[4], const GLfloat src[4]) -{ - /* memcpy seems to be most efficient */ - memcpy(dst, src, sizeof(GLfloat) * 4); -} - -/** Copy \p SZ elements into a 4-element vector */ -#define COPY_SZ_4V(DST, SZ, SRC) \ -do { \ - switch (SZ) { \ - case 4: (DST)[3] = (SRC)[3]; \ - case 3: (DST)[2] = (SRC)[2]; \ - case 2: (DST)[1] = (SRC)[1]; \ - case 1: (DST)[0] = (SRC)[0]; \ - } \ -} while(0) - -/** Copy \p SZ elements into a homegeneous (4-element) vector, giving - * default values to the remaining */ -#define COPY_CLEAN_4V(DST, SZ, SRC) \ -do { \ - ASSIGN_4V( DST, 0, 0, 0, 1 ); \ - COPY_SZ_4V( DST, SZ, SRC ); \ -} while (0) - -/** Subtraction */ -#define SUB_4V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] - (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] - (SRCB)[1]; \ - (DST)[2] = (SRCA)[2] - (SRCB)[2]; \ - (DST)[3] = (SRCA)[3] - (SRCB)[3]; \ -} while (0) - -/** Addition */ -#define ADD_4V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] + (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] + (SRCB)[1]; \ - (DST)[2] = (SRCA)[2] + (SRCB)[2]; \ - (DST)[3] = (SRCA)[3] + (SRCB)[3]; \ -} while (0) - -/** Element-wise multiplication */ -#define SCALE_4V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] * (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] * (SRCB)[1]; \ - (DST)[2] = (SRCA)[2] * (SRCB)[2]; \ - (DST)[3] = (SRCA)[3] * (SRCB)[3]; \ -} while (0) - -/** In-place addition */ -#define ACC_4V( DST, SRC ) \ -do { \ - (DST)[0] += (SRC)[0]; \ - (DST)[1] += (SRC)[1]; \ - (DST)[2] += (SRC)[2]; \ - (DST)[3] += (SRC)[3]; \ -} while (0) - -/** Element-wise multiplication and addition */ -#define ACC_SCALE_4V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] += (SRCA)[0] * (SRCB)[0]; \ - (DST)[1] += (SRCA)[1] * (SRCB)[1]; \ - (DST)[2] += (SRCA)[2] * (SRCB)[2]; \ - (DST)[3] += (SRCA)[3] * (SRCB)[3]; \ -} while (0) - -/** In-place scalar multiplication and addition */ -#define ACC_SCALE_SCALAR_4V( DST, S, SRCB ) \ -do { \ - (DST)[0] += S * (SRCB)[0]; \ - (DST)[1] += S * (SRCB)[1]; \ - (DST)[2] += S * (SRCB)[2]; \ - (DST)[3] += S * (SRCB)[3]; \ -} while (0) - -/** Scalar multiplication */ -#define SCALE_SCALAR_4V( DST, S, SRCB ) \ -do { \ - (DST)[0] = S * (SRCB)[0]; \ - (DST)[1] = S * (SRCB)[1]; \ - (DST)[2] = S * (SRCB)[2]; \ - (DST)[3] = S * (SRCB)[3]; \ -} while (0) - -/** In-place scalar multiplication */ -#define SELF_SCALE_SCALAR_4V( DST, S ) \ -do { \ - (DST)[0] *= S; \ - (DST)[1] *= S; \ - (DST)[2] *= S; \ - (DST)[3] *= S; \ -} while (0) - -/** Assignment */ -#define ASSIGN_4V( V, V0, V1, V2, V3 ) \ -do { \ - V[0] = V0; \ - V[1] = V1; \ - V[2] = V2; \ - V[3] = V3; \ -} while(0) - -/*@}*/ - - -/**********************************************************************/ -/** \name 3-element vector operations*/ -/*@{*/ - -/** Zero */ -#define ZERO_3V( DST ) (DST)[0] = (DST)[1] = (DST)[2] = 0 - -/** Test for equality */ -#define TEST_EQ_3V(a,b) \ - ((a)[0] == (b)[0] && \ - (a)[1] == (b)[1] && \ - (a)[2] == (b)[2]) - -/** Copy a 3-element vector */ -#define COPY_3V( DST, SRC ) \ -do { \ - (DST)[0] = (SRC)[0]; \ - (DST)[1] = (SRC)[1]; \ - (DST)[2] = (SRC)[2]; \ -} while (0) - -/** Copy a 3-element vector with cast */ -#define COPY_3V_CAST( DST, SRC, CAST ) \ -do { \ - (DST)[0] = (CAST)(SRC)[0]; \ - (DST)[1] = (CAST)(SRC)[1]; \ - (DST)[2] = (CAST)(SRC)[2]; \ -} while (0) - -/** Copy a 3-element float vector */ -#define COPY_3FV( DST, SRC ) \ -do { \ - const GLfloat *_tmp = (SRC); \ - (DST)[0] = _tmp[0]; \ - (DST)[1] = _tmp[1]; \ - (DST)[2] = _tmp[2]; \ -} while (0) - -/** Subtraction */ -#define SUB_3V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] - (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] - (SRCB)[1]; \ - (DST)[2] = (SRCA)[2] - (SRCB)[2]; \ -} while (0) - -/** Addition */ -#define ADD_3V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] + (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] + (SRCB)[1]; \ - (DST)[2] = (SRCA)[2] + (SRCB)[2]; \ -} while (0) - -/** In-place scalar multiplication */ -#define SCALE_3V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] * (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] * (SRCB)[1]; \ - (DST)[2] = (SRCA)[2] * (SRCB)[2]; \ -} while (0) - -/** In-place element-wise multiplication */ -#define SELF_SCALE_3V( DST, SRC ) \ -do { \ - (DST)[0] *= (SRC)[0]; \ - (DST)[1] *= (SRC)[1]; \ - (DST)[2] *= (SRC)[2]; \ -} while (0) - -/** In-place addition */ -#define ACC_3V( DST, SRC ) \ -do { \ - (DST)[0] += (SRC)[0]; \ - (DST)[1] += (SRC)[1]; \ - (DST)[2] += (SRC)[2]; \ -} while (0) - -/** Element-wise multiplication and addition */ -#define ACC_SCALE_3V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] += (SRCA)[0] * (SRCB)[0]; \ - (DST)[1] += (SRCA)[1] * (SRCB)[1]; \ - (DST)[2] += (SRCA)[2] * (SRCB)[2]; \ -} while (0) - -/** Scalar multiplication */ -#define SCALE_SCALAR_3V( DST, S, SRCB ) \ -do { \ - (DST)[0] = S * (SRCB)[0]; \ - (DST)[1] = S * (SRCB)[1]; \ - (DST)[2] = S * (SRCB)[2]; \ -} while (0) - -/** In-place scalar multiplication and addition */ -#define ACC_SCALE_SCALAR_3V( DST, S, SRCB ) \ -do { \ - (DST)[0] += S * (SRCB)[0]; \ - (DST)[1] += S * (SRCB)[1]; \ - (DST)[2] += S * (SRCB)[2]; \ -} while (0) - -/** In-place scalar multiplication */ -#define SELF_SCALE_SCALAR_3V( DST, S ) \ -do { \ - (DST)[0] *= S; \ - (DST)[1] *= S; \ - (DST)[2] *= S; \ -} while (0) - -/** In-place scalar addition */ -#define ACC_SCALAR_3V( DST, S ) \ -do { \ - (DST)[0] += S; \ - (DST)[1] += S; \ - (DST)[2] += S; \ -} while (0) - -/** Assignment */ -#define ASSIGN_3V( V, V0, V1, V2 ) \ -do { \ - V[0] = V0; \ - V[1] = V1; \ - V[2] = V2; \ -} while(0) - -/*@}*/ - - -/**********************************************************************/ -/** \name 2-element vector operations*/ -/*@{*/ - -/** Zero */ -#define ZERO_2V( DST ) (DST)[0] = (DST)[1] = 0 - -/** Copy a 2-element vector */ -#define COPY_2V( DST, SRC ) \ -do { \ - (DST)[0] = (SRC)[0]; \ - (DST)[1] = (SRC)[1]; \ -} while (0) - -/** Copy a 2-element vector with cast */ -#define COPY_2V_CAST( DST, SRC, CAST ) \ -do { \ - (DST)[0] = (CAST)(SRC)[0]; \ - (DST)[1] = (CAST)(SRC)[1]; \ -} while (0) - -/** Copy a 2-element float vector */ -#define COPY_2FV( DST, SRC ) \ -do { \ - const GLfloat *_tmp = (SRC); \ - (DST)[0] = _tmp[0]; \ - (DST)[1] = _tmp[1]; \ -} while (0) - -/** Subtraction */ -#define SUB_2V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] - (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] - (SRCB)[1]; \ -} while (0) - -/** Addition */ -#define ADD_2V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] + (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] + (SRCB)[1]; \ -} while (0) - -/** In-place scalar multiplication */ -#define SCALE_2V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] * (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] * (SRCB)[1]; \ -} while (0) - -/** In-place addition */ -#define ACC_2V( DST, SRC ) \ -do { \ - (DST)[0] += (SRC)[0]; \ - (DST)[1] += (SRC)[1]; \ -} while (0) - -/** Element-wise multiplication and addition */ -#define ACC_SCALE_2V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] += (SRCA)[0] * (SRCB)[0]; \ - (DST)[1] += (SRCA)[1] * (SRCB)[1]; \ -} while (0) - -/** Scalar multiplication */ -#define SCALE_SCALAR_2V( DST, S, SRCB ) \ -do { \ - (DST)[0] = S * (SRCB)[0]; \ - (DST)[1] = S * (SRCB)[1]; \ -} while (0) - -/** In-place scalar multiplication and addition */ -#define ACC_SCALE_SCALAR_2V( DST, S, SRCB ) \ -do { \ - (DST)[0] += S * (SRCB)[0]; \ - (DST)[1] += S * (SRCB)[1]; \ -} while (0) - -/** In-place scalar multiplication */ -#define SELF_SCALE_SCALAR_2V( DST, S ) \ -do { \ - (DST)[0] *= S; \ - (DST)[1] *= S; \ -} while (0) - -/** In-place scalar addition */ -#define ACC_SCALAR_2V( DST, S ) \ -do { \ - (DST)[0] += S; \ - (DST)[1] += S; \ -} while (0) - -/** Assign scalers to short vectors */ -#define ASSIGN_2V( V, V0, V1 ) \ -do { \ - V[0] = V0; \ - V[1] = V1; \ -} while(0) - -/*@}*/ - -/** Copy \p sz elements into a homegeneous (4-element) vector, giving - * default values to the remaining components. - * The default values are chosen based on \p type. - */ -static inline void -COPY_CLEAN_4V_TYPE_AS_FLOAT(GLfloat dst[4], int sz, const GLfloat src[4], - GLenum type) -{ - switch (type) { - case GL_FLOAT: - ASSIGN_4V(dst, 0, 0, 0, 1); - break; - case GL_INT: - ASSIGN_4V(dst, INT_AS_FLT(0), INT_AS_FLT(0), - INT_AS_FLT(0), INT_AS_FLT(1)); - break; - case GL_UNSIGNED_INT: - ASSIGN_4V(dst, UINT_AS_FLT(0), UINT_AS_FLT(0), - UINT_AS_FLT(0), UINT_AS_FLT(1)); - break; - default: - ASSIGN_4V(dst, 0.0f, 0.0f, 0.0f, 1.0f); /* silence warnings */ - ASSERT(!"Unexpected type in COPY_CLEAN_4V_TYPE_AS_FLOAT macro"); - } - COPY_SZ_4V(dst, sz, src); -} - -/** \name Linear interpolation functions */ -/*@{*/ - -static inline GLfloat -LINTERP(GLfloat t, GLfloat out, GLfloat in) -{ - return out + t * (in - out); -} - -static inline void -INTERP_3F(GLfloat t, GLfloat dst[3], const GLfloat out[3], const GLfloat in[3]) -{ - dst[0] = LINTERP( t, out[0], in[0] ); - dst[1] = LINTERP( t, out[1], in[1] ); - dst[2] = LINTERP( t, out[2], in[2] ); -} - -static inline void -INTERP_4F(GLfloat t, GLfloat dst[4], const GLfloat out[4], const GLfloat in[4]) -{ - dst[0] = LINTERP( t, out[0], in[0] ); - dst[1] = LINTERP( t, out[1], in[1] ); - dst[2] = LINTERP( t, out[2], in[2] ); - dst[3] = LINTERP( t, out[3], in[3] ); -} - -/*@}*/ - - - -/** Clamp X to [MIN,MAX] */ -#define CLAMP( X, MIN, MAX ) ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ? (MAX) : (X)) ) - -/** Minimum of two values: */ -#define MIN2( A, B ) ( (A)<(B) ? (A) : (B) ) - -/** Maximum of two values: */ -#define MAX2( A, B ) ( (A)>(B) ? (A) : (B) ) - -/** Minimum and maximum of three values: */ -#define MIN3( A, B, C ) ((A) < (B) ? MIN2(A, C) : MIN2(B, C)) -#define MAX3( A, B, C ) ((A) > (B) ? MAX2(A, C) : MAX2(B, C)) - -static inline unsigned -minify(unsigned value, unsigned levels) -{ - return MAX2(1, value >> levels); -} - -/** - * Return true if the given value is a power of two. - * - * Note that this considers 0 a power of two. - */ -static inline bool -is_power_of_two(unsigned value) -{ - return (value & (value - 1)) == 0; -} - -/** - * Align a value up to an alignment value - * - * If \c value is not already aligned to the requested alignment value, it - * will be rounded up. - * - * \param value Value to be rounded - * \param alignment Alignment value to be used. This must be a power of two. - * - * \sa ROUND_DOWN_TO() - */ -#define ALIGN(value, alignment) (((value) + (alignment) - 1) & ~((alignment) - 1)) - -/** - * Align a value down to an alignment value - * - * If \c value is not already aligned to the requested alignment value, it - * will be rounded down. - * - * \param value Value to be rounded - * \param alignment Alignment value to be used. This must be a power of two. - * - * \sa ALIGN() - */ -#define ROUND_DOWN_TO(value, alignment) ((value) & ~(alignment - 1)) - - -/** Cross product of two 3-element vectors */ -static inline void -CROSS3(GLfloat n[3], const GLfloat u[3], const GLfloat v[3]) -{ - n[0] = u[1] * v[2] - u[2] * v[1]; - n[1] = u[2] * v[0] - u[0] * v[2]; - n[2] = u[0] * v[1] - u[1] * v[0]; -} - - -/** Dot product of two 2-element vectors */ -static inline GLfloat -DOT2(const GLfloat a[2], const GLfloat b[2]) -{ - return a[0] * b[0] + a[1] * b[1]; -} - -static inline GLfloat -DOT3(const GLfloat a[3], const GLfloat b[3]) -{ - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; -} - -static inline GLfloat -DOT4(const GLfloat a[4], const GLfloat b[4]) -{ - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; -} - - -static inline GLfloat -LEN_SQUARED_3FV(const GLfloat v[3]) -{ - return DOT3(v, v); -} - -static inline GLfloat -LEN_SQUARED_2FV(const GLfloat v[2]) -{ - return DOT2(v, v); -} - - -static inline GLfloat -LEN_3FV(const GLfloat v[3]) -{ - return sqrtf(LEN_SQUARED_3FV(v)); -} - -static inline GLfloat -LEN_2FV(const GLfloat v[2]) -{ - return sqrtf(LEN_SQUARED_2FV(v)); -} - - -/* Normalize a 3-element vector to unit length. */ -static inline void -NORMALIZE_3FV(GLfloat v[3]) -{ - GLfloat len = (GLfloat) LEN_SQUARED_3FV(v); - if (len) { - len = INV_SQRTF(len); - v[0] *= len; - v[1] *= len; - v[2] *= len; - } -} - - -/** Test two floats have opposite signs */ -static inline GLboolean -DIFFERENT_SIGNS(GLfloat x, GLfloat y) -{ - return signbit(x) != signbit(y); -} - - -/** Compute ceiling of integer quotient of A divided by B. */ -#define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 ) - - -/** casts to silence warnings with some compilers */ -#define ENUM_TO_INT(E) ((GLint)(E)) -#define ENUM_TO_FLOAT(E) ((GLfloat)(GLint)(E)) -#define ENUM_TO_DOUBLE(E) ((GLdouble)(GLint)(E)) -#define ENUM_TO_BOOLEAN(E) ((E) ? GL_TRUE : GL_FALSE) - -/* Compute the size of an array */ -#ifndef ARRAY_SIZE -# define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) -#endif - -/* Stringify */ -#define STRINGIFY(x) #x - -#endif diff --git a/3rdparty/glsl-optimizer/src/mesa/main/mtypes.h b/3rdparty/glsl-optimizer/src/mesa/main/mtypes.h deleted file mode 100644 index b65f1c569..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/main/mtypes.h +++ /dev/null @@ -1,1693 +0,0 @@ -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. - * Copyright (C) 2009 VMware, Inc. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -/** - * \file mtypes.h - * Main Mesa data structures. - * - * Please try to mark derived values with a leading underscore ('_'). - */ - -#ifndef MTYPES_H -#define MTYPES_H - - -#include /* uint32_t */ - -#include "main/glheader.h" -#include "main/config.h" - - -#ifdef __cplusplus -extern "C" { -#endif - - - -/** - * \name Some forward type declarations - */ -/*@{*/ -struct gl_context; -struct gl_uniform_storage; -struct prog_instruction; -struct set; -struct set_entry; -/*@}*/ - - -/** Extra draw modes beyond GL_POINTS, GL_TRIANGLE_FAN, etc */ -#define PRIM_MAX GL_TRIANGLE_STRIP_ADJACENCY -#define PRIM_OUTSIDE_BEGIN_END (PRIM_MAX + 1) -#define PRIM_UNKNOWN (PRIM_MAX + 2) - - - -/** - * Indexes for vertex program attributes. - * GL_NV_vertex_program aliases generic attributes over the conventional - * attributes. In GL_ARB_vertex_program shader the aliasing is optional. - * In GL_ARB_vertex_shader / OpenGL 2.0 the aliasing is disallowed (the - * generic attributes are distinct/separate). - */ -typedef enum -{ - VERT_ATTRIB_POS = 0, - VERT_ATTRIB_WEIGHT = 1, - VERT_ATTRIB_NORMAL = 2, - VERT_ATTRIB_COLOR0 = 3, - VERT_ATTRIB_COLOR1 = 4, - VERT_ATTRIB_FOG = 5, - VERT_ATTRIB_COLOR_INDEX = 6, - VERT_ATTRIB_EDGEFLAG = 7, - VERT_ATTRIB_TEX0 = 8, - VERT_ATTRIB_TEX1 = 9, - VERT_ATTRIB_TEX2 = 10, - VERT_ATTRIB_TEX3 = 11, - VERT_ATTRIB_TEX4 = 12, - VERT_ATTRIB_TEX5 = 13, - VERT_ATTRIB_TEX6 = 14, - VERT_ATTRIB_TEX7 = 15, - VERT_ATTRIB_POINT_SIZE = 16, - VERT_ATTRIB_GENERIC0 = 17, - VERT_ATTRIB_GENERIC1 = 18, - VERT_ATTRIB_GENERIC2 = 19, - VERT_ATTRIB_GENERIC3 = 20, - VERT_ATTRIB_GENERIC4 = 21, - VERT_ATTRIB_GENERIC5 = 22, - VERT_ATTRIB_GENERIC6 = 23, - VERT_ATTRIB_GENERIC7 = 24, - VERT_ATTRIB_GENERIC8 = 25, - VERT_ATTRIB_GENERIC9 = 26, - VERT_ATTRIB_GENERIC10 = 27, - VERT_ATTRIB_GENERIC11 = 28, - VERT_ATTRIB_GENERIC12 = 29, - VERT_ATTRIB_GENERIC13 = 30, - VERT_ATTRIB_GENERIC14 = 31, - VERT_ATTRIB_GENERIC15 = 32, - VERT_ATTRIB_MAX = 33 -} gl_vert_attrib; - -/** - * Symbolic constats to help iterating over - * specific blocks of vertex attributes. - * - * VERT_ATTRIB_FF - * includes all fixed function attributes as well as - * the aliased GL_NV_vertex_program shader attributes. - * VERT_ATTRIB_TEX - * include the classic texture coordinate attributes. - * Is a subset of VERT_ATTRIB_FF. - * VERT_ATTRIB_GENERIC - * include the OpenGL 2.0+ GLSL generic shader attributes. - * These alias the generic GL_ARB_vertex_shader attributes. - */ -#define VERT_ATTRIB_FF(i) (VERT_ATTRIB_POS + (i)) -#define VERT_ATTRIB_FF_MAX VERT_ATTRIB_GENERIC0 - -#define VERT_ATTRIB_TEX(i) (VERT_ATTRIB_TEX0 + (i)) -#define VERT_ATTRIB_TEX_MAX MAX_TEXTURE_COORD_UNITS - -#define VERT_ATTRIB_GENERIC(i) (VERT_ATTRIB_GENERIC0 + (i)) -#define VERT_ATTRIB_GENERIC_MAX MAX_VERTEX_GENERIC_ATTRIBS - - - - -/** - * Indexes for vertex shader outputs, geometry shader inputs/outputs, and - * fragment shader inputs. - * - * Note that some of these values are not available to all pipeline stages. - * - * When this enum is updated, the following code must be updated too: - * - vertResults (in prog_print.c's arb_output_attrib_string()) - * - fragAttribs (in prog_print.c's arb_input_attrib_string()) - * - _mesa_varying_slot_in_fs() - */ -typedef enum -{ - VARYING_SLOT_POS, - VARYING_SLOT_COL0, /* COL0 and COL1 must be contiguous */ - VARYING_SLOT_COL1, - VARYING_SLOT_FOGC, - VARYING_SLOT_TEX0, /* TEX0-TEX7 must be contiguous */ - VARYING_SLOT_TEX1, - VARYING_SLOT_TEX2, - VARYING_SLOT_TEX3, - VARYING_SLOT_TEX4, - VARYING_SLOT_TEX5, - VARYING_SLOT_TEX6, - VARYING_SLOT_TEX7, - VARYING_SLOT_PSIZ, /* Does not appear in FS */ - VARYING_SLOT_BFC0, /* Does not appear in FS */ - VARYING_SLOT_BFC1, /* Does not appear in FS */ - VARYING_SLOT_EDGE, /* Does not appear in FS */ - VARYING_SLOT_CLIP_VERTEX, /* Does not appear in FS */ - VARYING_SLOT_CLIP_DIST0, - VARYING_SLOT_CLIP_DIST1, - VARYING_SLOT_PRIMITIVE_ID, /* Does not appear in VS */ - VARYING_SLOT_LAYER, /* Appears as VS or GS output */ - VARYING_SLOT_VIEWPORT, /* Appears as VS or GS output */ - VARYING_SLOT_FACE, /* FS only */ - VARYING_SLOT_PNTC, /* FS only */ - VARYING_SLOT_VAR0, /* First generic varying slot */ - VARYING_SLOT_MAX = VARYING_SLOT_VAR0 + MAX_VARYING -} gl_varying_slot; - - -/** - * Fragment program results - */ -typedef enum -{ - FRAG_RESULT_DEPTH = 0, - FRAG_RESULT_STENCIL = 1, - /* If a single color should be written to all render targets, this - * register is written. No FRAG_RESULT_DATAn will be written. - */ - FRAG_RESULT_COLOR = 2, - FRAG_RESULT_SAMPLE_MASK = 3, - - /* FRAG_RESULT_DATAn are the per-render-target (GLSL gl_FragData[n] - * or ARB_fragment_program fragment.color[n]) color results. If - * any are written, FRAG_RESULT_COLOR will not be written. - */ - FRAG_RESULT_DATA0 = 4, - FRAG_RESULT_MAX = (FRAG_RESULT_DATA0 + MAX_DRAW_BUFFERS) -} gl_frag_result; - - -/** - * Shader stages. Note that these will become 5 with tessellation. - * - * The order must match how shaders are ordered in the pipeline. - * The GLSL linker assumes that if iTemporary[] */ - PROGRAM_ARRAY, /**< Arrays & Matrixes */ - PROGRAM_INPUT, /**< machine->Inputs[] */ - PROGRAM_OUTPUT, /**< machine->Outputs[] */ - PROGRAM_STATE_VAR, /**< gl_program->Parameters[] */ - PROGRAM_CONSTANT, /**< gl_program->Parameters[] */ - PROGRAM_UNIFORM, /**< gl_program->Parameters[] */ - PROGRAM_WRITE_ONLY, /**< A dummy, write-only register */ - PROGRAM_ADDRESS, /**< machine->AddressReg */ - PROGRAM_SAMPLER, /**< for shader samplers, compile-time only */ - PROGRAM_SYSTEM_VALUE,/**< InstanceId, PrimitiveID, etc. */ - PROGRAM_UNDEFINED, /**< Invalid/TBD value */ - PROGRAM_FILE_MAX -} gl_register_file; - - -/** - * If the register file is PROGRAM_SYSTEM_VALUE, the register index will be - * one of these values. - */ -typedef enum -{ - /** - * \name Vertex shader system values - */ - /*@{*/ - /** - * OpenGL-style vertex ID. - * - * Section 2.11.7 (Shader Execution), subsection Shader Inputs, of the - * OpenGL 3.3 core profile spec says: - * - * "gl_VertexID holds the integer index i implicitly passed by - * DrawArrays or one of the other drawing commands defined in section - * 2.8.3." - * - * Section 2.8.3 (Drawing Commands) of the same spec says: - * - * "The commands....are equivalent to the commands with the same base - * name (without the BaseVertex suffix), except that the ith element - * transferred by the corresponding draw call will be taken from - * element indices[i] + basevertex of each enabled array." - * - * Additionally, the overview in the GL_ARB_shader_draw_parameters spec - * says: - * - * "In unextended GL, vertex shaders have inputs named gl_VertexID and - * gl_InstanceID, which contain, respectively the index of the vertex - * and instance. The value of gl_VertexID is the implicitly passed - * index of the vertex being processed, which includes the value of - * baseVertex, for those commands that accept it." - * - * gl_VertexID gets basevertex added in. This differs from DirectX where - * SV_VertexID does \b not get basevertex added in. - * - * \note - * If all system values are available, \c SYSTEM_VALUE_VERTEX_ID will be - * equal to \c SYSTEM_VALUE_VERTEX_ID_ZERO_BASE plus - * \c SYSTEM_VALUE_BASE_VERTEX. - * - * \sa SYSTEM_VALUE_VERTEX_ID_ZERO_BASE, SYSTEM_VALUE_BASE_VERTEX - */ - SYSTEM_VALUE_VERTEX_ID, - - /** - * Instanced ID as supplied to gl_InstanceID - * - * Values assigned to gl_InstanceID always begin with zero, regardless of - * the value of baseinstance. - * - * Section 11.1.3.9 (Shader Inputs) of the OpenGL 4.4 core profile spec - * says: - * - * "gl_InstanceID holds the integer instance number of the current - * primitive in an instanced draw call (see section 10.5)." - * - * Through a big chain of pseudocode, section 10.5 describes that - * baseinstance is not counted by gl_InstanceID. In that section, notice - * - * "If an enabled vertex attribute array is instanced (it has a - * non-zero divisor as specified by VertexAttribDivisor), the element - * index that is transferred to the GL, for all vertices, is given by - * - * floor(instance/divisor) + baseinstance - * - * If an array corresponding to an attribute required by a vertex - * shader is not enabled, then the corresponding element is taken from - * the current attribute state (see section 10.2)." - * - * Note that baseinstance is \b not included in the value of instance. - */ - SYSTEM_VALUE_INSTANCE_ID, - - /** - * DirectX-style vertex ID. - * - * Unlike \c SYSTEM_VALUE_VERTEX_ID, this system value does \b not include - * the value of basevertex. - * - * \sa SYSTEM_VALUE_VERTEX_ID, SYSTEM_VALUE_BASE_VERTEX - */ - SYSTEM_VALUE_VERTEX_ID_ZERO_BASE, - - /** - * Value of \c basevertex passed to \c glDrawElementsBaseVertex and similar - * functions. - * - * \sa SYSTEM_VALUE_VERTEX_ID, SYSTEM_VALUE_VERTEX_ID_ZERO_BASE - */ - SYSTEM_VALUE_BASE_VERTEX, - /*@}*/ - - /** - * \name Geometry shader system values - */ - /*@{*/ - SYSTEM_VALUE_INVOCATION_ID, - /*@}*/ - - /** - * \name Fragment shader system values - */ - /*@{*/ - SYSTEM_VALUE_FRONT_FACE, /**< (not done yet) */ - SYSTEM_VALUE_SAMPLE_ID, - SYSTEM_VALUE_SAMPLE_POS, - SYSTEM_VALUE_SAMPLE_MASK_IN, - /*@}*/ - - SYSTEM_VALUE_MAX /**< Number of values */ -} gl_system_value; - - -/** - * The possible interpolation qualifiers that can be applied to a fragment - * shader input in GLSL. - * - * Note: INTERP_QUALIFIER_NONE must be 0 so that memsetting the - * gl_fragment_program data structure to 0 causes the default behavior. - */ -enum glsl_interp_qualifier -{ - INTERP_QUALIFIER_NONE = 0, - INTERP_QUALIFIER_SMOOTH, - INTERP_QUALIFIER_FLAT, - INTERP_QUALIFIER_NOPERSPECTIVE, - INTERP_QUALIFIER_COUNT /**< Number of interpolation qualifiers */ -}; - - -/** - * \brief Layout qualifiers for gl_FragDepth. - * - * Extension AMD_conservative_depth allows gl_FragDepth to be redeclared with - * a layout qualifier. - * - * \see enum ir_depth_layout - */ -enum gl_frag_depth_layout -{ - FRAG_DEPTH_LAYOUT_NONE, /**< No layout is specified. */ - FRAG_DEPTH_LAYOUT_ANY, - FRAG_DEPTH_LAYOUT_GREATER, - FRAG_DEPTH_LAYOUT_LESS, - FRAG_DEPTH_LAYOUT_UNCHANGED -}; - - -/** - * Base class for any kind of program object - */ -struct gl_program -{ - GLuint Id; - GLubyte *String; /**< Null-terminated program text */ - GLint RefCount; - GLenum Target; /**< GL_VERTEX/FRAGMENT_PROGRAM_ARB, GL_GEOMETRY_PROGRAM_NV */ - GLenum Format; /**< String encoding format */ - - /** - * Local parameters used by the program. - * - * It's dynamically allocated because it is rarely used (just - * assembly-style programs), and MAX_PROGRAM_LOCAL_PARAMS entries once it's - * allocated. - */ - GLfloat (*LocalParams)[4]; - - /** Map from sampler unit to texture unit (set by glUniform1i()) */ - GLubyte SamplerUnits[MAX_SAMPLERS]; - - /** Bitmask of which register files are read/written with indirect - * addressing. Mask of (1 << PROGRAM_x) bits. - */ - GLbitfield IndirectRegisterFiles; - - /** Logical counts */ - /*@{*/ - GLuint NumInstructions; - GLuint NumTemporaries; - GLuint NumParameters; - GLuint NumAttributes; - GLuint NumAddressRegs; - GLuint NumAluInstructions; - GLuint NumTexInstructions; - GLuint NumTexIndirections; - /*@}*/ - /** Native, actual h/w counts */ - /*@{*/ - GLuint NumNativeInstructions; - GLuint NumNativeTemporaries; - GLuint NumNativeParameters; - GLuint NumNativeAttributes; - GLuint NumNativeAddressRegs; - GLuint NumNativeAluInstructions; - GLuint NumNativeTexInstructions; - GLuint NumNativeTexIndirections; - /*@}*/ -}; - - - -/** Set by #pragma directives */ -struct gl_sl_pragmas -{ - GLboolean IgnoreOptimize; /**< ignore #pragma optimize(on/off) ? */ - GLboolean IgnoreDebug; /**< ignore #pragma debug(on/off) ? */ - GLboolean Optimize; /**< defaults on */ - GLboolean Debug; /**< defaults off */ -}; - - -/** - * A GLSL vertex or fragment shader object. - */ -struct gl_shader -{ - /** GL_FRAGMENT_SHADER || GL_VERTEX_SHADER || GL_GEOMETRY_SHADER_ARB. - * Must be the first field. - */ - GLenum Type; - gl_shader_stage Stage; - GLuint Name; /**< AKA the handle */ - GLchar *Label; /**< GL_KHR_debug */ - GLint RefCount; /**< Reference count */ - GLboolean DeletePending; - GLboolean CompileStatus; - const char *Source; /**< Source code string */ - GLuint SourceChecksum; /**< for debug/logging purposes */ - struct gl_program *Program; /**< Post-compile assembly code */ - char *InfoLog; - struct gl_sl_pragmas Pragmas; - - unsigned Version; /**< GLSL version used for linking */ - GLboolean IsES; /**< True if this shader uses GLSL ES */ - - /** - * \name Sampler tracking - * - * \note Each of these fields is only set post-linking. - */ - /*@{*/ - unsigned num_samplers; /**< Number of samplers used by this shader. */ - GLbitfield active_samplers; /**< Bitfield of which samplers are used */ - GLbitfield shadow_samplers; /**< Samplers used for shadow sampling. */ - /*@}*/ - - /** - * Map from sampler unit to texture unit (set by glUniform1i()) - * - * A sampler unit is associated with each sampler uniform by the linker. - * The sampler unit associated with each uniform is stored in the - * \c gl_uniform_storage::sampler field. - */ - GLubyte SamplerUnits[MAX_SAMPLERS]; - /** Which texture target is being sampled (TEXTURE_1D/2D/3D/etc_INDEX) */ - gl_texture_index SamplerTargets[MAX_SAMPLERS]; - - /** - * Number of default uniform block components used by this shader. - * - * This field is only set post-linking. - */ - unsigned num_uniform_components; - - /** - * Number of combined uniform components used by this shader. - * - * This field is only set post-linking. It is the sum of the uniform block - * sizes divided by sizeof(float), and num_uniform_compoennts. - */ - unsigned num_combined_uniform_components; - - /** - * This shader's uniform block information. - * - * These fields are only set post-linking. - */ - struct gl_uniform_block *UniformBlocks; - unsigned NumUniformBlocks; - - struct exec_list *ir; - struct glsl_symbol_table *symbols; - - bool uses_builtin_functions; - bool uses_gl_fragcoord; - bool redeclares_gl_fragcoord; - bool ARB_fragment_coord_conventions_enable; - - /** - * Fragment shader state from GLSL 1.50 layout qualifiers. - */ - bool origin_upper_left; - bool pixel_center_integer; - - /** - * Geometry shader state from GLSL 1.50 layout qualifiers. - */ - struct { - GLint VerticesOut; - /** - * 0 - Invocations count not declared in shader, or - * 1 .. MAX_GEOMETRY_SHADER_INVOCATIONS - */ - GLint Invocations; - /** - * GL_POINTS, GL_LINES, GL_LINES_ADJACENCY, GL_TRIANGLES, or - * GL_TRIANGLES_ADJACENCY, or PRIM_UNKNOWN if it's not set in this - * shader. - */ - GLenum InputType; - /** - * GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP, or PRIM_UNKNOWN if - * it's not set in this shader. - */ - GLenum OutputType; - } Geom; - - /** - * Map from image uniform index to image unit (set by glUniform1i()) - * - * An image uniform index is associated with each image uniform by - * the linker. The image index associated with each uniform is - * stored in the \c gl_uniform_storage::image field. - */ - GLubyte ImageUnits[MAX_IMAGE_UNIFORMS]; - - /** - * Access qualifier specified in the shader for each image uniform - * index. Either \c GL_READ_ONLY, \c GL_WRITE_ONLY or \c - * GL_READ_WRITE. - * - * It may be different, though only more strict than the value of - * \c gl_image_unit::Access for the corresponding image unit. - */ - GLenum ImageAccess[MAX_IMAGE_UNIFORMS]; - - /** - * Number of image uniforms defined in the shader. It specifies - * the number of valid elements in the \c ImageUnits and \c - * ImageAccess arrays above. - */ - GLuint NumImages; - - /** - * Compute shader state from ARB_compute_shader layout qualifiers. - */ - struct { - /** - * Size specified using local_size_{x,y,z}, or all 0's to indicate that - * it's not set in this shader. - */ - unsigned LocalSize[3]; - } Comp; -}; - - -struct gl_uniform_buffer_variable -{ - char *Name; - - /** - * Name of the uniform as seen by glGetUniformIndices. - * - * glGetUniformIndices requires that the block instance index \b not be - * present in the name of queried uniforms. - * - * \note - * \c gl_uniform_buffer_variable::IndexName and - * \c gl_uniform_buffer_variable::Name may point to identical storage. - */ - char *IndexName; - - const struct glsl_type *Type; - unsigned int Offset; - GLboolean RowMajor; -}; - - -enum gl_uniform_block_packing -{ - ubo_packing_std140, - ubo_packing_shared, - ubo_packing_packed -}; - - -struct gl_uniform_block -{ - /** Declared name of the uniform block */ - char *Name; - - /** Array of supplemental information about UBO ir_variables. */ - struct gl_uniform_buffer_variable *Uniforms; - GLuint NumUniforms; - - /** - * Index (GL_UNIFORM_BLOCK_BINDING) into ctx->UniformBufferBindings[] to use - * with glBindBufferBase to bind a buffer object to this uniform block. When - * updated in the program, _NEW_BUFFER_OBJECT will be set. - */ - GLuint Binding; - - /** - * Minimum size (in bytes) of a buffer object to back this uniform buffer - * (GL_UNIFORM_BLOCK_DATA_SIZE). - */ - GLuint UniformBufferSize; - - /** - * Layout specified in the shader - * - * This isn't accessible through the API, but it is used while - * cross-validating uniform blocks. - */ - enum gl_uniform_block_packing _Packing; -}; - -/** - * Structure that represents a reference to an atomic buffer from some - * shader program. - */ -struct gl_active_atomic_buffer -{ - /** Uniform indices of the atomic counters declared within it. */ - GLuint *Uniforms; - GLuint NumUniforms; - - /** Binding point index associated with it. */ - GLuint Binding; - - /** Minimum reasonable size it is expected to have. */ - GLuint MinimumSize; - - /** Shader stages making use of it. */ - GLboolean StageReferences[MESA_SHADER_STAGES]; -}; - -/** - * A GLSL program object. - * Basically a linked collection of vertex and fragment shaders. - */ -struct gl_shader_program -{ - GLenum Type; /**< Always GL_SHADER_PROGRAM (internal token) */ - GLuint Name; /**< aka handle or ID */ - GLchar *Label; /**< GL_KHR_debug */ - GLint RefCount; /**< Reference count */ - GLboolean DeletePending; - - /** - * Is the application intending to glGetProgramBinary this program? - */ - GLboolean BinaryRetreivableHint; - - /** - * Indicates whether program can be bound for individual pipeline stages - * using UseProgramStages after it is next linked. - */ - GLboolean SeparateShader; - - GLuint NumShaders; /**< number of attached shaders */ - struct gl_shader **Shaders; /**< List of attached the shaders */ - - /** - * User-defined attribute bindings - * - * These are set via \c glBindAttribLocation and are used to direct the - * GLSL linker. These are \b not the values used in the compiled shader, - * and they are \b not the values returned by \c glGetAttribLocation. - */ - struct string_to_uint_map *AttributeBindings; - - /** - * User-defined fragment data bindings - * - * These are set via \c glBindFragDataLocation and are used to direct the - * GLSL linker. These are \b not the values used in the compiled shader, - * and they are \b not the values returned by \c glGetFragDataLocation. - */ - struct string_to_uint_map *FragDataBindings; - struct string_to_uint_map *FragDataIndexBindings; - - /** - * Transform feedback varyings last specified by - * glTransformFeedbackVaryings(). - * - * For the current set of transform feeedback varyings used for transform - * feedback output, see LinkedTransformFeedback. - */ - struct { - GLenum BufferMode; - GLuint NumVarying; - char **VaryingNames; /**< Array [NumVarying] of char * */ - } TransformFeedback; - - /** Post-link transform feedback info. */ - struct gl_transform_feedback_info LinkedTransformFeedback; - - /** Post-link gl_FragDepth layout for ARB_conservative_depth. */ - enum gl_frag_depth_layout FragDepthLayout; - - /** - * Geometry shader state - copied into gl_geometry_program by - * _mesa_copy_linked_program_data(). - */ - struct { - GLint VerticesIn; - GLint VerticesOut; - /** - * 1 .. MAX_GEOMETRY_SHADER_INVOCATIONS - */ - GLint Invocations; - GLenum InputType; /**< GL_POINTS, GL_LINES, GL_LINES_ADJACENCY_ARB, - GL_TRIANGLES, or GL_TRIANGLES_ADJACENCY_ARB */ - GLenum OutputType; /**< GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP */ - /** - * True if gl_ClipDistance is written to. Copied into - * gl_geometry_program by _mesa_copy_linked_program_data(). - */ - GLboolean UsesClipDistance; - GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or - 0 if not present. */ - bool UsesEndPrimitive; - bool UsesStreams; - } Geom; - - /** Vertex shader state */ - struct { - /** - * True if gl_ClipDistance is written to. Copied into gl_vertex_program - * by _mesa_copy_linked_program_data(). - */ - GLboolean UsesClipDistance; - GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or - 0 if not present. */ - } Vert; - - /** - * Compute shader state - copied into gl_compute_program by - * _mesa_copy_linked_program_data(). - */ - struct { - /** - * If this shader contains a compute stage, size specified using - * local_size_{x,y,z}. Otherwise undefined. - */ - unsigned LocalSize[3]; - } Comp; - - /* post-link info: */ - unsigned NumUserUniformStorage; - struct gl_uniform_storage *UniformStorage; - - /** - * Mapping from GL uniform locations returned by \c glUniformLocation to - * UniformStorage entries. Arrays will have multiple contiguous slots - * in the UniformRemapTable, all pointing to the same UniformStorage entry. - */ - unsigned NumUniformRemapTable; - struct gl_uniform_storage **UniformRemapTable; - - /** - * Size of the gl_ClipDistance array that is output from the last pipeline - * stage before the fragment shader. - */ - unsigned LastClipDistanceArraySize; - - struct gl_uniform_block *UniformBlocks; - unsigned NumUniformBlocks; - - /** - * Indices into the _LinkedShaders's UniformBlocks[] array for each stage - * they're used in, or -1. - * - * This is used to maintain the Binding values of the stage's UniformBlocks[] - * and to answer the GL_UNIFORM_BLOCK_REFERENCED_BY_*_SHADER queries. - */ - int *UniformBlockStageIndex[MESA_SHADER_STAGES]; - - /** - * Map of active uniform names to locations - * - * Maps any active uniform that is not an array element to a location. - * Each active uniform, including individual structure members will appear - * in this map. This roughly corresponds to the set of names that would be - * enumerated by \c glGetActiveUniform. - */ - struct string_to_uint_map *UniformHash; - - struct gl_active_atomic_buffer *AtomicBuffers; - unsigned NumAtomicBuffers; - - GLboolean LinkStatus; /**< GL_LINK_STATUS */ - GLboolean Validated; - GLboolean _Used; /**< Ever used for drawing? */ - GLchar *InfoLog; - - unsigned Version; /**< GLSL version used for linking */ - GLboolean IsES; /**< True if this program uses GLSL ES */ - - /** - * Per-stage shaders resulting from the first stage of linking. - * - * Set of linked shaders for this program. The array is accessed using the - * \c MESA_SHADER_* defines. Entries for non-existent stages will be - * \c NULL. - */ - struct gl_shader *_LinkedShaders[MESA_SHADER_STAGES]; - - /* True if any of the fragment shaders attached to this program use: - * #extension ARB_fragment_coord_conventions: enable - */ - GLboolean ARB_fragment_coord_conventions_enable; -}; - - - -/** - * Compiler options for a single GLSL shaders type - */ -struct gl_shader_compiler_options -{ - /** Driver-selectable options: */ - GLboolean EmitCondCodes; /**< Use condition codes? */ - GLboolean EmitNoLoops; - GLboolean EmitNoFunctions; - GLboolean EmitNoCont; /**< Emit CONT opcode? */ - GLboolean EmitNoMainReturn; /**< Emit CONT/RET opcodes? */ - GLboolean EmitNoNoise; /**< Emit NOISE opcodes? */ - GLboolean EmitNoPow; /**< Emit POW opcodes? */ - GLboolean LowerClipDistance; /**< Lower gl_ClipDistance from float[8] to vec4[2]? */ - - /** - * \name Forms of indirect addressing the driver cannot do. - */ - /*@{*/ - GLboolean EmitNoIndirectInput; /**< No indirect addressing of inputs */ - GLboolean EmitNoIndirectOutput; /**< No indirect addressing of outputs */ - GLboolean EmitNoIndirectTemp; /**< No indirect addressing of temps */ - GLboolean EmitNoIndirectUniform; /**< No indirect addressing of constants */ - /*@}*/ - - GLuint MaxIfDepth; /**< Maximum nested IF blocks */ - GLuint MaxUnrollIterations; - - /** - * Optimize code for array of structures backends. - * - * This is a proxy for: - * - preferring DP4 instructions (rather than MUL/MAD) for - * matrix * vector operations, such as position transformation. - */ - GLboolean OptimizeForAOS; - - struct gl_sl_pragmas DefaultPragmas; /**< Default #pragma settings */ -}; - - - - -/** - * Limits for vertex, geometry and fragment programs/shaders. - */ -struct gl_program_constants -{ - /* logical limits */ - GLuint MaxInstructions; - GLuint MaxAluInstructions; - GLuint MaxTexInstructions; - GLuint MaxTexIndirections; - GLuint MaxAttribs; - GLuint MaxTemps; - GLuint MaxAddressRegs; - GLuint MaxAddressOffset; /**< [-MaxAddressOffset, MaxAddressOffset-1] */ - GLuint MaxParameters; - GLuint MaxLocalParams; - GLuint MaxEnvParams; - /* native/hardware limits */ - GLuint MaxNativeInstructions; - GLuint MaxNativeAluInstructions; - GLuint MaxNativeTexInstructions; - GLuint MaxNativeTexIndirections; - GLuint MaxNativeAttribs; - GLuint MaxNativeTemps; - GLuint MaxNativeAddressRegs; - GLuint MaxNativeParameters; - /* For shaders */ - GLuint MaxUniformComponents; /**< Usually == MaxParameters * 4 */ - - /** - * \name Per-stage input / output limits - * - * Previous to OpenGL 3.2, the intrastage data limits were advertised with - * a single value: GL_MAX_VARYING_COMPONENTS (GL_MAX_VARYING_VECTORS in - * ES). This is stored as \c gl_constants::MaxVarying. - * - * Starting with OpenGL 3.2, the limits are advertised with per-stage - * variables. Each stage as a certain number of outputs that it can feed - * to the next stage and a certain number inputs that it can consume from - * the previous stage. - * - * Vertex shader inputs do not participate this in this accounting. - * These are tracked exclusively by \c gl_program_constants::MaxAttribs. - * - * Fragment shader outputs do not participate this in this accounting. - * These are tracked exclusively by \c gl_constants::MaxDrawBuffers. - */ - /*@{*/ - GLuint MaxInputComponents; - GLuint MaxOutputComponents; - /*@}*/ - - /* GL_ARB_uniform_buffer_object */ - GLuint MaxUniformBlocks; - GLuint MaxCombinedUniformComponents; - GLuint MaxTextureImageUnits; - - /* GL_ARB_shader_atomic_counters */ - GLuint MaxAtomicBuffers; - GLuint MaxAtomicCounters; - - /* GL_ARB_shader_image_load_store */ - GLuint MaxImageUniforms; -}; - - -/** - * Constants which may be overridden by device driver during context creation - * but are never changed after that. - */ -struct gl_constants -{ - GLuint MaxTextureMbytes; /**< Max memory per image, in MB */ - GLuint MaxTextureLevels; /**< Max mipmap levels. */ - GLuint Max3DTextureLevels; /**< Max mipmap levels for 3D textures */ - GLuint MaxCubeTextureLevels; /**< Max mipmap levels for cube textures */ - GLuint MaxArrayTextureLayers; /**< Max layers in array textures */ - GLuint MaxTextureRectSize; /**< Max rectangle texture size, in pixes */ - GLuint MaxTextureCoordUnits; - GLuint MaxCombinedTextureImageUnits; - GLuint MaxTextureUnits; /**< = MIN(CoordUnits, FragmentProgram.ImageUnits) */ - GLfloat MaxTextureMaxAnisotropy; /**< GL_EXT_texture_filter_anisotropic */ - GLfloat MaxTextureLodBias; /**< GL_EXT_texture_lod_bias */ - GLuint MaxTextureBufferSize; /**< GL_ARB_texture_buffer_object */ - - GLuint TextureBufferOffsetAlignment; /**< GL_ARB_texture_buffer_range */ - - GLuint MaxArrayLockSize; - - GLint SubPixelBits; - - GLfloat MinPointSize, MaxPointSize; /**< aliased */ - GLfloat MinPointSizeAA, MaxPointSizeAA; /**< antialiased */ - GLfloat PointSizeGranularity; - GLfloat MinLineWidth, MaxLineWidth; /**< aliased */ - GLfloat MinLineWidthAA, MaxLineWidthAA; /**< antialiased */ - GLfloat LineWidthGranularity; - - GLuint MaxClipPlanes; - GLuint MaxLights; - GLfloat MaxShininess; /**< GL_NV_light_max_exponent */ - GLfloat MaxSpotExponent; /**< GL_NV_light_max_exponent */ - - GLuint MaxViewportWidth, MaxViewportHeight; - GLuint MaxViewports; /**< GL_ARB_viewport_array */ - GLuint ViewportSubpixelBits; /**< GL_ARB_viewport_array */ - struct { - GLfloat Min; - GLfloat Max; - } ViewportBounds; /**< GL_ARB_viewport_array */ - - struct gl_program_constants Program[MESA_SHADER_STAGES]; - GLuint MaxProgramMatrices; - GLuint MaxProgramMatrixStackDepth; - - struct { - GLuint SamplesPassed; - GLuint TimeElapsed; - GLuint Timestamp; - GLuint PrimitivesGenerated; - GLuint PrimitivesWritten; - } QueryCounterBits; - - GLuint MaxDrawBuffers; /**< GL_ARB_draw_buffers */ - - GLuint MaxColorAttachments; /**< GL_EXT_framebuffer_object */ - GLuint MaxRenderbufferSize; /**< GL_EXT_framebuffer_object */ - GLuint MaxSamples; /**< GL_ARB_framebuffer_object */ - - /** Number of varying vectors between any two shader stages. */ - GLuint MaxVarying; - - /** @{ - * GL_ARB_uniform_buffer_object - */ - GLuint MaxCombinedUniformBlocks; - GLuint MaxUniformBufferBindings; - GLuint MaxUniformBlockSize; - GLuint UniformBufferOffsetAlignment; - /** @} */ - - /** - * GL_ARB_explicit_uniform_location - */ - GLuint MaxUserAssignableUniformLocations; - - /** GL_ARB_geometry_shader4 */ - GLuint MaxGeometryOutputVertices; - GLuint MaxGeometryTotalOutputComponents; - - GLuint GLSLVersion; /**< Desktop GLSL version supported (ex: 120 = 1.20) */ - - /** - * Changes default GLSL extension behavior from "error" to "warn". It's out - * of spec, but it can make some apps work that otherwise wouldn't. - */ - GLboolean ForceGLSLExtensionsWarn; - - /** - * If non-zero, forces GLSL shaders without the #version directive to behave - * as if they began with "#version ForceGLSLVersion". - */ - GLuint ForceGLSLVersion; - - /** - * Allow GLSL #extension directives in the middle of shaders. - */ - GLboolean AllowGLSLExtensionDirectiveMidShader; - - /** - * Does the driver support real 32-bit integers? (Otherwise, integers are - * simulated via floats.) - */ - GLboolean NativeIntegers; - - /** - * Does VertexID count from zero or from base vertex? - * - * \note - * If desktop GLSL 1.30 or GLSL ES 3.00 are not supported, this field is - * ignored and need not be set. - */ - bool VertexID_is_zero_based; - - /** - * If the driver supports real 32-bit integers, what integer value should be - * used for boolean true in uniform uploads? (Usually 1 or ~0.) - */ - GLuint UniformBooleanTrue; - - /** - * Maximum amount of time, measured in nanseconds, that the server can wait. - */ - GLuint64 MaxServerWaitTimeout; - - /** GL_EXT_provoking_vertex */ - GLboolean QuadsFollowProvokingVertexConvention; - - /** OpenGL version 3.0 */ - GLbitfield ContextFlags; /**< Ex: GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT */ - - /** OpenGL version 3.2 */ - GLbitfield ProfileMask; /**< Mask of CONTEXT_x_PROFILE_BIT */ - - /** OpenGL version 4.4 */ - GLuint MaxVertexAttribStride; - - /** GL_EXT_transform_feedback */ - GLuint MaxTransformFeedbackBuffers; - GLuint MaxTransformFeedbackSeparateComponents; - GLuint MaxTransformFeedbackInterleavedComponents; - GLuint MaxVertexStreams; - - /** GL_EXT_gpu_shader4 */ - GLint MinProgramTexelOffset, MaxProgramTexelOffset; - - /** GL_ARB_texture_gather */ - GLuint MinProgramTextureGatherOffset; - GLuint MaxProgramTextureGatherOffset; - GLuint MaxProgramTextureGatherComponents; - - /* GL_ARB_robustness */ - GLenum ResetStrategy; - - /* GL_ARB_blend_func_extended */ - GLuint MaxDualSourceDrawBuffers; - - /** - * Whether the implementation strips out and ignores texture borders. - * - * Many GPU hardware implementations don't support rendering with texture - * borders and mipmapped textures. (Note: not static border color, but the - * old 1-pixel border around each edge). Implementations then have to do - * slow fallbacks to be correct, or just ignore the border and be fast but - * wrong. Setting the flag strips the border off of TexImage calls, - * providing "fast but wrong" at significantly reduced driver complexity. - * - * Texture borders are deprecated in GL 3.0. - **/ - GLboolean StripTextureBorder; - - /** - * For drivers which can do a better job at eliminating unused uniforms - * than the GLSL compiler. - * - * XXX Remove these as soon as a better solution is available. - */ - GLboolean GLSLSkipStrictMaxUniformLimitCheck; - - /** - * Always use the GetTransformFeedbackVertexCount() driver hook, rather - * than passing the transform feedback object to the drawing function. - */ - GLboolean AlwaysUseGetTransformFeedbackVertexCount; - - /** GL_ARB_map_buffer_alignment */ - GLuint MinMapBufferAlignment; - - /** - * Disable varying packing. This is out of spec, but potentially useful - * for older platforms that supports a limited number of texture - * indirections--on these platforms, unpacking the varyings in the fragment - * shader increases the number of texture indirections by 1, which might - * make some shaders not executable at all. - * - * Drivers that support transform feedback must set this value to GL_FALSE. - */ - GLboolean DisableVaryingPacking; - - /** - * Should meaningful names be generated for compiler temporary variables? - * - * Generally, it is not useful to have the compiler generate "meaningful" - * names for temporary variables that it creates. This can, however, be a - * useful debugging aid. In Mesa debug builds or release builds when - * MESA_GLSL is set at run-time, meaningful names will be generated. - * Drivers can also force names to be generated by setting this field. - * For example, the i965 driver may set it when INTEL_DEBUG=vs (to dump - * vertex shader assembly) is set at run-time. - */ - bool GenerateTemporaryNames; - - /** - * Disable interpretation of line continuations (lines ending with a - * backslash character ('\') in GLSL source. - */ - GLboolean DisableGLSLLineContinuations; - - /** GL_ARB_texture_multisample */ - GLint MaxColorTextureSamples; - GLint MaxDepthTextureSamples; - GLint MaxIntegerSamples; - - /** - * GL_EXT_texture_multisample_blit_scaled implementation assumes that - * samples are laid out in a rectangular grid roughly corresponding to - * sample locations within a pixel. Below SampleMap{2,4,8}x variables - * are used to map indices of rectangular grid to sample numbers within - * a pixel. This mapping of indices to sample numbers must be initialized - * by the driver for the target hardware. For example, if we have the 8X - * MSAA sample number layout (sample positions) for XYZ hardware: - * - * sample indices layout sample number layout - * --------- --------- - * | 0 | 1 | | a | b | - * --------- --------- - * | 2 | 3 | | c | d | - * --------- --------- - * | 4 | 5 | | e | f | - * --------- --------- - * | 6 | 7 | | g | h | - * --------- --------- - * - * Where a,b,c,d,e,f,g,h are integers between [0-7]. - * - * Then, initialize the SampleMap8x variable for XYZ hardware as shown - * below: - * SampleMap8x = {a, b, c, d, e, f, g, h}; - * - * Follow the logic for other sample counts. - */ - uint8_t SampleMap2x[2]; - uint8_t SampleMap4x[4]; - uint8_t SampleMap8x[8]; - - /** GL_ARB_shader_atomic_counters */ - GLuint MaxAtomicBufferBindings; - GLuint MaxAtomicBufferSize; - GLuint MaxCombinedAtomicBuffers; - GLuint MaxCombinedAtomicCounters; - - /** GL_ARB_vertex_attrib_binding */ - GLint MaxVertexAttribRelativeOffset; - GLint MaxVertexAttribBindings; - - /* GL_ARB_shader_image_load_store */ - GLuint MaxImageUnits; - GLuint MaxCombinedImageUnitsAndFragmentOutputs; - GLuint MaxImageSamples; - GLuint MaxCombinedImageUniforms; - - /** GL_ARB_compute_shader */ - GLuint MaxComputeWorkGroupCount[3]; /* Array of x, y, z dimensions */ - GLuint MaxComputeWorkGroupSize[3]; /* Array of x, y, z dimensions */ - GLuint MaxComputeWorkGroupInvocations; - - /** GL_ARB_gpu_shader5 */ - GLfloat MinFragmentInterpolationOffset; - GLfloat MaxFragmentInterpolationOffset; - - GLboolean FakeSWMSAA; - - struct gl_shader_compiler_options ShaderCompilerOptions[MESA_SHADER_STAGES]; -}; - - -/** - * Enable flag for each OpenGL extension. Different device drivers will - * enable different extensions at runtime. - */ -struct gl_extensions -{ - GLboolean dummy; /* don't remove this! */ - GLboolean dummy_true; /* Set true by _mesa_init_extensions(). */ - GLboolean dummy_false; /* Set false by _mesa_init_extensions(). */ - GLboolean ANGLE_texture_compression_dxt; - GLboolean ARB_ES2_compatibility; - GLboolean ARB_ES3_compatibility; - GLboolean ARB_arrays_of_arrays; - GLboolean ARB_base_instance; - GLboolean ARB_blend_func_extended; - GLboolean ARB_buffer_storage; - GLboolean ARB_clear_texture; - GLboolean ARB_color_buffer_float; - GLboolean ARB_compute_shader; - GLboolean ARB_conditional_render_inverted; - GLboolean ARB_conservative_depth; - GLboolean ARB_copy_image; - GLboolean ARB_depth_buffer_float; - GLboolean ARB_depth_clamp; - GLboolean ARB_depth_texture; - GLboolean ARB_derivative_control; - GLboolean ARB_draw_buffers_blend; - GLboolean ARB_draw_elements_base_vertex; - GLboolean ARB_draw_indirect; - GLboolean ARB_draw_instanced; - GLboolean ARB_fragment_coord_conventions; - GLboolean ARB_fragment_layer_viewport; - GLboolean ARB_fragment_program; - GLboolean ARB_fragment_program_shadow; - GLboolean ARB_fragment_shader; - GLboolean ARB_framebuffer_object; - GLboolean ARB_explicit_attrib_location; - GLboolean ARB_explicit_uniform_location; - GLboolean ARB_geometry_shader4; - GLboolean ARB_gpu_shader5; - GLboolean ARB_half_float_pixel; - GLboolean ARB_half_float_vertex; - GLboolean ARB_instanced_arrays; - GLboolean ARB_internalformat_query; - GLboolean ARB_map_buffer_alignment; - GLboolean ARB_map_buffer_range; - GLboolean ARB_occlusion_query; - GLboolean ARB_occlusion_query2; - GLboolean ARB_point_sprite; - GLboolean ARB_sample_shading; - GLboolean ARB_seamless_cube_map; - GLboolean ARB_shader_atomic_counters; - GLboolean ARB_shader_bit_encoding; - GLboolean ARB_shader_image_load_store; - GLboolean ARB_shader_stencil_export; - GLboolean ARB_shader_texture_lod; - GLboolean ARB_shader_viewport_layer_array; - GLboolean ARB_shading_language_packing; - GLboolean ARB_shading_language_420pack; - GLboolean ARB_shadow; - GLboolean ARB_stencil_texturing; - GLboolean ARB_sync; - GLboolean ARB_texture_border_clamp; - GLboolean ARB_texture_buffer_object; - GLboolean ARB_texture_buffer_object_rgb32; - GLboolean ARB_texture_buffer_range; - GLboolean ARB_texture_compression_bptc; - GLboolean ARB_texture_compression_rgtc; - GLboolean ARB_texture_cube_map; - GLboolean ARB_texture_cube_map_array; - GLboolean ARB_texture_env_combine; - GLboolean ARB_texture_env_crossbar; - GLboolean ARB_texture_env_dot3; - GLboolean ARB_texture_float; - GLboolean ARB_texture_gather; - GLboolean ARB_texture_mirror_clamp_to_edge; - GLboolean ARB_texture_multisample; - GLboolean ARB_texture_non_power_of_two; - GLboolean ARB_texture_stencil8; - GLboolean ARB_texture_query_levels; - GLboolean ARB_texture_query_lod; - GLboolean ARB_texture_rg; - GLboolean ARB_texture_rgb10_a2ui; - GLboolean ARB_texture_view; - GLboolean ARB_timer_query; - GLboolean ARB_transform_feedback2; - GLboolean ARB_transform_feedback3; - GLboolean ARB_transform_feedback_instanced; - GLboolean ARB_uniform_buffer_object; - GLboolean ARB_vertex_program; - GLboolean ARB_vertex_shader; - GLboolean ARB_vertex_type_10f_11f_11f_rev; - GLboolean ARB_vertex_type_2_10_10_10_rev; - GLboolean ARB_viewport_array; - GLboolean EXT_blend_color; - GLboolean EXT_blend_equation_separate; - GLboolean EXT_blend_func_separate; - GLboolean EXT_blend_minmax; - GLboolean EXT_depth_bounds_test; - GLboolean EXT_draw_buffers; - GLboolean EXT_draw_buffers2; - GLboolean EXT_draw_instanced; - GLboolean EXT_framebuffer_blit; - GLboolean EXT_framebuffer_multisample; - GLboolean EXT_framebuffer_multisample_blit_scaled; - GLboolean EXT_framebuffer_sRGB; - GLboolean EXT_gpu_program_parameters; - GLboolean EXT_gpu_shader4; - GLboolean EXT_packed_float; - GLboolean EXT_pixel_buffer_object; - GLboolean EXT_point_parameters; - GLboolean EXT_provoking_vertex; - GLboolean EXT_shader_integer_mix; - GLboolean EXT_stencil_two_side; - GLboolean EXT_texture3D; - GLboolean EXT_texture_array; - GLboolean EXT_texture_compression_latc; - GLboolean EXT_texture_compression_s3tc; - GLboolean EXT_texture_env_dot3; - GLboolean EXT_texture_filter_anisotropic; - GLboolean EXT_texture_integer; - GLboolean EXT_texture_mirror_clamp; - GLboolean EXT_texture_shared_exponent; - GLboolean EXT_texture_snorm; - GLboolean EXT_texture_sRGB; - GLboolean EXT_texture_sRGB_decode; - GLboolean EXT_texture_swizzle; - GLboolean EXT_transform_feedback; - GLboolean EXT_timer_query; - GLboolean EXT_vertex_array_bgra; - GLboolean OES_standard_derivatives; - GLboolean EXT_shadow_samplers; - GLboolean EXT_frag_depth; - GLboolean EXT_shader_framebuffer_fetch; - /* vendor extensions */ - GLboolean AMD_performance_monitor; - GLboolean AMD_seamless_cubemap_per_texture; - GLboolean AMD_shader_trinary_minmax; - GLboolean AMD_vertex_shader_layer; - GLboolean AMD_vertex_shader_viewport_index; - GLboolean APPLE_object_purgeable; - GLboolean ATI_texture_compression_3dc; - GLboolean ATI_texture_mirror_once; - GLboolean ATI_texture_env_combine3; - GLboolean ATI_fragment_shader; - GLboolean ATI_separate_stencil; - GLboolean INTEL_performance_query; - GLboolean MESA_pack_invert; - GLboolean MESA_ycbcr_texture; - GLboolean NV_conditional_render; - GLboolean NV_fog_distance; - GLboolean NV_fragment_program_option; - GLboolean NV_point_sprite; - GLboolean NV_primitive_restart; - GLboolean NV_texture_barrier; - GLboolean NV_texture_env_combine4; - GLboolean NV_texture_rectangle; - GLboolean NV_vdpau_interop; - GLboolean TDFX_texture_compression_FXT1; - GLboolean OES_EGL_image; - GLboolean OES_draw_texture; - GLboolean OES_depth_texture_cube_map; - GLboolean OES_EGL_image_external; - GLboolean OES_compressed_ETC1_RGB8_texture; - GLboolean extension_sentinel; - /** The extension string */ - const GLubyte *String; - /** Number of supported extensions */ - GLuint Count; -}; - - - - - - -/* This has to be included here. */ -#include "dd.h" - - - -/** @{ - * - * These are a mapping of the GL_ARB_debug_output/GL_KHR_debug enums - * to small enums suitable for use as an array index. - */ - -enum mesa_debug_type { - MESA_DEBUG_TYPE_ERROR, - MESA_DEBUG_TYPE_DEPRECATED, - MESA_DEBUG_TYPE_UNDEFINED, - MESA_DEBUG_TYPE_PORTABILITY, - MESA_DEBUG_TYPE_PERFORMANCE, - MESA_DEBUG_TYPE_OTHER, - MESA_DEBUG_TYPE_MARKER, - MESA_DEBUG_TYPE_PUSH_GROUP, - MESA_DEBUG_TYPE_POP_GROUP, - MESA_DEBUG_TYPE_COUNT -}; - -/** - * Enum for the OpenGL APIs we know about and may support. - * - * NOTE: This must match the api_enum table in - * src/mesa/main/get_hash_generator.py - */ -typedef enum -{ - API_OPENGL_COMPAT, /* legacy / compatibility contexts */ - API_OPENGLES, - API_OPENGLES2, - API_OPENGL_CORE, - API_OPENGL_LAST = API_OPENGL_CORE -} gl_api; - - - - -/** - * Mesa rendering context. - * - * This is the central context data structure for Mesa. Almost all - * OpenGL state is contained in this structure. - * Think of this as a base class from which device drivers will derive - * sub classes. - */ -struct gl_context -{ - gl_api API; - - /** - * Device driver function pointer table - */ - struct dd_function_table Driver; - - /** Core/Driver constants */ - struct gl_constants Const; - - /** Extension information */ - struct gl_extensions Extensions; - - /** GL version integer, for example 31 for GL 3.1, or 20 for GLES 2.0. */ - GLuint Version; - char *VersionString; - - - GLenum ErrorValue; /**< Last error code */ -}; - - -#ifdef DEBUG -extern int MESA_VERBOSE; -extern int MESA_DEBUG_FLAGS; -# define MESA_FUNCTION __FUNCTION__ -#else -# define MESA_VERBOSE 0 -# define MESA_DEBUG_FLAGS 0 -# define MESA_FUNCTION "a function" -# ifndef NDEBUG -# define NDEBUG -# endif -#endif - - -/** The MESA_VERBOSE var is a bitmask of these flags */ -enum _verbose -{ - VERBOSE_VARRAY = 0x0001, - VERBOSE_TEXTURE = 0x0002, - VERBOSE_MATERIAL = 0x0004, - VERBOSE_PIPELINE = 0x0008, - VERBOSE_DRIVER = 0x0010, - VERBOSE_STATE = 0x0020, - VERBOSE_API = 0x0040, - VERBOSE_DISPLAY_LIST = 0x0100, - VERBOSE_LIGHTING = 0x0200, - VERBOSE_PRIMS = 0x0400, - VERBOSE_VERTS = 0x0800, - VERBOSE_DISASSEM = 0x1000, - VERBOSE_DRAW = 0x2000, - VERBOSE_SWAPBUFFERS = 0x4000 -}; - - -/** The MESA_DEBUG_FLAGS var is a bitmask of these flags */ -enum _debug -{ - DEBUG_SILENT = (1 << 0), - DEBUG_ALWAYS_FLUSH = (1 << 1), - DEBUG_INCOMPLETE_TEXTURE = (1 << 2), - DEBUG_INCOMPLETE_FBO = (1 << 3) -}; - - - -#ifdef __cplusplus -} -#endif - -#endif /* MTYPES_H */ diff --git a/3rdparty/glsl-optimizer/src/mesa/main/simple_list.h b/3rdparty/glsl-optimizer/src/mesa/main/simple_list.h deleted file mode 100644 index aa6117aff..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/main/simple_list.h +++ /dev/null @@ -1,205 +0,0 @@ -/** - * \file simple_list.h - * Simple macros for type-safe, intrusive lists. - * - * Intended to work with a list sentinal which is created as an empty - * list. Insert & delete are O(1). - * - * \author - * (C) 1997, Keith Whitwell - */ - -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - -#ifndef _SIMPLE_LIST_H -#define _SIMPLE_LIST_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Remove an element from list. - * - * \param elem element to remove. - */ -#define remove_from_list(elem) \ -do { \ - (elem)->next->prev = (elem)->prev; \ - (elem)->prev->next = (elem)->next; \ -} while (0) - -/** - * Insert an element to the list head. - * - * \param list list. - * \param elem element to insert. - */ -#define insert_at_head(list, elem) \ -do { \ - (elem)->prev = list; \ - (elem)->next = (list)->next; \ - (list)->next->prev = elem; \ - (list)->next = elem; \ -} while(0) - -/** - * Insert an element to the list tail. - * - * \param list list. - * \param elem element to insert. - */ -#define insert_at_tail(list, elem) \ -do { \ - (elem)->next = list; \ - (elem)->prev = (list)->prev; \ - (list)->prev->next = elem; \ - (list)->prev = elem; \ -} while(0) - -/** - * Move an element to the list head. - * - * \param list list. - * \param elem element to move. - */ -#define move_to_head(list, elem) \ -do { \ - remove_from_list(elem); \ - insert_at_head(list, elem); \ -} while (0) - -/** - * Move an element to the list tail. - * - * \param list list. - * \param elem element to move. - */ -#define move_to_tail(list, elem) \ -do { \ - remove_from_list(elem); \ - insert_at_tail(list, elem); \ -} while (0) - -/** - * Make a empty list empty. - * - * \param sentinal list (sentinal element). - */ -#define make_empty_list(sentinal) \ -do { \ - (sentinal)->next = sentinal; \ - (sentinal)->prev = sentinal; \ -} while (0) - -/** - * Get list first element. - * - * \param list list. - * - * \return pointer to first element. - */ -#define first_elem(list) ((list)->next) - -/** - * Get list last element. - * - * \param list list. - * - * \return pointer to last element. - */ -#define last_elem(list) ((list)->prev) - -/** - * Get next element. - * - * \param elem element. - * - * \return pointer to next element. - */ -#define next_elem(elem) ((elem)->next) - -/** - * Get previous element. - * - * \param elem element. - * - * \return pointer to previous element. - */ -#define prev_elem(elem) ((elem)->prev) - -/** - * Test whether element is at end of the list. - * - * \param list list. - * \param elem element. - * - * \return non-zero if element is at end of list, or zero otherwise. - */ -#define at_end(list, elem) ((elem) == (list)) - -/** - * Test if a list is empty. - * - * \param list list. - * - * \return non-zero if list empty, or zero otherwise. - */ -#define is_empty_list(list) ((list)->next == (list)) - -/** - * Walk through the elements of a list. - * - * \param ptr pointer to the current element. - * \param list list. - * - * \note It should be followed by a { } block or a single statement, as in a \c - * for loop. - */ -#define foreach(ptr, list) \ - for( ptr=(list)->next ; ptr!=list ; ptr=(ptr)->next ) - -/** - * Walk through the elements of a list. - * - * Same as #foreach but lets you unlink the current value during a list - * traversal. Useful for freeing a list, element by element. - * - * \param ptr pointer to the current element. - * \param t temporary pointer. - * \param list list. - * - * \note It should be followed by a { } block or a single statement, as in a \c - * for loop. - */ -#define foreach_s(ptr, t, list) \ - for(ptr=(list)->next,t=(ptr)->next; list != ptr; ptr=t, t=(t)->next) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/3rdparty/glsl-optimizer/src/mesa/program/hash_table.h b/3rdparty/glsl-optimizer/src/mesa/program/hash_table.h deleted file mode 100644 index 20595aac4..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/program/hash_table.h +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Copyright © 2008 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file hash_table.h - * \brief Implementation of a generic, opaque hash table data type. - * - * \author Ian Romanick - */ - -#ifndef HASH_TABLE_H -#define HASH_TABLE_H - -#include -#include -#include -#include -#include -#include - -struct string_to_uint_map; - -#ifdef __cplusplus -extern "C" { -#endif - -struct hash_table; - -typedef unsigned (*hash_func_t)(const void *key); -typedef int (*hash_compare_func_t)(const void *key1, const void *key2); - -/** - * Hash table constructor - * - * Creates a hash table with the specified number of buckets. The supplied - * \c hash and \c compare routines are used when adding elements to the table - * and when searching for elements in the table. - * - * \param num_buckets Number of buckets (bins) in the hash table. - * \param hash Function used to compute hash value of input keys. - * \param compare Function used to compare keys. - */ -extern struct hash_table *hash_table_ctor(unsigned num_buckets, - hash_func_t hash, hash_compare_func_t compare); - - -/** - * Release all memory associated with a hash table - * - * \warning - * This function cannot release memory occupied either by keys or data. - */ -extern void hash_table_dtor(struct hash_table *ht); - - -/** - * Flush all entries from a hash table - * - * \param ht Table to be cleared of its entries. - */ -extern void hash_table_clear(struct hash_table *ht); - - -/** - * Search a hash table for a specific element - * - * \param ht Table to be searched - * \param key Key of the desired element - * - * \return - * The \c data value supplied to \c hash_table_insert when the element with - * the matching key was added. If no matching key exists in the table, - * \c NULL is returned. - */ -extern void *hash_table_find(struct hash_table *ht, const void *key); - - -/** - * Add an element to a hash table - * - * \warning - * If \c key is already in the hash table, it will be added again. Future - * calls to \c hash_table_find and \c hash_table_remove will return or remove, - * repsectively, the most recently added instance of \c key. - * - * \warning - * The value passed by \c key is kept in the hash table and is used by later - * calls to \c hash_table_find. - * - * \sa hash_table_replace - */ -extern void hash_table_insert(struct hash_table *ht, void *data, - const void *key); - -/** - * Add an element to a hash table with replacement - * - * \return - * 1 if it did replace the value (in which case the old key is kept), 0 if it - * did not replace the value (in which case the new key is kept). - * - * \warning - * If \c key is already in the hash table, \c data will \b replace the most - * recently inserted \c data (see the warning in \c hash_table_insert) for - * that key. - * - * \sa hash_table_insert - */ -extern bool hash_table_replace(struct hash_table *ht, void *data, - const void *key); - -/** - * Remove a specific element from a hash table. - */ -extern void hash_table_remove(struct hash_table *ht, const void *key); - -/** - * Compute hash value of a string - * - * Computes the hash value of a string using the DJB2 algorithm developed by - * Professor Daniel J. Bernstein. It was published on comp.lang.c once upon - * a time. I was unable to find the original posting in the archives. - * - * \param key Pointer to a NUL terminated string to be hashed. - * - * \sa hash_table_string_compare - */ -extern unsigned hash_table_string_hash(const void *key); - - -/** - * Compare two strings used as keys - * - * This is just a macro wrapper around \c strcmp. - * - * \sa hash_table_string_hash - */ -#define hash_table_string_compare ((hash_compare_func_t) strcmp) - - -/** - * Compute hash value of a pointer - * - * \param key Pointer to be used as a hash key - * - * \note - * The memory pointed to by \c key is \b never accessed. The value of \c key - * itself is used as the hash key - * - * \sa hash_table_pointer_compare - */ -unsigned -hash_table_pointer_hash(const void *key); - - -/** - * Compare two pointers used as keys - * - * \sa hash_table_pointer_hash - */ -int -hash_table_pointer_compare(const void *key1, const void *key2); - -void -hash_table_call_foreach(struct hash_table *ht, - void (*callback)(const void *key, - void *data, - void *closure), - void *closure); - -struct string_to_uint_map * -string_to_uint_map_ctor(); - -void -string_to_uint_map_dtor(struct string_to_uint_map *); - - -#ifdef __cplusplus -} - -/** - * Map from a string (name) to an unsigned integer value - * - * \note - * Because of the way this class interacts with the \c hash_table - * implementation, values of \c UINT_MAX cannot be stored in the map. - */ -struct string_to_uint_map { -public: - string_to_uint_map() - { - this->ht = hash_table_ctor(0, hash_table_string_hash, - hash_table_string_compare); - } - - ~string_to_uint_map() - { - hash_table_call_foreach(this->ht, delete_key, NULL); - hash_table_dtor(this->ht); - } - - /** - * Remove all mappings from this map. - */ - void clear() - { - hash_table_call_foreach(this->ht, delete_key, NULL); - hash_table_clear(this->ht); - } - - /** - * Get the value associated with a particular key - * - * \return - * If \c key is found in the map, \c true is returned. Otherwise \c false - * is returned. - * - * \note - * If \c key is not found in the table, \c value is not modified. - */ - bool get(unsigned &value, const char *key) - { - const intptr_t v = - (intptr_t) hash_table_find(this->ht, (const void *) key); - - if (v == 0) - return false; - - value = (unsigned)(v - 1); - return true; - } - - void put(unsigned value, const char *key) - { - /* The low-level hash table structure returns NULL if key is not in the - * hash table. However, users of this map might want to store zero as a - * valid value in the table. Bias the value by +1 so that a - * user-specified zero is stored as 1. This enables ::get to tell the - * difference between a user-specified zero (returned as 1 by - * hash_table_find) and the key not in the table (returned as 0 by - * hash_table_find). - * - * The net effect is that we can't store UINT_MAX in the table. This is - * because UINT_MAX+1 = 0. - */ - assert(value != UINT_MAX); - char *dup_key = strdup(key); - bool result = hash_table_replace(this->ht, - (void *) (intptr_t) (value + 1), - dup_key); - if (result) - free(dup_key); - } - -private: - static void delete_key(const void *key, void *data, void *closure) - { - (void) data; - (void) closure; - - free((char *)key); - } - - struct hash_table *ht; -}; - -#endif /* __cplusplus */ -#endif /* HASH_TABLE_H */ diff --git a/3rdparty/glsl-optimizer/src/mesa/program/prog_hash_table.c b/3rdparty/glsl-optimizer/src/mesa/program/prog_hash_table.c deleted file mode 100644 index 680699b56..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/program/prog_hash_table.c +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright © 2008 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file hash_table.c - * \brief Implementation of a generic, opaque hash table data type. - * - * \author Ian Romanick - */ - -#include "main/errors.h" -#include "main/simple_list.h" -#include "hash_table.h" - -struct node { - struct node *next; - struct node *prev; -}; - -struct hash_table { - hash_func_t hash; - hash_compare_func_t compare; - - unsigned num_buckets; - struct node buckets[1]; -}; - - -struct hash_node { - struct node link; - const void *key; - void *data; -}; - - -struct hash_table * -hash_table_ctor(unsigned num_buckets, hash_func_t hash, - hash_compare_func_t compare) -{ - struct hash_table *ht; - unsigned i; - - - if (num_buckets < 16) { - num_buckets = 16; - } - - ht = malloc(sizeof(*ht) + ((num_buckets - 1) - * sizeof(ht->buckets[0]))); - if (ht != NULL) { - ht->hash = hash; - ht->compare = compare; - ht->num_buckets = num_buckets; - - for (i = 0; i < num_buckets; i++) { - make_empty_list(& ht->buckets[i]); - } - } - - return ht; -} - - -void -hash_table_dtor(struct hash_table *ht) -{ - if (!ht) - return; - hash_table_clear(ht); - free(ht); -} - - -void -hash_table_clear(struct hash_table *ht) -{ - struct node *node; - struct node *temp; - unsigned i; - - - for (i = 0; i < ht->num_buckets; i++) { - foreach_s(node, temp, & ht->buckets[i]) { - remove_from_list(node); - free(node); - } - - assert(is_empty_list(& ht->buckets[i])); - } -} - - -static struct hash_node * -get_node(struct hash_table *ht, const void *key) -{ - const unsigned hash_value = (*ht->hash)(key); - const unsigned bucket = hash_value % ht->num_buckets; - struct node *node; - - foreach(node, & ht->buckets[bucket]) { - struct hash_node *hn = (struct hash_node *) node; - - if ((*ht->compare)(hn->key, key) == 0) { - return hn; - } - } - - return NULL; -} - -void * -hash_table_find(struct hash_table *ht, const void *key) -{ - struct hash_node *hn = get_node(ht, key); - - return (hn == NULL) ? NULL : hn->data; -} - -void -hash_table_insert(struct hash_table *ht, void *data, const void *key) -{ - const unsigned hash_value = (*ht->hash)(key); - const unsigned bucket = hash_value % ht->num_buckets; - struct hash_node *node; - - node = calloc(1, sizeof(*node)); - if (node == NULL) { - _mesa_error_no_memory(__func__); - return; - } - - node->data = data; - node->key = key; - - insert_at_head(& ht->buckets[bucket], & node->link); -} - -bool -hash_table_replace(struct hash_table *ht, void *data, const void *key) -{ - const unsigned hash_value = (*ht->hash)(key); - const unsigned bucket = hash_value % ht->num_buckets; - struct node *node; - struct hash_node *hn; - - foreach(node, & ht->buckets[bucket]) { - hn = (struct hash_node *) node; - - if ((*ht->compare)(hn->key, key) == 0) { - hn->data = data; - return true; - } - } - - hn = calloc(1, sizeof(*hn)); - if (hn == NULL) { - _mesa_error_no_memory(__func__); - return false; - } - - hn->data = data; - hn->key = key; - - insert_at_head(& ht->buckets[bucket], & hn->link); - return false; -} - -void -hash_table_remove(struct hash_table *ht, const void *key) -{ - struct node *node = (struct node *) get_node(ht, key); - if (node != NULL) { - remove_from_list(node); - free(node); - return; - } -} - -void -hash_table_call_foreach(struct hash_table *ht, - void (*callback)(const void *key, - void *data, - void *closure), - void *closure) -{ - unsigned bucket; - - for (bucket = 0; bucket < (int)ht->num_buckets; bucket++) { - struct node *node, *temp; - foreach_s(node, temp, &ht->buckets[bucket]) { - struct hash_node *hn = (struct hash_node *) node; - - callback(hn->key, hn->data, closure); - } - } -} - -unsigned -hash_table_string_hash(const void *key) -{ - const char *str = (const char *) key; - unsigned hash = 5381; - - - while (*str != '\0') { - hash = (hash * 33) + *str; - str++; - } - - return hash; -} - - -unsigned -hash_table_pointer_hash(const void *key) -{ - return (unsigned)((uintptr_t) key / sizeof(void *)); -} - - -int -hash_table_pointer_compare(const void *key1, const void *key2) -{ - return key1 == key2 ? 0 : 1; -} diff --git a/3rdparty/glsl-optimizer/src/mesa/program/prog_instruction.h b/3rdparty/glsl-optimizer/src/mesa/program/prog_instruction.h deleted file mode 100644 index b9604e50d..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/program/prog_instruction.h +++ /dev/null @@ -1,430 +0,0 @@ -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - -/** - * \file prog_instruction.h - * - * Vertex/fragment program instruction datatypes and constants. - * - * \author Brian Paul - * \author Keith Whitwell - * \author Ian Romanick - */ - - -#ifndef PROG_INSTRUCTION_H -#define PROG_INSTRUCTION_H - - -#include "main/glheader.h" - - -/** - * Swizzle indexes. - * Do not change! - */ -/*@{*/ -#define SWIZZLE_X 0 -#define SWIZZLE_Y 1 -#define SWIZZLE_Z 2 -#define SWIZZLE_W 3 -#define SWIZZLE_ZERO 4 /**< For SWZ instruction only */ -#define SWIZZLE_ONE 5 /**< For SWZ instruction only */ -#define SWIZZLE_NIL 7 /**< used during shader code gen (undefined value) */ -/*@}*/ - -#define MAKE_SWIZZLE4(a,b,c,d) (((a)<<0) | ((b)<<3) | ((c)<<6) | ((d)<<9)) -#define SWIZZLE_NOOP MAKE_SWIZZLE4(0,1,2,3) -#define GET_SWZ(swz, idx) (((swz) >> ((idx)*3)) & 0x7) -#define GET_BIT(msk, idx) (((msk) >> (idx)) & 0x1) - -#define SWIZZLE_XYZW MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W) -#define SWIZZLE_XXXX MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X) -#define SWIZZLE_YYYY MAKE_SWIZZLE4(SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y) -#define SWIZZLE_ZZZZ MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z) -#define SWIZZLE_WWWW MAKE_SWIZZLE4(SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W) - - -/** - * Writemask values, 1 bit per component. - */ -/*@{*/ -#define WRITEMASK_X 0x1 -#define WRITEMASK_Y 0x2 -#define WRITEMASK_XY 0x3 -#define WRITEMASK_Z 0x4 -#define WRITEMASK_XZ 0x5 -#define WRITEMASK_YZ 0x6 -#define WRITEMASK_XYZ 0x7 -#define WRITEMASK_W 0x8 -#define WRITEMASK_XW 0x9 -#define WRITEMASK_YW 0xa -#define WRITEMASK_XYW 0xb -#define WRITEMASK_ZW 0xc -#define WRITEMASK_XZW 0xd -#define WRITEMASK_YZW 0xe -#define WRITEMASK_XYZW 0xf -/*@}*/ - - -/** - * Condition codes - */ -/*@{*/ -#define COND_GT 1 /**< greater than zero */ -#define COND_EQ 2 /**< equal to zero */ -#define COND_LT 3 /**< less than zero */ -#define COND_UN 4 /**< unordered (NaN) */ -#define COND_GE 5 /**< greater than or equal to zero */ -#define COND_LE 6 /**< less than or equal to zero */ -#define COND_NE 7 /**< not equal to zero */ -#define COND_TR 8 /**< always true */ -#define COND_FL 9 /**< always false */ -/*@}*/ - - -/** - * Instruction precision for GL_NV_fragment_program - */ -/*@{*/ -#define FLOAT32 0x1 -#define FLOAT16 0x2 -#define FIXED12 0x4 -/*@}*/ - - -/** - * Saturation modes when storing values. - */ -/*@{*/ -#define SATURATE_OFF 0 -#define SATURATE_ZERO_ONE 1 -/*@}*/ - - -/** - * Per-component negation masks - */ -/*@{*/ -#define NEGATE_X 0x1 -#define NEGATE_Y 0x2 -#define NEGATE_Z 0x4 -#define NEGATE_W 0x8 -#define NEGATE_XYZ 0x7 -#define NEGATE_XYZW 0xf -#define NEGATE_NONE 0x0 -/*@}*/ - - -/** - * Program instruction opcodes for vertex, fragment and geometry programs. - */ -typedef enum prog_opcode { - /* ARB_vp ARB_fp NV_vp NV_fp GLSL */ - /*------------------------------------------*/ - OPCODE_NOP = 0, /* X */ - OPCODE_ABS, /* X X 1.1 X */ - OPCODE_ADD, /* X X X X X */ - OPCODE_ARL, /* X X X */ - OPCODE_BGNLOOP, /* opt */ - OPCODE_BGNSUB, /* opt */ - OPCODE_BRK, /* 2 opt */ - OPCODE_CAL, /* 2 2 opt */ - OPCODE_CMP, /* X X */ - OPCODE_CONT, /* opt */ - OPCODE_COS, /* X 2 X X */ - OPCODE_DDX, /* X X */ - OPCODE_DDY, /* X X */ - OPCODE_DP2, /* 2 X */ - OPCODE_DP3, /* X X X X X */ - OPCODE_DP4, /* X X X X X */ - OPCODE_DPH, /* X X 1.1 */ - OPCODE_DST, /* X X X X */ - OPCODE_ELSE, /* opt */ - OPCODE_END, /* X X X X opt */ - OPCODE_ENDIF, /* opt */ - OPCODE_ENDLOOP, /* opt */ - OPCODE_ENDSUB, /* opt */ - OPCODE_EX2, /* X X 2 X X */ - OPCODE_EXP, /* X X */ - OPCODE_FLR, /* X X 2 X X */ - OPCODE_FRC, /* X X 2 X X */ - OPCODE_IF, /* opt */ - OPCODE_KIL, /* X X */ - OPCODE_KIL_NV, /* X X */ - OPCODE_LG2, /* X X 2 X X */ - OPCODE_LIT, /* X X X X */ - OPCODE_LOG, /* X X */ - OPCODE_LRP, /* X X */ - OPCODE_MAD, /* X X X X X */ - OPCODE_MAX, /* X X X X X */ - OPCODE_MIN, /* X X X X X */ - OPCODE_MOV, /* X X X X X */ - OPCODE_MUL, /* X X X X X */ - OPCODE_NOISE1, /* X */ - OPCODE_NOISE2, /* X */ - OPCODE_NOISE3, /* X */ - OPCODE_NOISE4, /* X */ - OPCODE_PK2H, /* X */ - OPCODE_PK2US, /* X */ - OPCODE_PK4B, /* X */ - OPCODE_PK4UB, /* X */ - OPCODE_POW, /* X X X X */ - OPCODE_RCP, /* X X X X X */ - OPCODE_RET, /* 2 2 opt */ - OPCODE_RFL, /* X */ - OPCODE_RSQ, /* X X X X X */ - OPCODE_SCS, /* X X */ - OPCODE_SEQ, /* 2 X X */ - OPCODE_SFL, /* 2 X */ - OPCODE_SGE, /* X X X X X */ - OPCODE_SGT, /* 2 X X */ - OPCODE_SIN, /* X 2 X X */ - OPCODE_SLE, /* 2 X X */ - OPCODE_SLT, /* X X X X X */ - OPCODE_SNE, /* 2 X X */ - OPCODE_SSG, /* 2 X */ - OPCODE_STR, /* 2 X */ - OPCODE_SUB, /* X X 1.1 X X */ - OPCODE_SWZ, /* X X X */ - OPCODE_TEX, /* X 3 X X */ - OPCODE_TXB, /* X 3 X */ - OPCODE_TXD, /* X X */ - OPCODE_TXL, /* 3 2 X */ - OPCODE_TXP, /* X X */ - OPCODE_TXP_NV, /* 3 X */ - OPCODE_TRUNC, /* X */ - OPCODE_UP2H, /* X */ - OPCODE_UP2US, /* X */ - OPCODE_UP4B, /* X */ - OPCODE_UP4UB, /* X */ - OPCODE_X2D, /* X */ - OPCODE_XPD, /* X X */ - MAX_OPCODE -} gl_inst_opcode; - - -/** - * Number of bits for the src/dst register Index field. - * This limits the size of temp/uniform register files. - */ -#define INST_INDEX_BITS 12 - - -/** - * Instruction source register. - */ -struct prog_src_register -{ - GLuint File:4; /**< One of the PROGRAM_* register file values. */ - GLint Index:(INST_INDEX_BITS+1); /**< Extra bit here for sign bit. - * May be negative for relative addressing. - */ - GLuint Swizzle:12; - GLuint RelAddr:1; - - /** Take the component-wise absolute value */ - GLuint Abs:1; - - /** - * Post-Abs negation. - * This will either be NEGATE_NONE or NEGATE_XYZW, except for the SWZ - * instruction which allows per-component negation. - */ - GLuint Negate:4; - - /** - * Is the register two-dimensional. - * Two dimensional registers are of the - * REGISTER[index][index2] format. - * They are used by the geometry shaders where - * the first index is the index within an array - * and the second index is the semantic of the - * array, e.g. gl_PositionIn[index] would become - * INPUT[index][gl_PositionIn] - */ - GLuint HasIndex2:1; - GLuint RelAddr2:1; - GLint Index2:(INST_INDEX_BITS+1); /**< Extra bit here for sign bit. - * May be negative for relative - * addressing. */ -}; - - -/** - * Instruction destination register. - */ -struct prog_dst_register -{ - GLuint File:4; /**< One of the PROGRAM_* register file values */ - GLuint Index:INST_INDEX_BITS; /**< Unsigned, never negative */ - GLuint WriteMask:4; - GLuint RelAddr:1; - - /** - * \name Conditional destination update control. - * - * \since - * NV_fragment_program_option, NV_vertex_program2, NV_vertex_program2_option. - */ - /*@{*/ - /** - * Takes one of the 9 possible condition values (EQ, FL, GT, GE, LE, LT, - * NE, TR, or UN). Dest reg is only written to if the matching - * (swizzled) condition code value passes. When a conditional update mask - * is not specified, this will be \c COND_TR. - */ - GLuint CondMask:4; - - /** - * Condition code swizzle value. - */ - GLuint CondSwizzle:12; -}; - - -/** - * Vertex/fragment program instruction. - */ -struct prog_instruction -{ - gl_inst_opcode Opcode; - struct prog_src_register SrcReg[3]; - struct prog_dst_register DstReg; - - /** - * Indicates that the instruction should update the condition code - * register. - * - * \since - * NV_fragment_program_option, NV_vertex_program2, NV_vertex_program2_option. - */ - GLuint CondUpdate:1; - - /** - * If prog_instruction::CondUpdate is \c GL_TRUE, this value selects the - * condition code register that is to be updated. - * - * In GL_NV_fragment_program or GL_NV_vertex_program2 mode, only condition - * code register 0 is available. In GL_NV_vertex_program3 mode, condition - * code registers 0 and 1 are available. - * - * \since - * NV_fragment_program_option, NV_vertex_program2, NV_vertex_program2_option. - */ - GLuint CondDst:1; - - /** - * Saturate each value of the vectored result to the range [0,1] or the - * range [-1,1]. \c SSAT mode (i.e., saturation to the range [-1,1]) is - * only available in NV_fragment_program2 mode. - * Value is one of the SATURATE_* tokens. - * - * \since - * NV_fragment_program_option, NV_vertex_program3. - */ - GLuint SaturateMode:2; - - /** - * Per-instruction selectable precision: FLOAT32, FLOAT16, FIXED12. - * - * \since - * NV_fragment_program_option. - */ - GLuint Precision:3; - - /** - * \name Extra fields for TEX, TXB, TXD, TXL, TXP instructions. - */ - /*@{*/ - /** Source texture unit. */ - GLuint TexSrcUnit:5; - - /** Source texture target, one of TEXTURE_{1D,2D,3D,CUBE,RECT}_INDEX */ - GLuint TexSrcTarget:4; - - /** True if tex instruction should do shadow comparison */ - GLuint TexShadow:1; - /*@}*/ - - /** - * For BRA and CAL instructions, the location to jump to. - * For BGNLOOP, points to ENDLOOP (and vice-versa). - * For BRK, points to ENDLOOP - * For IF, points to ELSE or ENDIF. - * For ELSE, points to ENDIF. - */ - GLint BranchTarget; - - /** for debugging purposes */ - const char *Comment; - - /** for driver use (try to remove someday) */ - GLint Aux; -}; - - -#ifdef __cplusplus -extern "C" { -#endif - -extern void -_mesa_init_instructions(struct prog_instruction *inst, GLuint count); - -extern struct prog_instruction * -_mesa_alloc_instructions(GLuint numInst); - -extern struct prog_instruction * -_mesa_realloc_instructions(struct prog_instruction *oldInst, - GLuint numOldInst, GLuint numNewInst); - -extern struct prog_instruction * -_mesa_copy_instructions(struct prog_instruction *dest, - const struct prog_instruction *src, GLuint n); - -extern void -_mesa_free_instructions(struct prog_instruction *inst, GLuint count); - -extern GLuint -_mesa_num_inst_src_regs(gl_inst_opcode opcode); - -extern GLuint -_mesa_num_inst_dst_regs(gl_inst_opcode opcode); - -extern GLboolean -_mesa_is_tex_instruction(gl_inst_opcode opcode); - -extern GLboolean -_mesa_check_soa_dependencies(const struct prog_instruction *inst); - -extern const char * -_mesa_opcode_string(gl_inst_opcode opcode); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* PROG_INSTRUCTION_H */ diff --git a/3rdparty/glsl-optimizer/src/mesa/program/prog_parameter.h b/3rdparty/glsl-optimizer/src/mesa/program/prog_parameter.h deleted file mode 100644 index 8daeea48b..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/program/prog_parameter.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -/** - * \file prog_parameter.c - * Program parameter lists and functions. - * \author Brian Paul - */ - -#ifndef PROG_PARAMETER_H -#define PROG_PARAMETER_H - -#include "main/mtypes.h" - - -#ifdef __cplusplus -extern "C" { -#endif - - -/** - * Actual data for constant values of parameters. - */ -typedef union gl_constant_value -{ - GLfloat f; - GLint b; - GLint i; - GLuint u; -} gl_constant_value; - - -#ifdef __cplusplus -} -#endif - -#endif /* PROG_PARAMETER_H */ diff --git a/3rdparty/glsl-optimizer/src/mesa/program/prog_statevars.h b/3rdparty/glsl-optimizer/src/mesa/program/prog_statevars.h deleted file mode 100644 index d33b4c76e..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/program/prog_statevars.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PROG_STATEVARS_H -#define PROG_STATEVARS_H - - -#include "main/glheader.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Number of STATE_* values we need to address any GL state. - * Used to dimension arrays. - */ -#define STATE_LENGTH 5 - - -/** - * Used for describing GL state referenced from inside ARB vertex and - * fragment programs. - * A string such as "state.light[0].ambient" gets translated into a - * sequence of tokens such as [ STATE_LIGHT, 0, STATE_AMBIENT ]. - * - * For state that's an array, like STATE_CLIPPLANE, the 2nd token [1] should - * always be the array index. - */ -typedef enum gl_state_index_ { - STATE_MATERIAL = 100, /* start at 100 so small ints are seen as ints */ - - STATE_LIGHT, - STATE_LIGHTMODEL_AMBIENT, - STATE_LIGHTMODEL_SCENECOLOR, - STATE_LIGHTPROD, - - STATE_TEXGEN, - - STATE_FOG_COLOR, - STATE_FOG_PARAMS, - - STATE_CLIPPLANE, - - STATE_POINT_SIZE, - STATE_POINT_ATTENUATION, - - STATE_MODELVIEW_MATRIX, - STATE_PROJECTION_MATRIX, - STATE_MVP_MATRIX, - STATE_TEXTURE_MATRIX, - STATE_PROGRAM_MATRIX, - STATE_MATRIX_INVERSE, - STATE_MATRIX_TRANSPOSE, - STATE_MATRIX_INVTRANS, - - STATE_AMBIENT, - STATE_DIFFUSE, - STATE_SPECULAR, - STATE_EMISSION, - STATE_SHININESS, - STATE_HALF_VECTOR, - - STATE_POSITION, /**< xyzw = position */ - STATE_ATTENUATION, /**< xyz = attenuation, w = spot exponent */ - STATE_SPOT_DIRECTION, /**< xyz = direction, w = cos(cutoff) */ - STATE_SPOT_CUTOFF, /**< x = cutoff, yzw = undefined */ - - STATE_TEXGEN_EYE_S, - STATE_TEXGEN_EYE_T, - STATE_TEXGEN_EYE_R, - STATE_TEXGEN_EYE_Q, - STATE_TEXGEN_OBJECT_S, - STATE_TEXGEN_OBJECT_T, - STATE_TEXGEN_OBJECT_R, - STATE_TEXGEN_OBJECT_Q, - - STATE_TEXENV_COLOR, - - STATE_NUM_SAMPLES, /* An integer, not a float like the other state vars */ - - STATE_DEPTH_RANGE, - - STATE_VERTEX_PROGRAM, - STATE_FRAGMENT_PROGRAM, - - STATE_ENV, - STATE_LOCAL, - - STATE_INTERNAL, /* Mesa additions */ - STATE_CURRENT_ATTRIB, /* ctx->Current vertex attrib value */ - STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED, /* ctx->Current vertex attrib value after passthrough vertex processing */ - STATE_NORMAL_SCALE, - STATE_TEXRECT_SCALE, - STATE_FOG_PARAMS_OPTIMIZED, /* for faster fog calc */ - STATE_POINT_SIZE_CLAMPED, /* includes implementation dependent size clamp */ - STATE_LIGHT_SPOT_DIR_NORMALIZED, /* pre-normalized spot dir */ - STATE_LIGHT_POSITION, /* object vs eye space */ - STATE_LIGHT_POSITION_NORMALIZED, /* object vs eye space */ - STATE_LIGHT_HALF_VECTOR, /* object vs eye space */ - STATE_PT_SCALE, /**< Pixel transfer RGBA scale */ - STATE_PT_BIAS, /**< Pixel transfer RGBA bias */ - STATE_FB_SIZE, /**< (width-1, height-1, 0, 0) */ - STATE_FB_WPOS_Y_TRANSFORM, /**< (1, 0, -1, height) if a FBO is bound, (-1, height, 1, 0) otherwise */ - STATE_INTERNAL_DRIVER /* first available state index for drivers (must be last) */ -} gl_state_index; - - - - - - -#ifdef __cplusplus -} -#endif - -#endif /* PROG_STATEVARS_H */ diff --git a/3rdparty/glsl-optimizer/src/mesa/program/symbol_table.c b/3rdparty/glsl-optimizer/src/mesa/program/symbol_table.c deleted file mode 100644 index bd0aad2ce..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/program/symbol_table.c +++ /dev/null @@ -1,435 +0,0 @@ -/* - * Copyright © 2008 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "main/errors.h" -#include "symbol_table.h" -#include "hash_table.h" - -struct symbol { - /** - * Link to the next symbol in the table with the same name - * - * The linked list of symbols with the same name is ordered by scope - * from inner-most to outer-most. - */ - struct symbol *next_with_same_name; - - - /** - * Link to the next symbol in the table with the same scope - * - * The linked list of symbols with the same scope is unordered. Symbols - * in this list my have unique names. - */ - struct symbol *next_with_same_scope; - - - /** - * Header information for the list of symbols with the same name. - */ - struct symbol_header *hdr; - - - /** - * Name space of the symbol - * - * Name space are arbitrary user assigned integers. No two symbols can - * exist in the same name space at the same scope level. - */ - int name_space; - - /** Scope depth where this symbol was defined. */ - unsigned depth; - - /** - * Arbitrary user supplied data. - */ - void *data; -}; - - -/** - */ -struct symbol_header { - /** Linkage in list of all headers in a given symbol table. */ - struct symbol_header *next; - - /** Symbol name. */ - char *name; - - /** Linked list of symbols with the same name. */ - struct symbol *symbols; -}; - - -/** - * Element of the scope stack. - */ -struct scope_level { - /** Link to next (inner) scope level. */ - struct scope_level *next; - - /** Linked list of symbols with the same scope. */ - struct symbol *symbols; -}; - - -/** - * - */ -struct _mesa_symbol_table { - /** Hash table containing all symbols in the symbol table. */ - struct hash_table *ht; - - /** Top of scope stack. */ - struct scope_level *current_scope; - - /** List of all symbol headers in the table. */ - struct symbol_header *hdr; - - /** Current scope depth. */ - unsigned depth; -}; - - -static void -check_symbol_table(struct _mesa_symbol_table *table) -{ -#if !defined(NDEBUG) - struct scope_level *scope; - - for (scope = table->current_scope; scope != NULL; scope = scope->next) { - struct symbol *sym; - - for (sym = scope->symbols - ; sym != NULL - ; sym = sym->next_with_same_name) { - const struct symbol_header *const hdr = sym->hdr; - struct symbol *sym2; - - for (sym2 = hdr->symbols - ; sym2 != NULL - ; sym2 = sym2->next_with_same_name) { - assert(sym2->hdr == hdr); - } - } - } -#else - (void) table; -#endif /* !defined(NDEBUG) */ -} - -void -_mesa_symbol_table_pop_scope(struct _mesa_symbol_table *table) -{ - struct scope_level *const scope = table->current_scope; - struct symbol *sym = scope->symbols; - - table->current_scope = scope->next; - table->depth--; - - free(scope); - - while (sym != NULL) { - struct symbol *const next = sym->next_with_same_scope; - struct symbol_header *const hdr = sym->hdr; - - assert(hdr->symbols == sym); - - hdr->symbols = sym->next_with_same_name; - - free(sym); - - sym = next; - } - - check_symbol_table(table); -} - - -void -_mesa_symbol_table_push_scope(struct _mesa_symbol_table *table) -{ - struct scope_level *const scope = calloc(1, sizeof(*scope)); - - if (scope == NULL) { - _mesa_error_no_memory(__func__); - return; - } - - scope->next = table->current_scope; - table->current_scope = scope; - table->depth++; -} - - -static struct symbol_header * -find_symbol(struct _mesa_symbol_table *table, const char *name) -{ - return (struct symbol_header *) hash_table_find(table->ht, name); -} - - -/** - * Determine the scope "distance" of a symbol from the current scope - * - * \return - * A non-negative number for the number of scopes between the current scope - * and the scope where a symbol was defined. A value of zero means the current - * scope. A negative number if the symbol does not exist. - */ -int -_mesa_symbol_table_symbol_scope(struct _mesa_symbol_table *table, - int name_space, const char *name) -{ - struct symbol_header *const hdr = find_symbol(table, name); - struct symbol *sym; - - if (hdr != NULL) { - for (sym = hdr->symbols; sym != NULL; sym = sym->next_with_same_name) { - assert(sym->hdr == hdr); - - if ((name_space == -1) || (sym->name_space == name_space)) { - assert(sym->depth <= table->depth); - return sym->depth - table->depth; - } - } - } - - return -1; -} - - -void * -_mesa_symbol_table_find_symbol(struct _mesa_symbol_table *table, - int name_space, const char *name) -{ - struct symbol_header *const hdr = find_symbol(table, name); - - if (hdr != NULL) { - struct symbol *sym; - - - for (sym = hdr->symbols; sym != NULL; sym = sym->next_with_same_name) { - assert(sym->hdr == hdr); - - if ((name_space == -1) || (sym->name_space == name_space)) { - return sym->data; - } - } - } - - return NULL; -} - - -int -_mesa_symbol_table_add_symbol(struct _mesa_symbol_table *table, - int name_space, const char *name, - void *declaration) -{ - struct symbol_header *hdr; - struct symbol *sym; - - check_symbol_table(table); - - hdr = find_symbol(table, name); - - check_symbol_table(table); - - if (hdr == NULL) { - hdr = calloc(1, sizeof(*hdr)); - if (hdr == NULL) { - _mesa_error_no_memory(__func__); - return -1; - } - - hdr->name = strdup(name); - if (hdr->name == NULL) { - free(hdr); - _mesa_error_no_memory(__func__); - return -1; - } - - hash_table_insert(table->ht, hdr, hdr->name); - hdr->next = table->hdr; - table->hdr = hdr; - } - - check_symbol_table(table); - - /* If the symbol already exists in this namespace at this scope, it cannot - * be added to the table. - */ - for (sym = hdr->symbols - ; (sym != NULL) && (sym->name_space != name_space) - ; sym = sym->next_with_same_name) { - /* empty */ - } - - if (sym && (sym->depth == table->depth)) - return -1; - - sym = calloc(1, sizeof(*sym)); - if (sym == NULL) { - _mesa_error_no_memory(__func__); - return -1; - } - - sym->next_with_same_name = hdr->symbols; - sym->next_with_same_scope = table->current_scope->symbols; - sym->hdr = hdr; - sym->name_space = name_space; - sym->data = declaration; - sym->depth = table->depth; - - assert(sym->hdr == hdr); - - hdr->symbols = sym; - table->current_scope->symbols = sym; - - check_symbol_table(table); - return 0; -} - - -int -_mesa_symbol_table_add_global_symbol(struct _mesa_symbol_table *table, - int name_space, const char *name, - void *declaration) -{ - struct symbol_header *hdr; - struct symbol *sym; - struct symbol *curr; - struct scope_level *top_scope; - - check_symbol_table(table); - - hdr = find_symbol(table, name); - - check_symbol_table(table); - - if (hdr == NULL) { - hdr = calloc(1, sizeof(*hdr)); - if (hdr == NULL) { - _mesa_error_no_memory(__func__); - return -1; - } - - hdr->name = strdup(name); - - hash_table_insert(table->ht, hdr, hdr->name); - hdr->next = table->hdr; - table->hdr = hdr; - } - - check_symbol_table(table); - - /* If the symbol already exists in this namespace at this scope, it cannot - * be added to the table. - */ - for (sym = hdr->symbols - ; (sym != NULL) && (sym->name_space != name_space) - ; sym = sym->next_with_same_name) { - /* empty */ - } - - if (sym && sym->depth == 0) - return -1; - - /* Find the top-level scope */ - for (top_scope = table->current_scope - ; top_scope->next != NULL - ; top_scope = top_scope->next) { - /* empty */ - } - - sym = calloc(1, sizeof(*sym)); - if (sym == NULL) { - _mesa_error_no_memory(__func__); - return -1; - } - - sym->next_with_same_scope = top_scope->symbols; - sym->hdr = hdr; - sym->name_space = name_space; - sym->data = declaration; - - assert(sym->hdr == hdr); - - /* Since next_with_same_name is ordered by scope, we need to append the - * new symbol to the _end_ of the list. - */ - if (hdr->symbols == NULL) { - hdr->symbols = sym; - } else { - for (curr = hdr->symbols - ; curr->next_with_same_name != NULL - ; curr = curr->next_with_same_name) { - /* empty */ - } - curr->next_with_same_name = sym; - } - top_scope->symbols = sym; - - check_symbol_table(table); - return 0; -} - - - -struct _mesa_symbol_table * -_mesa_symbol_table_ctor(void) -{ - struct _mesa_symbol_table *table = calloc(1, sizeof(*table)); - - if (table != NULL) { - table->ht = hash_table_ctor(32, hash_table_string_hash, - hash_table_string_compare); - - _mesa_symbol_table_push_scope(table); - } - - return table; -} - - -void -_mesa_symbol_table_dtor(struct _mesa_symbol_table *table) -{ - struct symbol_header *hdr; - struct symbol_header *next; - - while (table->current_scope != NULL) { - _mesa_symbol_table_pop_scope(table); - } - - for (hdr = table->hdr; hdr != NULL; hdr = next) { - next = hdr->next; - free(hdr->name); - free(hdr); - } - - hash_table_dtor(table->ht); - free(table); -} diff --git a/3rdparty/glsl-optimizer/src/mesa/program/symbol_table.h b/3rdparty/glsl-optimizer/src/mesa/program/symbol_table.h deleted file mode 100644 index 1027f4761..000000000 --- a/3rdparty/glsl-optimizer/src/mesa/program/symbol_table.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright © 2008 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#ifndef MESA_SYMBOL_TABLE_H -#define MESA_SYMBOL_TABLE_H - -struct _mesa_symbol_table; - -extern void _mesa_symbol_table_push_scope(struct _mesa_symbol_table *table); - -extern void _mesa_symbol_table_pop_scope(struct _mesa_symbol_table *table); - -extern int _mesa_symbol_table_add_symbol(struct _mesa_symbol_table *symtab, - int name_space, const char *name, void *declaration); - -extern int _mesa_symbol_table_add_global_symbol( - struct _mesa_symbol_table *symtab, int name_space, const char *name, - void *declaration); - -extern int _mesa_symbol_table_symbol_scope(struct _mesa_symbol_table *table, - int name_space, const char *name); - -extern void *_mesa_symbol_table_find_symbol( - struct _mesa_symbol_table *symtab, int name_space, const char *name); - -extern struct _mesa_symbol_table *_mesa_symbol_table_ctor(void); - -extern void _mesa_symbol_table_dtor(struct _mesa_symbol_table *); - -#endif /* MESA_SYMBOL_TABLE_H */ diff --git a/3rdparty/glsl-optimizer/src/node/binding.cpp b/3rdparty/glsl-optimizer/src/node/binding.cpp deleted file mode 100644 index fa7bb946a..000000000 --- a/3rdparty/glsl-optimizer/src/node/binding.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include -#include "shader.h" -#include - -using namespace v8; - -void InitAll(Handle exports) -{ - // Export constants - exports->Set(String::NewSymbol("VERTEX_SHADER"), Int32::New(kGlslOptShaderVertex), ReadOnly); - exports->Set(String::NewSymbol("FRAGMENT_SHADER"), Int32::New(kGlslOptShaderFragment), ReadOnly); - exports->Set(String::NewSymbol("TARGET_OPENGL"), Int32::New(kGlslTargetOpenGL), ReadOnly); - exports->Set(String::NewSymbol("TARGET_OPENGLES20"), Int32::New(kGlslTargetOpenGLES20), ReadOnly); - exports->Set(String::NewSymbol("TARGET_OPENGLES30"), Int32::New(kGlslTargetOpenGLES30), ReadOnly); - - // Export classes - Compiler::Init(exports); - Shader::Init(exports); -} - -NODE_MODULE(glslOptimizer, InitAll); diff --git a/3rdparty/glsl-optimizer/src/node/compiler.cpp b/3rdparty/glsl-optimizer/src/node/compiler.cpp deleted file mode 100644 index af2f49207..000000000 --- a/3rdparty/glsl-optimizer/src/node/compiler.cpp +++ /dev/null @@ -1,87 +0,0 @@ -#include "compiler.h" - -using namespace v8; -using namespace node; - - -Persistent Compiler::constructor; - -//---------------------------------------------------------------------- - -Compiler::Compiler(glslopt_target target) -{ - _binding = glslopt_initialize(target); -} - -//---------------------------------------------------------------------- - -Compiler::~Compiler() -{ - release(); -} - -//---------------------------------------------------------------------- - -void Compiler::release() -{ - if (_binding) - { - glslopt_cleanup(_binding); - - _binding = 0; - } -} - -//---------------------------------------------------------------------- - -void Compiler::Init(Handle exports) -{ - NanScope(); - - // Prepare constructor template - Local tpl = NanNew(New); - - tpl->SetClassName(NanNew("Compiler")); - tpl->InstanceTemplate()->SetInternalFieldCount(1); - - // Prototype - NanSetPrototypeTemplate(tpl, "dispose", NanNew(Dispose)); - - // Export the class - NanAssignPersistent(constructor, tpl->GetFunction()); - exports->Set(NanNew("Compiler"), tpl->GetFunction()); -} - -//---------------------------------------------------------------------- - -NAN_METHOD(Compiler::New) -{ - NanScope(); - - if (args.IsConstructCall()) { - glslopt_target target = kGlslTargetOpenGL; - if (args[0]->IsInt32()) - target = (glslopt_target)args[0]->Int32Value(); - else if (args[0]->IsBoolean()) - target = (glslopt_target)( (int)args[0]->BooleanValue() ); - - Compiler* obj = new Compiler(target); - obj->Wrap(args.This()); - NanReturnValue(args.This()); - } else { - Local cons = NanNew(constructor); - NanReturnValue(cons->NewInstance()); - } -} - -//---------------------------------------------------------------------- - -NAN_METHOD(Compiler::Dispose) -{ - NanScope(); - - Compiler* obj = ObjectWrap::Unwrap(args.This()); - obj->release(); - - NanReturnUndefined(); -} diff --git a/3rdparty/glsl-optimizer/src/node/compiler.h b/3rdparty/glsl-optimizer/src/node/compiler.h deleted file mode 100644 index 46fe8e144..000000000 --- a/3rdparty/glsl-optimizer/src/node/compiler.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef COMPILER_H -#define COMPILER_H - -#include -#include -#include - -class Compiler : public node::ObjectWrap { -public: - static void Init(v8::Handle exports); - - inline glslopt_ctx* getBinding() const { return _binding; } - - void release(); - -private: - Compiler(glslopt_target target); - ~Compiler(); - - glslopt_ctx* _binding; - - static NAN_METHOD(New); - static NAN_METHOD(Dispose); - static v8::Persistent constructor; -}; - -#endif diff --git a/3rdparty/glsl-optimizer/src/node/shader.cpp b/3rdparty/glsl-optimizer/src/node/shader.cpp deleted file mode 100644 index 4370d1a9e..000000000 --- a/3rdparty/glsl-optimizer/src/node/shader.cpp +++ /dev/null @@ -1,182 +0,0 @@ -#include "shader.h" -#include - -using namespace v8; -using namespace node; - -Persistent Shader::constructor; - -//---------------------------------------------------------------------- - -Shader::Shader(Compiler* compiler, int type, const char* source) -{ - if (compiler) - { - _binding = glslopt_optimize(compiler->getBinding(), (glslopt_shader_type)type, source, 0); - _compiled = glslopt_get_status(_binding); - } - else - { - _binding = 0; - _compiled = false; - } -} - -//---------------------------------------------------------------------- - -Shader::~Shader() -{ - release(); -} - -//---------------------------------------------------------------------- - -void Shader::release() -{ - if (_binding) - { - glslopt_shader_delete(_binding); - _binding = 0; - _compiled = false; - } -} - -//---------------------------------------------------------------------- - -const char* Shader::getOutput() const -{ - return (_compiled) ? glslopt_get_output(_binding) : ""; -} - -//---------------------------------------------------------------------- - -const char* Shader::getRawOutput() const -{ - return (_compiled) ? glslopt_get_raw_output(_binding) : ""; -} - -//---------------------------------------------------------------------- - -const char* Shader::getLog() const -{ - return (_compiled) ? glslopt_get_log(_binding) : ""; -} - -//---------------------------------------------------------------------- - -void Shader::Init(Handle exports) -{ - NanScope(); - - // Prepare constructor template - Local tpl = NanNew(New); - tpl->SetClassName(NanNew("Shader")); - tpl->InstanceTemplate()->SetInternalFieldCount(1); - - // Prototype - NanSetPrototypeTemplate(tpl, "dispose", NanNew(Dispose)); - NanSetPrototypeTemplate(tpl, "compiled", NanNew(Compiled)); - NanSetPrototypeTemplate(tpl, "output", NanNew(Output)); - NanSetPrototypeTemplate(tpl, "rawOutput", NanNew(RawOutput)); - NanSetPrototypeTemplate(tpl, "log", NanNew(Log)); - - // Export the class - NanAssignPersistent(constructor, tpl->GetFunction()); - exports->Set(NanNew("Shader"), tpl->GetFunction()); -} - -//---------------------------------------------------------------------- - -Handle Shader::New(const Arguments& args) -{ - NanScope(); - - if (args.Length() == 3) - { - // Check the first parameter (compiler) - Local args0 = args[0]; - - if (args0->IsObject()) - { - // Check the second parameter (shader type) - Local args1 = args[1]; - - if (args1->IsInt32()) - { - // Check the third parameter (source code) - Local args2 = args[2]; - - if (args2->IsString()) - { - Compiler* compiler = ObjectWrap::Unwrap(args0->ToObject()); - int type = args1->Int32Value(); - String::Utf8Value sourceCode(args2->ToString()); - - Shader* obj = new Shader(compiler, type, *sourceCode); - obj->Wrap(args.This()); - - return args.This(); - } - } - } - } - - // Couldn't create the Shader - NanThrowError("Invalid arguments"); -} - -//---------------------------------------------------------------------- - -NAN_METHOD(Shader::Dispose) -{ - NanScope(); - - Shader* obj = ObjectWrap::Unwrap(args.This()); - obj->release(); - - NanReturnUndefined(); -} - -//---------------------------------------------------------------------- - -NAN_METHOD(Shader::Compiled) -{ - NanScope(); - - Shader* obj = ObjectWrap::Unwrap(args.This()); - - NanReturnValue(NanNew(obj->isCompiled())); -} - -//---------------------------------------------------------------------- - -NAN_METHOD(Shader::Output) -{ - NanScope(); - - Shader* obj = ObjectWrap::Unwrap(args.This()); - - NanReturnValue(NanNew(obj->getOutput())); -} - -//---------------------------------------------------------------------- - -NAN_METHOD(Shader::RawOutput) -{ - NanScope(); - - Shader* obj = ObjectWrap::Unwrap(args.This()); - - NanReturnValue(NanNew(obj->getRawOutput())); -} - -//---------------------------------------------------------------------- - -NAN_METHOD(Shader::Log) -{ - NanScope(); - - Shader* obj = ObjectWrap::Unwrap(args.This()); - - NanReturnValue(NanNew(obj->getLog())); -} diff --git a/3rdparty/glsl-optimizer/src/node/shader.h b/3rdparty/glsl-optimizer/src/node/shader.h deleted file mode 100644 index 952cd86d5..000000000 --- a/3rdparty/glsl-optimizer/src/node/shader.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef SHADER_H -#define SHADER_H - -#include "compiler.h" -#include -#include -#include - -class Shader : public node::ObjectWrap { -public: - static void Init(v8::Handle exports); - - inline bool isCompiled() const { return _compiled; } - const char* getOutput() const; - const char* getRawOutput() const; - const char* getLog() const; - - void release(); - -private: - Shader(Compiler* compiler, int type, const char* source); - ~Shader(); - - glslopt_shader* _binding; - bool _compiled; - - static NAN_METHOD(New); - static NAN_METHOD(Dispose); - - static NAN_METHOD(Compiled); - static NAN_METHOD(Output); - static NAN_METHOD(RawOutput); - static NAN_METHOD(Log); - static v8::Persistent constructor; -}; - -#endif diff --git a/3rdparty/glsl-optimizer/src/util/Makefile.sources b/3rdparty/glsl-optimizer/src/util/Makefile.sources deleted file mode 100644 index 952b79905..000000000 --- a/3rdparty/glsl-optimizer/src/util/Makefile.sources +++ /dev/null @@ -1,9 +0,0 @@ -MESA_UTIL_FILES := \ - hash_table.c \ - ralloc.c \ - register_allocate.c \ - register_allocate.h \ - rgtc.c - -MESA_UTIL_GENERATED_FILES = \ - format_srgb.c diff --git a/3rdparty/glsl-optimizer/src/util/hash_table.c b/3rdparty/glsl-optimizer/src/util/hash_table.c deleted file mode 100644 index 1b6726c79..000000000 --- a/3rdparty/glsl-optimizer/src/util/hash_table.c +++ /dev/null @@ -1,440 +0,0 @@ -/* - * Copyright © 2009,2012 Intel Corporation - * Copyright © 1988-2004 Keith Packard and Bart Massey. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - * - * Except as contained in this notice, the names of the authors - * or their institutions shall not be used in advertising or - * otherwise to promote the sale, use or other dealings in this - * Software without prior written authorization from the - * authors. - * - * Authors: - * Eric Anholt - * Keith Packard - */ - -/** - * Implements an open-addressing, linear-reprobing hash table. - * - * For more information, see: - * - * http://cgit.freedesktop.org/~anholt/hash_table/tree/README - */ - -#include -#include - -#include "hash_table.h" -#include "ralloc.h" -#include "macros.h" - -static const uint32_t deleted_key_value; - -/** - * From Knuth -- a good choice for hash/rehash values is p, p-2 where - * p and p-2 are both prime. These tables are sized to have an extra 10% - * free to avoid exponential performance degradation as the hash table fills - */ -static const struct { - uint32_t max_entries, size, rehash; -} hash_sizes[] = { - { 2, 5, 3 }, - { 4, 7, 5 }, - { 8, 13, 11 }, - { 16, 19, 17 }, - { 32, 43, 41 }, - { 64, 73, 71 }, - { 128, 151, 149 }, - { 256, 283, 281 }, - { 512, 571, 569 }, - { 1024, 1153, 1151 }, - { 2048, 2269, 2267 }, - { 4096, 4519, 4517 }, - { 8192, 9013, 9011 }, - { 16384, 18043, 18041 }, - { 32768, 36109, 36107 }, - { 65536, 72091, 72089 }, - { 131072, 144409, 144407 }, - { 262144, 288361, 288359 }, - { 524288, 576883, 576881 }, - { 1048576, 1153459, 1153457 }, - { 2097152, 2307163, 2307161 }, - { 4194304, 4613893, 4613891 }, - { 8388608, 9227641, 9227639 }, - { 16777216, 18455029, 18455027 }, - { 33554432, 36911011, 36911009 }, - { 67108864, 73819861, 73819859 }, - { 134217728, 147639589, 147639587 }, - { 268435456, 295279081, 295279079 }, - { 536870912, 590559793, 590559791 }, - { 1073741824, 1181116273, 1181116271}, - { 2147483648ul, 2362232233ul, 2362232231ul} -}; - -static int -entry_is_free(const struct hash_entry *entry) -{ - return entry->key == NULL; -} - -static int -entry_is_deleted(const struct hash_table *ht, struct hash_entry *entry) -{ - return entry->key == ht->deleted_key; -} - -static int -entry_is_present(const struct hash_table *ht, struct hash_entry *entry) -{ - return entry->key != NULL && entry->key != ht->deleted_key; -} - -struct hash_table * -_mesa_hash_table_create(void *mem_ctx, - bool (*key_equals_function)(const void *a, - const void *b)) -{ - struct hash_table *ht; - - ht = ralloc(mem_ctx, struct hash_table); - if (ht == NULL) - return NULL; - - ht->size_index = 0; - ht->size = hash_sizes[ht->size_index].size; - ht->rehash = hash_sizes[ht->size_index].rehash; - ht->max_entries = hash_sizes[ht->size_index].max_entries; - ht->key_equals_function = key_equals_function; - ht->table = rzalloc_array(ht, struct hash_entry, ht->size); - ht->entries = 0; - ht->deleted_entries = 0; - ht->deleted_key = &deleted_key_value; - - if (ht->table == NULL) { - ralloc_free(ht); - return NULL; - } - - return ht; -} - -/** - * Frees the given hash table. - * - * If delete_function is passed, it gets called on each entry present before - * freeing. - */ -void -_mesa_hash_table_destroy(struct hash_table *ht, - void (*delete_function)(struct hash_entry *entry)) -{ - if (!ht) - return; - - if (delete_function) { - struct hash_entry *entry; - - hash_table_foreach(ht, entry) { - delete_function(entry); - } - } - ralloc_free(ht); -} - -/** Sets the value of the key pointer used for deleted entries in the table. - * - * The assumption is that usually keys are actual pointers, so we use a - * default value of a pointer to an arbitrary piece of storage in the library. - * But in some cases a consumer wants to store some other sort of value in the - * table, like a uint32_t, in which case that pointer may conflict with one of - * their valid keys. This lets that user select a safe value. - * - * This must be called before any keys are actually deleted from the table. - */ -void -_mesa_hash_table_set_deleted_key(struct hash_table *ht, const void *deleted_key) -{ - ht->deleted_key = deleted_key; -} - -/** - * Finds a hash table entry with the given key and hash of that key. - * - * Returns NULL if no entry is found. Note that the data pointer may be - * modified by the user. - */ -struct hash_entry * -_mesa_hash_table_search(struct hash_table *ht, uint32_t hash, - const void *key) -{ - uint32_t start_hash_address = hash % ht->size; - uint32_t hash_address = start_hash_address; - - do { - uint32_t double_hash; - - struct hash_entry *entry = ht->table + hash_address; - - if (entry_is_free(entry)) { - return NULL; - } else if (entry_is_present(ht, entry) && entry->hash == hash) { - if (ht->key_equals_function(key, entry->key)) { - return entry; - } - } - - double_hash = 1 + hash % ht->rehash; - - hash_address = (hash_address + double_hash) % ht->size; - } while (hash_address != start_hash_address); - - return NULL; -} - -static void -_mesa_hash_table_rehash(struct hash_table *ht, int new_size_index) -{ - struct hash_table old_ht; - struct hash_entry *table, *entry; - - if (new_size_index >= ARRAY_SIZE(hash_sizes)) - return; - - table = rzalloc_array(ht, struct hash_entry, - hash_sizes[new_size_index].size); - if (table == NULL) - return; - - old_ht = *ht; - - ht->table = table; - ht->size_index = new_size_index; - ht->size = hash_sizes[ht->size_index].size; - ht->rehash = hash_sizes[ht->size_index].rehash; - ht->max_entries = hash_sizes[ht->size_index].max_entries; - ht->entries = 0; - ht->deleted_entries = 0; - - hash_table_foreach(&old_ht, entry) { - _mesa_hash_table_insert(ht, entry->hash, - entry->key, entry->data); - } - - ralloc_free(old_ht.table); -} - -/** - * Inserts the key with the given hash into the table. - * - * Note that insertion may rearrange the table on a resize or rehash, - * so previously found hash_entries are no longer valid after this function. - */ -struct hash_entry * -_mesa_hash_table_insert(struct hash_table *ht, uint32_t hash, - const void *key, void *data) -{ - uint32_t start_hash_address, hash_address; - - if (ht->entries >= ht->max_entries) { - _mesa_hash_table_rehash(ht, ht->size_index + 1); - } else if (ht->deleted_entries + ht->entries >= ht->max_entries) { - _mesa_hash_table_rehash(ht, ht->size_index); - } - - start_hash_address = hash % ht->size; - hash_address = start_hash_address; - do { - struct hash_entry *entry = ht->table + hash_address; - uint32_t double_hash; - - if (!entry_is_present(ht, entry)) { - if (entry_is_deleted(ht, entry)) - ht->deleted_entries--; - entry->hash = hash; - entry->key = key; - entry->data = data; - ht->entries++; - return entry; - } - - /* Implement replacement when another insert happens - * with a matching key. This is a relatively common - * feature of hash tables, with the alternative - * generally being "insert the new value as well, and - * return it first when the key is searched for". - * - * Note that the hash table doesn't have a delete - * callback. If freeing of old data pointers is - * required to avoid memory leaks, perform a search - * before inserting. - */ - if (entry->hash == hash && - ht->key_equals_function(key, entry->key)) { - entry->key = key; - entry->data = data; - return entry; - } - - - double_hash = 1 + hash % ht->rehash; - - hash_address = (hash_address + double_hash) % ht->size; - } while (hash_address != start_hash_address); - - /* We could hit here if a required resize failed. An unchecked-malloc - * application could ignore this result. - */ - return NULL; -} - -/** - * This function deletes the given hash table entry. - * - * Note that deletion doesn't otherwise modify the table, so an iteration over - * the table deleting entries is safe. - */ -void -_mesa_hash_table_remove(struct hash_table *ht, - struct hash_entry *entry) -{ - if (!entry) - return; - - entry->key = ht->deleted_key; - ht->entries--; - ht->deleted_entries++; -} - -/** - * This function is an iterator over the hash table. - * - * Pass in NULL for the first entry, as in the start of a for loop. Note that - * an iteration over the table is O(table_size) not O(entries). - */ -struct hash_entry * -_mesa_hash_table_next_entry(struct hash_table *ht, - struct hash_entry *entry) -{ - if (entry == NULL) - entry = ht->table; - else - entry = entry + 1; - - for (; entry != ht->table + ht->size; entry++) { - if (entry_is_present(ht, entry)) { - return entry; - } - } - - return NULL; -} - -/** - * Returns a random entry from the hash table. - * - * This may be useful in implementing random replacement (as opposed - * to just removing everything) in caches based on this hash table - * implementation. @predicate may be used to filter entries, or may - * be set to NULL for no filtering. - */ -struct hash_entry * -_mesa_hash_table_random_entry(struct hash_table *ht, - bool (*predicate)(struct hash_entry *entry)) -{ - struct hash_entry *entry; - uint32_t i = rand() % ht->size; - - if (ht->entries == 0) - return NULL; - - for (entry = ht->table + i; entry != ht->table + ht->size; entry++) { - if (entry_is_present(ht, entry) && - (!predicate || predicate(entry))) { - return entry; - } - } - - for (entry = ht->table; entry != ht->table + i; entry++) { - if (entry_is_present(ht, entry) && - (!predicate || predicate(entry))) { - return entry; - } - } - - return NULL; -} - - -/** - * Quick FNV-1 hash implementation based on: - * http://www.isthe.com/chongo/tech/comp/fnv/ - * - * FNV-1 is not be the best hash out there -- Jenkins's lookup3 is supposed to - * be quite good, and it probably beats FNV. But FNV has the advantage that - * it involves almost no code. For an improvement on both, see Paul - * Hsieh's http://www.azillionmonkeys.com/qed/hash.html - */ -uint32_t -_mesa_hash_data(const void *data, size_t size) -{ - uint32_t hash = 2166136261ul; - const uint8_t *bytes = data; - - while (size-- != 0) { - hash ^= *bytes; - hash = hash * 0x01000193; - bytes++; - } - - return hash; -} - -/** FNV-1 string hash implementation */ -uint32_t -_mesa_hash_string(const char *key) -{ - uint32_t hash = 2166136261ul; - - while (*key != 0) { - hash ^= *key; - hash = hash * 0x01000193; - key++; - } - - return hash; -} - -/** - * String compare function for use as the comparison callback in - * _mesa_hash_table_create(). - */ -bool -_mesa_key_string_equal(const void *a, const void *b) -{ - return strcmp(a, b) == 0; -} - -bool -_mesa_key_pointer_equal(const void *a, const void *b) -{ - return a == b; -} diff --git a/3rdparty/glsl-optimizer/src/util/hash_table.h b/3rdparty/glsl-optimizer/src/util/hash_table.h deleted file mode 100644 index d6b6ebf40..000000000 --- a/3rdparty/glsl-optimizer/src/util/hash_table.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright © 2009,2012 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - * - * Authors: - * Eric Anholt - * - */ - -#ifndef _HASH_TABLE_H -#define _HASH_TABLE_H - -#include -#include -#include -#include "c99_compat.h" -#include "macros.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct hash_entry { - uint32_t hash; - const void *key; - void *data; -}; - -struct hash_table { - struct hash_entry *table; - bool (*key_equals_function)(const void *a, const void *b); - const void *deleted_key; - uint32_t size; - uint32_t rehash; - uint32_t max_entries; - uint32_t size_index; - uint32_t entries; - uint32_t deleted_entries; -}; - -struct hash_table * -_mesa_hash_table_create(void *mem_ctx, - bool (*key_equals_function)(const void *a, - const void *b)); -void _mesa_hash_table_destroy(struct hash_table *ht, - void (*delete_function)(struct hash_entry *entry)); -void _mesa_hash_table_set_deleted_key(struct hash_table *ht, - const void *deleted_key); - -struct hash_entry * -_mesa_hash_table_insert(struct hash_table *ht, uint32_t hash, - const void *key, void *data); -struct hash_entry * -_mesa_hash_table_search(struct hash_table *ht, uint32_t hash, - const void *key); -void _mesa_hash_table_remove(struct hash_table *ht, - struct hash_entry *entry); - -struct hash_entry *_mesa_hash_table_next_entry(struct hash_table *ht, - struct hash_entry *entry); -struct hash_entry * -_mesa_hash_table_random_entry(struct hash_table *ht, - bool (*predicate)(struct hash_entry *entry)); - -uint32_t _mesa_hash_data(const void *data, size_t size); -uint32_t _mesa_hash_string(const char *key); -bool _mesa_key_string_equal(const void *a, const void *b); -bool _mesa_key_pointer_equal(const void *a, const void *b); - -static inline uint32_t _mesa_hash_pointer(const void *pointer) -{ - return _mesa_hash_data(&pointer, sizeof(pointer)); -} - -/** - * This foreach function is safe against deletion (which just replaces - * an entry's data with the deleted marker), but not against insertion - * (which may rehash the table, making entry a dangling pointer). - */ -#define hash_table_foreach(ht, entry) \ - for (entry = _mesa_hash_table_next_entry(ht, NULL); \ - entry != NULL; \ - entry = _mesa_hash_table_next_entry(ht, entry)) - -#ifdef __cplusplus -} /* extern C */ -#endif - -#endif /* _HASH_TABLE_H */ diff --git a/3rdparty/glsl-optimizer/src/util/macros.h b/3rdparty/glsl-optimizer/src/util/macros.h deleted file mode 100644 index 40ebf02da..000000000 --- a/3rdparty/glsl-optimizer/src/util/macros.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright © 2014 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -#ifndef UTIL_MACROS_H -#define UTIL_MACROS_H - -/* Compute the size of an array */ -#ifndef ARRAY_SIZE -# define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x))) -#endif - - -/** - * __builtin_expect macros - */ -#if !defined(HAVE___BUILTIN_EXPECT) -# define __builtin_expect(x, y) (x) -#endif - -#ifndef likely -# ifdef HAVE___BUILTIN_EXPECT -# define likely(x) __builtin_expect(!!(x), 1) -# define unlikely(x) __builtin_expect(!!(x), 0) -# else -# define likely(x) (x) -# define unlikely(x) (x) -# endif -#endif - - -/** - * Static (compile-time) assertion. - * Basically, use COND to dimension an array. If COND is false/zero the - * array size will be -1 and we'll get a compilation error. - */ -#define STATIC_ASSERT(COND) \ - do { \ - (void) sizeof(char [1 - 2*!(COND)]); \ - } while (0) - - -/** - * Unreachable macro. Useful for suppressing "control reaches end of non-void - * function" warnings. - */ -#ifdef HAVE___BUILTIN_UNREACHABLE -#define unreachable(str) \ -do { \ - assert(!str); \ - __builtin_unreachable(); \ -} while (0) -#endif - -#ifndef unreachable -#define unreachable(str) -#endif - -#ifdef HAVE_FUNC_ATTRIBUTE_FLATTEN -#define FLATTEN __attribute__((__flatten__)) -#else -#define FLATTEN -#endif - -#ifdef HAVE_FUNC_ATTRIBUTE_FORMAT -#define PRINTFLIKE(f, a) __attribute__ ((format(__printf__, f, a))) -#else -#define PRINTFLIKE(f, a) -#endif - -#ifdef HAVE_FUNC_ATTRIBUTE_MALLOC -#define MALLOCLIKE __attribute__((__malloc__)) -#else -#define MALLOCLIKE -#endif - -/* Used to optionally mark structures with misaligned elements or size as - * packed, to trade off performance for space. - */ -#ifdef HAVE_FUNC_ATTRIBUTE_PACKED -#define PACKED __attribute__((__packed__)) -#else -#define PACKED -#endif - -#ifdef __cplusplus -/** - * Macro function that evaluates to true if T is a trivially - * destructible type -- that is, if its (non-virtual) destructor - * performs no action and all member variables and base classes are - * trivially destructible themselves. - */ -# if defined(__GNUC__) -# if ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))) -# define HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T) -# endif -# elif (defined(__clang__) && defined(__has_feature)) -# if __has_feature(has_trivial_destructor) -# define HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T) -# endif -# endif -# ifndef HAS_TRIVIAL_DESTRUCTOR - /* It's always safe (if inefficient) to assume that a - * destructor is non-trivial. - */ -# define HAS_TRIVIAL_DESTRUCTOR(T) (false) -# endif -#endif - -#endif /* UTIL_MACROS_H */ diff --git a/3rdparty/glsl-optimizer/src/util/ralloc.c b/3rdparty/glsl-optimizer/src/util/ralloc.c deleted file mode 100644 index 85e682658..000000000 --- a/3rdparty/glsl-optimizer/src/util/ralloc.c +++ /dev/null @@ -1,492 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include -#include -#include -#include -#include -#include - -/* Android defines SIZE_MAX in limits.h, instead of the standard stdint.h */ -#ifdef ANDROID -#include -#endif - -/* Some versions of MinGW are missing _vscprintf's declaration, although they - * still provide the symbol in the import library. */ -#ifdef __MINGW32__ -_CRTIMP int _vscprintf(const char *format, va_list argptr); -#endif - -#include "ralloc.h" - -#ifndef va_copy -#ifdef __va_copy -#define va_copy(dest, src) __va_copy((dest), (src)) -#else -#define va_copy(dest, src) (dest) = (src) -#endif -#endif - -#define CANARY 0x5A1106 - -struct ralloc_header -{ -#ifdef DEBUG - /* A canary value used to determine whether a pointer is ralloc'd. */ - unsigned canary; -#endif - - struct ralloc_header *parent; - - /* The first child (head of a linked list) */ - struct ralloc_header *child; - - /* Linked list of siblings */ - struct ralloc_header *prev; - struct ralloc_header *next; - - void (*destructor)(void *); -}; - -typedef struct ralloc_header ralloc_header; - -static void unlink_block(ralloc_header *info); -static void unsafe_free(ralloc_header *info); - -static ralloc_header * -get_header(const void *ptr) -{ - ralloc_header *info = (ralloc_header *) (((char *) ptr) - - sizeof(ralloc_header)); -#ifdef DEBUG - assert(info->canary == CANARY); -#endif - return info; -} - -#define PTR_FROM_HEADER(info) (((char *) info) + sizeof(ralloc_header)) - -static void -add_child(ralloc_header *parent, ralloc_header *info) -{ - if (parent != NULL) { - info->parent = parent; - info->next = parent->child; - parent->child = info; - - if (info->next != NULL) - info->next->prev = info; - } -} - -void * -ralloc_context(const void *ctx) -{ - return ralloc_size(ctx, 0); -} - -void * -ralloc_size(const void *ctx, size_t size) -{ - void *block = calloc(1, size + sizeof(ralloc_header)); - ralloc_header *info; - ralloc_header *parent; - - if (unlikely(block == NULL)) - return NULL; - info = (ralloc_header *) block; - parent = ctx != NULL ? get_header(ctx) : NULL; - - add_child(parent, info); - -#ifdef DEBUG - info->canary = CANARY; -#endif - - return PTR_FROM_HEADER(info); -} - -void * -rzalloc_size(const void *ctx, size_t size) -{ - void *ptr = ralloc_size(ctx, size); - if (likely(ptr != NULL)) - memset(ptr, 0, size); - return ptr; -} - -/* helper function - assumes ptr != NULL */ -static void * -resize(void *ptr, size_t size) -{ - ralloc_header *child, *old, *info; - - old = get_header(ptr); - info = realloc(old, size + sizeof(ralloc_header)); - - if (info == NULL) - return NULL; - - /* Update parent and sibling's links to the reallocated node. */ - if (info != old && info->parent != NULL) { - if (info->parent->child == old) - info->parent->child = info; - - if (info->prev != NULL) - info->prev->next = info; - - if (info->next != NULL) - info->next->prev = info; - } - - /* Update child->parent links for all children */ - for (child = info->child; child != NULL; child = child->next) - child->parent = info; - - return PTR_FROM_HEADER(info); -} - -void * -reralloc_size(const void *ctx, void *ptr, size_t size) -{ - if (unlikely(ptr == NULL)) - return ralloc_size(ctx, size); - - assert(ralloc_parent(ptr) == ctx); - return resize(ptr, size); -} - -void * -ralloc_array_size(const void *ctx, size_t size, size_t count) -{ - if (count > SIZE_MAX/size) - return NULL; - - return ralloc_size(ctx, size * count); -} - -void * -rzalloc_array_size(const void *ctx, size_t size, size_t count) -{ - if (count > SIZE_MAX/size) - return NULL; - - return rzalloc_size(ctx, size * count); -} - -void * -reralloc_array_size(const void *ctx, void *ptr, size_t size, size_t count) -{ - if (count > SIZE_MAX/size) - return NULL; - - return reralloc_size(ctx, ptr, size * count); -} - -void -ralloc_free(void *ptr) -{ - ralloc_header *info; - - if (ptr == NULL) - return; - - info = get_header(ptr); - unlink_block(info); - unsafe_free(info); -} - -static void -unlink_block(ralloc_header *info) -{ - /* Unlink from parent & siblings */ - if (info->parent != NULL) { - if (info->parent->child == info) - info->parent->child = info->next; - - if (info->prev != NULL) - info->prev->next = info->next; - - if (info->next != NULL) - info->next->prev = info->prev; - } - info->parent = NULL; - info->prev = NULL; - info->next = NULL; -} - -static void -unsafe_free(ralloc_header *info) -{ - /* Recursively free any children...don't waste time unlinking them. */ - ralloc_header *temp; - while (info->child != NULL) { - temp = info->child; - info->child = temp->next; - unsafe_free(temp); - } - - /* Free the block itself. Call the destructor first, if any. */ - if (info->destructor != NULL) - info->destructor(PTR_FROM_HEADER(info)); - - free(info); -} - -void -ralloc_steal(const void *new_ctx, void *ptr) -{ - ralloc_header *info, *parent; - - if (unlikely(ptr == NULL)) - return; - - info = get_header(ptr); - parent = get_header(new_ctx); - - unlink_block(info); - - add_child(parent, info); -} - -void * -ralloc_parent(const void *ptr) -{ - ralloc_header *info; - - if (unlikely(ptr == NULL)) - return NULL; - - info = get_header(ptr); - return info->parent ? PTR_FROM_HEADER(info->parent) : NULL; -} - -static void *autofree_context = NULL; - -static void -autofree(void) -{ - ralloc_free(autofree_context); -} - -void * -ralloc_autofree_context(void) -{ - if (unlikely(autofree_context == NULL)) { - autofree_context = ralloc_context(NULL); - atexit(autofree); - } - return autofree_context; -} - -void -ralloc_set_destructor(const void *ptr, void(*destructor)(void *)) -{ - ralloc_header *info = get_header(ptr); - info->destructor = destructor; -} - -char * -ralloc_strdup(const void *ctx, const char *str) -{ - size_t n; - char *ptr; - - if (unlikely(str == NULL)) - return NULL; - - n = strlen(str); - ptr = ralloc_array(ctx, char, n + 1); - memcpy(ptr, str, n); - ptr[n] = '\0'; - return ptr; -} - -char * -ralloc_strndup(const void *ctx, const char *str, size_t max) -{ - size_t n; - char *ptr; - - if (unlikely(str == NULL)) - return NULL; - - n = strlen(str); - if (n > max) - n = max; - - ptr = ralloc_array(ctx, char, n + 1); - memcpy(ptr, str, n); - ptr[n] = '\0'; - return ptr; -} - -/* helper routine for strcat/strncat - n is the exact amount to copy */ -static bool -cat(char **dest, const char *str, size_t n) -{ - char *both; - size_t existing_length; - assert(dest != NULL && *dest != NULL); - - existing_length = strlen(*dest); - both = resize(*dest, existing_length + n + 1); - if (unlikely(both == NULL)) - return false; - - memcpy(both + existing_length, str, n); - both[existing_length + n] = '\0'; - - *dest = both; - return true; -} - - -bool -ralloc_strcat(char **dest, const char *str) -{ - return cat(dest, str, strlen(str)); -} - -bool -ralloc_strncat(char **dest, const char *str, size_t n) -{ - /* Clamp n to the string length */ - size_t str_length = strlen(str); - if (str_length < n) - n = str_length; - - return cat(dest, str, n); -} - -char * -ralloc_asprintf(const void *ctx, const char *fmt, ...) -{ - char *ptr; - va_list args; - va_start(args, fmt); - ptr = ralloc_vasprintf(ctx, fmt, args); - va_end(args); - return ptr; -} - -/* Return the length of the string that would be generated by a printf-style - * format and argument list, not including the \0 byte. - */ -size_t -printf_length(const char *fmt, va_list untouched_args) -{ - int size; - char junk; - - /* Make a copy of the va_list so the original caller can still use it */ - va_list args; - va_copy(args, untouched_args); - -#ifdef _WIN32 - /* We need to use _vcsprintf to calculate the size as vsnprintf returns -1 - * if the number of characters to write is greater than count. - */ - size = _vscprintf(fmt, args); - (void)junk; -#else - size = vsnprintf(&junk, 1, fmt, args); -#endif - assert(size >= 0); - - va_end(args); - - return size; -} - -char * -ralloc_vasprintf(const void *ctx, const char *fmt, va_list args) -{ - size_t size = printf_length(fmt, args) + 1; - - char *ptr = ralloc_size(ctx, size); - if (ptr != NULL) - vsnprintf(ptr, size, fmt, args); - - return ptr; -} - -bool -ralloc_asprintf_append(char **str, const char *fmt, ...) -{ - bool success; - va_list args; - va_start(args, fmt); - success = ralloc_vasprintf_append(str, fmt, args); - va_end(args); - return success; -} - -bool -ralloc_vasprintf_append(char **str, const char *fmt, va_list args) -{ - size_t existing_length; - assert(str != NULL); - existing_length = *str ? strlen(*str) : 0; - return ralloc_vasprintf_rewrite_tail(str, &existing_length, fmt, args); -} - -bool -ralloc_asprintf_rewrite_tail(char **str, size_t *start, const char *fmt, ...) -{ - bool success; - va_list args; - va_start(args, fmt); - success = ralloc_vasprintf_rewrite_tail(str, start, fmt, args); - va_end(args); - return success; -} - -bool -ralloc_vasprintf_rewrite_tail(char **str, size_t *start, const char *fmt, - va_list args) -{ - size_t new_length; - char *ptr; - - assert(str != NULL); - - if (unlikely(*str == NULL)) { - // Assuming a NULL context is probably bad, but it's expected behavior. - *str = ralloc_vasprintf(NULL, fmt, args); - return true; - } - - new_length = printf_length(fmt, args); - - ptr = resize(*str, *start + new_length + 1); - if (unlikely(ptr == NULL)) - return false; - - vsnprintf(ptr + *start, new_length + 1, fmt, args); - *str = ptr; - *start += new_length; - return true; -} diff --git a/3rdparty/glsl-optimizer/src/util/ralloc.h b/3rdparty/glsl-optimizer/src/util/ralloc.h deleted file mode 100644 index 2d4231085..000000000 --- a/3rdparty/glsl-optimizer/src/util/ralloc.h +++ /dev/null @@ -1,449 +0,0 @@ -/* - * Copyright © 2010 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file ralloc.h - * - * ralloc: a recursive memory allocator - * - * The ralloc memory allocator creates a hierarchy of allocated - * objects. Every allocation is in reference to some parent, and - * every allocated object can in turn be used as the parent of a - * subsequent allocation. This allows for extremely convenient - * discarding of an entire tree/sub-tree of allocations by calling - * ralloc_free on any particular object to free it and all of its - * children. - * - * The conceptual working of ralloc was directly inspired by Andrew - * Tridgell's talloc, but ralloc is an independent implementation - * released under the MIT license and tuned for Mesa. - * - * talloc is more sophisticated than ralloc in that it includes reference - * counting and useful debugging features. However, it is released under - * a non-permissive open source license. - */ - -#ifndef RALLOC_H -#define RALLOC_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include - -#include "macros.h" - -/** - * \def ralloc(ctx, type) - * Allocate a new object chained off of the given context. - * - * This is equivalent to: - * \code - * ((type *) ralloc_size(ctx, sizeof(type)) - * \endcode - */ -#define ralloc(ctx, type) ((type *) ralloc_size(ctx, sizeof(type))) - -/** - * \def rzalloc(ctx, type) - * Allocate a new object out of the given context and initialize it to zero. - * - * This is equivalent to: - * \code - * ((type *) rzalloc_size(ctx, sizeof(type)) - * \endcode - */ -#define rzalloc(ctx, type) ((type *) rzalloc_size(ctx, sizeof(type))) - -/** - * Allocate a new ralloc context. - * - * While any ralloc'd pointer can be used as a context, sometimes it is useful - * to simply allocate a context with no associated memory. - * - * It is equivalent to: - * \code - * ((type *) ralloc_size(ctx, 0) - * \endcode - */ -void *ralloc_context(const void *ctx); - -/** - * Allocate memory chained off of the given context. - * - * This is the core allocation routine which is used by all others. It - * simply allocates storage for \p size bytes and returns the pointer, - * similar to \c malloc. - */ -void *ralloc_size(const void *ctx, size_t size) MALLOCLIKE; - -/** - * Allocate zero-initialized memory chained off of the given context. - * - * This is similar to \c calloc with a size of 1. - */ -void *rzalloc_size(const void *ctx, size_t size) MALLOCLIKE; - -/** - * Resize a piece of ralloc-managed memory, preserving data. - * - * Similar to \c realloc. Unlike C89, passing 0 for \p size does not free the - * memory. Instead, it resizes it to a 0-byte ralloc context, just like - * calling ralloc_size(ctx, 0). This is different from talloc. - * - * \param ctx The context to use for new allocation. If \p ptr != NULL, - * it must be the same as ralloc_parent(\p ptr). - * \param ptr Pointer to the memory to be resized. May be NULL. - * \param size The amount of memory to allocate, in bytes. - */ -void *reralloc_size(const void *ctx, void *ptr, size_t size); - -/// \defgroup array Array Allocators @{ - -/** - * \def ralloc_array(ctx, type, count) - * Allocate an array of objects chained off the given context. - * - * Similar to \c calloc, but does not initialize the memory to zero. - * - * More than a convenience function, this also checks for integer overflow when - * multiplying \c sizeof(type) and \p count. This is necessary for security. - * - * This is equivalent to: - * \code - * ((type *) ralloc_array_size(ctx, sizeof(type), count) - * \endcode - */ -#define ralloc_array(ctx, type, count) \ - ((type *) ralloc_array_size(ctx, sizeof(type), count)) - -/** - * \def rzalloc_array(ctx, type, count) - * Allocate a zero-initialized array chained off the given context. - * - * Similar to \c calloc. - * - * More than a convenience function, this also checks for integer overflow when - * multiplying \c sizeof(type) and \p count. This is necessary for security. - * - * This is equivalent to: - * \code - * ((type *) rzalloc_array_size(ctx, sizeof(type), count) - * \endcode - */ -#define rzalloc_array(ctx, type, count) \ - ((type *) rzalloc_array_size(ctx, sizeof(type), count)) - -/** - * \def reralloc(ctx, ptr, type, count) - * Resize a ralloc-managed array, preserving data. - * - * Similar to \c realloc. Unlike C89, passing 0 for \p size does not free the - * memory. Instead, it resizes it to a 0-byte ralloc context, just like - * calling ralloc_size(ctx, 0). This is different from talloc. - * - * More than a convenience function, this also checks for integer overflow when - * multiplying \c sizeof(type) and \p count. This is necessary for security. - * - * \param ctx The context to use for new allocation. If \p ptr != NULL, - * it must be the same as ralloc_parent(\p ptr). - * \param ptr Pointer to the array to be resized. May be NULL. - * \param type The element type. - * \param count The number of elements to allocate. - */ -#define reralloc(ctx, ptr, type, count) \ - ((type *) reralloc_array_size(ctx, ptr, sizeof(type), count)) - -/** - * Allocate memory for an array chained off the given context. - * - * Similar to \c calloc, but does not initialize the memory to zero. - * - * More than a convenience function, this also checks for integer overflow when - * multiplying \p size and \p count. This is necessary for security. - */ -void *ralloc_array_size(const void *ctx, size_t size, size_t count) MALLOCLIKE; - -/** - * Allocate a zero-initialized array chained off the given context. - * - * Similar to \c calloc. - * - * More than a convenience function, this also checks for integer overflow when - * multiplying \p size and \p count. This is necessary for security. - */ -void *rzalloc_array_size(const void *ctx, size_t size, size_t count) MALLOCLIKE; - -/** - * Resize a ralloc-managed array, preserving data. - * - * Similar to \c realloc. Unlike C89, passing 0 for \p size does not free the - * memory. Instead, it resizes it to a 0-byte ralloc context, just like - * calling ralloc_size(ctx, 0). This is different from talloc. - * - * More than a convenience function, this also checks for integer overflow when - * multiplying \c sizeof(type) and \p count. This is necessary for security. - * - * \param ctx The context to use for new allocation. If \p ptr != NULL, - * it must be the same as ralloc_parent(\p ptr). - * \param ptr Pointer to the array to be resized. May be NULL. - * \param size The size of an individual element. - * \param count The number of elements to allocate. - * - * \return True unless allocation failed. - */ -void *reralloc_array_size(const void *ctx, void *ptr, size_t size, - size_t count); -/// @} - -/** - * Free a piece of ralloc-managed memory. - * - * This will also free the memory of any children allocated this context. - */ -void ralloc_free(void *ptr); - -/** - * "Steal" memory from one context, changing it to another. - * - * This changes \p ptr's context to \p new_ctx. This is quite useful if - * memory is allocated out of a temporary context. - */ -void ralloc_steal(const void *new_ctx, void *ptr); - -/** - * Return the given pointer's ralloc context. - */ -void *ralloc_parent(const void *ptr); - -/** - * Return a context whose memory will be automatically freed at program exit. - * - * The first call to this function creates a context and registers a handler - * to free it using \c atexit. This may cause trouble if used in a library - * loaded with \c dlopen. - */ -void *ralloc_autofree_context(void); - -/** - * Set a callback to occur just before an object is freed. - */ -void ralloc_set_destructor(const void *ptr, void(*destructor)(void *)); - -/// \defgroup array String Functions @{ -/** - * Duplicate a string, allocating the memory from the given context. - */ -char *ralloc_strdup(const void *ctx, const char *str) MALLOCLIKE; - -/** - * Duplicate a string, allocating the memory from the given context. - * - * Like \c strndup, at most \p n characters are copied. If \p str is longer - * than \p n characters, \p n are copied, and a termining \c '\0' byte is added. - */ -char *ralloc_strndup(const void *ctx, const char *str, size_t n) MALLOCLIKE; - -/** - * Concatenate two strings, allocating the necessary space. - * - * This appends \p str to \p *dest, similar to \c strcat, using ralloc_resize - * to expand \p *dest to the appropriate size. \p dest will be updated to the - * new pointer unless allocation fails. - * - * The result will always be null-terminated. - * - * \return True unless allocation failed. - */ -bool ralloc_strcat(char **dest, const char *str); - -/** - * Concatenate two strings, allocating the necessary space. - * - * This appends at most \p n bytes of \p str to \p *dest, using ralloc_resize - * to expand \p *dest to the appropriate size. \p dest will be updated to the - * new pointer unless allocation fails. - * - * The result will always be null-terminated; \p str does not need to be null - * terminated if it is longer than \p n. - * - * \return True unless allocation failed. - */ -bool ralloc_strncat(char **dest, const char *str, size_t n); - -/** - * Print to a string. - * - * This is analogous to \c sprintf, but allocates enough space (using \p ctx - * as the context) for the resulting string. - * - * \return The newly allocated string. - */ -char *ralloc_asprintf (const void *ctx, const char *fmt, ...) PRINTFLIKE(2, 3) MALLOCLIKE; - -/** - * Print to a string, given a va_list. - * - * This is analogous to \c vsprintf, but allocates enough space (using \p ctx - * as the context) for the resulting string. - * - * \return The newly allocated string. - */ -char *ralloc_vasprintf(const void *ctx, const char *fmt, va_list args) MALLOCLIKE; - -/** - * Rewrite the tail of an existing string, starting at a given index. - * - * Overwrites the contents of *str starting at \p start with newly formatted - * text, including a new null-terminator. Allocates more memory as necessary. - * - * This can be used to append formatted text when the length of the existing - * string is already known, saving a strlen() call. - * - * \sa ralloc_asprintf_append - * - * \param str The string to be updated. - * \param start The index to start appending new data at. - * \param fmt A printf-style formatting string - * - * \p str will be updated to the new pointer unless allocation fails. - * \p start will be increased by the length of the newly formatted text. - * - * \return True unless allocation failed. - */ -bool ralloc_asprintf_rewrite_tail(char **str, size_t *start, - const char *fmt, ...) - PRINTFLIKE(3, 4); - -/** - * Rewrite the tail of an existing string, starting at a given index. - * - * Overwrites the contents of *str starting at \p start with newly formatted - * text, including a new null-terminator. Allocates more memory as necessary. - * - * This can be used to append formatted text when the length of the existing - * string is already known, saving a strlen() call. - * - * \sa ralloc_vasprintf_append - * - * \param str The string to be updated. - * \param start The index to start appending new data at. - * \param fmt A printf-style formatting string - * \param args A va_list containing the data to be formatted - * - * \p str will be updated to the new pointer unless allocation fails. - * \p start will be increased by the length of the newly formatted text. - * - * \return True unless allocation failed. - */ -bool ralloc_vasprintf_rewrite_tail(char **str, size_t *start, const char *fmt, - va_list args); - -/** - * Append formatted text to the supplied string. - * - * This is equivalent to - * \code - * ralloc_asprintf_rewrite_tail(str, strlen(*str), fmt, ...) - * \endcode - * - * \sa ralloc_asprintf - * \sa ralloc_asprintf_rewrite_tail - * \sa ralloc_strcat - * - * \p str will be updated to the new pointer unless allocation fails. - * - * \return True unless allocation failed. - */ -bool ralloc_asprintf_append (char **str, const char *fmt, ...) - PRINTFLIKE(2, 3); - -/** - * Append formatted text to the supplied string, given a va_list. - * - * This is equivalent to - * \code - * ralloc_vasprintf_rewrite_tail(str, strlen(*str), fmt, args) - * \endcode - * - * \sa ralloc_vasprintf - * \sa ralloc_vasprintf_rewrite_tail - * \sa ralloc_strcat - * - * \p str will be updated to the new pointer unless allocation fails. - * - * \return True unless allocation failed. - */ -bool ralloc_vasprintf_append(char **str, const char *fmt, va_list args); -/// @} - - -size_t printf_length(const char *fmt, va_list untouched_args); - - -#ifdef __cplusplus -} /* end of extern "C" */ -#endif - -/** - * Declare C++ new and delete operators which use ralloc. - * - * Placing this macro in the body of a class makes it possible to do: - * - * TYPE *var = new(mem_ctx) TYPE(...); - * delete var; - * - * which is more idiomatic in C++ than calling ralloc. - */ -#define DECLARE_RALLOC_CXX_OPERATORS(TYPE) \ -private: \ - static void _ralloc_destructor(void *p) \ - { \ - reinterpret_cast(p)->~TYPE(); \ - } \ -public: \ - static void* operator new(size_t size, void *mem_ctx) \ - { \ - void *p = ralloc_size(mem_ctx, size); \ - assert(p != NULL); \ - if (!HAS_TRIVIAL_DESTRUCTOR(TYPE)) \ - ralloc_set_destructor(p, _ralloc_destructor); \ - return p; \ - } \ - \ - static void operator delete(void *p) \ - { \ - /* The object's destructor is guaranteed to have already been \ - * called by the delete operator at this point -- Make sure it's \ - * not called again. \ - */ \ - if (!HAS_TRIVIAL_DESTRUCTOR(TYPE)) \ - ralloc_set_destructor(p, NULL); \ - ralloc_free(p); \ - } - - -#endif diff --git a/3rdparty/khronos/GLES2/gl2.h b/3rdparty/khronos/GLES2/gl2.h deleted file mode 100644 index da64b8816..000000000 --- a/3rdparty/khronos/GLES2/gl2.h +++ /dev/null @@ -1,656 +0,0 @@ -#ifndef __gles2_gl2_h_ -#define __gles2_gl2_h_ 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** Copyright 2013-2025 The Khronos Group Inc. -** SPDX-License-Identifier: MIT -** -** This header is generated from the Khronos OpenGL / OpenGL ES XML -** API Registry. The current version of the Registry, generator scripts -** used to make the header, and the header can be found at -** https://github.com/KhronosGroup/OpenGL-Registry -*/ - -#include - -#ifndef GL_APIENTRYP -#define GL_APIENTRYP GL_APIENTRY* -#endif - -#ifndef GL_GLES_PROTOTYPES -#define GL_GLES_PROTOTYPES 1 -#endif - -/* Generated on date 20251023 */ - -/* Generated C header for: - * API: gles2 - * Profile: common - * Versions considered: 2\.[0-9] - * Versions emitted: .* - * Default extensions included: None - * Additional extensions included: _nomatch_^ - * Extensions removed: _nomatch_^ - */ - -#ifndef GL_ES_VERSION_2_0 -#define GL_ES_VERSION_2_0 1 -#include -typedef khronos_int8_t GLbyte; -typedef khronos_float_t GLclampf; -typedef khronos_int32_t GLfixed; -typedef khronos_int16_t GLshort; -typedef khronos_uint16_t GLushort; -typedef void GLvoid; -typedef struct __GLsync *GLsync; -typedef khronos_int64_t GLint64; -typedef khronos_uint64_t GLuint64; -typedef unsigned int GLenum; -typedef unsigned int GLuint; -typedef char GLchar; -typedef khronos_float_t GLfloat; -typedef khronos_ssize_t GLsizeiptr; -typedef khronos_intptr_t GLintptr; -typedef unsigned int GLbitfield; -typedef int GLint; -typedef unsigned char GLboolean; -typedef int GLsizei; -typedef khronos_uint8_t GLubyte; -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_FALSE 0 -#define GL_TRUE 1 -#define GL_POINTS 0x0000 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_ZERO 0 -#define GL_ONE 1 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -#define GL_FUNC_ADD 0x8006 -#define GL_BLEND_EQUATION 0x8009 -#define GL_BLEND_EQUATION_RGB 0x8009 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_STREAM_DRAW 0x88E0 -#define GL_STATIC_DRAW 0x88E4 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_CULL_FACE 0x0B44 -#define GL_BLEND 0x0BE2 -#define GL_DITHER 0x0BD0 -#define GL_STENCIL_TEST 0x0B90 -#define GL_DEPTH_TEST 0x0B71 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_NO_ERROR 0 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_OUT_OF_MEMORY 0x0505 -#define GL_CW 0x0900 -#define GL_CCW 0x0901 -#define GL_LINE_WIDTH 0x0B21 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#define GL_VIEWPORT 0x0BA2 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_RED_BITS 0x0D52 -#define GL_GREEN_BITS 0x0D53 -#define GL_BLUE_BITS 0x0D54 -#define GL_ALPHA_BITS 0x0D55 -#define GL_DEPTH_BITS 0x0D56 -#define GL_STENCIL_BITS 0x0D57 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_FIXED 0x140C -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_ALPHA 0x1906 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD -#define GL_SHADER_TYPE 0x8B4F -#define GL_DELETE_STATUS 0x8B80 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_NEVER 0x0200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -#define GL_INVERT 0x150A -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 -#define GL_NEAREST 0x2600 -#define GL_LINEAR 0x2601 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_TEXTURE 0x1702 -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_REPEAT 0x2901 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B -#define GL_COMPILE_STATUS 0x8B81 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_SHADER_COMPILER 0x8DFA -#define GL_SHADER_BINARY_FORMATS 0x8DF8 -#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 -#define GL_LOW_FLOAT 0x8DF0 -#define GL_MEDIUM_FLOAT 0x8DF1 -#define GL_HIGH_FLOAT 0x8DF2 -#define GL_LOW_INT 0x8DF3 -#define GL_MEDIUM_INT 0x8DF4 -#define GL_HIGH_INT 0x8DF5 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGB565 0x8D62 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_NONE 0 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -typedef void (GL_APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (GL_APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GL_APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); -typedef void (GL_APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); -typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); -typedef void (GL_APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture); -typedef void (GL_APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (GL_APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor); -typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (GL_APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); -typedef void (GL_APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); -typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); -typedef void (GL_APIENTRYP PFNGLCLEARPROC) (GLbitfield mask); -typedef void (GL_APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); -typedef void (GL_APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s); -typedef void (GL_APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -typedef void (GL_APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); -typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GL_APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMPROC) (void); -typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); -typedef void (GL_APIENTRYP PFNGLCULLFACEPROC) (GLenum mode); -typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); -typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); -typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (GL_APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); -typedef void (GL_APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures); -typedef void (GL_APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func); -typedef void (GL_APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag); -typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); -typedef void (GL_APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GL_APIENTRYP PFNGLDISABLEPROC) (GLenum cap); -typedef void (GL_APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (GL_APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices); -typedef void (GL_APIENTRYP PFNGLENABLEPROC) (GLenum cap); -typedef void (GL_APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (GL_APIENTRYP PFNGLFINISHPROC) (void); -typedef void (GL_APIENTRYP PFNGLFLUSHPROC) (void); -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GL_APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode); -typedef void (GL_APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); -typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); -typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); -typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (GL_APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); -typedef void (GL_APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (GL_APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); -typedef GLint (GL_APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (GL_APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data); -typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLenum (GL_APIENTRYP PFNGLGETERRORPROC) (void); -typedef void (GL_APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *data); -typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data); -typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (GL_APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -typedef void (GL_APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGPROC) (GLenum name); -typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); -typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); -typedef GLint (GL_APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); -typedef void (GL_APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode); -typedef GLboolean (GL_APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); -typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDPROC) (GLenum cap); -typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); -typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); -typedef GLboolean (GL_APIENTRYP PFNGLISSHADERPROC) (GLuint shader); -typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture); -typedef void (GL_APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width); -typedef void (GL_APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (GL_APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param); -typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units); -typedef void (GL_APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); -typedef void (GL_APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); -typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); -typedef void (GL_APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryFormat, const void *binary, GLsizei length); -typedef void (GL_APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); -typedef void (GL_APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask); -typedef void (GL_APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); -typedef void (GL_APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask); -typedef void (GL_APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (GL_APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass); -typedef void (GL_APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (GL_APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (GL_APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (GL_APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (GL_APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (GL_APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GL_APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GL_APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GL_APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GL_APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); -typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); -typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); -#if GL_GLES_PROTOTYPES -GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture); -GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader); -GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); -GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer); -GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); -GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); -GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture); -GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode); -GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); -GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); -GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); -GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); -GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target); -GL_APICALL void GL_APIENTRY glClear (GLbitfield mask); -GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d); -GL_APICALL void GL_APIENTRY glClearStencil (GLint s); -GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader); -GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GL_APICALL GLuint GL_APIENTRY glCreateProgram (void); -GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type); -GL_APICALL void GL_APIENTRY glCullFace (GLenum mode); -GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); -GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); -GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program); -GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); -GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader); -GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); -GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func); -GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag); -GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f); -GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader); -GL_APICALL void GL_APIENTRY glDisable (GLenum cap); -GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index); -GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); -GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); -GL_APICALL void GL_APIENTRY glEnable (GLenum cap); -GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index); -GL_APICALL void GL_APIENTRY glFinish (void); -GL_APICALL void GL_APIENTRY glFlush (void); -GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode); -GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); -GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target); -GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); -GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); -GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures); -GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); -GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); -GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data); -GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); -GL_APICALL GLenum GL_APIENTRY glGetError (void); -GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data); -GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data); -GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name); -GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); -GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); -GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); -GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); -GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); -GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); -GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode); -GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer); -GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap); -GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer); -GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program); -GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer); -GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader); -GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture); -GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width); -GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program); -GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param); -GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); -GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); -GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void); -GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); -GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryFormat, const void *binary, GLsizei length); -GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); -GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); -GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); -GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask); -GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); -GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); -GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); -GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); -GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); -GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0); -GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0); -GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); -GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); -GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); -GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUseProgram (GLuint program); -GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program); -GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); -GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); -GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); -GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); -GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); -GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); -GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); -GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); -#endif -#endif /* GL_ES_VERSION_2_0 */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/3rdparty/khronos/GLES2/gl2platform.h b/3rdparty/khronos/GLES2/gl2platform.h deleted file mode 100644 index 5bcce6d89..000000000 --- a/3rdparty/khronos/GLES2/gl2platform.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef __gl2platform_h_ -#define __gl2platform_h_ - -/* -** Copyright 2017-2020 The Khronos Group Inc. -** SPDX-License-Identifier: Apache-2.0 -*/ - -/* Platform-specific types and definitions for OpenGL ES 2.X gl2.h - * - * Adopters may modify khrplatform.h and this file to suit their platform. - * Please contribute modifications back to Khronos as pull requests on the - * public github repository: - * https://github.com/KhronosGroup/OpenGL-Registry - */ - -#include - -#ifndef GL_APICALL -#define GL_APICALL KHRONOS_APICALL -#endif - -#ifndef GL_APIENTRY -#define GL_APIENTRY KHRONOS_APIENTRY -#endif - -#endif /* __gl2platform_h_ */ diff --git a/README.md b/README.md index 792793b3a..b20c1a3f0 100644 --- a/README.md +++ b/README.md @@ -46,12 +46,9 @@ Supported rendering backends: * Direct3D 12 * GNM (only for licensed PS4 developers, search DevNet forums for source) * Metal - * OpenGL 2.1 - * OpenGL 3.1+ - * OpenGL ES 2 - * OpenGL ES 3.1 + * OpenGL 4.3+ + * OpenGL ES 3.0+ * Vulkan - * WebGL 1.0 * WebGL 2.0 * WebGPU (Dawn Native only) diff --git a/bindings/bf/bgfx.bf b/bindings/bf/bgfx.bf index ca270ab76..cb1acb50f 100644 --- a/bindings/bf/bgfx.bf +++ b/bindings/bf/bgfx.bf @@ -1561,12 +1561,12 @@ public static class bgfx Nvn, /// - /// OpenGL ES 2.0+ + /// OpenGL ES 3.0+ /// OpenGLES, /// - /// OpenGL 2.1+ + /// OpenGL 4.3+ /// OpenGL, diff --git a/bindings/c3/bgfx.c3 b/bindings/c3/bgfx.c3 index f1bf18e87..fb0ac377c 100644 --- a/bindings/c3/bgfx.c3 +++ b/bindings/c3/bgfx.c3 @@ -987,10 +987,10 @@ enum RendererType : uint // NVN NVN, - // OpenGL ES 2.0+ + // OpenGL ES 3.0+ OPENGLES, - // OpenGL 2.1+ + // OpenGL 4.3+ OPENGL, // Vulkan diff --git a/bindings/cs/bgfx.cs b/bindings/cs/bgfx.cs index 0ca9b58f3..6a93be0af 100644 --- a/bindings/cs/bgfx.cs +++ b/bindings/cs/bgfx.cs @@ -1558,12 +1558,12 @@ public static partial class bgfx Nvn, /// - /// OpenGL ES 2.0+ + /// OpenGL ES 3.0+ /// OpenGLES, /// - /// OpenGL 2.1+ + /// OpenGL 4.3+ /// OpenGL, diff --git a/bindings/d/package.d b/bindings/d/package.d index 8f4be71f8..e82533230 100644 --- a/bindings/d/package.d +++ b/bindings/d/package.d @@ -9,7 +9,7 @@ import bindbc.common.types: c_int64, c_uint64, va_list; import bindbc.bgfx.config; static import bgfx.impl; -enum uint apiVersion = 154; +enum uint apiVersion = 155; alias ViewID = ushort; diff --git a/bindings/zig/bgfx.zig b/bindings/zig/bgfx.zig index 67c41ad0b..507eeff38 100644 --- a/bindings/zig/bgfx.zig +++ b/bindings/zig/bgfx.zig @@ -950,10 +950,10 @@ pub const RendererType = enum(c_int) { /// NVN Nvn, - /// OpenGL ES 2.0+ + /// OpenGL ES 3.0+ OpenGLES, - /// OpenGL 2.1+ + /// OpenGL 4.3+ OpenGL, /// Vulkan diff --git a/docs/build.rst b/docs/build.rst index 8c8b9c526..e14606e17 100644 --- a/docs/build.rst +++ b/docs/build.rst @@ -137,9 +137,9 @@ There are also many platform-specific options. :: # Unix: - export BGFX_CONFIG=RENDERER_OPENGL_MIN_VERSION=40 + export BGFX_CONFIG=RENDERER_OPENGL_MIN_VERSION=46 # Windows: - set BGFX_CONFIG=RENDERER_OPENGL_MIN_VERSION=40 + set BGFX_CONFIG=RENDERER_OPENGL_MIN_VERSION=46 ../bx/tools/bin//genie <... your options ...> diff --git a/docs/internals.rst b/docs/internals.rst index 138018d7c..79af5047d 100644 --- a/docs/internals.rst +++ b/docs/internals.rst @@ -115,13 +115,13 @@ The maximum size of transient buffers can be configured via ``Limits.maxTransien Customization ------------- -By default each platform has sane default values. For example on Windows the default renderer is Direct3D 12, on Linux it is Vulkan, and on macOS it's Metal. On Windows, almost all rendering backends are available. For OpenGL ES on desktop you can find more information at: `OpenGL ES 2.0 and EGL on desktop `__ +By default each platform has sane default values. For example on Windows the default renderer is Direct3D 12, on Linux it is Vulkan, and on macOS it's Metal. On Windows, almost all rendering backends are available. For OpenGL ES on desktop you can find more information at: `OpenGL ES and EGL on desktop `__ If you're targeting specific mobile hardware, you can find GLES support in their official SDKs: `Adreno SDK `__, `Mali SDK `__, `PowerVR SDK `__. All configuration settings are located inside `src/config.h `__. -Every ``BGFX_CONFIG_*`` setting can be changed by passing defines through compiler switches. For example setting preprocessor define ``BGFX_CONFIG_RENDERER_OPENGL=1`` will change the backend renderer to OpenGL 2.1 on Windows. Since rendering APIs are platform specific, this obviously won't work nor make sense in all cases. +Every ``BGFX_CONFIG_*`` setting can be changed by passing defines through compiler switches. For example setting preprocessor define ``BGFX_CONFIG_RENDERER_OPENGL=1`` will change the backend renderer to OpenGL 4.3 on Windows. Since rendering APIs are platform specific, this obviously won't work nor make sense in all cases. Options ~~~~~~~ @@ -152,9 +152,9 @@ Renderer backends ``BGFX_CONFIG_RENDERER_NVN`` - Enable NVN renderer backend (Nintendo Switch). Default is auto-detected per platform. -``BGFX_CONFIG_RENDERER_OPENGL`` - Enable OpenGL renderer backend. Set to the minimum GL version (e.g. 21 for OpenGL 2.1, 33 for 3.3, 44 for 4.4). Default is auto-detected per platform; minimum is 21 if enabled. +``BGFX_CONFIG_RENDERER_OPENGL`` - Enable OpenGL renderer backend. Set to the minimum GL version (e.g. 43 for OpenGL 4.3, 45 for 4.5, 46 for 4.6). Default is auto-detected per platform; minimum is 43 if enabled. -``BGFX_CONFIG_RENDERER_OPENGLES`` - Enable OpenGL ES renderer backend. Set to the minimum GLES version (e.g. 20 for ES 2.0, 30 for ES 3.0). Default is auto-detected per platform; minimum is 20 if enabled. Cannot be combined with ``BGFX_CONFIG_RENDERER_OPENGL``. +``BGFX_CONFIG_RENDERER_OPENGLES`` - Enable OpenGL ES renderer backend. Set to the minimum GLES version (e.g. 30 for ES 3.0, 31 for ES 3.1). Default is auto-detected per platform; minimum is 30 if enabled. Cannot be combined with ``BGFX_CONFIG_RENDERER_OPENGL``. ``BGFX_CONFIG_RENDERER_VULKAN`` - Enable Vulkan renderer backend. Default is 1 on Android/Linux/Windows/macOS/NX. diff --git a/docs/license.rst b/docs/license.rst index 5819d4a46..5258514bf 100644 --- a/docs/license.rst +++ b/docs/license.rst @@ -40,7 +40,6 @@ directory. - Dear ImGui (`MIT `__) - Blendish (`MIT `__) - fcpp (`BSD `__) - - glsl-optimizer (`MIT `__) - glslang (`Apache 2.0 `__) - IconFontCppHeaders (`MIT `__) - meshoptimizer (`MIT `__) diff --git a/docs/overview.rst b/docs/overview.rst index 44c1dcc7c..a0ba3c9be 100644 --- a/docs/overview.rst +++ b/docs/overview.rst @@ -21,12 +21,9 @@ Supported rendering backends - Direct3D 12 - GNM (only for licensed PS4 developers, search DevNet forums for source) - Metal -- OpenGL 2.1 -- OpenGL 3.1+ -- OpenGL ES 2 -- OpenGL ES 3.1 +- OpenGL 4.3+ +- OpenGL ES 3.0+ - Vulkan -- WebGL 1.0 - WebGL 2.0 - WebGPU (Dawn Native only) diff --git a/docs/tools.rst b/docs/tools.rst index 8599dba04..e4917817c 100644 --- a/docs/tools.rst +++ b/docs/tools.rst @@ -203,7 +203,7 @@ Options: --preprocess Only pre-process. --keepcomments Do not discard comments. --define Add defines to preprocessor. (Semicolon-separated) - --raw Do not process shader. No preprocessor, and no glsl-optimizer. (GLSL only) + --raw Do not process shader. No preprocessor. (GLSL only) --type Shader type. Can be 'vertex', 'fragment, or 'compute'. --varyingdef varying.def.sc's file path. --verbose Be verbose. diff --git a/examples/02-metaballs/fs_metaballs.bin.h b/examples/02-metaballs/fs_metaballs.bin.h index 22b8342d1..ebe8fae5f 100644 --- a/examples/02-metaballs/fs_metaballs.bin.h +++ b/examples/02-metaballs/fs_metaballs.bin.h @@ -1,59 +1,57 @@ -static const uint8_t fs_metaballs_glsl[376] = +static const uint8_t fs_metaballs_glsl[338] = { - 0x46, 0x53, 0x48, 0x0b, 0x03, 0x2c, 0xf5, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x01, // FSH..,.?......e. - 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, // ..varying vec4 v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, // _color0;.varying - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, // vec3 v_normal;. - 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, // void main ().{. - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, // float tmpvar_1; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x64, 0x6f, // . tmpvar_1 = do - 0x74, 0x20, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x5f, 0x6e, // t (normalize(v_n - 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, // ormal), vec3(0.0 - 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, // , 0.0, -1.0));. - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, // vec4 tmpvar_2;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, // tmpvar_2.w = 1 - 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, // .0;. tmpvar_2.x - 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x28, 0x28, 0x0a, 0x20, 0x20, 0x20, // yz = pow (((. - 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, // pow (v_color0.x - 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, // yz, vec3(2.2, 2. - 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x74, 0x6d, // 2, 2.2)). * tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, // pvar_1) + pow (t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2c, 0x20, 0x33, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2c, // mpvar_1, 30.0)), - 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x2c, // vec3(0.4545454, - 0x20, 0x30, 0x2e, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x35, // 0.4545454, 0.45 - 0x34, 0x35, 0x34, 0x35, 0x34, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, // 45454));. gl_Fr - 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // agColor = tmpvar - 0x5f, 0x32, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _2;.}... -}; -static const uint8_t fs_metaballs_essl[402] = -{ - 0x46, 0x53, 0x48, 0x0b, 0x03, 0x2c, 0xf5, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x01, // FSH..,.?........ - 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // ..varying highp - 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, // vec4 v_color0;.v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // arying highp vec - 0x33, 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, // 3 v_normal;.void - 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, // main ().{. hig - 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // hp float tmpvar_ - 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, // 1;. tmpvar_1 = - 0x64, 0x6f, 0x74, 0x20, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, // dot (normalize(v - 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, // _normal), vec3(0 - 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, // .0, 0.0, -1.0)); - 0x0a, 0x20, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // . mediump vec4 - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // tmpvar_2;. tmpv - 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, // ar_2.w = 1.0;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x70, // tmpvar_2.xyz = p - 0x6f, 0x77, 0x20, 0x28, 0x28, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, // ow (((. pow ( - 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, // v_color0.xyz, ve - 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, // c3(2.2, 2.2, 2.2 - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // )). * tmpvar_1 - 0x29, 0x20, 0x2b, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ) + pow (tmpvar_ - 0x31, 0x2c, 0x20, 0x33, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // 1, 30.0)), vec3( - 0x30, 0x2e, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x35, 0x34, // 0.4545454, 0.454 - 0x35, 0x34, 0x35, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x29, // 5454, 0.4545454) - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, // );. gl_FragColo - 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x7d, 0x0a, // r = tmpvar_2;.}. + 0x46, 0x53, 0x48, 0x0b, 0x03, 0x2c, 0xf5, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x01, // FSH..,.?......?. + 0x00, 0x00, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, // ...in vec3 v_nor + 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // mal;.layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, // tion = 0) out ve + 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, // c4 bgfx_FragColo + 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // r;.in vec4 v_col + 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, // or0;..void main( + 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, // ).{. float _2 + 0x38, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, // 8 = dot(normaliz + 0x65, 0x28, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, // e(v_normal), vec + 0x33, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, // 3(0.0, 0.0, -1.0 + 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // ));. bgfx_Fra + 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x70, 0x6f, // gColor = vec4(po + 0x77, 0x28, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, // w((pow(v_color0. + 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, 0x30, 0x30, 0x30, // xyz, vec3(2.2000 + 0x30, 0x30, 0x30, 0x34, 0x37, 0x36, 0x38, 0x33, 0x37, 0x31, 0x35, 0x38, 0x32, 0x30, 0x33, 0x31, // 0004768371582031 + 0x32, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x38, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, // 25)) * _28) + ve + 0x63, 0x33, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x32, 0x38, 0x2c, 0x20, 0x33, 0x30, 0x2e, 0x30, // c3(pow(_28, 30.0 + 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x35, 0x34, 0x35, 0x34, // )), vec3(0.45454 + 0x35, 0x34, 0x36, 0x38, 0x30, 0x39, 0x31, 0x39, 0x36, 0x34, 0x37, 0x32, 0x31, 0x36, 0x37, 0x39, // 5468091964721679 + 0x36, 0x38, 0x37, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, // 6875)), 1.0);.}. 0x0a, 0x00, // .. }; +static const uint8_t fs_metaballs_essl[408] = +{ + 0x46, 0x53, 0x48, 0x0b, 0x03, 0x2c, 0xf5, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, // FSH..,.?........ + 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, // ..precision medi + 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, // ump float;.preci + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, // sion highp int;. + 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // .in highp vec3 v + 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, // _normal;.layout( + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, // location = 0) ou + 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, // t highp vec4 bgf + 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, // x_FragColor;.in + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // highp vec4 v_col + 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, // or0;..void main( + 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, // ).{. highp fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, // oat _28 = dot(no + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, // rmalize(v_normal + 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, // ), vec3(0.0, 0.0 + 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, // , -1.0));. bg + 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, // fx_FragColor = v + 0x65, 0x63, 0x34, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x76, 0x5f, 0x63, // ec4(pow((pow(v_c + 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // olor0.xyz, vec3( + 0x32, 0x2e, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x37, 0x36, 0x38, 0x33, 0x37, 0x31, // 2.20000004768371 + 0x35, 0x38, 0x32, 0x30, 0x33, 0x31, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x38, // 58203125)) * _28 + 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x32, 0x38, // ) + vec3(pow(_28 + 0x2c, 0x20, 0x33, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, // , 30.0)), vec3(0 + 0x2e, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x36, 0x38, 0x30, 0x39, 0x31, 0x39, 0x36, 0x34, // .454545468091964 + 0x37, 0x32, 0x31, 0x36, 0x37, 0x39, 0x36, 0x38, 0x37, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x31, 0x2e, // 7216796875)), 1. + 0x30, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 0);.}... +}; static const uint8_t fs_metaballs_spv[990] = { 0x46, 0x53, 0x48, 0x0b, 0x03, 0x2c, 0xf5, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x03, // FSH..,.?........ diff --git a/examples/02-metaballs/vs_metaballs.bin.h b/examples/02-metaballs/vs_metaballs.bin.h index f24d0157f..7416b4620 100644 --- a/examples/02-metaballs/vs_metaballs.bin.h +++ b/examples/02-metaballs/vs_metaballs.bin.h @@ -1,75 +1,64 @@ -static const uint8_t vs_metaballs_glsl[500] = +static const uint8_t vs_metaballs_glsl[434] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x2c, 0xf5, 0x3f, 0x02, 0x00, 0x0f, 0x75, // VSH......,.?...u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, // .........u_model - 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x01, 0x00, 0x00, 0x61, 0x74, // ..............at - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, // tribute vec4 a_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, // olor0;.attribute - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, // vec3 a_normal;. - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, // attribute vec3 a - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // _position;.varyi - 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // ng vec4 v_color0 - 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // ;.varying vec3 v - 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // _normal;.uniform - 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, // mat4 u_modelVie - 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, // wProj;.uniform m - 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, // at4 u_model[1];. - 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, // void main ().{. - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, // vec4 tmpvar_1;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, // tmpvar_1.w = 1 - 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, // .0;. tmpvar_1.x - 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, // yz = a_position; - 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, // . gl_Position = - 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, // (u_modelViewPro - 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, // j * tmpvar_1);. - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, // vec4 tmpvar_2;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x30, // tmpvar_2.w = 0 - 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, // .0;. tmpvar_2.x - 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x20, // yz = a_normal;. - 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, // v_normal = (u_m - 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // odel[0] * tmpvar - 0x5f, 0x32, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // _2).xyz;. v_col - 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, // or0 = a_color0;. - 0x7d, 0x0a, 0x0a, 0x00, // }... + 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x01, 0x00, 0x00, 0x0a, 0x75, // ..........s....u + 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, // niform mat4 u_mo + 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // delViewProj;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, // l[1];..layout(lo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, // cation = 2) in v + 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec3 a_position;. + 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, // out vec3 v_norma + 0x6c, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, // l;.layout(locati + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // on = 1) in vec3 + 0x61, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, // a_normal;.out ve + 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, // c4 v_color0;.lay + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, // out(location = 0 + 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ) in vec4 a_colo + 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, // r0;..void main() + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, // .{. gl_Positi + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, // on = u_modelView + 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, // Proj * vec4(a_po + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // sition, 1.0);. + 0x20, 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, // v_normal = (u_ + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // model[0] * vec4( + 0x61, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2e, // a_normal, 0.0)). + 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // xyz;. v_color + 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, // 0 = a_color0;.}. + 0x0a, 0x00, // .. }; -static const uint8_t vs_metaballs_essl[548] = +static const uint8_t vs_metaballs_essl[434] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x2c, 0xf5, 0x3f, 0x02, 0x00, 0x0f, 0x75, // VSH......,.?...u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, // .........u_model - 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0x01, 0x00, 0x00, 0x61, 0x74, // ..............at - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // tribute highp ve - 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, // c4 a_color0;.att - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // ribute highp vec - 0x33, 0x20, 0x61, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, // 3 a_normal;.attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, // ibute highp vec3 - 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x76, 0x61, 0x72, // a_position;.var - 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ying highp vec4 - 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // v_color0;.varyin - 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x6e, // g highp vec3 v_n - 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, // ormal;.uniform h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // ighp mat4 u_mode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // lViewProj;.unifo - 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, // rm mat4 u_model[ - 0x31, 0x5d, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, // 1];.void main () - 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // .{. highp vec4 - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // tmpvar_1;. tmpv - 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, // ar_1.w = 1.0;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, // tmpvar_1.xyz = a - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, // _position;. gl_ - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, // Position = (u_mo - 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, // delViewProj * tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // pvar_1);. highp - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, // vec4 tmpvar_2;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x30, // tmpvar_2.w = 0 - 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, // .0;. tmpvar_2.x - 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x20, // yz = a_normal;. - 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, // v_normal = (u_m - 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // odel[0] * tmpvar - 0x5f, 0x32, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // _2).xyz;. v_col - 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, // or0 = a_color0;. - 0x7d, 0x0a, 0x0a, 0x00, // }... + 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x01, 0x00, 0x00, 0x0a, 0x75, // ..........s....u + 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, // niform mat4 u_mo + 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // delViewProj;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, // l[1];..layout(lo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, // cation = 2) in v + 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec3 a_position;. + 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, // out vec3 v_norma + 0x6c, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, // l;.layout(locati + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // on = 1) in vec3 + 0x61, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, // a_normal;.out ve + 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, // c4 v_color0;.lay + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, // out(location = 0 + 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ) in vec4 a_colo + 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, // r0;..void main() + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, // .{. gl_Positi + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, // on = u_modelView + 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, // Proj * vec4(a_po + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // sition, 1.0);. + 0x20, 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, // v_normal = (u_ + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // model[0] * vec4( + 0x61, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2e, // a_normal, 0.0)). + 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // xyz;. v_color + 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, // 0 = a_color0;.}. + 0x0a, 0x00, // .. }; static const uint8_t vs_metaballs_spv[1608] = { diff --git a/examples/17-drawstress/fs_drawstress.bin.h b/examples/17-drawstress/fs_drawstress.bin.h index d6ead4d56..943ee8e29 100644 --- a/examples/17-drawstress/fs_drawstress.bin.h +++ b/examples/17-drawstress/fs_drawstress.bin.h @@ -1,20 +1,29 @@ -static const uint8_t fs_drawstress_glsl[87] = +static const uint8_t fs_drawstress_glsl[133] = { - 0x46, 0x53, 0x48, 0x0b, 0xa4, 0x8b, 0xef, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, // FSH....I......D. - 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, // ..varying vec4 v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // _color0;.void ma - 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, // in ().{. gl_Fra - 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // gColor = v_color - 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 0;.}... + 0x46, 0x53, 0x48, 0x0b, 0xa4, 0x8b, 0xef, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, // FSH....I......r. + 0x00, 0x00, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, // ...layout(locati + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, // on = 0) out vec4 + 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, // bgfx_FragColor; + 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // .in vec4 v_color + 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, // 0;..void main(). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, // {. bgfx_FragC + 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // olor = v_color0; + 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... }; -static const uint8_t fs_drawstress_essl[93] = +static const uint8_t fs_drawstress_essl[191] = { - 0x46, 0x53, 0x48, 0x0b, 0xa4, 0x8b, 0xef, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, // FSH....I......J. - 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // ..varying highp - 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, // vec4 v_color0;.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, // gl_FragColor = v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _color0;.}... + 0x46, 0x53, 0x48, 0x0b, 0xa4, 0x8b, 0xef, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, // FSH....I........ + 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, // ..precision medi + 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, // ump float;.preci + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, // sion highp int;. + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // .layout(location + 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // = 0) out highp + 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // vec4 bgfx_FragCo + 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // lor;.in highp ve + 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, // c4 v_color0;..vo + 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // id main().{. + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, // bgfx_FragColor = + 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // v_color0;.}... }; static const uint8_t fs_drawstress_spv[406] = { diff --git a/examples/17-drawstress/fs_drawstress_tex.bin.h b/examples/17-drawstress/fs_drawstress_tex.bin.h index 436746d5d..3618199d4 100644 --- a/examples/17-drawstress/fs_drawstress_tex.bin.h +++ b/examples/17-drawstress/fs_drawstress_tex.bin.h @@ -1,38 +1,44 @@ -static const uint8_t fs_drawstress_tex_glsl[204] = +static const uint8_t fs_drawstress_tex_glsl[241] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x73, // FSH............s 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, // .......varying v - 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, // ec4 v_color0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // rying vec2 v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // coord0;.uniform + 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // ........uniform 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // sampler2D s_texC - 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, // olor;.void main - 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // ().{. gl_FragCo - 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, // lor = (texture2D - 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, // (s_texColor, v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, // texcoord0) * v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // olor0);.}... + 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, // olor;..layout(lo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, // cation = 0) out + 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // vec4 bgfx_FragCo + 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, // lor;.in vec2 v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, // excoord0;.in vec + 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, // 4 v_color0;..voi + 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, // d main().{. b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, // gfx_FragColor = + 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, // texture(s_texCol + 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, // or, v_texcoord0) + 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, // * v_color0;.}.. + 0x00, // . }; -static const uint8_t fs_drawstress_tex_essl[261] = +static const uint8_t fs_drawstress_tex_essl[311] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x73, // FSH............s 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // .......varying h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ighp vec4 v_colo - 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, // r0;.varying high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // p vec2 v_texcoor - 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, // d0;.uniform samp - 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // ler2D s_texColor - 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, // ;.void main ().{ - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, // . lowp vec4 tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_1;. tmpvar_ - 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x20, 0x28, 0x73, // 1 = texture2D (s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // _texColor, v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, // coord0);. gl_Fr - 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // agColor = (tmpva - 0x72, 0x5f, 0x31, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x3b, // r_1 * v_color0); - 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... + 0x00, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, // .......precision + 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, // mediump float;. + 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // precision highp + 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, // int;..uniform hi + 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, // ghp sampler2D s_ + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texColor;..layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, // t(location = 0) + 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // out highp vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, // gfx_FragColor;.i + 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, // n highp vec2 v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, // excoord0;.in hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // hp vec4 v_color0 + 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, // ;..void main().{ + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // . bgfx_FragCo + 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, // lor = texture(s_ + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // texColor, v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // oord0) * v_color + 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 0;.}... }; static const uint8_t fs_drawstress_tex_spv[863] = { diff --git a/examples/17-drawstress/vs_drawstress.bin.h b/examples/17-drawstress/vs_drawstress.bin.h index ca8a59eea..6be98b92a 100644 --- a/examples/17-drawstress/vs_drawstress.bin.h +++ b/examples/17-drawstress/vs_drawstress.bin.h @@ -1,48 +1,44 @@ -static const uint8_t vs_drawstress_glsl[303] = +static const uint8_t vs_drawstress_glsl[278] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x8b, 0xef, 0x49, 0x01, 0x00, 0x0f, 0x75, // VSH........I...u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec3 a_position;. - 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, // varying vec4 v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, // olor0;.uniform m - 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, // at4 u_modelViewP - 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, // roj;.void main ( - 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ).{. vec4 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // r_1;. tmpvar_1. - 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // w = 1.0;. tmpva - 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, // r_1.xyz = a_posi - 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, // tion;. gl_Posit - 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, // ion = (u_modelVi - 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ewProj * tmpvar_ - 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, // 1);. v_color0 = - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // a_color0;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // .............uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, // n, 1.0);. v_c + 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // olor0 = a_color0 + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... }; -static const uint8_t vs_drawstress_essl[333] = +static const uint8_t vs_drawstress_essl[278] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x8b, 0xef, 0x49, 0x01, 0x00, 0x0f, 0x75, // VSH........I...u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........ ...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // bute highp vec3 - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // a_position;.vary - 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, // ing highp vec4 v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // _color0;.uniform - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, // highp mat4 u_mo - 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, // delViewProj;.voi - 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, // d main ().{. hi - 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ghp vec4 tmpvar_ - 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, // 1;. tmpvar_1.w - 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // = 1.0;. tmpvar_ - 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, // 1.xyz = a_positi - 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // on;. gl_Positio - 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, // n = (u_modelView - 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, // Proj * tmpvar_1) - 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, // ;. v_color0 = a - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _color0;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // .............uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, // n, 1.0);. v_c + 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // olor0 = a_color0 + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... }; static const uint8_t vs_drawstress_spv[1060] = { diff --git a/examples/17-drawstress/vs_drawstress_tex.bin.h b/examples/17-drawstress/vs_drawstress_tex.bin.h index a0180083e..1017189af 100644 --- a/examples/17-drawstress/vs_drawstress_tex.bin.h +++ b/examples/17-drawstress/vs_drawstress_tex.bin.h @@ -1,60 +1,56 @@ -static const uint8_t vs_drawstress_tex_glsl[386] = +static const uint8_t vs_drawstress_tex_glsl[373] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........U...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec3 a_position;. - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, // attribute vec2 a - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // _texcoord0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ing vec4 v_color - 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // 0;.varying vec2 - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // v_texcoord0;.uni + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........H....uni 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // lViewProj;.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // main ().{. vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, // var_1.w = 1.0;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, // tmpvar_1.xyz = - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, // a_position;. gl - 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, // _Position = (u_m - 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, // odelViewProj * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, // mpvar_1);. v_co - 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // lor0 = a_color0; - 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, // . v_texcoord0 = - 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, // a_texcoord0;.}. - 0x0a, 0x00, // .. + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // ut vec2 v_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // rd0;.layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, // tion = 2) in vec + 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x0a, // 2 a_texcoord0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, // n, 1.0);. v_c + 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // olor0 = a_color0 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // ;. v_texcoord + 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, // 0 = a_texcoord0; + 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... }; -static const uint8_t vs_drawstress_tex_essl[428] = +static const uint8_t vs_drawstress_tex_essl[373] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // bute highp vec3 - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, // a_position;.attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, // ibute highp vec2 - 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, // a_texcoord0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // rying highp vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color0;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, // ng highp vec2 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // texcoord0;.unifo - 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // rm highp mat4 u_ - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, // modelViewProj;.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // highp vec4 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // r_1;. tmpvar_1. - 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // w = 1.0;. tmpva - 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, // r_1.xyz = a_posi - 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, // tion;. gl_Posit - 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, // ion = (u_modelVi - 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ewProj * tmpvar_ - 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, // 1);. v_color0 = - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, // a_color0;. v_t - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, // excoord0 = a_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // coord0;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........H....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // ut vec2 v_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // rd0;.layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, // tion = 2) in vec + 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x0a, // 2 a_texcoord0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, // n, 1.0);. v_c + 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // olor0 = a_color0 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // ;. v_texcoord + 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, // 0 = a_texcoord0; + 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... }; static const uint8_t vs_drawstress_tex_spv[1270] = { diff --git a/examples/37-gpudrivenrendering/gpudrivenrendering.cpp b/examples/37-gpudrivenrendering/gpudrivenrendering.cpp index 2f8c117c8..c1cd28d8c 100644 --- a/examples/37-gpudrivenrendering/gpudrivenrendering.cpp +++ b/examples/37-gpudrivenrendering/gpudrivenrendering.cpp @@ -1044,13 +1044,19 @@ public: // Get renderer capabilities info. const bgfx::Caps* caps = bgfx::getCaps(); - // Check if instancing is supported. - if (0 == (BGFX_CAPS_INSTANCING & caps->supported) ) + // Check if instancing, compute and draw indirect are supported. + const uint64_t requiredCaps = 0 + | BGFX_CAPS_INSTANCING + | BGFX_CAPS_COMPUTE + | BGFX_CAPS_DRAW_INDIRECT + ; + + if (requiredCaps != (requiredCaps & caps->supported) ) { - // When instancing is not supported by GPU, implement alternative - // code path that doesn't use instancing. + // When instancing, compute or draw indirect is not supported by GPU, + // implement alternative code path that doesn't use them. bool blink = uint32_t(time*3.0f)&1; - bgfx::dbgTextPrintf(0, 0, blink ? 0x1f : 0x01, " Instancing is not supported by GPU. "); + bgfx::dbgTextPrintf(0, 0, blink ? 0x1f : 0x01, " Instancing, compute and draw indirect are not supported by GPU. "); } else { diff --git a/examples/39-assao/assao.cpp b/examples/39-assao/assao.cpp index 9e6b56aa2..fba5fdbb9 100644 --- a/examples/39-assao/assao.cpp +++ b/examples/39-assao/assao.cpp @@ -360,6 +360,14 @@ namespace m_modelTexture = bgfx::createTexture2D(1,1, false, 1, bgfx::TextureFormat::RGBA8, 0, mem); m_recreateFrameBuffers = false; + + // OpenGL ES 3.1 doesn't require r8, rg8, and r16f image formats to + // be supported, so fall back to formats that are always available. + const bool essl = bgfx::RendererType::OpenGLES == bgfx::getRendererType(); + m_aoFormat = essl ? bgfx::TextureFormat::RGBA8 : bgfx::TextureFormat::R8; + m_ssaoFormat = essl ? bgfx::TextureFormat::RGBA8 : bgfx::TextureFormat::RG8; + m_depthFormat = essl ? bgfx::TextureFormat::R32F : bgfx::TextureFormat::R16F; + createFramebuffers(); m_loadCounter = bgfx::createDynamicIndexBuffer(1, BGFX_BUFFER_COMPUTE_READ_WRITE | BGFX_BUFFER_INDEX32); @@ -513,7 +521,7 @@ namespace { for (int32_t j = 0; j < 2; ++j) { - bgfx::setImage((uint8_t)(j + 1), m_halfDepths[j == 0 ? 0 : 3], 0, bgfx::Access::Write, bgfx::TextureFormat::R16F); + bgfx::setImage((uint8_t)(j + 1), m_halfDepths[j == 0 ? 0 : 3], 0, bgfx::Access::Write, m_depthFormat); } bgfx::dispatch(view, m_settings.m_generateNormals ? m_prepareDepthsAndNormalsHalfProgram : m_prepareDepthsHalfProgram, (m_halfSize[0] + 7) / 8, (m_halfSize[1] + 7) / 8); @@ -522,7 +530,7 @@ namespace { for(int32_t j = 0; j < 4; ++j) { - bgfx::setImage((uint8_t)(j+1), m_halfDepths[j], 0, bgfx::Access::Write, bgfx::TextureFormat::R16F); + bgfx::setImage((uint8_t)(j+1), m_halfDepths[j], 0, bgfx::Access::Write, m_depthFormat); } bgfx::dispatch(view, m_settings.m_generateNormals ? m_prepareDepthsAndNormalsProgram : m_prepareDepthsProgram, (m_halfSize[0] + 7) / 8, (m_halfSize[1] + 7) / 8); @@ -543,8 +551,8 @@ namespace for (uint8_t j = 0; j < 4; ++j) { - bgfx::setImage(j, m_halfDepths[j], i-1, bgfx::Access::Read, bgfx::TextureFormat::R16F); - bgfx::setImage(j + 4, m_halfDepths[j], i, bgfx::Access::Write, bgfx::TextureFormat::R16F); + bgfx::setImage(j, m_halfDepths[j], i-1, bgfx::Access::Read, m_depthFormat); + bgfx::setImage(j + 4, m_halfDepths[j], i, bgfx::Access::Write, m_depthFormat); } m_uniforms.submit(); @@ -610,7 +618,7 @@ namespace // Generate { - bgfx::setImage(6, blurPasses == 0 ? m_finalResults : pPingRT, 0, bgfx::Access::Write, bgfx::TextureFormat::RG8); + bgfx::setImage(6, blurPasses == 0 ? m_finalResults : pPingRT, 0, bgfx::Access::Write, m_ssaoFormat); bgfx::setUniform(u_rect, halfResRect); @@ -625,7 +633,7 @@ namespace { bgfx::setBuffer(3, m_loadCounter, bgfx::Access::Read); bgfx::setTexture(4, s_importanceMap, m_importanceMap, SAMPLER_LINEAR_CLAMP); - bgfx::setImage(5, m_finalResults, 0, bgfx::Access::Read, bgfx::TextureFormat::RG8); + bgfx::setImage(5, m_finalResults, 0, bgfx::Access::Read, m_ssaoFormat); } bgfx::ProgramHandle programs[5] = { m_generateQ0Program, m_generateQ1Program , m_generateQ2Program , m_generateQ3Program , m_generateQ3BaseProgram }; @@ -651,7 +659,7 @@ namespace bgfx::setUniform(u_rect, halfResRect); - bgfx::setImage(0, i == (blurPasses - 1) ? m_finalResults : pPongRT, 0, bgfx::Access::Write, bgfx::TextureFormat::RG8); + bgfx::setImage(0, i == (blurPasses - 1) ? m_finalResults : pPongRT, 0, bgfx::Access::Write, m_ssaoFormat); bgfx::setTexture(1, s_blurInput, pPingRT, m_settings.m_qualityLevel > 0 ? SAMPLER_POINT_MIRROR : SAMPLER_LINEAR_CLAMP); if (m_settings.m_qualityLevel > 0) @@ -681,12 +689,12 @@ namespace if (ssaoPass == 0 && m_settings.m_qualityLevel == 3) { // Generate importance map m_uniforms.submit(); - bgfx::setImage(0, m_importanceMap, 0, bgfx::Access::Write, bgfx::TextureFormat::R8); + bgfx::setImage(0, m_importanceMap, 0, bgfx::Access::Write, m_aoFormat); bgfx::setTexture(1, s_finalSSAO, m_finalResults, SAMPLER_POINT_CLAMP); bgfx::dispatch(view, m_generateImportanceMapProgram, (m_quarterSize[0] + 7) / 8, (m_quarterSize[1] + 7) / 8); m_uniforms.submit(); - bgfx::setImage(0, m_importanceMapPong, 0, bgfx::Access::Write, bgfx::TextureFormat::R8); + bgfx::setImage(0, m_importanceMapPong, 0, bgfx::Access::Write, m_aoFormat); bgfx::setTexture(1, s_importanceMap, m_importanceMap); bgfx::dispatch(view, m_postprocessImportanceMapAProgram, (m_quarterSize[0] + 7) / 8, (m_quarterSize[1] + 7) / 8); @@ -694,7 +702,7 @@ namespace bgfx::dispatch(view, m_loadCounterClearProgram, 1,1); m_uniforms.submit(); - bgfx::setImage(0, m_importanceMap, 0, bgfx::Access::Write, bgfx::TextureFormat::R8); + bgfx::setImage(0, m_importanceMap, 0, bgfx::Access::Write, m_aoFormat); bgfx::setTexture(1, s_importanceMap, m_importanceMapPong); bgfx::setBuffer(2, m_loadCounter, bgfx::Access::ReadWrite); bgfx::dispatch(view, m_postprocessImportanceMapBProgram, (m_quarterSize[0]+7) / 8, (m_quarterSize[1]+7) / 8); @@ -705,7 +713,7 @@ namespace // Apply { // select 4 deinterleaved AO textures (texture array) - bgfx::setImage(0, m_aoMap, 0, bgfx::Access::Write, bgfx::TextureFormat::R8); + bgfx::setImage(0, m_aoMap, 0, bgfx::Access::Write, m_aoFormat); bgfx::setTexture(1, s_finalSSAO, m_finalResults); m_uniforms.submit(); @@ -928,20 +936,20 @@ namespace for (int32_t i = 0; i < 4; i++) { - m_halfDepths[i] = bgfx::createTexture2D(uint16_t(m_halfSize[0]), uint16_t(m_halfSize[1]), true, 1, bgfx::TextureFormat::R16F, BGFX_TEXTURE_COMPUTE_WRITE | SAMPLER_POINT_CLAMP); + m_halfDepths[i] = bgfx::createTexture2D(uint16_t(m_halfSize[0]), uint16_t(m_halfSize[1]), true, 1, m_depthFormat, BGFX_TEXTURE_COMPUTE_WRITE | SAMPLER_POINT_CLAMP); } - m_pingPongHalfResultA = bgfx::createTexture2D(uint16_t(m_halfSize[0]), uint16_t(m_halfSize[1]), false, 2, bgfx::TextureFormat::RG8, BGFX_TEXTURE_COMPUTE_WRITE); - m_pingPongHalfResultB = bgfx::createTexture2D(uint16_t(m_halfSize[0]), uint16_t(m_halfSize[1]), false, 2, bgfx::TextureFormat::RG8, BGFX_TEXTURE_COMPUTE_WRITE); + m_pingPongHalfResultA = bgfx::createTexture2D(uint16_t(m_halfSize[0]), uint16_t(m_halfSize[1]), false, 2, m_ssaoFormat, BGFX_TEXTURE_COMPUTE_WRITE); + m_pingPongHalfResultB = bgfx::createTexture2D(uint16_t(m_halfSize[0]), uint16_t(m_halfSize[1]), false, 2, m_ssaoFormat, BGFX_TEXTURE_COMPUTE_WRITE); - m_finalResults = bgfx::createTexture2D(uint16_t(m_halfSize[0]), uint16_t(m_halfSize[1]), false, 4, bgfx::TextureFormat::RG8, BGFX_TEXTURE_COMPUTE_WRITE | SAMPLER_LINEAR_CLAMP); + m_finalResults = bgfx::createTexture2D(uint16_t(m_halfSize[0]), uint16_t(m_halfSize[1]), false, 4, m_ssaoFormat, BGFX_TEXTURE_COMPUTE_WRITE | SAMPLER_LINEAR_CLAMP); m_normals = bgfx::createTexture2D(uint16_t(m_size[0]), uint16_t(m_size[1]), false, 1, bgfx::TextureFormat::RGBA8, BGFX_TEXTURE_COMPUTE_WRITE); - m_importanceMap = bgfx::createTexture2D(uint16_t(m_quarterSize[0]), uint16_t(m_quarterSize[1]), false, 1, bgfx::TextureFormat::R8, BGFX_TEXTURE_COMPUTE_WRITE | SAMPLER_LINEAR_CLAMP); - m_importanceMapPong = bgfx::createTexture2D(uint16_t(m_quarterSize[0]), uint16_t(m_quarterSize[1]), false, 1, bgfx::TextureFormat::R8, BGFX_TEXTURE_COMPUTE_WRITE | SAMPLER_LINEAR_CLAMP); + m_importanceMap = bgfx::createTexture2D(uint16_t(m_quarterSize[0]), uint16_t(m_quarterSize[1]), false, 1, m_aoFormat, BGFX_TEXTURE_COMPUTE_WRITE | SAMPLER_LINEAR_CLAMP); + m_importanceMapPong = bgfx::createTexture2D(uint16_t(m_quarterSize[0]), uint16_t(m_quarterSize[1]), false, 1, m_aoFormat, BGFX_TEXTURE_COMPUTE_WRITE | SAMPLER_LINEAR_CLAMP); - m_aoMap = bgfx::createTexture2D(uint16_t(m_size[0]), uint16_t(m_size[1]), false, 1, bgfx::TextureFormat::R8, BGFX_TEXTURE_COMPUTE_WRITE | SAMPLER_POINT_CLAMP); + m_aoMap = bgfx::createTexture2D(uint16_t(m_size[0]), uint16_t(m_size[1]), false, 1, m_aoFormat, BGFX_TEXTURE_COMPUTE_WRITE | SAMPLER_POINT_CLAMP); } void destroyFramebuffers() @@ -1149,6 +1157,11 @@ namespace bgfx::TextureHandle m_aoMap; bgfx::TextureHandle m_normals; + // Must match ASSAO_*_FORMAT in uniforms.sh. + bgfx::TextureFormat::Enum m_aoFormat; + bgfx::TextureFormat::Enum m_ssaoFormat; + bgfx::TextureFormat::Enum m_depthFormat; + // Only needed for quality level 3 (adaptive quality) bgfx::TextureHandle m_importanceMap; bgfx::TextureHandle m_importanceMapPong; diff --git a/examples/39-assao/cs_assao_apply.sc b/examples/39-assao/cs_assao_apply.sc index c75e2788d..fd6f3d522 100644 --- a/examples/39-assao/cs_assao_apply.sc +++ b/examples/39-assao/cs_assao_apply.sc @@ -6,7 +6,7 @@ #include "bgfx_compute.sh" #include "uniforms.sh" -IMAGE2D_WO(s_target, r8, 0); +IMAGE2D_WO(s_target, ASSAO_AO_FORMAT, 0); SAMPLER2DARRAY(s_finalSSAO, 1); // unpacking for edges; 2 bits per edge mean 4 gradient values (0, 0.33, 0.66, 1) for smoother transitions! diff --git a/examples/39-assao/cs_assao_generate_importance_map.sc b/examples/39-assao/cs_assao_generate_importance_map.sc index 9f30767e7..a200bd911 100644 --- a/examples/39-assao/cs_assao_generate_importance_map.sc +++ b/examples/39-assao/cs_assao_generate_importance_map.sc @@ -6,7 +6,7 @@ #include "bgfx_compute.sh" #include "uniforms.sh" -IMAGE2D_WO(s_target, r8, 0); +IMAGE2D_WO(s_target, ASSAO_AO_FORMAT, 0); SAMPLER2DARRAY(s_finalSSAO, 1); NUM_THREADS(8, 8, 1) diff --git a/examples/39-assao/cs_assao_generate_q.sh b/examples/39-assao/cs_assao_generate_q.sh index 7053879bd..8c41a44a4 100644 --- a/examples/39-assao/cs_assao_generate_q.sh +++ b/examples/39-assao/cs_assao_generate_q.sh @@ -61,8 +61,8 @@ SAMPLER2D(s_viewspaceDepthSourceMirror, 1); IMAGE2D_RO(s_normalmapSource, rgba8, 2); BUFFER_RO(s_loadCounter, uint, 3); SAMPLER2D(s_importanceMap, 4); -IMAGE2D_ARRAY_RO(s_baseSSAO, rg8, 5); -IMAGE2D_ARRAY_WO(s_target, rg8, 6); +IMAGE2D_ARRAY_RO(s_baseSSAO, ASSAO_SSAO_FORMAT, 5); +IMAGE2D_ARRAY_WO(s_target, ASSAO_SSAO_FORMAT, 6); // packing/unpacking for edges; 2 bits per edge mean 4 gradient values (0, 0.33, 0.66, 1) for smoother transitions! float PackEdges( vec4 edgesLRTB ) diff --git a/examples/39-assao/cs_assao_non_smart_apply.sc b/examples/39-assao/cs_assao_non_smart_apply.sc index 29aaebfb2..a74110dea 100644 --- a/examples/39-assao/cs_assao_non_smart_apply.sc +++ b/examples/39-assao/cs_assao_non_smart_apply.sc @@ -6,7 +6,7 @@ #include "bgfx_compute.sh" #include "uniforms.sh" -IMAGE2D_WO(s_target, r8, 0); +IMAGE2D_WO(s_target, ASSAO_AO_FORMAT, 0); SAMPLER2DARRAY(s_finalSSAO, 1); // edge-ignorant blur & apply (for the lowest quality level 0) diff --git a/examples/39-assao/cs_assao_non_smart_blur.sc b/examples/39-assao/cs_assao_non_smart_blur.sc index 29476a90c..76ad5af26 100644 --- a/examples/39-assao/cs_assao_non_smart_blur.sc +++ b/examples/39-assao/cs_assao_non_smart_blur.sc @@ -6,7 +6,7 @@ #include "bgfx_compute.sh" #include "uniforms.sh" -IMAGE2D_ARRAY_WO(s_target, rg8, 0); +IMAGE2D_ARRAY_WO(s_target, ASSAO_SSAO_FORMAT, 0); SAMPLER2DARRAY(s_blurInput, 1); // edge-ignorant blur in x and y directions, 9 pixels touched (for the lowest quality level 0) diff --git a/examples/39-assao/cs_assao_non_smart_half_apply.sc b/examples/39-assao/cs_assao_non_smart_half_apply.sc index 06d9e1fc3..79ee11103 100644 --- a/examples/39-assao/cs_assao_non_smart_half_apply.sc +++ b/examples/39-assao/cs_assao_non_smart_half_apply.sc @@ -6,7 +6,7 @@ #include "bgfx_compute.sh" #include "uniforms.sh" -IMAGE2D_WO(s_target, r8, 0); +IMAGE2D_WO(s_target, ASSAO_AO_FORMAT, 0); SAMPLER2DARRAY(s_finalSSAO, 1); // edge-ignorant blur & apply, skipping half pixels in checkerboard pattern (for the Lowest quality level 0 and Settings::SkipHalfPixelsOnLowQualityLevel == true ) diff --git a/examples/39-assao/cs_assao_postprocess_importance_map_a.sc b/examples/39-assao/cs_assao_postprocess_importance_map_a.sc index c7041bfce..0dd95d83f 100644 --- a/examples/39-assao/cs_assao_postprocess_importance_map_a.sc +++ b/examples/39-assao/cs_assao_postprocess_importance_map_a.sc @@ -6,7 +6,7 @@ #include "bgfx_compute.sh" #include "uniforms.sh" -IMAGE2D_WO(s_target, r8, 0); +IMAGE2D_WO(s_target, ASSAO_AO_FORMAT, 0); SAMPLER2D(s_importanceMap, 1); // Shaders below only needed for adaptive quality level diff --git a/examples/39-assao/cs_assao_postprocess_importance_map_b.sc b/examples/39-assao/cs_assao_postprocess_importance_map_b.sc index 992d604a2..c74004db2 100644 --- a/examples/39-assao/cs_assao_postprocess_importance_map_b.sc +++ b/examples/39-assao/cs_assao_postprocess_importance_map_b.sc @@ -6,7 +6,7 @@ #include "bgfx_compute.sh" #include "uniforms.sh" -IMAGE2D_WO(s_target, r8, 0); +IMAGE2D_WO(s_target, ASSAO_AO_FORMAT, 0); SAMPLER2D(s_importanceMap, 1); BUFFER_RW(s_loadCounter, uint, 2); diff --git a/examples/39-assao/cs_assao_prepare_depth_mip.sc b/examples/39-assao/cs_assao_prepare_depth_mip.sc index 70cae37a8..42bd465fe 100644 --- a/examples/39-assao/cs_assao_prepare_depth_mip.sc +++ b/examples/39-assao/cs_assao_prepare_depth_mip.sc @@ -6,15 +6,15 @@ #include "bgfx_compute.sh" #include "uniforms.sh" -IMAGE2D_RO(s_viewspaceDepthSource0, r16f, 0); -IMAGE2D_RO(s_viewspaceDepthSource1, r16f, 1); -IMAGE2D_RO(s_viewspaceDepthSource2, r16f, 2); -IMAGE2D_RO(s_viewspaceDepthSource3, r16f, 3); +IMAGE2D_RO(s_viewspaceDepthSource0, ASSAO_DEPTH_FORMAT, 0); +IMAGE2D_RO(s_viewspaceDepthSource1, ASSAO_DEPTH_FORMAT, 1); +IMAGE2D_RO(s_viewspaceDepthSource2, ASSAO_DEPTH_FORMAT, 2); +IMAGE2D_RO(s_viewspaceDepthSource3, ASSAO_DEPTH_FORMAT, 3); -IMAGE2D_WO(s_target0, r16f, 4); -IMAGE2D_WO(s_target1, r16f, 5); -IMAGE2D_WO(s_target2, r16f, 6); -IMAGE2D_WO(s_target3, r16f, 7); +IMAGE2D_WO(s_target0, ASSAO_DEPTH_FORMAT, 4); +IMAGE2D_WO(s_target1, ASSAO_DEPTH_FORMAT, 5); +IMAGE2D_WO(s_target2, ASSAO_DEPTH_FORMAT, 6); +IMAGE2D_WO(s_target3, ASSAO_DEPTH_FORMAT, 7); // calculate effect radius and fit our screen sampling pattern inside it void CalculateRadiusParameters( const float pixCenterLength, const vec2 pixelDirRBViewspaceSizeAtCenterZ, out float pixLookupRadiusMod, out float effectRadius, out float falloffCalcMulSq ) diff --git a/examples/39-assao/cs_assao_prepare_depths.sc b/examples/39-assao/cs_assao_prepare_depths.sc index 26e1b371e..099d957e9 100644 --- a/examples/39-assao/cs_assao_prepare_depths.sc +++ b/examples/39-assao/cs_assao_prepare_depths.sc @@ -8,10 +8,10 @@ SAMPLER2D(s_depthSource, 0); -IMAGE2D_WO(s_target0, r16f, 1); -IMAGE2D_WO(s_target1, r16f, 2); -IMAGE2D_WO(s_target2, r16f, 3); -IMAGE2D_WO(s_target3, r16f, 4); +IMAGE2D_WO(s_target0, ASSAO_DEPTH_FORMAT, 1); +IMAGE2D_WO(s_target1, ASSAO_DEPTH_FORMAT, 2); +IMAGE2D_WO(s_target2, ASSAO_DEPTH_FORMAT, 3); +IMAGE2D_WO(s_target3, ASSAO_DEPTH_FORMAT, 4); float ScreenSpaceToViewSpaceDepth( float screenDepth ) { diff --git a/examples/39-assao/cs_assao_prepare_depths_and_normals.sc b/examples/39-assao/cs_assao_prepare_depths_and_normals.sc index b952828b3..f1800eabf 100644 --- a/examples/39-assao/cs_assao_prepare_depths_and_normals.sc +++ b/examples/39-assao/cs_assao_prepare_depths_and_normals.sc @@ -8,10 +8,10 @@ SAMPLER2D(s_depthSource, 0); -IMAGE2D_WO(s_target0, r16f, 1); -IMAGE2D_WO(s_target1, r16f, 2); -IMAGE2D_WO(s_target2, r16f, 3); -IMAGE2D_WO(s_target3, r16f, 4); +IMAGE2D_WO(s_target0, ASSAO_DEPTH_FORMAT, 1); +IMAGE2D_WO(s_target1, ASSAO_DEPTH_FORMAT, 2); +IMAGE2D_WO(s_target2, ASSAO_DEPTH_FORMAT, 3); +IMAGE2D_WO(s_target3, ASSAO_DEPTH_FORMAT, 4); IMAGE2D_WO(s_normalsOutputUAV, rgba8, 5); float ScreenSpaceToViewSpaceDepth( float screenDepth ) diff --git a/examples/39-assao/cs_assao_prepare_depths_and_normals_half.sc b/examples/39-assao/cs_assao_prepare_depths_and_normals_half.sc index 390c8b4ee..f08ef3559 100644 --- a/examples/39-assao/cs_assao_prepare_depths_and_normals_half.sc +++ b/examples/39-assao/cs_assao_prepare_depths_and_normals_half.sc @@ -8,8 +8,8 @@ SAMPLER2D(s_depthSource, 0); -IMAGE2D_WO(s_target0, r16f, 1); -IMAGE2D_WO(s_target1, r16f, 2); +IMAGE2D_WO(s_target0, ASSAO_DEPTH_FORMAT, 1); +IMAGE2D_WO(s_target1, ASSAO_DEPTH_FORMAT, 2); IMAGE2D_WO(s_normalsOutputUAV, rgba8, 5); float ScreenSpaceToViewSpaceDepth( float screenDepth ) diff --git a/examples/39-assao/cs_assao_prepare_depths_half.sc b/examples/39-assao/cs_assao_prepare_depths_half.sc index 8a4c1dda4..266c04d1a 100644 --- a/examples/39-assao/cs_assao_prepare_depths_half.sc +++ b/examples/39-assao/cs_assao_prepare_depths_half.sc @@ -7,8 +7,8 @@ #include "uniforms.sh" SAMPLER2D(s_depthSource, 0); -IMAGE2D_WO(s_target0, r16f, 1); -IMAGE2D_WO(s_target1, r16f, 2); +IMAGE2D_WO(s_target0, ASSAO_DEPTH_FORMAT, 1); +IMAGE2D_WO(s_target1, ASSAO_DEPTH_FORMAT, 2); float ScreenSpaceToViewSpaceDepth( float screenDepth ) { diff --git a/examples/39-assao/cs_assao_smart_blur.sc b/examples/39-assao/cs_assao_smart_blur.sc index 7cf4722b3..20ab36b23 100644 --- a/examples/39-assao/cs_assao_smart_blur.sc +++ b/examples/39-assao/cs_assao_smart_blur.sc @@ -6,7 +6,7 @@ #include "bgfx_compute.sh" #include "uniforms.sh" -IMAGE2D_ARRAY_WO(s_target, rg8, 0); +IMAGE2D_ARRAY_WO(s_target, ASSAO_SSAO_FORMAT, 0); SAMPLER2DARRAY(s_blurInput, 1); // unpacking for edges; 2 bits per edge mean 4 gradient values (0, 0.33, 0.66, 1) for smoother transitions! diff --git a/examples/39-assao/cs_assao_smart_blur_wide.sc b/examples/39-assao/cs_assao_smart_blur_wide.sc index 70c81cd22..59b903780 100644 --- a/examples/39-assao/cs_assao_smart_blur_wide.sc +++ b/examples/39-assao/cs_assao_smart_blur_wide.sc @@ -6,7 +6,7 @@ #include "bgfx_compute.sh" #include "uniforms.sh" -IMAGE2D_ARRAY_WO(s_target, rg8, 0); +IMAGE2D_ARRAY_WO(s_target, ASSAO_SSAO_FORMAT, 0); SAMPLER2DARRAY(s_blurInput, 1); // unpacking for edges; 2 bits per edge mean 4 gradient values (0, 0.33, 0.66, 1) for smoother transitions! diff --git a/examples/39-assao/uniforms.sh b/examples/39-assao/uniforms.sh index 585262b9e..687b05012 100644 --- a/examples/39-assao/uniforms.sh +++ b/examples/39-assao/uniforms.sh @@ -35,6 +35,18 @@ uniform vec4 u_rect; #define u_normalsWorldToViewspaceMatrix2 u_params[17] #define u_normalsWorldToViewspaceMatrix3 u_params[18] +// OpenGL ES 3.1 doesn't require r8, rg8, and r16f image formats to be +// supported, so fall back to formats that are always available there. +#if BGFX_SHADER_LANGUAGE_ESSL +# define ASSAO_AO_FORMAT rgba8 +# define ASSAO_SSAO_FORMAT rgba8 +# define ASSAO_DEPTH_FORMAT r32f +#else +# define ASSAO_AO_FORMAT r8 +# define ASSAO_SSAO_FORMAT rg8 +# define ASSAO_DEPTH_FORMAT r16f +#endif // BGFX_SHADER_LANGUAGE_ESSL + #define SSAO_MAX_TAPS 32 #define SSAO_ADAPTIVE_TAP_BASE_COUNT 5 #define SSAO_ADAPTIVE_TAP_FLEXIBLE_COUNT (SSAO_MAX_TAPS-SSAO_ADAPTIVE_TAP_BASE_COUNT) diff --git a/examples/46-fsr/cs_fsr.h b/examples/46-fsr/cs_fsr.h index 1d17c705c..d74b5b418 100644 --- a/examples/46-fsr/cs_fsr.h +++ b/examples/46-fsr/cs_fsr.h @@ -23,10 +23,27 @@ uniform vec4 u_params[3]; #define A_HLSL 1 #endif // BGFX_SHADER_LANGUAGE_GLSL -#if SAMPLE_SLOW_FALLBACK +#ifndef SAMPLE_SLOW_FALLBACK +# define SAMPLE_SLOW_FALLBACK 0 +#endif // SAMPLE_SLOW_FALLBACK + +// glslang's GLSL front-end doesn't implement fp16 overloads of the builtin +// functions FSR needs, thus 16-bit math is unavailable there. The 16-bit +// output format is kept, only the math is done at full precision. +#if BGFX_SHADER_LANGUAGE_GLSL +# define SAMPLE_HALF_MATH 0 +#else +# define SAMPLE_HALF_MATH (1-SAMPLE_SLOW_FALLBACK) +#endif // BGFX_SHADER_LANGUAGE_GLSL + +#if !SAMPLE_HALF_MATH # include "ffx_a.h" SAMPLER2D(InputTexture, 0); - IMAGE2D_WO(OutputTexture, rgba32f, 1); +# if SAMPLE_SLOW_FALLBACK + IMAGE2D_WO(OutputTexture, rgba32f, 1); +# else + IMAGE2D_WO(OutputTexture, rgba16f, 1); +# endif # if SAMPLE_EASU #define FSR_EASU_F 1 AF4 FsrEasuRF(AF2 p) { AF4 res = textureGather(InputTexture, p, 0); return res; } @@ -66,7 +83,7 @@ void CurrFilter(AU2 pos, AU4 Const0, AU4 Const1, AU4 Const2, AU4 Const3, AU4 Sam #endif #if SAMPLE_EASU -# if SAMPLE_SLOW_FALLBACK +# if !SAMPLE_HALF_MATH AF3 c; FsrEasuF(c, pos, Const0, Const1, Const2, Const3); if( Sample.x == 1 ) @@ -82,7 +99,7 @@ void CurrFilter(AU2 pos, AU4 Const0, AU4 Const1, AU4 Const2, AU4 Const3, AU4 Sam #endif #if SAMPLE_RCAS -# if SAMPLE_SLOW_FALLBACK +# if !SAMPLE_HALF_MATH AF3 c; FsrRcasF(c.r, c.g, c.b, pos, Const0); if( Sample.x == 1 ) diff --git a/examples/common/bgfx_utils.cpp b/examples/common/bgfx_utils.cpp index 764633d54..08db1a6e7 100644 --- a/examples/common/bgfx_utils.cpp +++ b/examples/common/bgfx_utils.cpp @@ -126,7 +126,10 @@ static bgfx::ShaderHandle loadShader(bx::FileReaderI* _reader, const bx::StringV filePath.join(fileName); bgfx::ShaderHandle handle = bgfx::createShader(loadMem(_reader, filePath.getCPtr() ) ); - bgfx::setName(handle, _name.getPtr(), _name.getLength() ); + if (bgfx::isValid(handle) ) + { + bgfx::setName(handle, _name.getPtr(), _name.getLength() ); + } return handle; } diff --git a/examples/common/debugdraw/fs_debugdraw_fill.bin.h b/examples/common/debugdraw/fs_debugdraw_fill.bin.h index 2229f9191..eb542eea5 100644 --- a/examples/common/debugdraw/fs_debugdraw_fill.bin.h +++ b/examples/common/debugdraw/fs_debugdraw_fill.bin.h @@ -1,22 +1,33 @@ -static const uint8_t fs_debugdraw_fill_glsl[112] = +static const uint8_t fs_debugdraw_fill_glsl[164] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, // _params......... - 0x00, 0x4a, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, // .J...uniform vec - 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x76, // 4 u_params[4];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x75, // gl_FragColor = u - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _params[3];.}... + 0x00, 0x7e, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, // .~....uniform ve + 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, // c4 u_params[4];. + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // .layout(location + 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // = 0) out vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, // gfx_FragColor;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // bgfx_FragColor + 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, // = u_params[3];. + 0x7d, 0x0a, 0x0a, 0x00, // }... }; -static const uint8_t fs_debugdraw_fill_essl[112] = +static const uint8_t fs_debugdraw_fill_essl[222] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, // _params......... - 0x00, 0x4a, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, // .J...uniform vec - 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x76, // 4 u_params[4];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x75, // gl_FragColor = u - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _params[3];.}... + 0x00, 0xb8, 0x00, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, // .....precision m + 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, // ediump float;.pr + 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, // ecision highp in + 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, // t;..uniform high + 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, // p vec4 u_params[ + 0x34, 0x5d, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // 4];..layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, // tion = 0) out hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, // ghp vec4 bgfx_Fr + 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // agColor;..void m + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // ain().{. bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x70, // _FragColor = u_p + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // arams[3];.}... }; static const uint8_t fs_debugdraw_fill_spv[673] = { diff --git a/examples/common/debugdraw/fs_debugdraw_fill_lit.bin.h b/examples/common/debugdraw/fs_debugdraw_fill_lit.bin.h index e9aeb26a9..e236565ae 100644 --- a/examples/common/debugdraw/fs_debugdraw_fill_lit.bin.h +++ b/examples/common/debugdraw/fs_debugdraw_fill_lit.bin.h @@ -1,72 +1,54 @@ -static const uint8_t fs_debugdraw_fill_lit_glsl[492] = +static const uint8_t fs_debugdraw_fill_lit_glsl[336] = { 0x46, 0x53, 0x48, 0x0b, 0x0f, 0xc8, 0x56, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x75, // FSH...V_.......u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, // _params......... - 0x00, 0xc6, 0x01, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, // .....varying vec - 0x33, 0x20, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // 3 v_world;.unifo - 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // rm vec4 u_params - 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, // [4];.void main ( - 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ).{. vec3 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, // r_1;. tmpvar_1 - 0x3d, 0x20, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x29, 0x3b, // = dFdx(v_world); - 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // . vec3 tmpvar_2 - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x64, // ;. tmpvar_2 = d - 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, // Fdy(v_world);. - 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, // vec4 tmpvar_3;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, // tmpvar_3.xyz = - 0x28, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x32, // (mix (u_params[2 - 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, // ].xyz, u_params[ - 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x64, // 1].xyz, (. (d - 0x6f, 0x74, 0x20, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x28, 0x0a, // ot (normalize((. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // (tmpvar_1. - 0x79, 0x7a, 0x78, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x7a, // yzx * tmpvar_2.z - 0x78, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, // xy). - . - 0x20, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x78, 0x79, 0x20, // (tmpvar_1.zxy - 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x79, 0x7a, 0x78, 0x29, 0x0a, // * tmpvar_2.yzx). - 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // )), u_params - 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x0a, // [0].xyz) * 0.5). - 0x20, 0x20, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, // + 0.5)) * u_p - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, // arams[3].xyz);. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x75, 0x5f, // tmpvar_3.w = u_ - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x33, 0x5d, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x67, // params[3].w;. g - 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, // l_FragColor = tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // pvar_3;.}... + 0x00, 0x2a, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, // .*....uniform ve + 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, // c4 u_params[4];. + 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, // .in vec3 v_world + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // n = 0) out vec4 + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, // bgfx_FragColor;. + 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, // .void main().{. + 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, // bgfx_FragColo + 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x75, 0x5f, 0x70, // r = vec4(mix(u_p + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x75, 0x5f, // arams[2].xyz, u_ + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, // params[1].xyz, v + 0x65, 0x63, 0x33, 0x28, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, // ec3((dot(normali + 0x7a, 0x65, 0x28, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, // ze(cross(dFdx(v_ + 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x29, 0x2c, 0x20, 0x64, 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, 0x77, // world), dFdy(v_w + 0x6f, 0x72, 0x6c, 0x64, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // orld))), u_param + 0x73, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, // s[0].xyz) * 0.5) + 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, // + 0.5)) * u_par + 0x61, 0x6d, 0x73, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, // ams[3].xyz, u_pa + 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x33, 0x5d, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // rams[3].w);.}... }; -static const uint8_t fs_debugdraw_fill_lit_essl[518] = +static const uint8_t fs_debugdraw_fill_lit_essl[400] = { 0x46, 0x53, 0x48, 0x0b, 0x0f, 0xc8, 0x56, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x75, // FSH...V_.......u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, // _params......... - 0x00, 0xe0, 0x01, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, // .....varying hig - 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x3b, // hp vec3 v_world; - 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, // .uniform vec4 u_ - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // params[4];.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, // main ().{. high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, // p vec3 tmpvar_1; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x64, 0x46, // . tmpvar_1 = dF - 0x64, 0x78, 0x28, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, // dx(v_world);. h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ighp vec3 tmpvar - 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, // _2;. tmpvar_2 = - 0x20, 0x64, 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x29, 0x3b, 0x0a, // dFdy(v_world);. - 0x20, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, // mediump vec4 t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_3;. tmpva - 0x72, 0x5f, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x69, 0x78, 0x20, 0x28, // r_3.xyz = (mix ( - 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, // u_params[2].xyz, - 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, // u_params[1].xyz - 0x2c, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x6e, 0x6f, // , (. (dot (no - 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // rmalize((. - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x79, 0x7a, 0x78, 0x20, 0x2a, 0x20, // (tmpvar_1.yzx * - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x7a, 0x78, 0x79, 0x29, 0x0a, 0x20, 0x20, // tmpvar_2.zxy). - 0x20, 0x20, 0x20, 0x2d, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6d, 0x70, // - . (tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x78, 0x79, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, // var_1.zxy * tmpv - 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x79, 0x7a, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, // ar_2.yzx). )) - 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, // , u_params[0].xy - 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2b, 0x20, 0x30, // z) * 0.5). + 0 - 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, // .5)) * u_params[ - 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // 3].xyz);. tmpva - 0x72, 0x5f, 0x33, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // r_3.w = u_params - 0x5b, 0x33, 0x5d, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, // [3].w;. gl_Frag - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, // Color = tmpvar_3 - 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... + 0x00, 0x6a, 0x01, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, // .j...precision m + 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, // ediump float;.pr + 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, // ecision highp in + 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, // t;..uniform high + 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, // p vec4 u_params[ + 0x34, 0x5d, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // 4];..in highp ve + 0x63, 0x33, 0x20, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // c3 v_world;.layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, // ut(location = 0) + 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // out highp vec4 + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, // bgfx_FragColor;. + 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, // .void main().{. + 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, // bgfx_FragColo + 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x75, 0x5f, 0x70, // r = vec4(mix(u_p + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x75, 0x5f, // arams[2].xyz, u_ + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, // params[1].xyz, v + 0x65, 0x63, 0x33, 0x28, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, // ec3((dot(normali + 0x7a, 0x65, 0x28, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, // ze(cross(dFdx(v_ + 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x29, 0x2c, 0x20, 0x64, 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, 0x77, // world), dFdy(v_w + 0x6f, 0x72, 0x6c, 0x64, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // orld))), u_param + 0x73, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, // s[0].xyz) * 0.5) + 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, // + 0.5)) * u_par + 0x61, 0x6d, 0x73, 0x5b, 0x33, 0x5d, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, // ams[3].xyz, u_pa + 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x33, 0x5d, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // rams[3].w);.}... }; static const uint8_t fs_debugdraw_fill_lit_spv[1469] = { diff --git a/examples/common/debugdraw/fs_debugdraw_fill_texture.bin.h b/examples/common/debugdraw/fs_debugdraw_fill_texture.bin.h index 5f0fbfc7c..bdf9ed76f 100644 --- a/examples/common/debugdraw/fs_debugdraw_fill_texture.bin.h +++ b/examples/common/debugdraw/fs_debugdraw_fill_texture.bin.h @@ -1,38 +1,44 @@ -static const uint8_t fs_debugdraw_fill_texture_glsl[204] = +static const uint8_t fs_debugdraw_fill_texture_glsl[241] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x73, // FSH............s 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, // .......varying v - 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, // ec4 v_color0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // rying vec2 v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // coord0;.uniform + 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // ........uniform 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // sampler2D s_texC - 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, // olor;.void main - 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // ().{. gl_FragCo - 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, // lor = (texture2D - 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, // (s_texColor, v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, // texcoord0) * v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // olor0);.}... + 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, // olor;..layout(lo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, // cation = 0) out + 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // vec4 bgfx_FragCo + 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, // lor;.in vec2 v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, // excoord0;.in vec + 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, // 4 v_color0;..voi + 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, // d main().{. b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, // gfx_FragColor = + 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, // texture(s_texCol + 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, // or, v_texcoord0) + 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, // * v_color0;.}.. + 0x00, // . }; -static const uint8_t fs_debugdraw_fill_texture_essl[261] = +static const uint8_t fs_debugdraw_fill_texture_essl[311] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x73, // FSH............s 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // .......varying h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ighp vec4 v_colo - 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, // r0;.varying high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // p vec2 v_texcoor - 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, // d0;.uniform samp - 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // ler2D s_texColor - 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, // ;.void main ().{ - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, // . lowp vec4 tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_1;. tmpvar_ - 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x20, 0x28, 0x73, // 1 = texture2D (s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // _texColor, v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, // coord0);. gl_Fr - 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // agColor = (tmpva - 0x72, 0x5f, 0x31, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x3b, // r_1 * v_color0); - 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... + 0x00, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, // .......precision + 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, // mediump float;. + 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // precision highp + 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, // int;..uniform hi + 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, // ghp sampler2D s_ + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texColor;..layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, // t(location = 0) + 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // out highp vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, // gfx_FragColor;.i + 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, // n highp vec2 v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, // excoord0;.in hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // hp vec4 v_color0 + 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, // ;..void main().{ + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // . bgfx_FragCo + 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, // lor = texture(s_ + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // texColor, v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // oord0) * v_color + 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 0;.}... }; static const uint8_t fs_debugdraw_fill_texture_spv[863] = { diff --git a/examples/common/debugdraw/fs_debugdraw_lines.bin.h b/examples/common/debugdraw/fs_debugdraw_lines.bin.h index f16225406..50c61aa5c 100644 --- a/examples/common/debugdraw/fs_debugdraw_lines.bin.h +++ b/examples/common/debugdraw/fs_debugdraw_lines.bin.h @@ -1,20 +1,29 @@ -static const uint8_t fs_debugdraw_lines_glsl[87] = +static const uint8_t fs_debugdraw_lines_glsl[133] = { - 0x46, 0x53, 0x48, 0x0b, 0xa4, 0x8b, 0xef, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, // FSH....I......D. - 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, // ..varying vec4 v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // _color0;.void ma - 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, // in ().{. gl_Fra - 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // gColor = v_color - 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 0;.}... + 0x46, 0x53, 0x48, 0x0b, 0xa4, 0x8b, 0xef, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, // FSH....I......r. + 0x00, 0x00, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, // ...layout(locati + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, // on = 0) out vec4 + 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, // bgfx_FragColor; + 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // .in vec4 v_color + 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, // 0;..void main(). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, // {. bgfx_FragC + 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // olor = v_color0; + 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... }; -static const uint8_t fs_debugdraw_lines_essl[93] = +static const uint8_t fs_debugdraw_lines_essl[191] = { - 0x46, 0x53, 0x48, 0x0b, 0xa4, 0x8b, 0xef, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, // FSH....I......J. - 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // ..varying highp - 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, // vec4 v_color0;.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, // gl_FragColor = v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _color0;.}... + 0x46, 0x53, 0x48, 0x0b, 0xa4, 0x8b, 0xef, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, // FSH....I........ + 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, // ..precision medi + 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, // ump float;.preci + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, // sion highp int;. + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // .layout(location + 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // = 0) out highp + 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // vec4 bgfx_FragCo + 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // lor;.in highp ve + 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, // c4 v_color0;..vo + 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // id main().{. + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, // bgfx_FragColor = + 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // v_color0;.}... }; static const uint8_t fs_debugdraw_lines_spv[406] = { diff --git a/examples/common/debugdraw/fs_debugdraw_lines_stipple.bin.h b/examples/common/debugdraw/fs_debugdraw_lines_stipple.bin.h index 1e39f34f6..a62d3423f 100644 --- a/examples/common/debugdraw/fs_debugdraw_lines_stipple.bin.h +++ b/examples/common/debugdraw/fs_debugdraw_lines_stipple.bin.h @@ -1,37 +1,40 @@ -static const uint8_t fs_debugdraw_lines_stipple_glsl[221] = +static const uint8_t fs_debugdraw_lines_stipple_glsl[220] = { - 0x46, 0x53, 0x48, 0x0b, 0xe7, 0x1a, 0x5a, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0x00, // FSH...Z......... - 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, // ..varying vec4 v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, // _color0;.varying - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x5f, 0x73, 0x74, 0x69, 0x70, 0x70, 0x6c, 0x65, // float v_stipple - 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, // ;.void main ().{ - 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // . float tmpvar_ - 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, // 1;. tmpvar_1 = - 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6d, 0x6f, 0x64, 0x20, 0x28, 0x76, 0x5f, 0x73, 0x74, // (float(mod (v_st - 0x69, 0x70, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x29, 0x29, 0x3b, 0x0a, // ipple, 0.25)));. - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x20, 0x3c, 0x20, 0x74, // if ((0.125 < t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // mpvar_1)) {. - 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, // discard;. };. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, // gl_FragColor = v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _color0;.}... + 0x46, 0x53, 0x48, 0x0b, 0xe7, 0x1a, 0x5a, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc9, 0x00, // FSH...Z......... + 0x00, 0x00, 0x0a, 0x69, 0x6e, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x5f, 0x73, 0x74, // ...in float v_st + 0x69, 0x70, 0x70, 0x6c, 0x65, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, // ipple;.layout(lo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, // cation = 0) out + 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // vec4 bgfx_FragCo + 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, // lor;.in vec4 v_c + 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, // olor0;..void mai + 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x30, 0x2e, // n().{. if (0. + 0x31, 0x32, 0x35, 0x20, 0x3c, 0x20, 0x6d, 0x6f, 0x64, 0x28, 0x76, 0x5f, 0x73, 0x74, 0x69, 0x70, // 125 < mod(v_stip + 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, // ple, 0.25)). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, // {. discar + 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, // d;. }. bgf + 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x5f, // x_FragColor = v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // color0;.}... }; -static const uint8_t fs_debugdraw_lines_stipple_essl[239] = +static const uint8_t fs_debugdraw_lines_stipple_essl[284] = { - 0x46, 0x53, 0x48, 0x0b, 0xe7, 0x1a, 0x5a, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x00, // FSH...Z......... - 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // ..varying highp - 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, // vec4 v_color0;.v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, // arying highp flo - 0x61, 0x74, 0x20, 0x76, 0x5f, 0x73, 0x74, 0x69, 0x70, 0x70, 0x6c, 0x65, 0x3b, 0x0a, 0x76, 0x6f, // at v_stipple;.vo - 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, // id main ().{. h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ighp float tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, // r_1;. tmpvar_1 - 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6d, 0x6f, 0x64, 0x20, 0x28, 0x76, 0x5f, // = (float(mod (v_ - 0x73, 0x74, 0x69, 0x70, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x29, 0x29, // stipple, 0.25))) - 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x20, 0x3c, // ;. if ((0.125 < - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, // tmpvar_1)) {. - 0x20, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, // discard;. };. - 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, // gl_FragColor = - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // v_color0;.}... + 0x46, 0x53, 0x48, 0x0b, 0xe7, 0x1a, 0x5a, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01, // FSH...Z......... + 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, // ..precision medi + 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, // ump float;.preci + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, // sion highp int;. + 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // .in highp float + 0x76, 0x5f, 0x73, 0x74, 0x69, 0x70, 0x70, 0x6c, 0x65, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // v_stipple;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, // t(location = 0) + 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // out highp vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, // gfx_FragColor;.i + 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, // n highp vec4 v_c + 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, // olor0;..void mai + 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x30, 0x2e, // n().{. if (0. + 0x31, 0x32, 0x35, 0x20, 0x3c, 0x20, 0x6d, 0x6f, 0x64, 0x28, 0x76, 0x5f, 0x73, 0x74, 0x69, 0x70, // 125 < mod(v_stip + 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, // ple, 0.25)). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, // {. discar + 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, // d;. }. bgf + 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x5f, // x_FragColor = v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // color0;.}... }; static const uint8_t fs_debugdraw_lines_stipple_spv[702] = { diff --git a/examples/common/debugdraw/vs_debugdraw_fill.bin.h b/examples/common/debugdraw/vs_debugdraw_fill.bin.h index cb8235a97..9d5b683ee 100644 --- a/examples/common/debugdraw/vs_debugdraw_fill.bin.h +++ b/examples/common/debugdraw/vs_debugdraw_fill.bin.h @@ -1,51 +1,46 @@ -static const uint8_t vs_debugdraw_fill_glsl[303] = +static const uint8_t vs_debugdraw_fill_glsl[294] = { - 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x75, // VSH............u - 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, // _viewProj....... - 0x00, 0x00, 0x00, 0x07, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x02, 0x00, 0x00, 0x08, // ....u_model..... - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf5, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, // .........in uvec - 0x34, 0x20, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x3b, 0x0a, 0x69, 0x6e, 0x20, // 4 a_indices;.in - 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, // vec3 a_position; - 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // .uniform mat4 u_ - 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // viewProj;.unifor + 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x75, // VSH............u + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, // _model.......... + 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, // .u_viewProj..... + 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // ..........unifor 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x32, // m mat4 u_model[2 - 0x5d, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, // ];.void main (). - 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // {. vec4 tmpvar_ - 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, // 1;. tmpvar_1.w - 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // = 1.0;. tmpvar_ - 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, // 1.xyz = a_positi - 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // on;. gl_Positio - 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // n = (u_viewProj - 0x2a, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x69, 0x6e, 0x74, 0x28, 0x61, // * (u_model[int(a - 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x29, 0x5d, 0x20, 0x2a, 0x20, 0x74, // _indices.x)] * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // mpvar_1));.}... + 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // ];.uniform mat4 + 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, // u_viewProj;..lay + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, // out(location = 0 + 0x29, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x69, 0x6e, 0x64, // ) in uvec4 a_ind + 0x69, 0x63, 0x65, 0x73, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, // ices;.layout(loc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, // ation = 1) in ve + 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x0a, // c3 a_position;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x28, 0x75, 0x5f, // u_viewProj * (u_ + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x69, 0x6e, 0x74, 0x28, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x69, // model[int(a_indi + 0x63, 0x65, 0x73, 0x2e, 0x78, 0x29, 0x5d, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, // ces.x)] * vec4(a + 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, // _position, 1.0)) + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... }; -static const uint8_t vs_debugdraw_fill_essl[371] = +static const uint8_t vs_debugdraw_fill_essl[294] = { - 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x75, // VSH............u - 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, // _viewProj....... - 0x00, 0x00, 0x00, 0x07, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x02, 0x00, 0x00, 0x08, // ....u_model..... - 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x01, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, // .....9...precisi - 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x70, 0x72, // on highp int;.pr - 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, // ecision highp fl - 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x75, 0x76, // oat;.in highp uv - 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x3b, 0x0a, 0x69, // ec4 a_indices;.i - 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, // n highp vec3 a_p - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // osition;.uniform - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, // highp mat4 u_vi - 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // ewProj;.uniform - 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x32, 0x5d, 0x3b, // mat4 u_model[2]; - 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, // .void main ().{. - 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, // highp vec4 tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_1;. tmpvar_ - 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // 1.w = 1.0;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, // var_1.xyz = a_po - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, // sition;. gl_Pos - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, // ition = (u_viewP - 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x69, // roj * (u_model[i - 0x6e, 0x74, 0x28, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x29, 0x5d, // nt(a_indices.x)] - 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x29, 0x3b, 0x0a, 0x7d, // * tmpvar_1));.} - 0x0a, 0x0a, 0x00, // ... + 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x75, // VSH............u + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, // _model.......... + 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, // .u_viewProj..... + 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // ..........unifor + 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x32, // m mat4 u_model[2 + 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // ];.uniform mat4 + 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, // u_viewProj;..lay + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, // out(location = 0 + 0x29, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x69, 0x6e, 0x64, // ) in uvec4 a_ind + 0x69, 0x63, 0x65, 0x73, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, // ices;.layout(loc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, // ation = 1) in ve + 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x0a, // c3 a_position;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x28, 0x75, 0x5f, // u_viewProj * (u_ + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x69, 0x6e, 0x74, 0x28, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x69, // model[int(a_indi + 0x63, 0x65, 0x73, 0x2e, 0x78, 0x29, 0x5d, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, // ces.x)] * vec4(a + 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, // _position, 1.0)) + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... }; static const uint8_t vs_debugdraw_fill_spv[1257] = { diff --git a/examples/common/debugdraw/vs_debugdraw_fill_lit.bin.h b/examples/common/debugdraw/vs_debugdraw_fill_lit.bin.h index 61a4e3fac..68bbdf0d5 100644 --- a/examples/common/debugdraw/vs_debugdraw_fill_lit.bin.h +++ b/examples/common/debugdraw/vs_debugdraw_fill_lit.bin.h @@ -1,74 +1,64 @@ -static const uint8_t vs_debugdraw_fill_lit_glsl[478] = +static const uint8_t vs_debugdraw_fill_lit_glsl[441] = { - 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc8, 0x56, 0x5f, 0x03, 0x00, 0x06, 0x75, // VSH.......V_...u - 0x5f, 0x76, 0x69, 0x65, 0x77, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, // _view........... - 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, // u_viewProj...... - 0x00, 0x00, 0x00, 0x00, 0x07, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x02, 0x00, 0x00, // .....u_model.... - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x01, 0x00, 0x00, 0x69, 0x6e, 0x20, 0x75, 0x76, 0x65, // ..........in uve - 0x63, 0x34, 0x20, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x3b, 0x0a, 0x69, 0x6e, // c4 a_indices;.in - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, // vec3 a_position - 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x76, 0x69, 0x65, // ;.out vec3 v_vie - 0x77, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x77, 0x6f, // w;.out vec3 v_wo - 0x72, 0x6c, 0x64, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, // rld;.uniform mat - 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // 4 u_view;.unifor - 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, // m mat4 u_viewPro - 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // j;.uniform mat4 - 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, // u_model[2];.void - 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, // main ().{. vec - 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // 4 tmpvar_1;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, // pvar_1.w = 1.0;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, // tmpvar_1.xyz = - 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x76, // a_position;. v - 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, // ec4 tmpvar_2;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, // tmpvar_2 = (u_mo - 0x64, 0x65, 0x6c, 0x5b, 0x69, 0x6e, 0x74, 0x28, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, // del[int(a_indice - 0x73, 0x2e, 0x78, 0x29, 0x5d, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // s.x)] * tmpvar_1 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, // );. gl_Position - 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, // = (u_viewProj * - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, // tmpvar_2);. v_ - 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x20, 0x2a, // view = (u_view * - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, // tmpvar_2).xyz;. - 0x20, 0x20, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // v_world = tmpv - 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ar_2.xyz;.}... + 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc8, 0x56, 0x5f, 0x03, 0x00, 0x07, 0x75, // VSH.......V_...u + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, // _model.......... + 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, // .u_viewProj..... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x04, 0x01, 0x00, 0x00, // ......u_view.... + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // ......n....unifo + 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, // rm mat4 u_model[ + 0x32, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, // 2];.uniform mat4 + 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // u_viewProj;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, // form mat4 u_view + 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, // ;..layout(locati + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, // on = 0) in uvec4 + 0x20, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // a_indices;.layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, // ion;.out vec3 v_ + 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // view;.out vec3 v + 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // _world;..void ma + 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // in().{. vec4 + 0x5f, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x69, 0x6e, // _37 = u_model[in + 0x74, 0x28, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x29, 0x5d, 0x20, // t(a_indices.x)] + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, // n, 1.0);. gl_ + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, // Position = u_vie + 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, // wProj * _37;. + 0x20, 0x76, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x76, 0x69, 0x65, // v_view = (u_vie + 0x77, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, // w * _37).xyz;. + 0x20, 0x20, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x2e, // v_world = _37. + 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // xyz;.}... }; -static const uint8_t vs_debugdraw_fill_lit_essl[570] = +static const uint8_t vs_debugdraw_fill_lit_essl[441] = { - 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc8, 0x56, 0x5f, 0x03, 0x00, 0x06, 0x75, // VSH.......V_...u - 0x5f, 0x76, 0x69, 0x65, 0x77, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, // _view........... - 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, // u_viewProj...... - 0x00, 0x00, 0x00, 0x00, 0x07, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x02, 0x00, 0x00, // .....u_model.... - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0x01, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, // ..........precis - 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x70, // ion highp int;.p - 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, // recision highp f - 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x75, // loat;.in highp u - 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x3b, 0x0a, // vec4 a_indices;. - 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, // in highp vec3 a_ - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, // position;.out hi - 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x3b, // ghp vec3 v_view; - 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // .out highp vec3 - 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // v_world;.uniform - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, // highp mat4 u_vi - 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, // ew;.uniform high - 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, // p mat4 u_viewPro - 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // j;.uniform mat4 - 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, // u_model[2];.void - 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, // main ().{. hig - 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // hp vec4 tmpvar_1 - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, // ;. tmpvar_1.w = - 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // 1.0;. tmpvar_1 - 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // .xyz = a_positio - 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // n;. highp vec4 - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // tmpvar_2;. tmpv - 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, // ar_2 = (u_model[ - 0x69, 0x6e, 0x74, 0x28, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x29, // int(a_indices.x) - 0x5d, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, // ] * tmpvar_1);. - 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, // gl_Position = ( - 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, // u_viewProj * tmp - 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x76, 0x69, 0x65, 0x77, // var_2);. v_view - 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, // = (u_view * tmp - 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, // var_2).xyz;. v_ - 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // world = tmpvar_2 - 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .xyz;.}... + 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc8, 0x56, 0x5f, 0x03, 0x00, 0x07, 0x75, // VSH.......V_...u + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, // _model.......... + 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, // .u_viewProj..... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x04, 0x01, 0x00, 0x00, // ......u_view.... + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // ......n....unifo + 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, // rm mat4 u_model[ + 0x32, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, // 2];.uniform mat4 + 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // u_viewProj;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, // form mat4 u_view + 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, // ;..layout(locati + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, // on = 0) in uvec4 + 0x20, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // a_indices;.layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, // ion;.out vec3 v_ + 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // view;.out vec3 v + 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // _world;..void ma + 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // in().{. vec4 + 0x5f, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x69, 0x6e, // _37 = u_model[in + 0x74, 0x28, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x29, 0x5d, 0x20, // t(a_indices.x)] + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, // n, 1.0);. gl_ + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, // Position = u_vie + 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, // wProj * _37;. + 0x20, 0x76, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x76, 0x69, 0x65, // v_view = (u_vie + 0x77, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, // w * _37).xyz;. + 0x20, 0x20, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x2e, // v_world = _37. + 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // xyz;.}... }; static const uint8_t vs_debugdraw_fill_lit_spv[1674] = { diff --git a/examples/common/debugdraw/vs_debugdraw_fill_lit_mesh.bin.h b/examples/common/debugdraw/vs_debugdraw_fill_lit_mesh.bin.h index 8a42be0df..fa74890fb 100644 --- a/examples/common/debugdraw/vs_debugdraw_fill_lit_mesh.bin.h +++ b/examples/common/debugdraw/vs_debugdraw_fill_lit_mesh.bin.h @@ -1,69 +1,58 @@ -static const uint8_t vs_debugdraw_fill_lit_mesh_glsl[458] = +static const uint8_t vs_debugdraw_fill_lit_mesh_glsl[385] = { - 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc8, 0x56, 0x5f, 0x03, 0x00, 0x06, 0x75, // VSH.......V_...u - 0x5f, 0x76, 0x69, 0x65, 0x77, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, // _view........... - 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, // u_viewProj...... - 0x00, 0x00, 0x00, 0x00, 0x07, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x01, 0x00, 0x00, // .....u_model.... - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, // ..........attrib - 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // ute vec3 a_posit - 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, // ion;.varying vec - 0x33, 0x20, 0x76, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // 3 v_view;.varyin - 0x67, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x3b, 0x0a, // g vec3 v_world;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, // uniform mat4 u_v - 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, // iew;.uniform mat - 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, // 4 u_viewProj;.un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // iform mat4 u_mod - 0x65, 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // el[1];.void main - 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, // ().{. vec4 tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_1;. tmpvar_ - 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // 1.w = 1.0;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, // var_1.xyz = a_po - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, // sition;. vec4 t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_2;. tmpva - 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x30, // r_2 = (u_model[0 - 0x5d, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, // ] * tmpvar_1);. - 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, // gl_Position = ( - 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, // u_viewProj * tmp - 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x76, 0x69, 0x65, 0x77, // var_2);. v_view - 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, // = (u_view * tmp - 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, // var_2).xyz;. v_ - 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // world = tmpvar_2 - 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .xyz;.}... + 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc8, 0x56, 0x5f, 0x03, 0x00, 0x07, 0x75, // VSH.......V_...u + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, // _model.......... + 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, // .u_viewProj..... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x04, 0x01, 0x00, 0x00, // ......u_view.... + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // ......6....unifo + 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, // rm mat4 u_model[ + 0x31, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, // 1];.uniform mat4 + 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // u_viewProj;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, // form mat4 u_view + 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, // ;..layout(locati + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // on = 0) in vec3 + 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, // a_position;.out + 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x6f, 0x75, 0x74, // vec3 v_view;.out + 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x3b, 0x0a, 0x0a, // vec3 v_world;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, // vec4 _30 = u_m + 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, // odel[0] * vec4(a + 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, // _position, 1.0); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, // . gl_Position + 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, // = u_viewProj * + 0x5f, 0x33, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x20, // _30;. v_view + 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x29, // = (u_view * _30) + 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, // .xyz;. v_worl + 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, // d = _30.xyz;.}.. + 0x00, // . }; -static const uint8_t vs_debugdraw_fill_lit_mesh_essl[500] = +static const uint8_t vs_debugdraw_fill_lit_mesh_essl[385] = { - 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc8, 0x56, 0x5f, 0x03, 0x00, 0x06, 0x75, // VSH.......V_...u - 0x5f, 0x76, 0x69, 0x65, 0x77, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, // _view........... - 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, // u_viewProj...... - 0x00, 0x00, 0x00, 0x00, 0x07, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x01, 0x00, 0x00, // .....u_model.... - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa9, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, // ..........attrib - 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, // ute highp vec3 a - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // _position;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, // ng highp vec3 v_ - 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, // view;.varying hi - 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, // ghp vec3 v_world - 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // ;.uniform highp - 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // mat4 u_view;.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // form highp mat4 - 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // u_viewProj;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, // orm mat4 u_model - 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, // [1];.void main ( - 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ).{. highp vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, // var_1.w = 1.0;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, // tmpvar_1.xyz = - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, // a_position;. hi - 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ghp vec4 tmpvar_ - 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, // 2;. tmpvar_2 = - 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x74, 0x6d, // (u_model[0] * tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, // pvar_1);. gl_Po - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, // sition = (u_view - 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, // Proj * tmpvar_2) - 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, // ;. v_view = (u_ - 0x76, 0x69, 0x65, 0x77, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, // view * tmpvar_2) - 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x20, // .xyz;. v_world - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, // = tmpvar_2.xyz;. - 0x7d, 0x0a, 0x0a, 0x00, // }... + 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc8, 0x56, 0x5f, 0x03, 0x00, 0x07, 0x75, // VSH.......V_...u + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, // _model.......... + 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, // .u_viewProj..... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x04, 0x01, 0x00, 0x00, // ......u_view.... + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // ......6....unifo + 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, // rm mat4 u_model[ + 0x31, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, // 1];.uniform mat4 + 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // u_viewProj;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, // form mat4 u_view + 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, // ;..layout(locati + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // on = 0) in vec3 + 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, // a_position;.out + 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x6f, 0x75, 0x74, // vec3 v_view;.out + 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x3b, 0x0a, 0x0a, // vec3 v_world;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, // vec4 _30 = u_m + 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, // odel[0] * vec4(a + 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, // _position, 1.0); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, // . gl_Position + 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, // = u_viewProj * + 0x5f, 0x33, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x20, // _30;. v_view + 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x29, // = (u_view * _30) + 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x77, 0x6f, 0x72, 0x6c, // .xyz;. v_worl + 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, // d = _30.xyz;.}.. + 0x00, // . }; static const uint8_t vs_debugdraw_fill_lit_mesh_spv[1532] = { diff --git a/examples/common/debugdraw/vs_debugdraw_fill_mesh.bin.h b/examples/common/debugdraw/vs_debugdraw_fill_mesh.bin.h index 0392104da..7dacef93c 100644 --- a/examples/common/debugdraw/vs_debugdraw_fill_mesh.bin.h +++ b/examples/common/debugdraw/vs_debugdraw_fill_mesh.bin.h @@ -1,45 +1,38 @@ -static const uint8_t vs_debugdraw_fill_mesh_glsl[275] = +static const uint8_t vs_debugdraw_fill_mesh_glsl[238] = { - 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x75, // VSH............u - 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, // _viewProj....... - 0x00, 0x00, 0x00, 0x07, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x01, 0x00, 0x00, 0x04, // ....u_model..... - 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, // .........attribu - 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, // te vec3 a_positi - 0x6f, 0x6e, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, // on;.uniform mat4 - 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // u_viewProj;.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode - 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, // l[1];.void main - 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, // ().{. vec4 tmpv - 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // ar_1;. tmpvar_1 - 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // .w = 1.0;. tmpv - 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, // ar_1.xyz = a_pos - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, // ition;. gl_Posi - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, // tion = (u_viewPr - 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x30, 0x5d, // oj * (u_model[0] - 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x29, 0x3b, 0x0a, 0x7d, // * tmpvar_1));.} - 0x0a, 0x0a, 0x00, // ... + 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x75, // VSH............u + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, // _model.......... + 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, // .u_viewProj..... + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // ..........unifor + 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x31, // m mat4 u_model[1 + 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // ];.uniform mat4 + 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, // u_viewProj;..lay + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, // out(location = 0 + 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, // ) in vec3 a_posi + 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // tion;..void main + 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, // ().{. gl_Posi + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, // tion = u_viewPro + 0x6a, 0x20, 0x2a, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x30, 0x5d, 0x20, // j * (u_model[0] + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // n, 1.0));.}... }; -static const uint8_t vs_debugdraw_fill_mesh_essl[293] = +static const uint8_t vs_debugdraw_fill_mesh_essl[238] = { - 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x75, // VSH............u - 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, // _viewProj....... - 0x00, 0x00, 0x00, 0x07, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x01, 0x00, 0x00, 0x04, // ....u_model..... - 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, // .........attribu - 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, // te highp vec3 a_ - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // position;.unifor - 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, // m highp mat4 u_v - 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // iewProj;.uniform - 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x31, 0x5d, // mat4 u_model[1] - 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, // ;.void main ().{ - 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, // . highp vec4 tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // pvar_1;. tmpvar - 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // _1.w = 1.0;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, // pvar_1.xyz = a_p - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, // osition;. gl_Po - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, // sition = (u_view - 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, // Proj * (u_model[ - 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x29, 0x3b, // 0] * tmpvar_1)); - 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... + 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x75, // VSH............u + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, // _model.......... + 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, // .u_viewProj..... + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // ..........unifor + 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x31, // m mat4 u_model[1 + 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // ];.uniform mat4 + 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, // u_viewProj;..lay + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, // out(location = 0 + 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, // ) in vec3 a_posi + 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // tion;..void main + 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, // ().{. gl_Posi + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, // tion = u_viewPro + 0x6a, 0x20, 0x2a, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x30, 0x5d, 0x20, // j * (u_model[0] + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // n, 1.0));.}... }; static const uint8_t vs_debugdraw_fill_mesh_spv[1115] = { diff --git a/examples/common/debugdraw/vs_debugdraw_fill_texture.bin.h b/examples/common/debugdraw/vs_debugdraw_fill_texture.bin.h index f63690999..33c9b369f 100644 --- a/examples/common/debugdraw/vs_debugdraw_fill_texture.bin.h +++ b/examples/common/debugdraw/vs_debugdraw_fill_texture.bin.h @@ -1,60 +1,56 @@ -static const uint8_t vs_debugdraw_fill_texture_glsl[386] = +static const uint8_t vs_debugdraw_fill_texture_glsl[373] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........U...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec3 a_position;. - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, // attribute vec2 a - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // _texcoord0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ing vec4 v_color - 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // 0;.varying vec2 - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // v_texcoord0;.uni + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........H....uni 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // lViewProj;.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // main ().{. vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, // var_1.w = 1.0;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, // tmpvar_1.xyz = - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, // a_position;. gl - 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, // _Position = (u_m - 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, // odelViewProj * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, // mpvar_1);. v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // xcoord0 = a_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // oord0;. v_color - 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, // 0 = a_color0;.}. - 0x0a, 0x00, // .. + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, // ion;.out vec2 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, // t(location = 2) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec2 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, // n, 1.0);. v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, // excoord0 = a_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, // coord0;. v_co + 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // lor0 = a_color0; + 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... }; -static const uint8_t vs_debugdraw_fill_texture_essl[428] = +static const uint8_t vs_debugdraw_fill_texture_essl[373] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // bute highp vec3 - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, // a_position;.attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, // ibute highp vec2 - 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, // a_texcoord0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // rying highp vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color0;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, // ng highp vec2 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // texcoord0;.unifo - 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // rm highp mat4 u_ - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, // modelViewProj;.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // highp vec4 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // r_1;. tmpvar_1. - 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // w = 1.0;. tmpva - 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, // r_1.xyz = a_posi - 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, // tion;. gl_Posit - 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, // ion = (u_modelVi - 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ewProj * tmpvar_ - 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // 1);. v_texcoord - 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, // 0 = a_texcoord0; - 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, // . v_color0 = a_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // color0;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........H....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, // ion;.out vec2 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, // t(location = 2) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec2 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, // n, 1.0);. v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, // excoord0 = a_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, // coord0;. v_co + 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // lor0 = a_color0; + 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... }; static const uint8_t vs_debugdraw_fill_texture_spv[1270] = { diff --git a/examples/common/debugdraw/vs_debugdraw_lines.bin.h b/examples/common/debugdraw/vs_debugdraw_lines.bin.h index 21014a9ab..8d229146f 100644 --- a/examples/common/debugdraw/vs_debugdraw_lines.bin.h +++ b/examples/common/debugdraw/vs_debugdraw_lines.bin.h @@ -1,48 +1,44 @@ -static const uint8_t vs_debugdraw_lines_glsl[303] = +static const uint8_t vs_debugdraw_lines_glsl[278] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x8b, 0xef, 0x49, 0x01, 0x00, 0x0f, 0x75, // VSH........I...u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec3 a_position;. - 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, // varying vec4 v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, // olor0;.uniform m - 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, // at4 u_modelViewP - 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, // roj;.void main ( - 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ).{. vec4 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // r_1;. tmpvar_1. - 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // w = 1.0;. tmpva - 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, // r_1.xyz = a_posi - 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, // tion;. gl_Posit - 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, // ion = (u_modelVi - 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ewProj * tmpvar_ - 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, // 1);. v_color0 = - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // a_color0;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // .............uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, // n, 1.0);. v_c + 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // olor0 = a_color0 + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... }; -static const uint8_t vs_debugdraw_lines_essl[333] = +static const uint8_t vs_debugdraw_lines_essl[278] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x8b, 0xef, 0x49, 0x01, 0x00, 0x0f, 0x75, // VSH........I...u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........ ...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // bute highp vec3 - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // a_position;.vary - 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, // ing highp vec4 v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // _color0;.uniform - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, // highp mat4 u_mo - 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, // delViewProj;.voi - 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, // d main ().{. hi - 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ghp vec4 tmpvar_ - 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, // 1;. tmpvar_1.w - 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // = 1.0;. tmpvar_ - 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, // 1.xyz = a_positi - 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // on;. gl_Positio - 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, // n = (u_modelView - 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, // Proj * tmpvar_1) - 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, // ;. v_color0 = a - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _color0;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // .............uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, // n, 1.0);. v_c + 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // olor0 = a_color0 + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... }; static const uint8_t vs_debugdraw_lines_spv[1060] = { diff --git a/examples/common/debugdraw/vs_debugdraw_lines_stipple.bin.h b/examples/common/debugdraw/vs_debugdraw_lines_stipple.bin.h index cdc740372..1e00464a3 100644 --- a/examples/common/debugdraw/vs_debugdraw_lines_stipple.bin.h +++ b/examples/common/debugdraw/vs_debugdraw_lines_stipple.bin.h @@ -1,60 +1,56 @@ -static const uint8_t vs_debugdraw_lines_stipple_glsl[385] = +static const uint8_t vs_debugdraw_lines_stipple_glsl[372] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x1a, 0x5a, 0xef, 0x01, 0x00, 0x0f, 0x75, // VSH.......Z....u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........T...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec3 a_position;. - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, // attribute vec2 a - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // _texcoord0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ing vec4 v_color - 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // 0;.varying float - 0x20, 0x76, 0x5f, 0x73, 0x74, 0x69, 0x70, 0x70, 0x6c, 0x65, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // v_stipple;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, // orm mat4 u_model - 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // ViewProj;.void m - 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ain ().{. vec4 - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // tmpvar_1;. tmpv - 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, // ar_1.w = 1.0;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, // tmpvar_1.xyz = a - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, // _position;. gl_ - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, // Position = (u_mo - 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, // delViewProj * tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // pvar_1);. v_col - 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, // or0 = a_color0;. - 0x20, 0x20, 0x76, 0x5f, 0x73, 0x74, 0x69, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x5f, // v_stipple = a_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, // texcoord0.x;.}.. - 0x00, // . + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........G....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x5f, 0x73, 0x74, 0x69, 0x70, 0x70, // ut float v_stipp + 0x6c, 0x65, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, // le;.layout(locat + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, // ion = 2) in vec2 + 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x0a, 0x76, // a_texcoord0;..v + 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, // oid main().{. + 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, // gl_Position = u + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, // _modelViewProj * + 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, // vec4(a_position + 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, // , 1.0);. v_co + 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // lor0 = a_color0; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x73, 0x74, 0x69, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x3d, // . v_stipple = + 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x3b, 0x0a, // a_texcoord0.x;. + 0x7d, 0x0a, 0x0a, 0x00, // }... }; -static const uint8_t vs_debugdraw_lines_stipple_essl[427] = +static const uint8_t vs_debugdraw_lines_stipple_essl[372] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x1a, 0x5a, 0xef, 0x01, 0x00, 0x0f, 0x75, // VSH.......Z....u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........~...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // bute highp vec3 - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, // a_position;.attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, // ibute highp vec2 - 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, // a_texcoord0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // rying highp vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color0;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, // ng highp float v - 0x5f, 0x73, 0x74, 0x69, 0x70, 0x70, 0x6c, 0x65, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // _stipple;.unifor - 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, // m highp mat4 u_m - 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, // odelViewProj;.vo - 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, // id main ().{. h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ighp vec4 tmpvar - 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, // _1;. tmpvar_1.w - 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // = 1.0;. tmpvar - 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // _1.xyz = a_posit - 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, // ion;. gl_Positi - 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, // on = (u_modelVie - 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // wProj * tmpvar_1 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, // );. v_color0 = - 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x73, 0x74, // a_color0;. v_st - 0x69, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // ipple = a_texcoo - 0x72, 0x64, 0x30, 0x2e, 0x78, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // rd0.x;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........G....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x5f, 0x73, 0x74, 0x69, 0x70, 0x70, // ut float v_stipp + 0x6c, 0x65, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, // le;.layout(locat + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, // ion = 2) in vec2 + 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x0a, 0x76, // a_texcoord0;..v + 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, // oid main().{. + 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, // gl_Position = u + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, // _modelViewProj * + 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, // vec4(a_position + 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, // , 1.0);. v_co + 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // lor0 = a_color0; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x73, 0x74, 0x69, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x3d, // . v_stipple = + 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x3b, 0x0a, // a_texcoord0.x;. + 0x7d, 0x0a, 0x0a, 0x00, // }... }; static const uint8_t vs_debugdraw_lines_stipple_spv[1286] = { diff --git a/examples/common/font/fs_font_basic.bin.h b/examples/common/font/fs_font_basic.bin.h index c7dcc68d1..6f011434f 100644 --- a/examples/common/font/fs_font_basic.bin.h +++ b/examples/common/font/fs_font_basic.bin.h @@ -1,107 +1,112 @@ -static const uint8_t fs_font_basic_glsl[760] = +static const uint8_t fs_font_basic_glsl[774] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x73, // FSH............s 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0xd0, 0x02, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, // .......varying v - 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, // ec4 v_color0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // rying vec4 v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // coord0;.uniform + 0x00, 0x00, 0x00, 0xde, 0x02, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // ........uniform 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, // samplerCube s_te - 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, // xColor;.void mai - 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, // n ().{. vec4 tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // pvar_1;. tmpvar - 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, // _1 = textureCube - 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, // (s_texColor, v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, // texcoord0.xyz);. - 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, // int tmpvar_2;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, // tmpvar_2 = int - 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, // (((v_texcoord0.w - 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, // * 4.0) + 0.5)); - 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // . float tmpvar_ - 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // 3;. if ((tmpvar - 0x5f, 0x32, 0x20, 0x3c, 0x20, 0x31, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // _2 < 1)) {. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // mpvar_3 = tmpvar - 0x5f, 0x31, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, // _1.z;. } else { - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // . float tmpva - 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, // r_4;. if ((tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3c, 0x20, 0x32, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, // pvar_2 < 2)) {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, // tmpvar_4 = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // tmpvar_1.y;. - 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // } else {. f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, // loat tmpvar_5;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // if ((tmpvar - 0x5f, 0x32, 0x20, 0x3c, 0x20, 0x33, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // _2 < 3)) {. - 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x6d, // tmpvar_5 = tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // pvar_1.x;. - 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // } else {. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // tmpvar_5 = tmpv - 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, // ar_1.w;. }; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, // . tmpvar_4 - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // = tmpvar_5;. - 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, // };. tmpvar_3 - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, // = tmpvar_4;. }; - 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, // . vec4 tmpvar_6 - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x78, 0x79, 0x7a, // ;. tmpvar_6.xyz - 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, // = v_color0.xyz; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x77, 0x20, 0x3d, 0x20, // . tmpvar_6.w = - 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x74, 0x6d, // (v_color0.w * tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, // pvar_3);. gl_Fr - 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // agColor = tmpvar - 0x5f, 0x36, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _6;.}... + 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, // xColor;..in vec4 + 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, // v_texcoord0;.la + 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // yout(location = + 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, // 0) out vec4 bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, // _FragColor;.in v + 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, // ec4 v_color0;..v + 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, // oid main().{. + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, // vec4 _20 = text + 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, // ure(s_texColor, + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, // v_texcoord0.xyz) + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x33, 0x33, 0x20, 0x3d, 0x20, // ;. int _33 = + 0x69, 0x6e, 0x74, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // int((v_texcoord0 + 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, // .w * 4.0) + 0.5) + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x30, // ;. float _110 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x33, 0x33, 0x20, 0x3c, 0x20, // ;. if (_33 < + 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 1). {. + 0x20, 0x5f, 0x31, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, // _110 = _20.z;. + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, // }. else. + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // {. floa + 0x74, 0x20, 0x5f, 0x31, 0x30, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // t _109;. + 0x69, 0x66, 0x20, 0x28, 0x5f, 0x33, 0x33, 0x20, 0x3c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, // if (_33 < 2). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x79, 0x3b, // _109 = _20.y; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . }. + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // {. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // oat _108;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x33, 0x33, 0x20, 0x3c, 0x20, // if (_33 < + 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, // 3). { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x5f, 0x31, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x78, 0x3b, 0x0a, 0x20, // _108 = _20.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x38, // _108 + 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _20.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x3b, // _109 = _108; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . }. + 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x39, 0x3b, 0x0a, // _110 = _109;. + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // }. bgfx_F + 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // ragColor = vec4( + 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x5f, // v_color0.xyz, v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x29, // color0.w * _110) + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... }; -static const uint8_t fs_font_basic_essl[808] = +static const uint8_t fs_font_basic_essl[868] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x73, // FSH............s 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // .......varying h + 0x00, 0x00, 0x00, 0x3c, 0x03, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, // ...<...precision + 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, // mediump float;. + 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // precision highp + 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, // int;..uniform hi + 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, // ghp samplerCube + 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, // s_texColor;..in + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // highp vec4 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // coord0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, // ocation = 0) out + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, // highp vec4 bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, // _FragColor;.in h 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ighp vec4 v_colo - 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, // r0;.varying high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // p vec4 v_texcoor - 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6c, 0x6f, 0x77, 0x70, // d0;.uniform lowp - 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, // samplerCube s_t - 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // exColor;.void ma - 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, // in ().{. lowp v - 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, // ec4 tmpvar_1;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, // tmpvar_1 = textu - 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, // reCube (s_texCol - 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, // or, v_texcoord0. - 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, // xyz);. highp in - 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // t tmpvar_2;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, 0x76, // pvar_2 = int(((v - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, // _texcoord0.w * 4 - 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, // .0) + 0.5));. l - 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // owp float tmpvar - 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // _3;. if ((tmpva - 0x72, 0x5f, 0x32, 0x20, 0x3c, 0x20, 0x31, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // r_2 < 1)) {. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // tmpvar_3 = tmpva - 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, // r_1.z;. } else - 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // {. lowp float - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, // tmpvar_4;. i - 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3c, 0x20, 0x32, // f ((tmpvar_2 < 2 - 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // )) {. tmpva - 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x79, // r_4 = tmpvar_1.y - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, // ;. } else {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // lowp float - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // tmpvar_5;. - 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3c, 0x20, // if ((tmpvar_2 < - 0x33, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, // 3)) {. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // pvar_5 = tmpvar_ - 0x31, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, // 1.x;. } els - 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // e {. tmpv - 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // ar_5 = tmpvar_1. - 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // w;. };. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // tmpvar_4 = tmp - 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, // var_5;. };. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // tmpvar_3 = tmp - 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, // var_4;. };. lo - 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, // wp vec4 tmpvar_6 - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x78, 0x79, 0x7a, // ;. tmpvar_6.xyz - 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, // = v_color0.xyz; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x77, 0x20, 0x3d, 0x20, // . tmpvar_6.w = - 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x74, 0x6d, // (v_color0.w * tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, // pvar_3);. gl_Fr - 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // agColor = tmpvar - 0x5f, 0x36, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _6;.}... + 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, // r0;..void main() + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // .{. highp vec + 0x34, 0x20, 0x5f, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, // 4 _20 = texture( + 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, // s_texColor, v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, // xcoord0.xyz);. + 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, // int _33 = int( + 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, // (v_texcoord0.w * + 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, // 4.0) + 0.5);. + 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, // highp float _1 + 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x33, 0x33, 0x20, // 10;. if (_33 + 0x3c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // < 1). {. + 0x20, 0x20, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x7a, 0x3b, // _110 = _20.z; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, // . }. else. + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, // {. hi + 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x39, 0x3b, 0x0a, // ghp float _109;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x33, 0x33, 0x20, // if (_33 + 0x3c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // < 2). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x39, 0x20, // _109 + 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _20.y;. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, // }. else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // highp floa + 0x74, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // t _108;. + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x33, 0x33, 0x20, 0x3c, 0x20, 0x33, 0x29, // if (_33 < 3) + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, // _ + 0x31, 0x30, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 108 = _20.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x20, 0x3d, // _108 = + 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _20.w;. + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x5f, 0x31, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x38, 0x3b, 0x0a, 0x20, // _109 = _108;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x5f, 0x31, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x39, 0x3b, 0x0a, 0x20, 0x20, // _110 = _109;. + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // }. bgfx_Fra + 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x76, 0x5f, // gColor = vec4(v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x5f, 0x63, 0x6f, // color0.xyz, v_co + 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x29, 0x3b, 0x0a, // lor0.w * _110);. + 0x7d, 0x0a, 0x0a, 0x00, // }... }; static const uint8_t fs_font_basic_spv[1379] = { diff --git a/examples/common/font/fs_font_distance_field.bin.h b/examples/common/font/fs_font_distance_field.bin.h index f200e4f4c..0a2967c84 100644 --- a/examples/common/font/fs_font_distance_field.bin.h +++ b/examples/common/font/fs_font_distance_field.bin.h @@ -1,134 +1,89 @@ -static const uint8_t fs_font_distance_field_glsl[971] = +static const uint8_t fs_font_distance_field_glsl[593] = { - 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x73, // FSH............s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, // ....u_params.... - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // ..........varyin - 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // g vec4 v_color0; - 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // .varying vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // texcoord0;.unifo + 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x75, // FSH............u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // _params......... + 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, // ..s_texColor.... + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x02, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // ...........unifo 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, // rm samplerCube s 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // _texColor;.unifo 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // rm vec4 u_params - 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, // ;.void main ().{ - 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, // . float rgba_1[ - 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // 4];. vec4 tmpva - 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, // r_2;. tmpvar_2 - 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, // = textureCube (s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // _texColor, v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, // coord0.xyz);. i - 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, // nt tmpvar_3;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, // mpvar_3 = int((( + 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // ;..in vec4 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // coord0;.in vec4 + 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // v_color0;.layout + 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, // (location = 0) o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // ut vec4 bgfx_Fra + 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // gColor;..void ma + 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // in().{. vec4 + 0x5f, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, // _20 = texture(s_ + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // texColor, v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // oord0.xyz);. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, // float rgba[4];. + 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, // rgba[0] = _20 + 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x31, 0x5d, 0x20, // .z;. rgba[1] + 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, // = _20.y;. rgb + 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, // a[2] = _20.x;. + 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, // rgba[3] = _20. + 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x36, // w;. float _76 + 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x66, 0x77, 0x69, 0x64, 0x74, // = (length(fwidt + 0x68, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, // h(v_texcoord0.xy + 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x31, 0x31, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x30, 0x38, 0x33, // z)) * 11.3137083 + 0x30, 0x35, 0x33, 0x35, 0x38, 0x38, 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, // 0535888671875) * + 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, // u_params.y;. + 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, // bgfx_FragColor + 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, // = vec4(v_color0. + 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, // xyz, smoothstep( + 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x37, 0x36, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2b, // 0.5 - _76, 0.5 + + 0x20, 0x5f, 0x37, 0x36, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x69, 0x6e, 0x74, 0x28, 0x28, // _76, rgba[int(( 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, // v_texcoord0.w * - 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // 4.0) + 0.5));. - 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // rgba_1[0] = tmpv - 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, // ar_2.z;. rgba_1 - 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x79, // [1] = tmpvar_2.y - 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, // ;. rgba_1[2] = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, // tmpvar_2.x;. rg - 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ba_1[3] = tmpvar - 0x5f, 0x32, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, // _2.w;. vec3 tmp - 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_4;. tmpvar_ - 0x34, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, // 4 = (abs(dFdx(v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, // texcoord0.xyz)) - 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, // + abs(dFdy(v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, // coord0.xyz)));. - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, // float tmpvar_5; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x28, // . tmpvar_5 = (( - 0x28, 0x31, 0x36, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x71, 0x72, // (16.0 * . sqr - 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2c, // t(dot (tmpvar_4, - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x20, // tmpvar_4)). ) - 0x2f, 0x20, 0x31, 0x2e, 0x34, 0x31, 0x34, 0x32, 0x31, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, // / 1.414214) * u_ - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, // params.y);. flo - 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x64, // at edge0_6;. ed - 0x67, 0x65, 0x30, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x74, // ge0_6 = (0.5 - t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // mpvar_5);. floa - 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // t tmpvar_7;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, // pvar_7 = clamp ( - 0x28, 0x28, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ((rgba_1[tmpvar_ - 0x33, 0x5d, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x36, 0x29, 0x20, 0x2f, 0x20, // 3] - edge0_6) / - 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, // (. (0.5 + tmp - 0x76, 0x61, 0x72, 0x5f, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, // var_5). - edge - 0x30, 0x5f, 0x36, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, // 0_6)), 0.0, 1.0) - 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ;. vec4 tmpvar_ - 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x2e, 0x78, 0x79, // 8;. tmpvar_8.xy - 0x7a, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, // z = v_color0.xyz - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x2e, 0x77, 0x20, 0x3d, // ;. tmpvar_8.w = - 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x2a, 0x20, 0x28, 0x74, // ((tmpvar_7 * (t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, // mpvar_7 * . ( - 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, // 3.0 - (2.0 * tmp - 0x76, 0x61, 0x72, 0x5f, 0x37, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, // var_7)). )) * v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, // _color0.w);. gl - 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // _FragColor = tmp - 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // var_8;.}... + 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x5d, 0x29, 0x20, 0x2a, 0x20, // 4.0) + 0.5)]) * + 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, // v_color0.w);.}.. + 0x00, // . }; -static const uint8_t fs_font_distance_field_essl[1038] = +static const uint8_t fs_font_distance_field_essl[687] = { - 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x73, // FSH............s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, // ....u_params.... - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x03, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // ..........varyin - 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, // g highp vec4 v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // olor0;.varying h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // ighp vec4 v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6c, // oord0;.uniform l - 0x6f, 0x77, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, // owp samplerCube - 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // s_texColor;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, // orm highp vec4 u - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // _params;.void ma - 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, // in ().{. lowp f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, // loat rgba_1[4];. - 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, // lowp vec4 tmpv - 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // ar_2;. tmpvar_2 - 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, // = textureCube ( + 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x75, // FSH............u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // _params......... + 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, // ..s_texColor.... + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x02, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, // ......t...precis + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // ion mediump floa + 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, // t;.precision hig + 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // hp int;..uniform + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, // highp samplerCu + 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, // be s_texColor;.u + 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // niform highp vec + 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, // 4 u_params;..in + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // highp vec4 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // coord0;.in highp + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, // vec4 v_color0;. + 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, // layout(location + 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // = 0) out highp v + 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, // ec4 bgfx_FragCol + 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, // or;..void main() + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // .{. highp vec + 0x34, 0x20, 0x5f, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, // 4 _20 = texture( 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, // s_texColor, v_te 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, // xcoord0.xyz);. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // highp int tmpvar - 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3d, // _3;. tmpvar_3 = - 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // int(((v_texcoor - 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, // d0.w * 4.0) + 0. - 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x30, 0x5d, // 5));. rgba_1[0] - 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, // = tmpvar_2.z;. - 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // rgba_1[1] = tmp - 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, // var_2.y;. rgba_ - 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, // 1[2] = tmpvar_2. - 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x33, 0x5d, 0x20, 0x3d, // x;. rgba_1[3] = - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x68, // tmpvar_2.w;. h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ighp vec3 tmpvar - 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, // _4;. tmpvar_4 = - 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, // (abs(dFdx(v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x61, // coord0.xyz)) + a - 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // bs(dFdy(v_texcoo - 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, // rd0.xyz)));. hi - 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ghp float tmpvar - 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, // _5;. tmpvar_5 = - 0x20, 0x28, 0x28, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, // (((16.0 * . - 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // sqrt(dot (tmpvar - 0x5f, 0x34, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x29, 0x29, 0x0a, 0x20, // _4, tmpvar_4)). - 0x20, 0x29, 0x20, 0x2f, 0x20, 0x31, 0x2e, 0x34, 0x31, 0x34, 0x32, 0x31, 0x34, 0x29, 0x20, 0x2a, // ) / 1.414214) * - 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, // u_params.y);. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, // highp float edge - 0x30, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x36, 0x20, 0x3d, // 0_6;. edge0_6 = - 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, // (0.5 - tmpvar_5 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // );. lowp float - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // tmpvar_7;. tmpv - 0x61, 0x72, 0x5f, 0x37, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, // ar_7 = clamp ((( - 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x5d, // rgba_1[tmpvar_3] - 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x36, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, // - edge0_6) / (. - 0x20, 0x20, 0x20, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // (0.5 + tmpva - 0x72, 0x5f, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, // r_5). - edge0_ - 0x36, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, // 6)), 0.0, 1.0);. - 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, // lowp vec4 tmpv - 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, // ar_8;. tmpvar_8 - 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, // .xyz = v_color0. - 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x2e, // xyz;. tmpvar_8. - 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x2a, // w = ((tmpvar_7 * - 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, // (tmpvar_7 * . - 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, // (3.0 - (2.0 * - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x20, // tmpvar_7)). )) - 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, // * v_color0.w);. - 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, // gl_FragColor = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // tmpvar_8;.}... + 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, // highp float rg + 0x62, 0x61, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, // ba[4];. rgba[ + 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 0] = _20.z;. + 0x72, 0x67, 0x62, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x79, 0x3b, // rgba[1] = _20.y; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x5f, // . rgba[2] = _ + 0x32, 0x30, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x33, // 20.x;. rgba[3 + 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, // ] = _20.w;. h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x36, 0x20, 0x3d, // ighp float _76 = + 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, // (length(fwidth( + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, // v_texcoord0.xyz) + 0x29, 0x20, 0x2a, 0x20, 0x31, 0x31, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x30, 0x38, 0x33, 0x30, 0x35, // ) * 11.313708305 + 0x33, 0x35, 0x38, 0x38, 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x75, // 35888671875) * u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, // _params.y;. b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, // gfx_FragColor = + 0x76, 0x65, 0x63, 0x34, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, // vec4(v_color0.xy + 0x7a, 0x2c, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x30, 0x2e, // z, smoothstep(0. + 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x37, 0x36, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x5f, // 5 - _76, 0.5 + _ + 0x37, 0x36, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x76, 0x5f, // 76, rgba[int((v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, // texcoord0.w * 4. + 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x5d, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, // 0) + 0.5)]) * v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // color0.w);.}... }; static const uint8_t fs_font_distance_field_spv[1942] = { diff --git a/examples/common/font/fs_font_distance_field_drop_shadow.bin.h b/examples/common/font/fs_font_distance_field_drop_shadow.bin.h index 9e404250c..edd0be2a7 100644 --- a/examples/common/font/fs_font_distance_field_drop_shadow.bin.h +++ b/examples/common/font/fs_font_distance_field_drop_shadow.bin.h @@ -1,268 +1,173 @@ -static const uint8_t fs_font_distance_field_drop_shadow_glsl[2015] = +static const uint8_t fs_font_distance_field_drop_shadow_glsl[1253] = { - 0x46, 0x53, 0x48, 0x0b, 0x9e, 0x67, 0x7a, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x73, // FSH..gz........s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, // ....u_params.... - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x07, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // ..........varyin - 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // g vec4 v_color0; - 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // .varying vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // texcoord0;.varyi - 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // ng vec4 v_texcoo - 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, // rd2;.uniform sam - 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, // plerCube s_texCo - 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, // lor;.uniform vec - 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, // 4 u_params;.void - 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, // main ().{. flo - 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // at rgba_1[4];. - 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, // bool tmpvar_2;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x6e, 0x79, 0x28, // tmpvar_2 = any( - 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // equal (v_texcoor - 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, // d2.xyz, vec3(0.0 - 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, // , 0.0, 0.0)));. - 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, // if (!(tmpvar_2) - 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, // ) {. float rg - 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // ba2_3[4];. ve - 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, // c4 tmpvar_4;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, // tmpvar_4 = text - 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, // ureCube (s_texCo - 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, // lor, v_texcoord2 - 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x74, // .xyz);. int t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // mpvar_5;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, 0x76, 0x5f, // var_5 = int(((v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, // texcoord2.w * 4. - 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 0) + 0.5));. - 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // rgba2_3[0] = tmp - 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, // var_4.z;. rgb - 0x61, 0x32, 0x5f, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // a2_3[1] = tmpvar - 0x5f, 0x34, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, // _4.y;. rgba2_ - 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, // 3[2] = tmpvar_4. - 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, 0x33, // x;. rgba2_3[3 - 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x77, 0x3b, 0x0a, // ] = tmpvar_4.w;. - 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // vec3 tmpvar_ - 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x20, // 6;. tmpvar_6 - 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x74, 0x65, // = (abs(dFdx(v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, // xcoord2.xyz)) + - 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // abs(dFdy(v_texco - 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // ord2.xyz)));. - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, // float tmpvar_7; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x3d, 0x20, // . tmpvar_7 = - 0x28, 0x28, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x20, // (((. (16.0 - 0x2a, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, // * sqrt(dot (tmpv - 0x61, 0x72, 0x5f, 0x36, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x29, 0x29, // ar_6, tmpvar_6)) - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x20, 0x31, 0x2e, 0x34, 0x31, 0x34, 0x32, 0x31, // ). / 1.41421 - 0x34, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, // 4) * u_params.y) - 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, // * u_params.z);. - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, // float edge0_ - 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x38, 0x20, 0x3d, // 8;. edge0_8 = - 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, // (0.5 - tmpvar_7 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, // );. float tmp - 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // var_9;. tmpva - 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x72, // r_9 = clamp (((r - 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x5d, // gba2_3[tmpvar_5] - 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x38, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, // - edge0_8) / (. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, // (0.5 + tmp - 0x76, 0x61, 0x72, 0x5f, 0x37, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, // var_7). - ed - 0x67, 0x65, 0x30, 0x5f, 0x38, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, // ge0_8)), 0.0, 1. - 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, // 0);. vec4 tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // var_10;. tmpv - 0x61, 0x72, 0x5f, 0x31, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, // ar_10.xyz = v_co - 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, // lor0.xyz;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x6d, // pvar_10.w = ((tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // pvar_9 * (tmpvar - 0x5f, 0x39, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, // _9 * . (3.0 - 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // - (2.0 * tmpvar - 0x5f, 0x39, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, // _9)). )) * v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, // color0.w);. g - 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, // l_FragColor = tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, // pvar_10;. ret - 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // urn;. };. vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // tmpvar_11;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, // pvar_11 = textur - 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // eCube (s_texColo - 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, // r, v_texcoord0.x - 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // yz);. int tmpva - 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // r_12;. tmpvar_1 - 0x32, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // 2 = int(((v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, // oord0.w * 4.0) + - 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, // 0.5));. rgba_1 - 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x2e, // [0] = tmpvar_11. - 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x3d, // z;. rgba_1[1] = - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, // tmpvar_11.y;. - 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // rgba_1[2] = tmpv - 0x61, 0x72, 0x5f, 0x31, 0x31, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, // ar_11.x;. rgba_ - 0x31, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, // 1[3] = tmpvar_11 - 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // .w;. vec3 tmpva - 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // r_13;. tmpvar_1 - 0x33, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, // 3 = (abs(dFdx(v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, // texcoord0.xyz)) - 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, // + abs(dFdy(v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, // coord0.xyz)));. - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, // float tmpvar_14 - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x20, 0x3d, 0x20, // ;. tmpvar_14 = - 0x28, 0x28, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, // (((16.0 * . s - 0x71, 0x72, 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // qrt(dot (tmpvar_ - 0x31, 0x33, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x29, 0x29, 0x0a, // 13, tmpvar_13)). - 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x31, 0x2e, 0x34, 0x31, 0x34, 0x32, 0x31, 0x34, 0x29, 0x20, // ) / 1.414214) - 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, // * u_params.y);. - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x35, 0x3b, // float edge0_15; - 0x0a, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x30, // . edge0_15 = (0 - 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x29, 0x3b, // .5 - tmpvar_14); - 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // . float tmpvar_ - 0x31, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x20, // 16;. tmpvar_16 - 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x72, 0x67, 0x62, 0x61, 0x5f, // = clamp (((rgba_ - 0x31, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x5d, 0x20, 0x2d, 0x20, 0x65, // 1[tmpvar_12] - e - 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x35, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, // dge0_15) / (. - 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // (0.5 + tmpvar_1 - 0x34, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x35, // 4). - edge0_15 - 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, // )), 0.0, 1.0);. - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x37, 0x3b, // vec4 tmpvar_17; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x37, 0x2e, 0x78, 0x79, 0x7a, // . tmpvar_17.xyz - 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, // = v_color0.xyz; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x37, 0x2e, 0x77, 0x20, 0x3d, // . tmpvar_17.w = - 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x20, 0x2a, 0x20, 0x28, // ((tmpvar_16 * ( - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, // tmpvar_16 * . - 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, // (3.0 - (2.0 * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x20, // mpvar_16)). )) - 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, // * v_color0.w);. - 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, // gl_FragColor = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x37, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // tmpvar_17;.}... -}; -static const uint8_t fs_font_distance_field_drop_shadow_essl[2132] = -{ - 0x46, 0x53, 0x48, 0x0b, 0x9e, 0x67, 0x7a, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x73, // FSH..gz........s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, // ....u_params.... - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x08, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // ..........varyin - 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, // g highp vec4 v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // olor0;.varying h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // ighp vec4 v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // oord0;.varying h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // ighp vec4 v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6c, // oord2;.uniform l - 0x6f, 0x77, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, // owp samplerCube - 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // s_texColor;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, // orm highp vec4 u - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // _params;.void ma - 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, // in ().{. lowp f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, // loat rgba_1[4];. - 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, // bool tmpvar_2; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x6e, // . tmpvar_2 = an - 0x79, 0x28, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // y(equal (v_texco - 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, // ord2.xyz, vec3(0 - 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, // .0, 0.0, 0.0))); - 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // . if (!(tmpvar_ - 0x32, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, // 2)) {. lowp f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, 0x34, 0x5d, 0x3b, // loat rgba2_3[4]; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, // . lowp vec4 t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // mpvar_4;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, // var_4 = textureC - 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, // ube (s_texColor, - 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, // v_texcoord2.xyz - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, // );. highp int - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // tmpvar_5;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, // mpvar_5 = int((( - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x77, 0x20, 0x2a, 0x20, // v_texcoord2.w * - 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // 4.0) + 0.5));. - 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, // rgba2_3[0] = t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, // mpvar_4.z;. r - 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // gba2_3[1] = tmpv - 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, // ar_4.y;. rgba - 0x32, 0x5f, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // 2_3[2] = tmpvar_ - 0x34, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, // 4.x;. rgba2_3 - 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x77, // [3] = tmpvar_4.w - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, // ;. highp vec3 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // tmpvar_6;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x64, // mpvar_6 = (abs(d - 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, // Fdx(v_texcoord2. - 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x79, // xyz)) + abs(dFdy + 0x46, 0x53, 0x48, 0x0b, 0x9e, 0x67, 0x7a, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x75, // FSH..gz........u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // _params......... + 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, // ..s_texColor.... + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x04, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // ...........unifo + 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, // rm samplerCube s + 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // _texColor;.unifo + 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // rm vec4 u_params + 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // ;..in vec4 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // coord2;.in vec4 + 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // v_color0;.layout + 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, // (location = 0) o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // ut vec4 bgfx_Fra + 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // gColor;.in vec4 + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, // v_texcoord0;..vo + 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // id main().{. + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // do. {. + 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x6e, 0x79, 0x28, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x28, // if (!any(equal( + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x2c, // v_texcoord2.xyz, + 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, // vec3(0.0)))). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x74, // vec4 _33 = t + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // exture(s_texColo + 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, // r, v_texcoord2.x + 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // yz);. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x34, 0x5d, 0x3b, // float rgba2[4]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, // . rgb + 0x61, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, // a2[0] = _33.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, // rgba2 + 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, // [1] = _33.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x32, // rgba2[2 + 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // ] = _33.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x33, 0x5d, 0x20, // rgba2[3] + 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _33.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x31, 0x20, 0x3d, // float _91 = + 0x20, 0x28, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, // ((length(fwidth 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, // (v_texcoord2.xyz - 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, // )));. highp f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, // loat tmpvar_7;. - 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x28, // tmpvar_7 = (( - 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x20, 0x2a, 0x20, // (. (16.0 * - 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // sqrt(dot (tmpvar - 0x5f, 0x36, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x29, 0x29, 0x29, 0x0a, // _6, tmpvar_6))). - 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x20, 0x31, 0x2e, 0x34, 0x31, 0x34, 0x32, 0x31, 0x34, 0x29, // / 1.414214) - 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x20, 0x2a, // * u_params.y) * - 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, // u_params.z);. - 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, // highp float ed - 0x67, 0x65, 0x30, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, // ge0_8;. edge0 - 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, // _8 = (0.5 - tmpv - 0x61, 0x72, 0x5f, 0x37, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, // ar_7);. lowp - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, // float tmpvar_9;. - 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x63, // tmpvar_9 = c - 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, // lamp (((rgba2_3[ - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x5d, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, // tmpvar_5] - edge - 0x30, 0x5f, 0x38, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, // 0_8) / (. ( - 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x29, 0x0a, // 0.5 + tmpvar_7). - 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x38, 0x29, 0x29, // - edge0_8)) - 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // , 0.0, 1.0);. - 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // lowp vec4 tmpva - 0x72, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // r_10;. tmpvar - 0x5f, 0x31, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // _10.xyz = v_colo - 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // r0.xyz;. tmpv - 0x61, 0x72, 0x5f, 0x31, 0x30, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, // ar_10.w = ((tmpv - 0x61, 0x72, 0x5f, 0x39, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, // ar_9 * (tmpvar_9 - 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, // * . (3.0 - - 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, // (2.0 * tmpvar_9 - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, // )). )) * v_co - 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, // lor0.w);. gl_ - 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // FragColor = tmpv - 0x61, 0x72, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, // ar_10;. retur - 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, // n;. };. lowp v - 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, // ec4 tmpvar_11;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, // tmpvar_11 = tex - 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // tureCube (s_texC - 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // olor, v_texcoord - 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // 0.xyz);. highp - 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, // int tmpvar_12;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, // tmpvar_12 = int - 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, // (((v_texcoord0.w - 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, // * 4.0) + 0.5)); - 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, // . rgba_1[0] = t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, // mpvar_11.z;. rg - 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ba_1[1] = tmpvar - 0x5f, 0x31, 0x31, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, // _11.y;. rgba_1[ - 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x2e, 0x78, // 2] = tmpvar_11.x - 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, // ;. rgba_1[3] = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x68, // tmpvar_11.w;. h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ighp vec3 tmpvar - 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, // _13;. tmpvar_13 - 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x74, // = (abs(dFdx(v_t - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2b, // excoord0.xyz)) + - 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // abs(dFdy(v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // oord0.xyz)));. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, // highp float tmpv - 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ar_14;. tmpvar_ - 0x31, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x0a, // 14 = (((16.0 * . - 0x20, 0x20, 0x20, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, // sqrt(dot (tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // pvar_13, tmpvar_ - 0x31, 0x33, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x31, 0x2e, 0x34, 0x31, 0x34, // 13)). ) / 1.414 - 0x32, 0x31, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, // 214) * u_params. - 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // y);. highp floa - 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x64, // t edge0_15;. ed - 0x67, 0x65, 0x30, 0x5f, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, // ge0_15 = (0.5 - - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, // tmpvar_14);. lo - 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // wp float tmpvar_ - 0x31, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x20, // 16;. tmpvar_16 - 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x72, 0x67, 0x62, 0x61, 0x5f, // = clamp (((rgba_ - 0x31, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x5d, 0x20, 0x2d, 0x20, 0x65, // 1[tmpvar_12] - e - 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x35, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, // dge0_15) / (. - 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // (0.5 + tmpvar_1 - 0x34, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x35, // 4). - edge0_15 - 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, // )), 0.0, 1.0);. - 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // lowp vec4 tmpva - 0x72, 0x5f, 0x31, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // r_17;. tmpvar_1 - 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // 7.xyz = v_color0 - 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // .xyz;. tmpvar_1 - 0x37, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // 7.w = ((tmpvar_1 - 0x36, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x20, 0x2a, // 6 * (tmpvar_16 * - 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, // . (3.0 - (2. - 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x29, 0x29, 0x0a, // 0 * tmpvar_16)). - 0x20, 0x20, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, // )) * v_color0. - 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, // w);. gl_FragCol - 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x37, 0x3b, 0x0a, // or = tmpvar_17;. - 0x7d, 0x0a, 0x0a, 0x00, // }... + 0x29, 0x29, 0x20, 0x2a, 0x20, 0x31, 0x31, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x30, 0x38, 0x33, 0x30, // )) * 11.31370830 + 0x35, 0x33, 0x35, 0x38, 0x38, 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, // 535888671875) * + 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, // u_params.y) * u_ + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // params.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, // bgfx_FragC + 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x76, 0x5f, 0x63, 0x6f, // olor = vec4(v_co + 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, // lor0.xyz, smooth + 0x73, 0x74, 0x65, 0x70, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x39, 0x31, 0x2c, 0x20, // step(0.5 - _91, + 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x31, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, // 0.5 + _91, rgba2 + 0x5b, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // [int((v_texcoord + 0x32, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, // 2.w * 4.0) + 0.5 + 0x29, 0x5d, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, // )]) * v_color0.w + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, // );. b + 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // reak;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x32, // vec4 _12 + 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, // 1 = texture(s_te + 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // xColor, v_texcoo + 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // rd0.xyz);. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x34, 0x5d, 0x3b, // float rgba[4]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x30, 0x5d, // . rgba[0] + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _121.z;. + 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, // rgba[1] = _12 + 0x31, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, // 1.y;. rgb + 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x2e, 0x78, 0x3b, 0x0a, 0x20, // a[2] = _121.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, // rgba[3] = + 0x20, 0x5f, 0x31, 0x32, 0x31, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _121.w;. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x6c, // float _154 = (l + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x76, 0x5f, 0x74, // ength(fwidth(v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, // excoord0.xyz)) * + 0x20, 0x31, 0x31, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x30, 0x38, 0x33, 0x30, 0x35, 0x33, 0x35, 0x38, // 11.313708305358 + 0x38, 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, // 88671875) * u_pa + 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // rams.y;. + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, // bgfx_FragColor = + 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, // vec4(v_color0.x + 0x79, 0x7a, 0x2c, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x30, // yz, smoothstep(0 + 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2b, // .5 - _154, 0.5 + + 0x20, 0x5f, 0x31, 0x35, 0x34, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x69, 0x6e, 0x74, 0x28, // _154, rgba[int( + 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, // (v_texcoord0.w * + 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x5d, 0x29, 0x20, 0x2a, // 4.0) + 0.5)]) * + 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, // v_color0.w);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, // break;. + 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, // } while(false); + 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... +}; +static const uint8_t fs_font_distance_field_drop_shadow_essl[1371] = +{ + 0x46, 0x53, 0x48, 0x0b, 0x9e, 0x67, 0x7a, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x75, // FSH..gz........u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // _params......... + 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, // ..s_texColor.... + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x05, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, // ...... ...precis + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // ion mediump floa + 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, // t;.precision hig + 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // hp int;..uniform + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, // highp samplerCu + 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, // be s_texColor;.u + 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // niform highp vec + 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, // 4 u_params;..in + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // highp vec4 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // coord2;.in highp + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, // vec4 v_color0;. + 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, // layout(location + 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // = 0) out highp v + 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, // ec4 bgfx_FragCol + 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // or;.in highp vec + 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x0a, // 4 v_texcoord0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // do. {. + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x6e, 0x79, 0x28, 0x65, 0x71, 0x75, 0x61, // if (!any(equa + 0x6c, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, // l(v_texcoord2.xy + 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x0a, // z, vec3(0.0)))). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // highp vec4 + 0x20, 0x5f, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, // _33 = texture(s + 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // _texColor, v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // coord2.xyz);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, // highp f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, // loat rgba2[4];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, // rgba2 + 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, // [0] = _33.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x31, // rgba2[1 + 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // ] = _33.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x32, 0x5d, 0x20, // rgba2[2] + 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _33.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, // rgba2[3] = + 0x5f, 0x33, 0x33, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _33.w;. + 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // highp float _ + 0x39, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x66, 0x77, // 91 = ((length(fw + 0x69, 0x64, 0x74, 0x68, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, // idth(v_texcoord2 + 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x31, 0x31, 0x2e, 0x33, 0x31, 0x33, 0x37, // .xyz)) * 11.3137 + 0x30, 0x38, 0x33, 0x30, 0x35, 0x33, 0x35, 0x38, 0x38, 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, // 0830535888671875 + 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x20, // ) * u_params.y) + 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, // * u_params.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // bgfx_F + 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // ragColor = vec4( + 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x73, 0x6d, // v_color0.xyz, sm + 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x5f, // oothstep(0.5 - _ + 0x39, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x31, 0x2c, 0x20, 0x72, // 91, 0.5 + _91, r + 0x67, 0x62, 0x61, 0x32, 0x5b, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // gba2[int((v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, // oord2.w * 4.0) + + 0x20, 0x30, 0x2e, 0x35, 0x29, 0x5d, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // 0.5)]) * v_colo + 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // r0.w);. + 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, // }. high + 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, // p vec4 _121 = te + 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // xture(s_texColor + 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, // , v_texcoord0.xy + 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, // z);. high + 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x34, 0x5d, 0x3b, // p float rgba[4]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x30, 0x5d, // . rgba[0] + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _121.z;. + 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, // rgba[1] = _12 + 0x31, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, // 1.y;. rgb + 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x2e, 0x78, 0x3b, 0x0a, 0x20, // a[2] = _121.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, // rgba[3] = + 0x20, 0x5f, 0x31, 0x32, 0x31, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _121.w;. + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x35, // highp float _15 + 0x34, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x66, 0x77, 0x69, 0x64, // 4 = (length(fwid + 0x74, 0x68, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, // th(v_texcoord0.x + 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x31, 0x31, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x30, 0x38, // yz)) * 11.313708 + 0x33, 0x30, 0x35, 0x33, 0x35, 0x38, 0x38, 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x29, 0x20, // 30535888671875) + 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, // * u_params.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, // bgfx_FragC + 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x76, 0x5f, 0x63, 0x6f, // olor = vec4(v_co + 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, // lor0.xyz, smooth + 0x73, 0x74, 0x65, 0x70, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x2c, // step(0.5 - _154, + 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x35, 0x34, 0x2c, 0x20, 0x72, 0x67, 0x62, // 0.5 + _154, rgb + 0x61, 0x5b, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // a[int((v_texcoor + 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, // d0.w * 4.0) + 0. + 0x35, 0x29, 0x5d, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, // 5)]) * v_color0. + 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, // w);. brea + 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, // k;. } while(f + 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // alse);.}... }; static const uint8_t fs_font_distance_field_drop_shadow_spv[3078] = { diff --git a/examples/common/font/fs_font_distance_field_drop_shadow_image.bin.h b/examples/common/font/fs_font_distance_field_drop_shadow_image.bin.h index aca6d37fb..ed620b491 100644 --- a/examples/common/font/fs_font_distance_field_drop_shadow_image.bin.h +++ b/examples/common/font/fs_font_distance_field_drop_shadow_image.bin.h @@ -1,308 +1,204 @@ -static const uint8_t fs_font_distance_field_drop_shadow_image_glsl[2327] = +static const uint8_t fs_font_distance_field_drop_shadow_image_glsl[1493] = { - 0x46, 0x53, 0x48, 0x0b, 0x9e, 0x67, 0x7a, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x73, // FSH..gz........s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, // ....u_params.... - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x08, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // ..........varyin - 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // g vec4 v_color0; - 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // .varying vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // texcoord0;.varyi - 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // ng vec4 v_texcoo - 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, // rd1;.varying vec - 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x75, // 4 v_texcoord2;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, // niform samplerCu - 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, // be s_texColor;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, // niform vec4 u_pa - 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, // rams;.void main - 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, // ().{. float rgb - 0x61, 0x5f, 0x31, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x74, // a_1[4];. bool t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_2;. tmpva - 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x6e, 0x79, 0x28, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, // r_2 = any(equal - 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, // (v_texcoord2.xyz - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, // , vec3(0.0, 0.0, - 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, // 0.0)));. if (! - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, // (tmpvar_2)) {. - 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, // float rgba2_3[ - 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, // 4];. vec4 tmp - 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // var_4;. tmpva - 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, // r_4 = textureCub - 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, // e (s_texColor, v - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, // _texcoord2.xyz); - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // . int tmpvar_ - 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, // 5;. tmpvar_5 - 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // = int(((v_texcoo - 0x72, 0x64, 0x32, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, // rd2.w * 4.0) + 0 - 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, // .5));. rgba2_ - 0x33, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, // 3[0] = tmpvar_4. - 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, 0x31, // z;. rgba2_3[1 - 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x79, 0x3b, 0x0a, // ] = tmpvar_4.y;. - 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x3d, // rgba2_3[2] = - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, // tmpvar_4.x;. - 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, // rgba2_3[3] = tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // pvar_4.w;. ve - 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, // c3 tmpvar_6;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, // tmpvar_6 = (abs - 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // (dFdx(v_texcoord - 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, // 2.xyz)) + abs(dF - 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, // dy(v_texcoord2.x - 0x79, 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // yz)));. float - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // tmpvar_7;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x0a, 0x20, 0x20, // mpvar_7 = (((. - 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x73, 0x71, 0x72, 0x74, // (16.0 * sqrt - 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2c, 0x20, // (dot (tmpvar_6, - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, // tmpvar_6))). - 0x20, 0x2f, 0x20, 0x31, 0x2e, 0x34, 0x31, 0x34, 0x32, 0x31, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x75, // / 1.414214) * u - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, // _params.y) * u_p - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // arams.z);. fl - 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, // oat edge0_8;. - 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, // edge0_8 = (0.5 - 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // - tmpvar_7);. - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, // float tmpvar_9; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, // . tmpvar_9 = - 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, // clamp (((rgba2_3 - 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x5d, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, // [tmpvar_5] - edg - 0x65, 0x30, 0x5f, 0x38, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // e0_8) / (. - 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x29, // (0.5 + tmpvar_7) - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x38, 0x29, // . - edge0_8) - 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // ), 0.0, 1.0);. - 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, // vec4 tmpvar_10 - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x2e, // ;. tmpvar_10. - 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, // xyz = v_color0.x - 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // yz;. tmpvar_1 - 0x30, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, // 0.w = ((tmpvar_9 - 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x2a, 0x20, 0x0a, // * (tmpvar_9 * . - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, // (3.0 - (2. - 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, 0x29, 0x0a, 0x20, // 0 * tmpvar_9)). - 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // )) * v_color0 - 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, // .w);. gl_Frag - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // Color = tmpvar_1 - 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x20, // 0;. return;. - 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6e, 0x79, 0x28, 0x65, 0x71, // };. if (any(eq - 0x75, 0x61, 0x6c, 0x20, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // ual (v_texcoord0 - 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, // .xyz, vec3(0.0, - 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, // 0.0, 0.0)))) {. - 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // vec4 tmpvar_1 - 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, // 1;. tmpvar_11 - 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, // = textureCube ( - 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, // s_texColor, v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, // xcoord1.xyz);. - 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, // vec4 tmpvar_12 - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x2e, // ;. tmpvar_12. - 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x2e, // xyz = tmpvar_11. - 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // xyz;. tmpvar_ - 0x31, 0x32, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // 12.w = (tmpvar_1 - 0x31, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, // 1.w * v_color0.w - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // );. gl_FragCo - 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, // lor = tmpvar_12; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x7d, // . return;. } - 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ;. vec4 tmpvar_ - 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x20, // 13;. tmpvar_13 - 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, // = textureCube (s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // _texColor, v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, // coord0.xyz);. i - 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, // nt tmpvar_14;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, // tmpvar_14 = int( - 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, // ((v_texcoord0.w - 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, // * 4.0) + 0.5));. - 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, // rgba_1[0] = tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, // pvar_13.z;. rgb - 0x61, 0x5f, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // a_1[1] = tmpvar_ - 0x31, 0x33, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x32, // 13.y;. rgba_1[2 - 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x2e, 0x78, 0x3b, // ] = tmpvar_13.x; - 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x74, // . rgba_1[3] = t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, // mpvar_13.w;. ve - 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x3b, 0x0a, 0x20, 0x20, // c3 tmpvar_15;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, // tmpvar_15 = (abs - 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // (dFdx(v_texcoord - 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, // 0.xyz)) + abs(dF - 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, // dy(v_texcoord0.x - 0x79, 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, // yz)));. float t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // mpvar_16;. tmpv - 0x61, 0x72, 0x5f, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x20, // ar_16 = (((16.0 - 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, // * . sqrt(dot - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, // (tmpvar_15, tmpv - 0x61, 0x72, 0x5f, 0x31, 0x35, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x31, 0x2e, // ar_15)). ) / 1. - 0x34, 0x31, 0x34, 0x32, 0x31, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // 414214) * u_para - 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, // ms.y);. float e - 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, // dge0_17;. edge0 - 0x5f, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, // _17 = (0.5 - tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // var_16);. float - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // tmpvar_18;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, // pvar_18 = clamp - 0x28, 0x28, 0x28, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // (((rgba_1[tmpvar - 0x5f, 0x31, 0x34, 0x5d, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x37, 0x29, // _14] - edge0_17) - 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, // / (. (0.5 + - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, // tmpvar_16). - - 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x37, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, // edge0_17)), 0.0, - 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, // 1.0);. vec4 tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // pvar_19;. tmpva - 0x72, 0x5f, 0x31, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // r_19.xyz = v_col - 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // or0.xyz;. tmpva - 0x72, 0x5f, 0x31, 0x39, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // r_19.w = ((tmpva - 0x72, 0x5f, 0x31, 0x38, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // r_18 * (tmpvar_1 - 0x38, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, // 8 * . (3.0 - - 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, // (2.0 * tmpvar_18 - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // )). )) * v_colo - 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, // r0.w);. gl_Frag - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // Color = tmpvar_1 - 0x39, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 9;.}... + 0x46, 0x53, 0x48, 0x0b, 0x9e, 0x67, 0x7a, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x75, // FSH..gz........u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // _params......... + 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, // ..s_texColor.... + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x05, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // ...........unifo + 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, // rm samplerCube s + 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // _texColor;.unifo + 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // rm vec4 u_params + 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // ;..in vec4 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // coord2;.in vec4 + 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // v_color0;.layout + 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, // (location = 0) o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // ut vec4 bgfx_Fra + 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // gColor;.in vec4 + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, // v_texcoord0;.in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, // vec4 v_texcoord1 + 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, // ;..void main().{ + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // . do. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x6e, 0x79, 0x28, 0x65, // if (!any(e + 0x71, 0x75, 0x61, 0x6c, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, // qual(v_texcoord2 + 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, // .xyz, vec3(0.0)) + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // )). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, // vec4 _3 + 0x33, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, // 3 = texture(s_te + 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // xColor, v_texcoo + 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // rd2.xyz);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, // float rgba + 0x32, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 2[4];. + 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, // rgba2[0] = _33 + 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // .z;. + 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x2e, 0x79, // rgba2[1] = _33.y + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, // ;. rg + 0x62, 0x61, 0x32, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x2e, 0x78, 0x3b, 0x0a, // ba2[2] = _33.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, // rgba + 0x32, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, // 2[3] = _33.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // float + 0x5f, 0x39, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x66, // _91 = ((length(f + 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // width(v_texcoord + 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x31, 0x31, 0x2e, 0x33, 0x31, 0x33, // 2.xyz)) * 11.313 + 0x37, 0x30, 0x38, 0x33, 0x30, 0x35, 0x33, 0x35, 0x38, 0x38, 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, // 7083053588867187 + 0x35, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, // 5) * u_params.y) + 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, // * u_params.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // bgfx_ + 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, // FragColor = vec4 + 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x73, // (v_color0.xyz, s + 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, // moothstep(0.5 - + 0x5f, 0x39, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x31, 0x2c, 0x20, // _91, 0.5 + _91, + 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, // rgba2[int((v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, // coord2.w * 4.0) + 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x5d, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // + 0.5)]) * v_col + 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // or0.w);. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, // }. if + 0x28, 0x61, 0x6e, 0x79, 0x28, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, // (any(equal(v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // coord0.xyz, vec3 + 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // (0.0)))). + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, // {. v + 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, // ec4 _128 = textu + 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, // re(s_texColor, v + 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, // _texcoord1.xyz); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, // . bgf + 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, // x_FragColor = ve + 0x63, 0x34, 0x28, 0x5f, 0x31, 0x32, 0x38, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x5f, 0x31, 0x32, // c4(_128.xyz, _12 + 0x38, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, // 8.w * v_color0.w + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, // );. b + 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // reak;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x34, // vec4 _14 + 0x35, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, // 5 = texture(s_te + 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // xColor, v_texcoo + 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // rd0.xyz);. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x34, 0x5d, 0x3b, // float rgba[4]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x30, 0x5d, // . rgba[0] + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x35, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _145.z;. + 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, // rgba[1] = _14 + 0x35, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, // 5.y;. rgb + 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x35, 0x2e, 0x78, 0x3b, 0x0a, 0x20, // a[2] = _145.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, // rgba[3] = + 0x20, 0x5f, 0x31, 0x34, 0x35, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _145.w;. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x6c, // float _178 = (l + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x76, 0x5f, 0x74, // ength(fwidth(v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, // excoord0.xyz)) * + 0x20, 0x31, 0x31, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x30, 0x38, 0x33, 0x30, 0x35, 0x33, 0x35, 0x38, // 11.313708305358 + 0x38, 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, // 88671875) * u_pa + 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // rams.y;. + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, // bgfx_FragColor = + 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, // vec4(v_color0.x + 0x79, 0x7a, 0x2c, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x30, // yz, smoothstep(0 + 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x37, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2b, // .5 - _178, 0.5 + + 0x20, 0x5f, 0x31, 0x37, 0x38, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x69, 0x6e, 0x74, 0x28, // _178, rgba[int( + 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, // (v_texcoord0.w * + 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x5d, 0x29, 0x20, 0x2a, // 4.0) + 0.5)]) * + 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, // v_color0.w);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, // break;. + 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, // } while(false); + 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... }; -static const uint8_t fs_font_distance_field_drop_shadow_image_essl[2460] = +static const uint8_t fs_font_distance_field_drop_shadow_image_essl[1623] = { - 0x46, 0x53, 0x48, 0x0b, 0x9e, 0x67, 0x7a, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x73, // FSH..gz........s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, // ....u_params.... - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x09, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // ......a...varyin - 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, // g highp vec4 v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // olor0;.varying h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // ighp vec4 v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // oord0;.varying h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // ighp vec4 v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // oord1;.varying h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // ighp vec4 v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6c, // oord2;.uniform l - 0x6f, 0x77, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, // owp samplerCube - 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // s_texColor;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, // orm highp vec4 u - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // _params;.void ma - 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, // in ().{. lowp f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, // loat rgba_1[4];. - 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, // bool tmpvar_2; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x6e, // . tmpvar_2 = an - 0x79, 0x28, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // y(equal (v_texco - 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, // ord2.xyz, vec3(0 - 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, // .0, 0.0, 0.0))); - 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // . if (!(tmpvar_ - 0x32, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, // 2)) {. lowp f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, 0x34, 0x5d, 0x3b, // loat rgba2_3[4]; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, // . lowp vec4 t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // mpvar_4;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, // var_4 = textureC - 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, // ube (s_texColor, - 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, // v_texcoord2.xyz - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, // );. highp int - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // tmpvar_5;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, // mpvar_5 = int((( - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x77, 0x20, 0x2a, 0x20, // v_texcoord2.w * - 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // 4.0) + 0.5));. - 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, // rgba2_3[0] = t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, // mpvar_4.z;. r - 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // gba2_3[1] = tmpv - 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, // ar_4.y;. rgba - 0x32, 0x5f, 0x33, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // 2_3[2] = tmpvar_ - 0x34, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, // 4.x;. rgba2_3 - 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x77, // [3] = tmpvar_4.w - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, // ;. highp vec3 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // tmpvar_6;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x64, // mpvar_6 = (abs(d - 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, // Fdx(v_texcoord2. - 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x79, // xyz)) + abs(dFdy - 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, // (v_texcoord2.xyz - 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, // )));. highp f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, // loat tmpvar_7;. - 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x28, // tmpvar_7 = (( - 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x20, 0x2a, 0x20, // (. (16.0 * - 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // sqrt(dot (tmpvar - 0x5f, 0x36, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x29, 0x29, 0x29, 0x0a, // _6, tmpvar_6))). - 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x20, 0x31, 0x2e, 0x34, 0x31, 0x34, 0x32, 0x31, 0x34, 0x29, // / 1.414214) - 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x20, 0x2a, // * u_params.y) * - 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, // u_params.z);. - 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, // highp float ed - 0x67, 0x65, 0x30, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, // ge0_8;. edge0 - 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, // _8 = (0.5 - tmpv - 0x61, 0x72, 0x5f, 0x37, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, // ar_7);. lowp - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, // float tmpvar_9;. - 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x63, // tmpvar_9 = c - 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x33, 0x5b, // lamp (((rgba2_3[ - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x5d, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, // tmpvar_5] - edge - 0x30, 0x5f, 0x38, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, // 0_8) / (. ( - 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x29, 0x0a, // 0.5 + tmpvar_7). - 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x38, 0x29, 0x29, // - edge0_8)) - 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // , 0.0, 1.0);. - 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // lowp vec4 tmpva - 0x72, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // r_10;. tmpvar - 0x5f, 0x31, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // _10.xyz = v_colo - 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // r0.xyz;. tmpv - 0x61, 0x72, 0x5f, 0x31, 0x30, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, // ar_10.w = ((tmpv - 0x61, 0x72, 0x5f, 0x39, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, // ar_9 * (tmpvar_9 - 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, // * . (3.0 - - 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, // (2.0 * tmpvar_9 - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, // )). )) * v_co - 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, // lor0.w);. gl_ - 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // FragColor = tmpv - 0x61, 0x72, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, // ar_10;. retur - 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6e, // n;. };. if (an - 0x79, 0x28, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // y(equal (v_texco - 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, // ord0.xyz, vec3(0 - 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, // .0, 0.0, 0.0)))) - 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // {. lowp vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // tmpvar_11;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, // tmpvar_11 = text - 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, // ureCube (s_texCo - 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, // lor, v_texcoord1 - 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, // .xyz);. lowp - 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, // vec4 tmpvar_12;. - 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x2e, 0x78, 0x79, // tmpvar_12.xy - 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x2e, 0x78, 0x79, // z = tmpvar_11.xy - 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, // z;. tmpvar_12 - 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x2e, // .w = (tmpvar_11. - 0x77, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, // w * v_color0.w); - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, // . gl_FragColo - 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, // r = tmpvar_12;. - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, // return;. };. - 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, // lowp vec4 tmpv - 0x61, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ar_13;. tmpvar_ - 0x31, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, // 13 = textureCube - 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, // (s_texColor, v_ + 0x46, 0x53, 0x48, 0x0b, 0x9e, 0x67, 0x7a, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x75, // FSH..gz........u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // _params......... + 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, // ..s_texColor.... + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x06, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, // ..........precis + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // ion mediump floa + 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, // t;.precision hig + 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // hp int;..uniform + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, // highp samplerCu + 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, // be s_texColor;.u + 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // niform highp vec + 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, // 4 u_params;..in + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // highp vec4 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // coord2;.in highp + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, // vec4 v_color0;. + 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, // layout(location + 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // = 0) out highp v + 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, // ec4 bgfx_FragCol + 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // or;.in highp vec + 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, // 4 v_texcoord0;.i + 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, // n highp vec4 v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // excoord1;..void + 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, // main().{. do. + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, // {. if + 0x20, 0x28, 0x21, 0x61, 0x6e, 0x79, 0x28, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x28, 0x76, 0x5f, 0x74, // (!any(equal(v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, // excoord2.xyz, ve + 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // c3(0.0)))). + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x33, 0x20, // highp vec4 _33 + 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // = texture(s_texC + 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // olor, v_texcoord + 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 2.xyz);. + 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // highp float + 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // rgba2[4];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // rgba2[0] = + 0x20, 0x5f, 0x33, 0x33, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _33.z;. + 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x5f, // rgba2[1] = _ + 0x33, 0x33, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 33.y;. + 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, // rgba2[2] = _33 + 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // .x;. + 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x2e, 0x77, // rgba2[3] = _33.w + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, // ;. hi + 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x31, 0x20, 0x3d, 0x20, // ghp float _91 = + 0x28, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, // ((length(fwidth( + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, // v_texcoord2.xyz) + 0x29, 0x20, 0x2a, 0x20, 0x31, 0x31, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x30, 0x38, 0x33, 0x30, 0x35, // ) * 11.313708305 + 0x33, 0x35, 0x38, 0x38, 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x75, // 35888671875) * u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, // _params.y) * u_p + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // arams.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // bgfx_FragCo + 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // lor = vec4(v_col + 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, // or0.xyz, smooths + 0x74, 0x65, 0x70, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x39, 0x31, 0x2c, 0x20, 0x30, // tep(0.5 - _91, 0 + 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x5f, 0x39, 0x31, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, // .5 + _91, rgba2[ + 0x69, 0x6e, 0x74, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, // int((v_texcoord2 + 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, // .w * 4.0) + 0.5) + 0x5d, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, // ]) * v_color0.w) + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, // ;. br + 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, // eak;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6e, 0x79, 0x28, 0x65, // if (any(e + 0x71, 0x75, 0x61, 0x6c, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // qual(v_texcoord0 + 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, // .xyz, vec3(0.0)) + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // )). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // highp v + 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, // ec4 _128 = textu + 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, // re(s_texColor, v + 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, // _texcoord1.xyz); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, // . bgf + 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, // x_FragColor = ve + 0x63, 0x34, 0x28, 0x5f, 0x31, 0x32, 0x38, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x5f, 0x31, 0x32, // c4(_128.xyz, _12 + 0x38, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, // 8.w * v_color0.w + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, // );. b + 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // reak;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // highp ve + 0x63, 0x34, 0x20, 0x5f, 0x31, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, // c4 _145 = textur + 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, // e(s_texColor, v_ 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, // texcoord0.xyz);. - 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, // highp int tmpv - 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ar_14;. tmpvar_ - 0x31, 0x34, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, // 14 = int(((v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, // coord0.w * 4.0) - 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, // + 0.5));. rgba_ - 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, // 1[0] = tmpvar_13 - 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x31, 0x5d, 0x20, // .z;. rgba_1[1] - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x2e, 0x79, 0x3b, 0x0a, 0x20, // = tmpvar_13.y;. - 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // rgba_1[2] = tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, // var_13.x;. rgba - 0x5f, 0x31, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // _1[3] = tmpvar_1 - 0x33, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // 3.w;. highp vec - 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, // 3 tmpvar_15;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, // mpvar_15 = (abs( - 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // dFdx(v_texcoord0 - 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, // .xyz)) + abs(dFd - 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, // y(v_texcoord0.xy - 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, // z)));. highp fl - 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x3b, 0x0a, 0x20, // oat tmpvar_16;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, // tmpvar_16 = ((( - 0x31, 0x36, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x71, 0x72, 0x74, // 16.0 * . sqrt - 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x2c, // (dot (tmpvar_15, - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, // tmpvar_15)). ) - 0x20, 0x2f, 0x20, 0x31, 0x2e, 0x34, 0x31, 0x34, 0x32, 0x31, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x75, // / 1.414214) * u - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, // _params.y);. hi - 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, // ghp float edge0_ - 0x31, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x37, 0x20, 0x3d, // 17;. edge0_17 = - 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // (0.5 - tmpvar_1 - 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // 6);. lowp float - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // tmpvar_18;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, // pvar_18 = clamp - 0x28, 0x28, 0x28, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // (((rgba_1[tmpvar - 0x5f, 0x31, 0x34, 0x5d, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x37, 0x29, // _14] - edge0_17) - 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, // / (. (0.5 + - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, // tmpvar_16). - - 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x37, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, // edge0_17)), 0.0, - 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, // 1.0);. lowp ve - 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x39, 0x3b, 0x0a, 0x20, 0x20, // c4 tmpvar_19;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, // tmpvar_19.xyz = - 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, // v_color0.xyz;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x39, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, // tmpvar_19.w = (( - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, // tmpvar_18 * (tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, // var_18 * . (3 - 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, // .0 - (2.0 * tmpv - 0x61, 0x72, 0x5f, 0x31, 0x38, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, // ar_18)). )) * v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, // _color0.w);. gl - 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // _FragColor = tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x39, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // var_19;.}... + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, // highp fl + 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // oat rgba[4];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, // rgba[0] = _ + 0x31, 0x34, 0x35, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, // 145.z;. r + 0x67, 0x62, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x35, 0x2e, 0x79, 0x3b, // gba[1] = _145.y; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x32, 0x5d, // . rgba[2] + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, 0x35, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _145.x;. + 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x34, // rgba[3] = _14 + 0x35, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, // 5.w;. hig + 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x37, 0x38, 0x20, 0x3d, 0x20, // hp float _178 = + 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x76, // (length(fwidth(v + 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, // _texcoord0.xyz)) + 0x20, 0x2a, 0x20, 0x31, 0x31, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x30, 0x38, 0x33, 0x30, 0x35, 0x33, // * 11.3137083053 + 0x35, 0x38, 0x38, 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, // 5888671875) * u_ + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // params.y;. + 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // bgfx_FragColor + 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // = vec4(v_color0 + 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, // .xyz, smoothstep + 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x37, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x35, // (0.5 - _178, 0.5 + 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x37, 0x38, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x69, 0x6e, // + _178, rgba[in + 0x74, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, // t((v_texcoord0.w + 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x5d, 0x29, // * 4.0) + 0.5)]) + 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, // * v_color0.w);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, // break;. + 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, // } while(false + 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // );.}... }; static const uint8_t fs_font_distance_field_drop_shadow_image_spv[3466] = { diff --git a/examples/common/font/fs_font_distance_field_outline.bin.h b/examples/common/font/fs_font_distance_field_outline.bin.h index 70ed29e5e..bc06b5154 100644 --- a/examples/common/font/fs_font_distance_field_outline.bin.h +++ b/examples/common/font/fs_font_distance_field_outline.bin.h @@ -1,185 +1,108 @@ -static const uint8_t fs_font_distance_field_outline_glsl[1361] = +static const uint8_t fs_font_distance_field_outline_glsl[742] = { - 0x46, 0x53, 0x48, 0x0b, 0x94, 0xf7, 0xae, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x73, // FSH....n.......s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, // ....u_params.... - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x05, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // ..........varyin - 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // g vec4 v_color0; - 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // .varying vec4 v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, // color1;.varying - 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // vec4 v_texcoord0 - 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, // ;.uniform sample - 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // rCube s_texColor - 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, // ;.uniform vec4 u - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // _params;.void ma - 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // in ().{. float - 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, // rgba_1[4];. vec - 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // 4 tmpvar_2;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, // pvar_2 = texture - 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // Cube (s_texColor - 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, // , v_texcoord0.xy - 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // z);. int tmpvar - 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3d, // _3;. tmpvar_3 = - 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // int(((v_texcoor - 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, // d0.w * 4.0) + 0. - 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x30, 0x5d, // 5));. rgba_1[0] - 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, // = tmpvar_2.z;. - 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // rgba_1[1] = tmp - 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, // var_2.y;. rgba_ - 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, // 1[2] = tmpvar_2. - 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x33, 0x5d, 0x20, 0x3d, // x;. rgba_1[3] = - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x66, // tmpvar_2.w;. f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, // loat tmpvar_4;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x72, 0x67, 0x62, 0x61, // tmpvar_4 = rgba - 0x5f, 0x31, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // _1[tmpvar_3];. - 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, // vec3 tmpvar_5;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, // tmpvar_5 = (abs - 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // (dFdx(v_texcoord - 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, // 0.xyz)) + abs(dF - 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, // dy(v_texcoord0.x - 0x79, 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, // yz)));. float t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_6;. tmpva - 0x72, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x20, 0x2a, 0x20, // r_6 = (((16.0 * - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, // . sqrt(dot (t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // mpvar_5, tmpvar_ - 0x35, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x31, 0x2e, 0x34, 0x31, 0x34, 0x32, // 5)). ) / 1.4142 - 0x31, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, // 14) * u_params.y - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // );. float tmpva - 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, // r_7;. tmpvar_7 - 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // = (0.5 - (u_para - 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x29, // ms.w * tmpvar_6) - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, // );. float edge0 - 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x38, 0x20, 0x3d, 0x20, // _8;. edge0_8 = - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, // (tmpvar_7 - tmpv - 0x61, 0x72, 0x5f, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, // ar_6);. float t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_9;. tmpva - 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x74, // r_9 = clamp (((t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, // mpvar_4 - edge0_ - 0x38, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, // 8) / (. (tmpv - 0x61, 0x72, 0x5f, 0x37, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x29, // ar_7 + tmpvar_6) - 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x38, 0x29, 0x29, 0x2c, // . - edge0_8)), - 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, // 0.0, 1.0);. fl - 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, // oat edge0_10;. - 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, // edge0_10 = (0.5 - 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, // - tmpvar_6);. f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, // loat tmpvar_11;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6c, // tmpvar_11 = cl - 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, // amp (((tmpvar_4 - 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, // - edge0_10) / (. - 0x20, 0x20, 0x20, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // (0.5 + tmpva - 0x72, 0x5f, 0x36, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, // r_6). - edge0_ - 0x31, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, // 10)), 0.0, 1.0); - 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // . vec4 tmpvar_1 - 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x2e, 0x78, // 2;. tmpvar_12.x - 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // yz = mix (v_colo - 0x72, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // r1.xyz, v_color0 - 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, // .xyz, (tmpvar_11 - 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x2a, 0x20, // * (tmpvar_11 * - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, // . (3.0 - (2.0 - 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x29, 0x29, 0x0a, 0x20, // * tmpvar_11)). - 0x20, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // )));. tmpvar_1 - 0x32, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, // 2.w = ((tmpvar_9 - 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x2a, 0x20, 0x0a, // * (tmpvar_9 * . - 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, // (3.0 - (2.0 - 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, // * tmpvar_9)). ) - 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, // ) * v_color0.w); - 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, // . gl_FragColor - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, // = tmpvar_12;.}.. - 0x00, // . + 0x46, 0x53, 0x48, 0x0b, 0x94, 0xf7, 0xae, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x75, // FSH....n.......u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // _params......... + 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, // ..s_texColor.... + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x02, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // ...........unifo + 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, // rm samplerCube s + 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // _texColor;.unifo + 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // rm vec4 u_params + 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // ;..in vec4 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // coord0;.in vec4 + 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, // v_color1;.in vec + 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // 4 v_color0;.layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, // ut(location = 0) + 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // out vec4 bgfx_F + 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // ragColor;..void + 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, // main().{. vec + 0x34, 0x20, 0x5f, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, // 4 _20 = texture( + 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, // s_texColor, v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, // xcoord0.xyz);. + 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, // int _33 = int( + 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, // (v_texcoord0.w * + 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, // 4.0) + 0.5);. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x34, 0x5d, 0x3b, // float rgba[4]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, // . rgba[0] = _ + 0x32, 0x30, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x31, // 20.z;. rgba[1 + 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, // ] = _20.y;. r + 0x67, 0x62, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x78, 0x3b, 0x0a, // gba[2] = _20.x;. + 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, // rgba[3] = _2 + 0x30, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // 0.w;. float _ + 0x37, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x66, 0x77, 0x69, // 76 = (length(fwi + 0x64, 0x74, 0x68, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, // dth(v_texcoord0. + 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x31, 0x31, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x30, // xyz)) * 11.31370 + 0x38, 0x33, 0x30, 0x35, 0x33, 0x35, 0x38, 0x38, 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x29, // 830535888671875) + 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x3b, 0x0a, 0x20, // * u_params.y;. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x30, // float _84 = 0 + 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, // .5 - (u_params.w + 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, // * _76);. bgf + 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, // x_FragColor = ve + 0x63, 0x34, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x2e, // c4(mix(v_color1. + 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, // xyz, v_color0.xy + 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, // z, vec3(smoothst + 0x65, 0x70, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x37, 0x36, 0x2c, 0x20, 0x30, 0x2e, // ep(0.5 - _76, 0. + 0x35, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x36, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x5f, 0x33, // 5 + _76, rgba[_3 + 0x33, 0x5d, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, // 3]))), smoothste + 0x70, 0x28, 0x5f, 0x38, 0x34, 0x20, 0x2d, 0x20, 0x5f, 0x37, 0x36, 0x2c, 0x20, 0x5f, 0x38, 0x34, // p(_84 - _76, _84 + 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x36, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x5f, 0x33, 0x33, // + _76, rgba[_33 + 0x5d, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, // ]) * v_color0.w) + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... }; -static const uint8_t fs_font_distance_field_outline_essl[1456] = +static const uint8_t fs_font_distance_field_outline_essl[848] = { - 0x46, 0x53, 0x48, 0x0b, 0x94, 0xf7, 0xae, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x73, // FSH....n.......s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, // ....u_params.... - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x05, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // ......u...varyin - 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, // g highp vec4 v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // olor0;.varying h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ighp vec4 v_colo - 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, // r1;.varying high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // p vec4 v_texcoor - 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6c, 0x6f, 0x77, 0x70, // d0;.uniform lowp - 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, // samplerCube s_t - 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // exColor;.uniform - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, // highp vec4 u_pa - 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, // rams;.void main - 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // ().{. lowp floa - 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x6c, // t rgba_1[4];. l - 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // owp vec4 tmpvar_ - 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, // 2;. tmpvar_2 = - 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, // textureCube (s_t - 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // exColor, v_texco - 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, // ord0.xyz);. hig - 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, // hp int tmpvar_3; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x69, 0x6e, // . tmpvar_3 = in - 0x74, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, // t(((v_texcoord0. - 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, // w * 4.0) + 0.5)) - 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, // ;. rgba_1[0] = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, // tmpvar_2.z;. rg - 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ba_1[1] = tmpvar - 0x5f, 0x32, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x32, // _2.y;. rgba_1[2 - 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x3b, 0x0a, // ] = tmpvar_2.x;. - 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, // rgba_1[3] = tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, // pvar_2.w;. lowp - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, // float tmpvar_4; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x72, 0x67, // . tmpvar_4 = rg - 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x5d, 0x3b, 0x0a, // ba_1[tmpvar_3];. - 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, // highp vec3 tmp - 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_5;. tmpvar_ - 0x35, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, // 5 = (abs(dFdx(v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, // texcoord0.xyz)) - 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, // + abs(dFdy(v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, // coord0.xyz)));. - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, // highp float tmp - 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_6;. tmpvar_ - 0x36, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x0a, 0x20, // 6 = (((16.0 * . - 0x20, 0x20, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, // sqrt(dot (tmp - 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x29, // var_5, tmpvar_5) - 0x29, 0x0a, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x31, 0x2e, 0x34, 0x31, 0x34, 0x32, 0x31, 0x34, // ). ) / 1.414214 - 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x3b, // ) * u_params.y); - 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, // . highp float t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_7;. tmpva - 0x72, 0x5f, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x28, 0x75, 0x5f, // r_7 = (0.5 - (u_ - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // params.w * tmpva - 0x72, 0x5f, 0x36, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, // r_6));. highp f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, // loat edge0_8;. - 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // edge0_8 = (tmpva - 0x72, 0x5f, 0x37, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x29, 0x3b, // r_7 - tmpvar_6); - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, // . lowp float tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // pvar_9;. tmpvar - 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x74, 0x6d, // _9 = clamp (((tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x38, // pvar_4 - edge0_8 - 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // ) / (. (tmpva - 0x72, 0x5f, 0x37, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x29, 0x0a, // r_7 + tmpvar_6). - 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x38, 0x29, 0x29, 0x2c, 0x20, // - edge0_8)), - 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, // 0.0, 1.0);. hig - 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, // hp float edge0_1 - 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, // 0;. edge0_10 = - 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x29, // (0.5 - tmpvar_6) - 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, // ;. lowp float t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // mpvar_11;. tmpv - 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, // ar_11 = clamp (( - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, // (tmpvar_4 - edge - 0x30, 0x5f, 0x31, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x30, // 0_10) / (. (0 - 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x29, 0x0a, 0x20, // .5 + tmpvar_6). - 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x30, 0x29, 0x29, 0x2c, 0x20, // - edge0_10)), - 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, // 0.0, 1.0);. low - 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, // p vec4 tmpvar_12 - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x2e, 0x78, 0x79, // ;. tmpvar_12.xy - 0x7a, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // z = mix (v_color - 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, // 1.xyz, v_color0. - 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, // xyz, (tmpvar_11 - 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x2a, 0x20, 0x0a, // * (tmpvar_11 * . - 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, // (3.0 - (2.0 - 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, // * tmpvar_11)). - 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, // )));. tmpvar_12 - 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, // .w = ((tmpvar_9 - 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x2a, 0x20, 0x0a, 0x20, // * (tmpvar_9 * . - 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, // (3.0 - (2.0 * - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, // tmpvar_9)). )) - 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, // * v_color0.w);. - 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, // gl_FragColor = - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // tmpvar_12;.}... + 0x46, 0x53, 0x48, 0x0b, 0x94, 0xf7, 0xae, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x75, // FSH....n.......u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // _params......... + 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, // ..s_texColor.... + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x03, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, // ..........precis + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // ion mediump floa + 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, // t;.precision hig + 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // hp int;..uniform + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, // highp samplerCu + 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, // be s_texColor;.u + 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // niform highp vec + 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, // 4 u_params;..in + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // highp vec4 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // coord0;.in highp + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, // vec4 v_color1;. + 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // in highp vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, // ocation = 0) out + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, // highp vec4 bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, // _FragColor;..voi + 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, // d main().{. h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x30, 0x20, 0x3d, 0x20, // ighp vec4 _20 = + 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, // texture(s_texCol + 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, // or, v_texcoord0. + 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x33, // xyz);. int _3 + 0x33, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // 3 = int((v_texco + 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, // ord0.w * 4.0) + + 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // 0.5);. highp + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, // float rgba[4];. + 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, // rgba[0] = _20 + 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x31, 0x5d, 0x20, // .z;. rgba[1] + 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, // = _20.y;. rgb + 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, // a[2] = _20.x;. + 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, // rgba[3] = _20. + 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, // w;. highp flo + 0x61, 0x74, 0x20, 0x5f, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, // at _76 = (length + 0x28, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // (fwidth(v_texcoo + 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x31, 0x31, 0x2e, 0x33, // rd0.xyz)) * 11.3 + 0x31, 0x33, 0x37, 0x30, 0x38, 0x33, 0x30, 0x35, 0x33, 0x35, 0x38, 0x38, 0x38, 0x36, 0x37, 0x31, // 1370830535888671 + 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, // 875) * u_params. + 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, // y;. highp flo + 0x61, 0x74, 0x20, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x28, // at _84 = 0.5 - ( + 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x5f, 0x37, 0x36, // u_params.w * _76 + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, // );. bgfx_Frag + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6d, 0x69, 0x78, // Color = vec4(mix + 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, // (v_color1.xyz, v + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, // _color0.xyz, vec + 0x33, 0x28, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x30, 0x2e, 0x35, // 3(smoothstep(0.5 + 0x20, 0x2d, 0x20, 0x5f, 0x37, 0x36, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x5f, 0x37, // - _76, 0.5 + _7 + 0x36, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x5f, 0x33, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x2c, // 6, rgba[_33]))), + 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x5f, 0x38, 0x34, 0x20, // smoothstep(_84 + 0x2d, 0x20, 0x5f, 0x37, 0x36, 0x2c, 0x20, 0x5f, 0x38, 0x34, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x36, // - _76, _84 + _76 + 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x5f, 0x33, 0x33, 0x5d, 0x29, 0x20, 0x2a, 0x20, 0x76, // , rgba[_33]) * v + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _color0.w);.}... }; static const uint8_t fs_font_distance_field_outline_spv[2302] = { diff --git a/examples/common/font/fs_font_distance_field_outline_drop_shadow_image.bin.h b/examples/common/font/fs_font_distance_field_outline_drop_shadow_image.bin.h index 8e5ab5a3d..e21744b2f 100644 --- a/examples/common/font/fs_font_distance_field_outline_drop_shadow_image.bin.h +++ b/examples/common/font/fs_font_distance_field_outline_drop_shadow_image.bin.h @@ -1,387 +1,236 @@ -static const uint8_t fs_font_distance_field_outline_drop_shadow_image_glsl[2939] = +static const uint8_t fs_font_distance_field_outline_drop_shadow_image_glsl[1743] = { - 0x46, 0x53, 0x48, 0x0b, 0x9e, 0x67, 0x7a, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x73, // FSH..gz........s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, // ....u_params.... - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x0b, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // ......@...varyin - 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // g vec4 v_color0; - 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // .varying vec4 v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, // color1;.varying + 0x46, 0x53, 0x48, 0x0b, 0x9e, 0x67, 0x7a, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x75, // FSH..gz........u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // _params......... + 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, // ..s_texColor.... + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x06, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // ...........unifo + 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, // rm samplerCube s + 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // _texColor;.unifo + 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // rm vec4 u_params + 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // ;..in vec4 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // coord1;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, // ocation = 0) out + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, // vec4 bgfx_FragC + 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // olor;.in vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // color0;.in vec4 + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x69, 0x6e, 0x20, // v_texcoord2;.in 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // vec4 v_texcoord0 - 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, // ;.varying vec4 v - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // _texcoord1;.vary - 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // ing vec4 v_texco - 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, // ord2;.uniform sa - 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // mplerCube s_texC - 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, // olor;.uniform ve - 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x76, 0x6f, 0x69, // c4 u_params;.voi - 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x66, 0x6c, // d main ().{. fl - 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, // oat rgba_1[4];. - 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, // bool tmpvar_2;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x6e, 0x79, // tmpvar_2 = any - 0x28, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // (equal (v_texcoo - 0x72, 0x64, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, // rd1.xyz, vec3(0. - 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x0a, // 0, 0.0, 0.0)));. - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // if (!(tmpvar_2 - 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, // )) {. vec4 tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // pvar_3;. tmpv - 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, // ar_3 = textureCu - 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, // be (s_texColor, - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x29, // v_texcoord1.xyz) - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ;. vec4 tmpva - 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // r_4;. tmpvar_ - 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, // 4.xyz = tmpvar_3 - 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // .xyz;. tmpvar - 0x5f, 0x34, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, // _4.w = (tmpvar_3 - 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, // .w * v_color0.w) - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, // ;. gl_FragCol - 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, // or = tmpvar_4;. - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, // return;. };. - 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, // bool tmpvar_5; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x61, 0x6e, // . tmpvar_5 = an - 0x79, 0x28, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // y(equal (v_texco - 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, // ord2.xyz, vec3(0 - 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, // .0, 0.0, 0.0))); - 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // . if (!(tmpvar_ - 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // 5)) {. float - 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x53, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x5f, // shadowSmoothing_ - 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, // 6;. float rgb - 0x61, 0x32, 0x5f, 0x37, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, // a2_7[4];. vec - 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 4 tmpvar_8;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, // tmpvar_8 = textu - 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, // reCube (s_texCol - 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, // or, v_texcoord2. - 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6d, // xyz);. int tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // pvar_9;. tmpv - 0x61, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, // ar_9 = int(((v_t - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, // excoord2.w * 4.0 - 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, // ) + 0.5));. r - 0x67, 0x62, 0x61, 0x32, 0x5f, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // gba2_7[0] = tmpv - 0x61, 0x72, 0x5f, 0x38, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, // ar_8.z;. rgba - 0x32, 0x5f, 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // 2_7[1] = tmpvar_ - 0x38, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x37, // 8.y;. rgba2_7 - 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x2e, 0x78, // [2] = tmpvar_8.x - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x37, 0x5b, 0x33, 0x5d, // ;. rgba2_7[3] - 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x2e, 0x77, 0x3b, 0x0a, 0x20, // = tmpvar_8.w;. - 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // vec3 tmpvar_1 - 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, // 0;. tmpvar_10 - 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x74, // = (abs(dFdx(v_t - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2b, // excoord2.xyz)) + - 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // abs(dFdy(v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // oord2.xyz)));. - 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // float tmpvar_1 - 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, // 1;. tmpvar_11 - 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, // = (((16.0 * . - 0x20, 0x20, 0x20, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, // sqrt(dot (tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // pvar_10, tmpvar_ - 0x31, 0x30, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x31, 0x2e, 0x34, // 10)). ) / 1.4 - 0x31, 0x34, 0x32, 0x31, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // 14214) * u_param - 0x73, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // s.y);. float - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // tmpvar_12;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, // mpvar_12 = (0.5 - 0x2d, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x2a, 0x20, // - (u_params.w * - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // tmpvar_11));. - 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x53, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, // shadowSmoothing - 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, // _6 = (tmpvar_11 - 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, // * u_params.z);. - 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, // float edge0_1 - 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x33, 0x20, // 3;. edge0_13 - 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x2d, 0x20, 0x73, // = (tmpvar_12 - s - 0x68, 0x61, 0x64, 0x6f, 0x77, 0x53, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x36, // hadowSmoothing_6 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, // );. float tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // var_14;. tmpv - 0x61, 0x72, 0x5f, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, // ar_14 = clamp (( - 0x28, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x37, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // (rgba2_7[tmpvar_ - 0x39, 0x5d, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x33, 0x29, 0x20, 0x2f, // 9] - edge0_13) / - 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // (. (tmpvar - 0x5f, 0x31, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x53, 0x6d, 0x6f, 0x6f, // _12 + shadowSmoo - 0x74, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x36, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, // thing_6). - - 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x33, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, // edge0_13)), 0.0, - 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // 1.0);. vec4 - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // tmpvar_15;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x76, // mpvar_15.xyz = v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, // _color0.xyz;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, // tmpvar_15.w = ( - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, // (tmpvar_14 * (tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // pvar_14 * . - 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, // (3.0 - (2.0 * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x29, // mpvar_14)). ) - 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, // ) * v_color0.w); - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, // . gl_FragColo - 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x3b, 0x0a, 0x20, // r = tmpvar_15;. - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, // return;. };. - 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, // vec4 tmpvar_16 - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x20, 0x3d, 0x20, // ;. tmpvar_16 = - 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, // textureCube (s_t - 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // exColor, v_texco - 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x74, // ord0.xyz);. int - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // tmpvar_17;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, // pvar_17 = int((( - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, // v_texcoord0.w * - 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // 4.0) + 0.5));. - 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // rgba_1[0] = tmpv - 0x61, 0x72, 0x5f, 0x31, 0x36, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, // ar_16.z;. rgba_ - 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, // 1[1] = tmpvar_16 - 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x32, 0x5d, 0x20, // .y;. rgba_1[2] - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x2e, 0x78, 0x3b, 0x0a, 0x20, // = tmpvar_16.x;. - 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // rgba_1[3] = tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // var_16.w;. floa - 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x74, // t tmpvar_18;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, // mpvar_18 = rgba_ - 0x31, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x37, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // 1[tmpvar_17];. - 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x39, 0x3b, 0x0a, // vec3 tmpvar_19;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x61, // tmpvar_19 = (a - 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // bs(dFdx(v_texcoo - 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, // rd0.xyz)) + abs( - 0x64, 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // dFdy(v_texcoord0 - 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // .xyz)));. float - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // tmpvar_20;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x31, 0x36, 0x2e, // pvar_20 = (((16. - 0x30, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x6f, // 0 * . sqrt(do - 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x39, 0x2c, 0x20, 0x74, 0x6d, // t (tmpvar_19, tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x39, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, // pvar_19)). ) / - 0x31, 0x2e, 0x34, 0x31, 0x34, 0x32, 0x31, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, // 1.414214) * u_pa - 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // rams.y);. float - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // tmpvar_21;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, // pvar_21 = (0.5 - - 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x74, // (u_params.w * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, // mpvar_20));. fl - 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x32, 0x32, 0x3b, 0x0a, 0x20, 0x20, // oat edge0_22;. - 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, // edge0_22 = (tmpv - 0x61, 0x72, 0x5f, 0x32, 0x31, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // ar_21 - tmpvar_2 - 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, // 0);. float tmpv - 0x61, 0x72, 0x5f, 0x32, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ar_23;. tmpvar_ - 0x32, 0x33, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x74, 0x6d, // 23 = clamp (((tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, // pvar_18 - edge0_ - 0x32, 0x32, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6d, 0x70, // 22) / (. (tmp - 0x76, 0x61, 0x72, 0x5f, 0x32, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_21 + tmpvar_ - 0x32, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x32, // 20). - edge0_2 - 0x32, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, // 2)), 0.0, 1.0);. - 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x32, 0x34, // float edge0_24 - 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x28, // ;. edge0_24 = ( - 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x30, 0x29, // 0.5 - tmpvar_20) - 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ;. float tmpvar - 0x5f, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x35, // _25;. tmpvar_25 - 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, // = clamp (((tmpv - 0x61, 0x72, 0x5f, 0x31, 0x38, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x32, 0x34, // ar_18 - edge0_24 - 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, // ) / (. (0.5 + - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, // tmpvar_20). - - 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x32, 0x34, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, // edge0_24)), 0.0 - 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, // , 1.0);. vec4 t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // mpvar_26;. tmpv - 0x61, 0x72, 0x5f, 0x32, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x20, // ar_26.xyz = mix - 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, // (v_color1.xyz, v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x28, 0x74, 0x6d, // _color0.xyz, (tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // pvar_25 * (tmpva - 0x72, 0x5f, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, // r_25 * . (3.0 - 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // - (2.0 * tmpvar - 0x5f, 0x32, 0x35, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, // _25)). )));. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x36, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, // mpvar_26.w = ((t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x33, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, // mpvar_23 * (tmpv - 0x61, 0x72, 0x5f, 0x32, 0x33, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, // ar_23 * . (3. - 0x30, 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // 0 - (2.0 * tmpva - 0x72, 0x5f, 0x32, 0x33, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, // r_23)). )) * v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, // color0.w);. gl_ - 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // FragColor = tmpv - 0x61, 0x72, 0x5f, 0x32, 0x36, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ar_26;.}... -}; -static const uint8_t fs_font_distance_field_outline_drop_shadow_image_essl[3112] = -{ - 0x46, 0x53, 0x48, 0x0b, 0x9e, 0x67, 0x7a, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x73, // FSH..gz........s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, // ....u_params.... - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x0b, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // ..........varyin - 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, // g highp vec4 v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // olor0;.varying h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ighp vec4 v_colo - 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, // r1;.varying high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // p vec4 v_texcoor - 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, // d0;.varying high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // p vec4 v_texcoor - 0x64, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, // d1;.varying high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // p vec4 v_texcoor - 0x64, 0x32, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6c, 0x6f, 0x77, 0x70, // d2;.uniform lowp - 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, // samplerCube s_t - 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // exColor;.uniform - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, // highp vec4 u_pa - 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, // rams;.void main - 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // ().{. lowp floa - 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x62, // t rgba_1[4];. b - 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, // ool tmpvar_2;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x6e, 0x79, 0x28, 0x65, // tmpvar_2 = any(e - 0x71, 0x75, 0x61, 0x6c, 0x20, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // qual (v_texcoord - 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x2c, // 1.xyz, vec3(0.0, - 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // 0.0, 0.0)));. - 0x69, 0x66, 0x20, 0x28, 0x21, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x29, // if (!(tmpvar_2)) - 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // {. lowp vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // tmpvar_3;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, // mpvar_3 = textur - 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // eCube (s_texColo - 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x2e, 0x78, // r, v_texcoord1.x - 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, // yz);. lowp ve - 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, // c4 tmpvar_4;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, // tmpvar_4.xyz = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, // tmpvar_3.xyz;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, // tmpvar_4.w = ( - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, // tmpvar_3.w * v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, // olor0.w);. gl - 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // _FragColor = tmp - 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, // var_4;. retur - 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x74, // n;. };. bool t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_5;. tmpva - 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x61, 0x6e, 0x79, 0x28, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, // r_5 = any(equal + 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ;.in vec4 v_colo + 0x72, 0x31, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, // r1;..void main() + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // .{. do. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x6e, 0x79, // if (!any + 0x28, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // (equal(v_texcoor + 0x64, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, // d1.xyz, vec3(0.0 + 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // )))). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // vec4 + 0x5f, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, // _31 = texture(s_ + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // texColor, v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // oord1.xyz);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // bgfx_Fra + 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x33, // gColor = vec4(_3 + 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x5f, 0x33, 0x31, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x76, // 1.xyz, _31.w * v + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // _color0.w);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x6e, 0x79, 0x28, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x28, // if (!any(equal( + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x2c, // v_texcoord2.xyz, + 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, // vec3(0.0)))). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x74, // vec4 _65 = t + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // exture(s_texColo + 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, // r, v_texcoord2.x + 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // yz);. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x34, 0x5d, 0x3b, // float rgba2[4]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, // . rgb + 0x61, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, // a2[0] = _65.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, // rgba2 + 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, // [1] = _65.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x32, // rgba2[2 + 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // ] = _65.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x33, 0x5d, 0x20, // rgba2[3] + 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _65.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x20, // float _117 + 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, // = (length(fwidth 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, // (v_texcoord2.xyz - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, // , vec3(0.0, 0.0, - 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, // 0.0)));. if (! - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, // (tmpvar_5)) {. - 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x68, // highp float sh - 0x61, 0x64, 0x6f, 0x77, 0x53, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x36, 0x3b, // adowSmoothing_6; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // . lowp float - 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x37, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // rgba2_7[4];. - 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // lowp vec4 tmpvar - 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, // _8;. tmpvar_8 - 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, // = textureCube ( - 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, // s_texColor, v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, // xcoord2.xyz);. - 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, // highp int tmpv - 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ar_9;. tmpvar - 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, // _9 = int(((v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, // coord2.w * 4.0) - 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, // + 0.5));. rgb - 0x61, 0x32, 0x5f, 0x37, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // a2_7[0] = tmpvar - 0x5f, 0x38, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, // _8.z;. rgba2_ - 0x37, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x2e, // 7[1] = tmpvar_8. - 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x37, 0x5b, 0x32, // y;. rgba2_7[2 - 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x2e, 0x78, 0x3b, 0x0a, // ] = tmpvar_8.x;. - 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5f, 0x37, 0x5b, 0x33, 0x5d, 0x20, 0x3d, // rgba2_7[3] = - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, // tmpvar_8.w;. - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, // highp vec3 tmpv - 0x61, 0x72, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ar_10;. tmpva - 0x72, 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, // r_10 = (abs(dFdx - 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, // (v_texcoord2.xyz - 0x29, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, // )) + abs(dFdy(v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x29, // texcoord2.xyz))) - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // ;. highp floa - 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, // t tmpvar_11;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, // tmpvar_11 = ((( - 0x31, 0x36, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x71, // 16.0 * . sq - 0x72, 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // rt(dot (tmpvar_1 - 0x30, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x29, 0x29, 0x0a, 0x20, // 0, tmpvar_10)). - 0x20, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x31, 0x2e, 0x34, 0x31, 0x34, 0x32, 0x31, 0x34, 0x29, // ) / 1.414214) - 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x3b, 0x0a, // * u_params.y);. - 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // highp float - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // tmpvar_12;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, // mpvar_12 = (0.5 - 0x2d, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x2a, 0x20, // - (u_params.w * - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // tmpvar_11));. - 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x53, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, // shadowSmoothing - 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, // _6 = (tmpvar_11 - 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, // * u_params.z);. - 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, // highp float e - 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x64, 0x67, // dge0_13;. edg - 0x65, 0x30, 0x5f, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // e0_13 = (tmpvar_ - 0x31, 0x32, 0x20, 0x2d, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x53, 0x6d, 0x6f, 0x6f, 0x74, // 12 - shadowSmoot - 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, // hing_6);. low - 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // p float tmpvar_1 - 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, // 4;. tmpvar_14 - 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x72, 0x67, 0x62, 0x61, // = clamp (((rgba - 0x32, 0x5f, 0x37, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x5d, 0x20, 0x2d, 0x20, // 2_7[tmpvar_9] - - 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x33, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, // edge0_13) / (. - 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x2b, // (tmpvar_12 + - 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x53, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, // shadowSmoothing - 0x5f, 0x36, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, // _6). - edge0 - 0x5f, 0x31, 0x33, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, // _13)), 0.0, 1.0) - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ;. lowp vec4 - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, // tmpvar_15;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x76, // mpvar_15.xyz = v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, // _color0.xyz;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, // tmpvar_15.w = ( - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, // (tmpvar_14 * (tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // pvar_14 * . - 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, // (3.0 - (2.0 * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x29, // mpvar_14)). ) - 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, // ) * v_color0.w); - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, // . gl_FragColo - 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x3b, 0x0a, 0x20, // r = tmpvar_15;. - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, // return;. };. - 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, // lowp vec4 tmpv - 0x61, 0x72, 0x5f, 0x31, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ar_16;. tmpvar_ - 0x31, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, // 16 = textureCube - 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, // (s_texColor, v_ + 0x29, 0x29, 0x20, 0x2a, 0x20, 0x31, 0x31, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x30, 0x38, 0x33, 0x30, // )) * 11.31370830 + 0x35, 0x33, 0x35, 0x38, 0x38, 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, // 535888671875) * + 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // u_params.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, // float _1 + 0x32, 0x35, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, // 25 = 0.5 - (u_pa + 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x29, 0x3b, 0x0a, // rams.w * _117);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // floa + 0x74, 0x20, 0x5f, 0x31, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x20, 0x2a, 0x20, // t _129 = _117 * + 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // u_params.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // bgfx_Fra + 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x76, 0x5f, // gColor = vec4(v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x73, 0x6d, 0x6f, 0x6f, // color0.xyz, smoo + 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x5f, 0x31, 0x32, 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x31, // thstep(_125 - _1 + 0x32, 0x39, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x32, 0x39, 0x2c, // 29, _125 + _129, + 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, // rgba2[int((v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, // xcoord2.w * 4.0) + 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x5d, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, // + 0.5)]) * v_co + 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // lor0.w);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // }. ve + 0x63, 0x34, 0x20, 0x5f, 0x31, 0x35, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, // c4 _157 = textur + 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, // e(s_texColor, v_ 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, // texcoord0.xyz);. - 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, // highp int tmpv - 0x61, 0x72, 0x5f, 0x31, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ar_17;. tmpvar_ - 0x31, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, // 17 = int(((v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, // coord0.w * 4.0) - 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, // + 0.5));. rgba_ - 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, // 1[0] = tmpvar_16 - 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x31, 0x5d, 0x20, // .z;. rgba_1[1] - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x2e, 0x79, 0x3b, 0x0a, 0x20, // = tmpvar_16.y;. - 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // rgba_1[2] = tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, // var_16.x;. rgba - 0x5f, 0x31, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // _1[3] = tmpvar_1 - 0x36, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // 6.w;. lowp floa - 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x74, // t tmpvar_18;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, // mpvar_18 = rgba_ - 0x31, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x37, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // 1[tmpvar_17];. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // highp vec3 tmpva - 0x72, 0x5f, 0x31, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // r_19;. tmpvar_1 - 0x39, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, // 9 = (abs(dFdx(v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, // texcoord0.xyz)) - 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, // + abs(dFdy(v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, // coord0.xyz)));. - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, // highp float tmp - 0x76, 0x61, 0x72, 0x5f, 0x32, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // var_20;. tmpvar - 0x5f, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x20, 0x2a, 0x20, // _20 = (((16.0 * - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, // . sqrt(dot (t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x39, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // mpvar_19, tmpvar - 0x5f, 0x31, 0x39, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x31, 0x2e, 0x34, 0x31, // _19)). ) / 1.41 - 0x34, 0x32, 0x31, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // 4214) * u_params - 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, // .y);. highp flo - 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x31, 0x3b, 0x0a, 0x20, 0x20, // at tmpvar_21;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, // tmpvar_21 = (0.5 - 0x20, 0x2d, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x2a, // - (u_params.w * - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // tmpvar_20));. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, // highp float edge - 0x30, 0x5f, 0x32, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x32, 0x32, // 0_22;. edge0_22 - 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x31, 0x20, 0x2d, 0x20, // = (tmpvar_21 - - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, // tmpvar_20);. lo - 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // wp float tmpvar_ - 0x32, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x33, 0x20, // 23;. tmpvar_23 - 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // = clamp (((tmpva - 0x72, 0x5f, 0x31, 0x38, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x32, 0x32, 0x29, // r_18 - edge0_22) - 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // / (. (tmpvar - 0x5f, 0x32, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x30, 0x29, // _21 + tmpvar_20) - 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x32, 0x32, 0x29, 0x29, // . - edge0_22)) - 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, // , 0.0, 1.0);. h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, // ighp float edge0 - 0x5f, 0x32, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x32, 0x34, 0x20, // _24;. edge0_24 - 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // = (0.5 - tmpvar_ - 0x32, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // 20);. lowp floa - 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, // t tmpvar_25;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, // mpvar_25 = clamp - 0x20, 0x28, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x38, 0x20, 0x2d, 0x20, // (((tmpvar_18 - - 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x32, 0x34, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, // edge0_24) / (. - 0x20, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // (0.5 + tmpvar_ - 0x32, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x32, // 20). - edge0_2 - 0x34, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, // 4)), 0.0, 1.0);. - 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, // lowp vec4 tmpv - 0x61, 0x72, 0x5f, 0x32, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ar_26;. tmpvar_ - 0x32, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x76, 0x5f, // 26.xyz = mix (v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x5f, 0x63, 0x6f, // color1.xyz, v_co - 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // lor0.xyz, (tmpva - 0x72, 0x5f, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // r_25 * (tmpvar_2 - 0x35, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, // 5 * . (3.0 - - 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x35, // (2.0 * tmpvar_25 - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // )). )));. tmpv - 0x61, 0x72, 0x5f, 0x32, 0x36, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, // ar_26.w = ((tmpv - 0x61, 0x72, 0x5f, 0x32, 0x33, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ar_23 * (tmpvar_ - 0x32, 0x33, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, // 23 * . (3.0 - - 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // (2.0 * tmpvar_2 - 0x33, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // 3)). )) * v_col - 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, // or0.w);. gl_Fra - 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // gColor = tmpvar_ - 0x32, 0x36, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 26;.}... + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x33, // int _163 + 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // = int((v_texcoo + 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, // rd0.w * 4.0) + 0 + 0x2e, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // .5);. flo + 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // at rgba[4];. + 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, // rgba[0] = _1 + 0x35, 0x37, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, // 57.z;. rg + 0x62, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x37, 0x2e, 0x79, 0x3b, 0x0a, // ba[1] = _157.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x32, 0x5d, 0x20, // rgba[2] + 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x37, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _157.x;. + 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x37, // rgba[3] = _157 + 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // .w;. floa + 0x74, 0x20, 0x5f, 0x31, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, // t _190 = (length + 0x28, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // (fwidth(v_texcoo + 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x31, 0x31, 0x2e, 0x33, // rd0.xyz)) * 11.3 + 0x31, 0x33, 0x37, 0x30, 0x38, 0x33, 0x30, 0x35, 0x33, 0x35, 0x38, 0x38, 0x38, 0x36, 0x37, 0x31, // 1370830535888671 + 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, // 875) * u_params. + 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // y;. float + 0x20, 0x5f, 0x31, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x28, 0x75, // _198 = 0.5 - (u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x39, 0x30, // _params.w * _190 + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // );. bgfx_ + 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, // FragColor = vec4 + 0x28, 0x6d, 0x69, 0x78, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x2e, 0x78, 0x79, // (mix(v_color1.xy + 0x7a, 0x2c, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, // z, v_color0.xyz, + 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, // vec3(smoothstep + 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x39, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x35, // (0.5 - _190, 0.5 + 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x39, 0x30, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x5f, 0x31, // + _190, rgba[_1 + 0x36, 0x33, 0x5d, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, // 63]))), smoothst + 0x65, 0x70, 0x28, 0x5f, 0x31, 0x39, 0x38, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x39, 0x30, 0x2c, 0x20, // ep(_198 - _190, + 0x5f, 0x31, 0x39, 0x38, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x39, 0x30, 0x2c, 0x20, 0x72, 0x67, 0x62, // _198 + _190, rgb + 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x33, 0x5d, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // a[_163]) * v_col + 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // or0.w);. + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, // break;. } whi + 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // le(false);.}... +}; +static const uint8_t fs_font_distance_field_outline_drop_shadow_image_essl[1897] = +{ + 0x46, 0x53, 0x48, 0x0b, 0x9e, 0x67, 0x7a, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x75, // FSH..gz........u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // _params......... + 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, // ..s_texColor.... + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x07, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, // ..........precis + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // ion mediump floa + 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, // t;.precision hig + 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // hp int;..uniform + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, // highp samplerCu + 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, // be s_texColor;.u + 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // niform highp vec + 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, // 4 u_params;..in + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // highp vec4 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // coord1;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, // ocation = 0) out + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, // highp vec4 bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, // _FragColor;.in h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ighp vec4 v_colo + 0x72, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // r0;.in highp vec + 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x69, // 4 v_texcoord2;.i + 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, // n highp vec4 v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, // excoord0;.in hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, // hp vec4 v_color1 + 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, // ;..void main().{ + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // . do. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x6e, 0x79, 0x28, 0x65, // if (!any(e + 0x71, 0x75, 0x61, 0x6c, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, // qual(v_texcoord1 + 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, // .xyz, vec3(0.0)) + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // )). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // highp v + 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, // ec4 _31 = textur + 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, // e(s_texColor, v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, // texcoord1.xyz);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, // _FragColor = vec + 0x34, 0x28, 0x5f, 0x33, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x5f, 0x33, 0x31, 0x2e, 0x77, // 4(_31.xyz, _31.w + 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, // * v_color0.w);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, // brea + 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, // k;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x6e, 0x79, 0x28, 0x65, 0x71, // if (!any(eq + 0x75, 0x61, 0x6c, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, // ual(v_texcoord2. + 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, // xyz, vec3(0.0))) + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // ). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // highp ve + 0x63, 0x34, 0x20, 0x5f, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, // c4 _65 = texture + 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, // (s_texColor, v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, // excoord2.xyz);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // highp + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x34, 0x5d, 0x3b, // float rgba2[4]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, // . rgb + 0x61, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, // a2[0] = _65.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, // rgba2 + 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, // [1] = _65.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x32, // rgba2[2 + 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // ] = _65.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x33, 0x5d, 0x20, // rgba2[3] + 0x3d, 0x20, 0x5f, 0x36, 0x35, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _65.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // highp float + 0x20, 0x5f, 0x31, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, // _117 = (length( + 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // fwidth(v_texcoor + 0x64, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x31, 0x31, 0x2e, 0x33, 0x31, // d2.xyz)) * 11.31 + 0x33, 0x37, 0x30, 0x38, 0x33, 0x30, 0x35, 0x33, 0x35, 0x38, 0x38, 0x38, 0x36, 0x37, 0x31, 0x38, // 3708305358886718 + 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, // 75) * u_params.y + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, // ;. hi + 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x20, 0x3d, // ghp float _125 = + 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // 0.5 - (u_params + 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // .w * _117);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, // highp fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x20, // oat _129 = _117 + 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, // * u_params.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // bgfx_F + 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // ragColor = vec4( + 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x73, 0x6d, // v_color0.xyz, sm + 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x5f, 0x31, 0x32, 0x35, 0x20, 0x2d, 0x20, // oothstep(_125 - + 0x5f, 0x31, 0x32, 0x39, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x32, // _129, _125 + _12 + 0x39, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x32, 0x5b, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x76, 0x5f, // 9, rgba2[int((v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, // texcoord2.w * 4. + 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x5d, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, // 0) + 0.5)]) * v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // color0.w);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x35, 0x37, 0x20, // highp vec4 _157 + 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // = texture(s_texC + 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // olor, v_texcoord + 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 0.xyz);. + 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, // int _163 = int(( + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, // v_texcoord0.w * + 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 4.0) + 0.5);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // highp float + 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // rgba[4];. + 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x37, // rgba[0] = _157 + 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, // .z;. rgba + 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x37, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, // [1] = _157.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, // rgba[2] = + 0x5f, 0x31, 0x35, 0x37, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _157.x;. + 0x72, 0x67, 0x62, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x37, 0x2e, 0x77, // rgba[3] = _157.w + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // ;. highp + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, // float _190 = (le + 0x6e, 0x67, 0x74, 0x68, 0x28, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x76, 0x5f, 0x74, 0x65, // ngth(fwidth(v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, // xcoord0.xyz)) * + 0x31, 0x31, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x30, 0x38, 0x33, 0x30, 0x35, 0x33, 0x35, 0x38, 0x38, // 11.3137083053588 + 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, // 8671875) * u_par + 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, // ams.y;. h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x39, 0x38, 0x20, // ighp float _198 + 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // = 0.5 - (u_param + 0x73, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x39, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // s.w * _190);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // bgfx_FragCo + 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x76, // lor = vec4(mix(v + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x5f, 0x63, // _color1.xyz, v_c + 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // olor0.xyz, vec3( + 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, // smoothstep(0.5 - + 0x20, 0x5f, 0x31, 0x39, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x39, // _190, 0.5 + _19 + 0x30, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x33, 0x5d, 0x29, 0x29, 0x29, // 0, rgba[_163]))) + 0x2c, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x5f, 0x31, 0x39, // , smoothstep(_19 + 0x38, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x39, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x39, 0x38, 0x20, 0x2b, // 8 - _190, _198 + + 0x20, 0x5f, 0x31, 0x39, 0x30, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x5f, 0x31, 0x36, 0x33, // _190, rgba[_163 + 0x5d, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, // ]) * v_color0.w) + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, // ;. break; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, // . } while(fal + 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // se);.}... }; static const uint8_t fs_font_distance_field_outline_drop_shadow_image_spv[3922] = { diff --git a/examples/common/font/fs_font_distance_field_outline_image.bin.h b/examples/common/font/fs_font_distance_field_outline_image.bin.h index 657b609af..c207e1eaf 100644 --- a/examples/common/font/fs_font_distance_field_outline_image.bin.h +++ b/examples/common/font/fs_font_distance_field_outline_image.bin.h @@ -1,225 +1,151 @@ -static const uint8_t fs_font_distance_field_outline_image_glsl[1674] = +static const uint8_t fs_font_distance_field_outline_image_glsl[1076] = { - 0x46, 0x53, 0x48, 0x0b, 0x94, 0xf7, 0xae, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x73, // FSH....n.......s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, // ....u_params.... - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x06, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // ......O...varyin - 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // g vec4 v_color0; - 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // .varying vec4 v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, // color1;.varying - 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // vec4 v_texcoord0 - 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, // ;.varying vec4 v - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // _texcoord1;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, // orm samplerCube - 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // s_texColor;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // orm vec4 u_param - 0x73, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, // s;.void main (). - 0x7b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, // {. float rgba_1 - 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6e, 0x79, 0x28, 0x65, // [4];. if (any(e - 0x71, 0x75, 0x61, 0x6c, 0x20, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // qual (v_texcoord - 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x2c, // 0.xyz, vec3(0.0, - 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x20, 0x7b, 0x0a, // 0.0, 0.0)))) {. - 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // vec4 tmpvar_ - 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, // 2;. tmpvar_2 - 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, // = textureCube (s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // _texColor, v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // coord1.xyz);. - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, // vec4 tmpvar_3;. - 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2e, 0x78, 0x79, 0x7a, // tmpvar_3.xyz - 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x3b, // = tmpvar_2.xyz; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2e, 0x77, 0x20, // . tmpvar_3.w - 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, 0x20, 0x2a, 0x20, // = (tmpvar_2.w * + 0x46, 0x53, 0x48, 0x0b, 0x94, 0xf7, 0xae, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x75, // FSH....n.......u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // _params......... + 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, // ..s_texColor.... + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // ...........unifo + 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, // rm samplerCube s + 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // _texColor;.unifo + 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // rm vec4 u_params + 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // ;..in vec4 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // coord0;.in vec4 + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, // v_texcoord1;.lay + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, // out(location = 0 + 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // ) out vec4 bgfx_ + 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, // FragColor;.in ve + 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, // c4 v_color0;.in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x0a, // vec4 v_color1;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // do. {. + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6e, 0x79, 0x28, 0x65, 0x71, 0x75, 0x61, 0x6c, // if (any(equal + 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, // (v_texcoord0.xyz + 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, // , vec3(0.0)))). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x31, 0x20, 0x3d, 0x20, // vec4 _31 = + 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, // texture(s_texCol + 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x2e, // or, v_texcoord1. + 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // xyz);. + 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // bgfx_FragColor + 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x33, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, // = vec4(_31.xyz, + 0x20, 0x5f, 0x33, 0x31, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // _31.w * v_color + 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 0.w);. + 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // }. vec4 + 0x5f, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, // _55 = texture(s_ + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // texColor, v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // oord0.xyz);. + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, // int _65 = in + 0x74, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, // t((v_texcoord0.w + 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x0a, // * 4.0) + 0.5);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, // float rg + 0x62, 0x61, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, // ba[4];. r + 0x67, 0x62, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x35, 0x2e, 0x7a, 0x3b, 0x0a, // gba[0] = _55.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x31, 0x5d, 0x20, // rgba[1] + 0x3d, 0x20, 0x5f, 0x35, 0x35, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _55.y;. + 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x35, 0x2e, 0x78, // rgba[2] = _55.x + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x33, // ;. rgba[3 + 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x35, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // ] = _55.w;. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x20, 0x3d, 0x20, // float _107 = + 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x76, // (length(fwidth(v + 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, // _texcoord0.xyz)) + 0x20, 0x2a, 0x20, 0x31, 0x31, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x30, 0x38, 0x33, 0x30, 0x35, 0x33, // * 11.3137083053 + 0x35, 0x38, 0x38, 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, // 5888671875) * u_ + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // params.y;. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x30, // float _115 = 0 + 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, // .5 - (u_params.w + 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // * _107);. + 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // bgfx_FragColor + 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x76, 0x5f, 0x63, 0x6f, // = vec4(mix(v_co + 0x6c, 0x6f, 0x72, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // lor1.xyz, v_colo + 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x73, 0x6d, 0x6f, // r0.xyz, vec3(smo + 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x31, // othstep(0.5 - _1 + 0x30, 0x37, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2c, 0x20, // 07, 0.5 + _107, + 0x72, 0x67, 0x62, 0x61, 0x5b, 0x5f, 0x36, 0x35, 0x5d, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x73, 0x6d, // rgba[_65]))), sm + 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x5f, 0x31, 0x31, 0x35, 0x20, 0x2d, 0x20, // oothstep(_115 - + 0x5f, 0x31, 0x30, 0x37, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x30, // _107, _115 + _10 + 0x37, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x5f, 0x36, 0x35, 0x5d, 0x29, 0x20, 0x2a, 0x20, // 7, rgba[_65]) * 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // v_color0.w);. - 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, // gl_FragColor = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, // tmpvar_3;. re - 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, // turn;. };. vec - 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // 4 tmpvar_4;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, // pvar_4 = texture - 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // Cube (s_texColor - 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, // , v_texcoord0.xy - 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // z);. int tmpvar - 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, // _5;. tmpvar_5 = - 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // int(((v_texcoor - 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, // d0.w * 4.0) + 0. - 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x30, 0x5d, // 5));. rgba_1[0] - 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, // = tmpvar_4.z;. - 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // rgba_1[1] = tmp - 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, // var_4.y;. rgba_ - 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, // 1[2] = tmpvar_4. - 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x33, 0x5d, 0x20, 0x3d, // x;. rgba_1[3] = - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x66, // tmpvar_4.w;. f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, // loat tmpvar_6;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x72, 0x67, 0x62, 0x61, // tmpvar_6 = rgba - 0x5f, 0x31, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // _1[tmpvar_5];. - 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, // vec3 tmpvar_7;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, // tmpvar_7 = (abs - 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // (dFdx(v_texcoord - 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, // 0.xyz)) + abs(dF - 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, // dy(v_texcoord0.x - 0x79, 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, // yz)));. float t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_8;. tmpva - 0x72, 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x20, 0x2a, 0x20, // r_8 = (((16.0 * - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, // . sqrt(dot (t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // mpvar_7, tmpvar_ - 0x37, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x31, 0x2e, 0x34, 0x31, 0x34, 0x32, // 7)). ) / 1.4142 - 0x31, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, // 14) * u_params.y - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // );. float tmpva - 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, // r_9;. tmpvar_9 - 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // = (0.5 - (u_para - 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x29, // ms.w * tmpvar_8) - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, // );. float edge0 - 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x30, 0x20, // _10;. edge0_10 - 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x2d, 0x20, 0x74, 0x6d, // = (tmpvar_9 - tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // pvar_8);. float - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // tmpvar_11;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, // pvar_11 = clamp - 0x28, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x20, 0x2d, 0x20, 0x65, 0x64, // (((tmpvar_6 - ed - 0x67, 0x65, 0x30, 0x5f, 0x31, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, // ge0_10) / (. - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, // (tmpvar_9 + tmpv - 0x61, 0x72, 0x5f, 0x38, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, // ar_8). - edge0 - 0x5f, 0x31, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, // _10)), 0.0, 1.0) - 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, // ;. float edge0_ - 0x31, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x32, 0x20, 0x3d, // 12;. edge0_12 = - 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, // (0.5 - tmpvar_8 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // );. float tmpva - 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // r_13;. tmpvar_1 - 0x33, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x74, 0x6d, 0x70, // 3 = clamp (((tmp - 0x76, 0x61, 0x72, 0x5f, 0x36, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x32, // var_6 - edge0_12 - 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, // ) / (. (0.5 + - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, // tmpvar_8). - - 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x32, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, // edge0_12)), 0.0, - 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, // 1.0);. vec4 tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // pvar_14;. tmpva - 0x72, 0x5f, 0x31, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x20, 0x28, // r_14.xyz = mix ( - 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x5f, // v_color1.xyz, v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x28, 0x74, 0x6d, 0x70, // color0.xyz, (tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // var_13 * (tmpvar - 0x5f, 0x31, 0x33, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, // _13 * . (3.0 - 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // - (2.0 * tmpvar_ - 0x31, 0x33, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // 13)). )));. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x6d, // pvar_14.w = ((tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // pvar_11 * (tmpva - 0x72, 0x5f, 0x31, 0x31, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, // r_11 * . (3.0 - 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // - (2.0 * tmpvar - 0x5f, 0x31, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, // _11)). )) * v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, // olor0.w);. gl_F - 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ragColor = tmpva - 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r_14;.}... + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // break;. + 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, // } while(false);. + 0x7d, 0x0a, 0x0a, 0x00, // }... }; -static const uint8_t fs_font_distance_field_outline_image_essl[1785] = +static const uint8_t fs_font_distance_field_outline_image_essl[1194] = { - 0x46, 0x53, 0x48, 0x0b, 0x94, 0xf7, 0xae, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x73, // FSH....n.......s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, // ....u_params.... - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x06, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // ..........varyin - 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, // g highp vec4 v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // olor0;.varying h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ighp vec4 v_colo - 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, // r1;.varying high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // p vec4 v_texcoor - 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, // d0;.varying high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // p vec4 v_texcoor - 0x64, 0x31, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6c, 0x6f, 0x77, 0x70, // d1;.uniform lowp - 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, // samplerCube s_t - 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // exColor;.uniform - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, // highp vec4 u_pa - 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, // rams;.void main - 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // ().{. lowp floa - 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x69, // t rgba_1[4];. i - 0x66, 0x20, 0x28, 0x61, 0x6e, 0x79, 0x28, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x28, 0x76, 0x5f, // f (any(equal (v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, // texcoord0.xyz, v - 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, // ec3(0.0, 0.0, 0. - 0x30, 0x29, 0x29, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, // 0)))) {. lowp - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, // vec4 tmpvar_2;. - 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x74, // tmpvar_2 = t - 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, // extureCube (s_te - 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // xColor, v_texcoo - 0x72, 0x64, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, // rd1.xyz);. lo - 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, // wp vec4 tmpvar_3 - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2e, 0x78, // ;. tmpvar_3.x - 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x79, // yz = tmpvar_2.xy - 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2e, // z;. tmpvar_3. - 0x77, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, 0x20, // w = (tmpvar_2.w - 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, // * v_color0.w);. - 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, // gl_FragColor - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // = tmpvar_3;. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x6c, // return;. };. l - 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // owp vec4 tmpvar_ - 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, // 4;. tmpvar_4 = - 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, // textureCube (s_t - 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // exColor, v_texco - 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, // ord0.xyz);. hig - 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, // hp int tmpvar_5; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, // . tmpvar_5 = in - 0x74, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, // t(((v_texcoord0. - 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, // w * 4.0) + 0.5)) - 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, // ;. rgba_1[0] = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, // tmpvar_4.z;. rg - 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ba_1[1] = tmpvar - 0x5f, 0x34, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x32, // _4.y;. rgba_1[2 - 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x78, 0x3b, 0x0a, // ] = tmpvar_4.x;. - 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6d, // rgba_1[3] = tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, // pvar_4.w;. lowp - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, // float tmpvar_6; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x72, 0x67, // . tmpvar_6 = rg - 0x62, 0x61, 0x5f, 0x31, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x5d, 0x3b, 0x0a, // ba_1[tmpvar_5];. - 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, // highp vec3 tmp - 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_7;. tmpvar_ - 0x37, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, // 7 = (abs(dFdx(v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, // texcoord0.xyz)) - 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, // + abs(dFdy(v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, // coord0.xyz)));. - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, // highp float tmp - 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_8;. tmpvar_ - 0x38, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x0a, 0x20, // 8 = (((16.0 * . - 0x20, 0x20, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, // sqrt(dot (tmp - 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x29, // var_7, tmpvar_7) - 0x29, 0x0a, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x31, 0x2e, 0x34, 0x31, 0x34, 0x32, 0x31, 0x34, // ). ) / 1.414214 - 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x3b, // ) * u_params.y); - 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, // . highp float t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_9;. tmpva - 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x28, 0x75, 0x5f, // r_9 = (0.5 - (u_ - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // params.w * tmpva - 0x72, 0x5f, 0x38, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, // r_8));. highp f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, // loat edge0_10;. - 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, // edge0_10 = (tmp - 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, // var_9 - tmpvar_8 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // );. lowp float - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_11;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, // var_11 = clamp ( - 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, // ((tmpvar_6 - edg - 0x65, 0x30, 0x5f, 0x31, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, // e0_10) / (. ( - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // tmpvar_9 + tmpva - 0x72, 0x5f, 0x38, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, // r_8). - edge0_ - 0x31, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, // 10)), 0.0, 1.0); - 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, // . highp float e - 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, // dge0_12;. edge0 - 0x5f, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, // _12 = (0.5 - tmp - 0x76, 0x61, 0x72, 0x5f, 0x38, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, // var_8);. lowp f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, // loat tmpvar_13;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x63, 0x6c, // tmpvar_13 = cl - 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x20, // amp (((tmpvar_6 - 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x32, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, // - edge0_12) / (. - 0x20, 0x20, 0x20, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // (0.5 + tmpva - 0x72, 0x5f, 0x38, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, // r_8). - edge0_ - 0x31, 0x32, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, // 12)), 0.0, 1.0); - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, // . lowp vec4 tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // var_14;. tmpvar - 0x5f, 0x31, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x76, // _14.xyz = mix (v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x5f, 0x63, // _color1.xyz, v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, // olor0.xyz, (tmpv - 0x61, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ar_13 * (tmpvar_ - 0x31, 0x33, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, // 13 * . (3.0 - - 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // (2.0 * tmpvar_1 - 0x33, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // 3)). )));. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, // var_14.w = ((tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // var_11 * (tmpvar - 0x5f, 0x31, 0x31, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, // _11 * . (3.0 - 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // - (2.0 * tmpvar_ - 0x31, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, // 11)). )) * v_co - 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, // lor0.w);. gl_Fr - 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // agColor = tmpvar - 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _14;.}... + 0x46, 0x53, 0x48, 0x0b, 0x94, 0xf7, 0xae, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x75, // FSH....n.......u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // _params......... + 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, // ..s_texColor.... + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x04, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, // ......o...precis + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // ion mediump floa + 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, // t;.precision hig + 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // hp int;..uniform + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, // highp samplerCu + 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, // be s_texColor;.u + 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // niform highp vec + 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, // 4 u_params;..in + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // highp vec4 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // coord0;.in highp + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // vec4 v_texcoord + 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, // 1;.layout(locati + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, // on = 0) out high + 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, // p vec4 bgfx_Frag + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // Color;.in highp + 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x69, // vec4 v_color0;.i + 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, // n highp vec4 v_c + 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, // olor1;..void mai + 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, // n().{. do. + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, // {. if (a + 0x6e, 0x79, 0x28, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // ny(equal(v_texco + 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, // ord0.xyz, vec3(0 + 0x2e, 0x30, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, // .0)))). { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, // . hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, // hp vec4 _31 = te + 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // xture(s_texColor + 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x2e, 0x78, 0x79, // , v_texcoord1.xy + 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // z);. + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, // bgfx_FragColor = + 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x33, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x5f, // vec4(_31.xyz, _ + 0x33, 0x31, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, // 31.w * v_color0. + 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // w);. + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // break;. } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // . highp v + 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, // ec4 _55 = textur + 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, // e(s_texColor, v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, // texcoord0.xyz);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x36, 0x35, 0x20, // int _65 + 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // = int((v_texcoor + 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, // d0.w * 4.0) + 0. + 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, // 5);. high + 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x34, 0x5d, 0x3b, // p float rgba[4]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x30, 0x5d, // . rgba[0] + 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x35, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _55.z;. + 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x35, 0x2e, // rgba[1] = _55. + 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, // y;. rgba[ + 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x35, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 2] = _55.x;. + 0x20, 0x20, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x35, // rgba[3] = _5 + 0x35, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, // 5.w;. hig + 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x20, 0x3d, 0x20, // hp float _107 = + 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x76, // (length(fwidth(v + 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, // _texcoord0.xyz)) + 0x20, 0x2a, 0x20, 0x31, 0x31, 0x2e, 0x33, 0x31, 0x33, 0x37, 0x30, 0x38, 0x33, 0x30, 0x35, 0x33, // * 11.3137083053 + 0x35, 0x38, 0x38, 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, // 5888671875) * u_ + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // params.y;. + 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, // highp float _1 + 0x31, 0x35, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, // 15 = 0.5 - (u_pa + 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x29, 0x3b, 0x0a, // rams.w * _107);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // bgfx_Fra + 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6d, 0x69, // gColor = vec4(mi + 0x78, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, // x(v_color1.xyz, + 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, // v_color0.xyz, ve + 0x63, 0x33, 0x28, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x30, 0x2e, // c3(smoothstep(0. + 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, // 5 - _107, 0.5 + + 0x5f, 0x31, 0x30, 0x37, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x5f, 0x36, 0x35, 0x5d, 0x29, // _107, rgba[_65]) + 0x29, 0x29, 0x2c, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x5f, // )), smoothstep(_ + 0x31, 0x31, 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x35, // 115 - _107, _115 + 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5b, 0x5f, 0x36, // + _107, rgba[_6 + 0x35, 0x5d, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, // 5]) * v_color0.w + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, // );. break + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, // ;. } while(fa + 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lse);.}... }; static const uint8_t fs_font_distance_field_outline_image_spv[2838] = { diff --git a/examples/common/font/fs_font_distance_field_subpixel.bin.h b/examples/common/font/fs_font_distance_field_subpixel.bin.h index c8e908591..004a1dc55 100644 --- a/examples/common/font/fs_font_distance_field_subpixel.bin.h +++ b/examples/common/font/fs_font_distance_field_subpixel.bin.h @@ -1,160 +1,115 @@ -static const uint8_t fs_font_distance_field_subpixel_glsl[1150] = +static const uint8_t fs_font_distance_field_subpixel_glsl[788] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x73, // FSH............s 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x56, 0x04, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, // ...V...varying v - 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, // ec4 v_color0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // rying vec4 v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // coord0;.uniform + 0x00, 0x00, 0x00, 0xec, 0x02, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // ........uniform 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, // samplerCube s_te - 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, // xColor;.void mai - 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, // n ().{. int tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_1;. tmpvar_ - 0x31, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // 1 = int(((v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, // oord0.w * 4.0) + - 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, // 0.5));. vec3 t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_2;. tmpva - 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, // r_2 = dFdx(v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, // coord0.xyz);. v - 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, // ec3 tmpvar_3;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x64, 0x46, 0x64, 0x79, 0x28, // tmpvar_3 = dFdy( - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, // v_texcoord0.xyz) - 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ;. vec3 tmpvar_ - 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, // 4;. tmpvar_4 = - 0x28, 0x30, 0x2e, 0x31, 0x36, 0x36, 0x36, 0x36, 0x37, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, // (0.166667 * tmpv - 0x61, 0x72, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, // ar_2);. float t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_5;. tmpva - 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, // r_5 = textureCub - 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x28, // e (s_texColor, ( + 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, // xColor;..in vec4 + 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, // v_texcoord0;.la + 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // yout(location = + 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, // 0) out vec4 bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, // _FragColor;.in v + 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, // ec4 v_color0;..v + 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, // oid main().{. + 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, // int _22 = int(( + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, // v_texcoord0.w * + 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 4.0) + 0.5);. + 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x64, 0x46, 0x64, 0x78, // vec3 _28 = dFdx + 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, // (v_texcoord0.xyz + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x36, 0x20, // );. vec3 _36 + 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, // = _28 * 0.166666 + 0x39, 0x39, 0x39, 0x34, 0x35, 0x39, 0x32, 0x36, 0x36, 0x36, 0x36, 0x32, 0x35, 0x39, 0x37, 0x36, // 9994592666625976 + 0x35, 0x36, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // 5625;. float + 0x5f, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, // _58 = texture(s_ + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // texColor, v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, 0x5f, 0x33, 0x36, 0x29, // oord0.xyz - _36) + 0x2e, 0x7a, 0x79, 0x78, 0x77, 0x5b, 0x5f, 0x32, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // .zyxw[_22];. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, // float _65 = text + 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, // ure(s_texColor, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, // v_texcoord0.xyz - 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x29, 0x29, 0x2e, 0x7a, 0x79, 0x78, // - tmpvar_4)).zyx - 0x77, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x66, // w[tmpvar_1];. f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, // loat tmpvar_6;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, // tmpvar_6 = text - 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, // ureCube (s_texCo - 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // lor, (v_texcoord - 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, // 0.xyz + tmpvar_4 - 0x29, 0x29, 0x2e, 0x7a, 0x79, 0x78, 0x77, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // )).zyxw[tmpvar_1 - 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ];. float tmpva - 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, // r_7;. tmpvar_7 - 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // = (0.5 * (tmpvar - 0x5f, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x29, 0x29, 0x3b, // _5 + tmpvar_6)); - 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // . float tmpvar_ - 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x20, 0x3d, 0x20, // 8;. tmpvar_8 = - 0x28, 0x38, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x71, 0x72, 0x74, 0x28, 0x0a, 0x20, 0x20, // (8.0 * (sqrt(. - 0x20, 0x20, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2c, // dot (tmpvar_2, - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x20, 0x2b, // tmpvar_2). ) + - 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x74, 0x20, 0x28, // sqrt(. dot ( - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // tmpvar_3, tmpvar - 0x5f, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, // _3). )));. vec - 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // 3 tmpvar_9;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // pvar_9.x = tmpva - 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x2e, // r_5;. tmpvar_9. - 0x79, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, // y = tmpvar_7;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // tmpvar_9.z = tmp - 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, // var_6;. float e - 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, // dge0_10;. edge0 - 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, // _10 = (0.5 - tmp - 0x76, 0x61, 0x72, 0x5f, 0x38, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, // var_8);. vec3 t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // mpvar_11;. tmpv - 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, // ar_11 = clamp (( - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, // (tmpvar_9 - edge - 0x30, 0x5f, 0x31, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x30, // 0_10) / (. (0 - 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x29, 0x0a, 0x20, // .5 + tmpvar_8). - 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x30, 0x29, 0x29, 0x2c, 0x20, // - edge0_10)), - 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, // 0.0, 1.0);. gl_ - 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, // FragColor.xyz = - 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x2a, 0x20, 0x28, 0x74, // ((tmpvar_11 * (t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, // mpvar_11 * . - 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, // (3.0 - (2.0 * tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x20, 0x2a, // pvar_11)). )) * - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, // v_color0.w);. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x77, 0x20, 0x3d, // gl_FragColor.w = - 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, // (tmpvar_7 * v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // olor0.w);.}... + 0x2b, 0x20, 0x5f, 0x33, 0x36, 0x29, 0x2e, 0x7a, 0x79, 0x78, 0x77, 0x5b, 0x5f, 0x32, 0x32, 0x5d, // + _36).zyxw[_22] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x30, 0x20, // ;. float _70 + 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x35, 0x38, 0x20, 0x2b, 0x20, 0x5f, // = 0.5 * (_58 + _ + 0x36, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // 65);. float _ + 0x38, 0x32, 0x20, 0x3d, 0x20, 0x38, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, // 82 = 8.0 * (leng + 0x74, 0x68, 0x28, 0x5f, 0x32, 0x38, 0x29, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, // th(_28) + length + 0x28, 0x64, 0x46, 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // (dFdy(v_texcoord + 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // 0.xyz)));. ve + 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, // c3 _101 = smooth + 0x73, 0x74, 0x65, 0x70, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, // step(vec3(0.5 - + 0x5f, 0x38, 0x32, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, // _82), vec3(0.5 + + 0x20, 0x5f, 0x38, 0x32, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x35, 0x38, 0x2c, // _82), vec3(_58, + 0x20, 0x5f, 0x37, 0x30, 0x2c, 0x20, 0x5f, 0x36, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, // _70, _65)) * v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, // color0.w;. bg + 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, // fx_FragColor.x = + 0x20, 0x5f, 0x31, 0x30, 0x31, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, // _101.x;. bgf + 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, // x_FragColor.y = + 0x5f, 0x31, 0x30, 0x31, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // _101.y;. bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, // _FragColor.z = _ + 0x31, 0x30, 0x31, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // 101.z;. bgfx_ + 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x5f, 0x37, // FragColor.w = _7 + 0x30, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x3b, 0x0a, // 0 * v_color0.w;. + 0x7d, 0x0a, 0x0a, 0x00, // }... }; -static const uint8_t fs_font_distance_field_subpixel_essl[1276] = +static const uint8_t fs_font_distance_field_subpixel_essl[900] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x73, // FSH............s 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0xd4, 0x04, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // .......varying h + 0x00, 0x00, 0x00, 0x5c, 0x03, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, // .......precision + 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, // mediump float;. + 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // precision highp + 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, // int;..uniform hi + 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, // ghp samplerCube + 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, // s_texColor;..in + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // highp vec4 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // coord0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, // ocation = 0) out + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, // highp vec4 bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, // _FragColor;.in h 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ighp vec4 v_colo - 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, // r0;.varying high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // p vec4 v_texcoor - 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6c, 0x6f, 0x77, 0x70, // d0;.uniform lowp - 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, // samplerCube s_t - 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // exColor;.void ma - 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // in ().{. highp - 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, // int tmpvar_1;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, // tmpvar_1 = int(( - 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x77, 0x20, 0x2a, // (v_texcoord0.w * - 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, // 4.0) + 0.5));. - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, // highp vec3 tmpv - 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // ar_2;. tmpvar_2 - 0x20, 0x3d, 0x20, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // = dFdx(v_texcoo - 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, // rd0.xyz);. high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, // p vec3 tmpvar_3; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x64, 0x46, // . tmpvar_3 = dF - 0x64, 0x79, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, // dy(v_texcoord0.x - 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // yz);. highp vec - 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // 3 tmpvar_4;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x31, 0x36, 0x36, 0x36, // pvar_4 = (0.1666 - 0x36, 0x37, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x3b, 0x0a, // 67 * tmpvar_2);. - 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, // lowp float tmp - 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_5;. tmpvar_ - 0x35, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, // 5 = textureCube - 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x28, 0x76, 0x5f, // (s_texColor, (v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2d, 0x20, // texcoord0.xyz - - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x29, 0x29, 0x2e, 0x7a, 0x79, 0x78, 0x77, 0x5b, // tmpvar_4)).zyxw[ - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, // tmpvar_1];. low - 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, // p float tmpvar_6 - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x74, // ;. tmpvar_6 = t - 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, // extureCube (s_te - 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // xColor, (v_texco - 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ord0.xyz + tmpva - 0x72, 0x5f, 0x34, 0x29, 0x29, 0x2e, 0x7a, 0x79, 0x78, 0x77, 0x5b, 0x74, 0x6d, 0x70, 0x76, 0x61, // r_4)).zyxw[tmpva - 0x72, 0x5f, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, // r_1];. lowp flo - 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x74, // at tmpvar_7;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2a, // mpvar_7 = (0.5 * - 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, // (tmpvar_5 + tmp - 0x76, 0x61, 0x72, 0x5f, 0x36, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // var_6));. highp - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, // float tmpvar_8; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x38, // . tmpvar_8 = (8 - 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x71, 0x72, 0x74, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, // .0 * (sqrt(. - 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2c, 0x20, 0x74, // dot (tmpvar_2, t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x73, // mpvar_2). ) + s - 0x71, 0x72, 0x74, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, // qrt(. dot (tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, // pvar_3, tmpvar_3 - 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, // ). )));. lowp - 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, // vec3 tmpvar_9;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x6d, // tmpvar_9.x = tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // pvar_5;. tmpvar - 0x5f, 0x39, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, // _9.y = tmpvar_7; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x2e, 0x7a, 0x20, 0x3d, 0x20, // . tmpvar_9.z = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, // tmpvar_6;. lowp - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x3b, // vec3 tmpvar_10; - 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, // . highp float e - 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, // dge0_11;. edge0 - 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, // _11 = (0.5 - tmp - 0x76, 0x61, 0x72, 0x5f, 0x38, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, // var_8);. lowp v - 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, // ec3 tmpvar_12;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, // tmpvar_12 = cla - 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x2d, // mp (((tmpvar_9 - - 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, 0x31, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x0a, 0x20, // edge0_11) / (. - 0x20, 0x20, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // (0.5 + tmpvar - 0x5f, 0x38, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x31, // _8). - edge0_1 - 0x31, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, // 1)), 0.0, 1.0);. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x74, // tmpvar_10 = (t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, // mpvar_12 * (tmpv - 0x61, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x2a, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x0a, // ar_12 * (3.0 - . - 0x20, 0x20, 0x20, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // (2.0 * tmpva - 0x72, 0x5f, 0x31, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, // r_12). )));. g - 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x79, 0x7a, 0x20, // l_FragColor.xyz - 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x20, 0x2a, 0x20, 0x76, // = (tmpvar_10 * v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, // _color0.w);. gl - 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, // _FragColor.w = ( - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // tmpvar_7 * v_col - 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // or0.w);.}... + 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, // r0;..void main() + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x20, 0x3d, // .{. int _22 = + 0x20, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // int((v_texcoord + 0x30, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, // 0.w * 4.0) + 0.5 + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // );. highp vec + 0x33, 0x20, 0x5f, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x64, 0x46, 0x64, 0x78, 0x28, 0x76, 0x5f, 0x74, // 3 _28 = dFdx(v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, // excoord0.xyz);. + 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, // highp vec3 _3 + 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x31, 0x36, 0x36, 0x36, // 6 = _28 * 0.1666 + 0x36, 0x36, 0x39, 0x39, 0x39, 0x34, 0x35, 0x39, 0x32, 0x36, 0x36, 0x36, 0x36, 0x32, 0x35, 0x39, // 6699945926666259 + 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, // 765625;. high + 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x65, // p float _58 = te + 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // xture(s_texColor + 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, // , v_texcoord0.xy + 0x7a, 0x20, 0x2d, 0x20, 0x5f, 0x33, 0x36, 0x29, 0x2e, 0x7a, 0x79, 0x78, 0x77, 0x5b, 0x5f, 0x32, // z - _36).zyxw[_2 + 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, // 2];. highp fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, // oat _65 = textur + 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, // e(s_texColor, v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2b, 0x20, // texcoord0.xyz + + 0x5f, 0x33, 0x36, 0x29, 0x2e, 0x7a, 0x79, 0x78, 0x77, 0x5b, 0x5f, 0x32, 0x32, 0x5d, 0x3b, 0x0a, // _36).zyxw[_22];. + 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // highp float + 0x5f, 0x37, 0x30, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x35, 0x38, // _70 = 0.5 * (_58 + 0x20, 0x2b, 0x20, 0x5f, 0x36, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, // + _65);. hig + 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x38, // hp float _82 = 8 + 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x5f, 0x32, 0x38, // .0 * (length(_28 + 0x29, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x64, 0x46, 0x64, 0x79, 0x28, // ) + length(dFdy( + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, // v_texcoord0.xyz) + 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // ));. highp ve + 0x63, 0x33, 0x20, 0x5f, 0x31, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, // c3 _101 = smooth + 0x73, 0x74, 0x65, 0x70, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, // step(vec3(0.5 - + 0x5f, 0x38, 0x32, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, // _82), vec3(0.5 + + 0x20, 0x5f, 0x38, 0x32, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x35, 0x38, 0x2c, // _82), vec3(_58, + 0x20, 0x5f, 0x37, 0x30, 0x2c, 0x20, 0x5f, 0x36, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, // _70, _65)) * v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, // color0.w;. bg + 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, // fx_FragColor.x = + 0x20, 0x5f, 0x31, 0x30, 0x31, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, // _101.x;. bgf + 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, // x_FragColor.y = + 0x5f, 0x31, 0x30, 0x31, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // _101.y;. bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, // _FragColor.z = _ + 0x31, 0x30, 0x31, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // 101.z;. bgfx_ + 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x5f, 0x37, // FragColor.w = _7 + 0x30, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x3b, 0x0a, // 0 * v_color0.w;. + 0x7d, 0x0a, 0x0a, 0x00, // }... }; static const uint8_t fs_font_distance_field_subpixel_spv[1695] = { diff --git a/examples/common/font/vs_font_basic.bin.h b/examples/common/font/vs_font_basic.bin.h index ae52060f2..757991b7c 100644 --- a/examples/common/font/vs_font_basic.bin.h +++ b/examples/common/font/vs_font_basic.bin.h @@ -1,61 +1,56 @@ -static const uint8_t vs_font_basic_glsl[397] = +static const uint8_t vs_font_basic_glsl[378] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........`...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec2 a_position;. - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // attribute vec4 a - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // _texcoord0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ing vec4 v_color - 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // 0;.varying vec4 - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // v_texcoord0;.uni + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........M....uni 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // lViewProj;.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // main ().{. vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, // var_1.zw = vec2( - 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // 0.0, 1.0);. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, // var_1.xy = a_pos - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, // ition;. gl_Posi - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, // tion = (u_modelV - 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // iewProj * tmpvar - 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // _1);. v_texcoor - 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // d0 = a_texcoord0 - 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, // ;. v_color0 = a - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _color0;.}... + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, // t(location = 2) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // n, 0.0, 1.0);. + 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, // v_texcoord0 = + 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, // a_texcoord0;. + 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, // v_color0 = a_co + 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lor0;.}... }; -static const uint8_t vs_font_basic_essl[439] = +static const uint8_t vs_font_basic_essl[378] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // bute highp vec2 - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, // a_position;.attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, // a_texcoord0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // rying highp vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color0;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ng highp vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // texcoord0;.unifo - 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // rm highp mat4 u_ - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, // modelViewProj;.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // highp vec4 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // r_1;. tmpvar_1. - 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // zw = vec2(0.0, 1 - 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // .0);. tmpvar_1. - 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, // xy = a_position; - 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, // . gl_Position = - 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, // (u_modelViewPro - 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, // j * tmpvar_1);. - 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, // v_texcoord0 = a - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, // _texcoord0;. v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // color0 = a_color - 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 0;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........M....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, // t(location = 2) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // n, 0.0, 1.0);. + 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, // v_texcoord0 = + 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, // a_texcoord0;. + 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, // v_color0 = a_co + 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lor0;.}... }; static const uint8_t vs_font_basic_spv[1218] = { diff --git a/examples/common/font/vs_font_distance_field.bin.h b/examples/common/font/vs_font_distance_field.bin.h index b8a35de5c..b6264532d 100644 --- a/examples/common/font/vs_font_distance_field.bin.h +++ b/examples/common/font/vs_font_distance_field.bin.h @@ -1,61 +1,56 @@ -static const uint8_t vs_font_distance_field_glsl[397] = +static const uint8_t vs_font_distance_field_glsl[378] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........`...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec2 a_position;. - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // attribute vec4 a - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // _texcoord0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ing vec4 v_color - 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // 0;.varying vec4 - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // v_texcoord0;.uni + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........M....uni 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // lViewProj;.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // main ().{. vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, // var_1.zw = vec2( - 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // 0.0, 1.0);. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, // var_1.xy = a_pos - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, // ition;. gl_Posi - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, // tion = (u_modelV - 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // iewProj * tmpvar - 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // _1);. v_texcoor - 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // d0 = a_texcoord0 - 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, // ;. v_color0 = a - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _color0;.}... + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, // t(location = 2) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // n, 0.0, 1.0);. + 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, // v_texcoord0 = + 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, // a_texcoord0;. + 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, // v_color0 = a_co + 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lor0;.}... }; -static const uint8_t vs_font_distance_field_essl[439] = +static const uint8_t vs_font_distance_field_essl[378] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // bute highp vec2 - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, // a_position;.attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, // a_texcoord0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // rying highp vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color0;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ng highp vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // texcoord0;.unifo - 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // rm highp mat4 u_ - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, // modelViewProj;.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // highp vec4 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // r_1;. tmpvar_1. - 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // zw = vec2(0.0, 1 - 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // .0);. tmpvar_1. - 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, // xy = a_position; - 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, // . gl_Position = - 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, // (u_modelViewPro - 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, // j * tmpvar_1);. - 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, // v_texcoord0 = a - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, // _texcoord0;. v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // color0 = a_color - 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 0;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........M....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, // t(location = 2) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // n, 0.0, 1.0);. + 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, // v_texcoord0 = + 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, // a_texcoord0;. + 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, // v_color0 = a_co + 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lor0;.}... }; static const uint8_t vs_font_distance_field_spv[1218] = { diff --git a/examples/common/font/vs_font_distance_field_drop_shadow.bin.h b/examples/common/font/vs_font_distance_field_drop_shadow.bin.h index 6bad9c895..8f84517de 100644 --- a/examples/common/font/vs_font_distance_field_drop_shadow.bin.h +++ b/examples/common/font/vs_font_distance_field_drop_shadow.bin.h @@ -1,93 +1,90 @@ -static const uint8_t vs_font_distance_field_drop_shadow_glsl[634] = +static const uint8_t vs_font_distance_field_drop_shadow_glsl[651] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x67, 0x7a, 0xc3, 0x01, 0x00, 0x0f, 0x75, // VSH......gz....u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x02, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........M...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x61, 0x74, // ec4 a_color1;.at - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, // tribute vec2 a_p - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, // osition;.attribu - 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // te vec4 a_texcoo - 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // rd0;.attribute v - 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, // ec4 a_texcoord1; - 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // .attribute vec4 - 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x76, 0x61, 0x72, // a_texcoord2;.var - 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ying vec4 v_colo - 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, // r0;.varying vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color1;.varyi - 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // ng vec4 v_texcoo - 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, // rd0;.varying vec - 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x76, // 4 v_texcoord1;.v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, // arying vec4 v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // xcoord2;.uniform - 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, // mat4 u_modelVie - 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // wProj;.void main - 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, // ().{. vec4 tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_1;. tmpvar_ - 0x31, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, // 1.zw = vec2(0.0, - 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // 1.0);. tmpvar_ - 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // 1.xy = a_positio - 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, // n;. gl_Position - 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, // = (u_modelViewP - 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, // roj * tmpvar_1); - 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, // . v_texcoord0 = - 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, // a_texcoord0;. - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, // v_texcoord1 = a_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, // texcoord1;. v_t - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, // excoord2 = a_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // coord2;. v_colo - 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, // r0 = a_color0;. - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, // v_color1 = a_co - 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lor1;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x02, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........^....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, // ut(location = 2) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x29, 0x20, // t(location = 3) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord1;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, // t(location = 4) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd1;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord2;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x35, 0x29, 0x20, // t(location = 5) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd2;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, // ut vec4 v_color1 + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // n = 1) in vec4 a + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // _color1;..void m + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, // ain().{. gl_P + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // osition = u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, // lViewProj * vec4 + 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, // (a_position, 0.0 + 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, // , 1.0);. v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // xcoord0 = a_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // oord0;. v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // coord1 = a_texco + 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // ord1;. v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // oord2 = a_texcoo + 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // rd2;. v_color + 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, // 0 = a_color0;. + 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, // v_color1 = a_c + 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // olor1;.}... }; -static const uint8_t vs_font_distance_field_drop_shadow_essl[712] = +static const uint8_t vs_font_distance_field_drop_shadow_essl[651] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x67, 0x7a, 0xc3, 0x01, 0x00, 0x0f, 0x75, // VSH......gz....u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0x02, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // bute highp vec4 - 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, // a_color1;.attrib - 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, // ute highp vec2 a - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // _position;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // bute highp vec4 - 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, // a_texcoord0;.att - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // ribute highp vec - 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x61, // 4 a_texcoord1;.a - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // ttribute highp v - 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, // ec4 a_texcoord2; - 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // .varying highp v - 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, // ec4 v_color0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // rying highp vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color1;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ng highp vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // texcoord0;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ng highp vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // texcoord1;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ng highp vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // texcoord2;.unifo - 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // rm highp mat4 u_ - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, // modelViewProj;.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // highp vec4 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // r_1;. tmpvar_1. - 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // zw = vec2(0.0, 1 - 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // .0);. tmpvar_1. - 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, // xy = a_position; - 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, // . gl_Position = - 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, // (u_modelViewPro - 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, // j * tmpvar_1);. - 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, // v_texcoord0 = a - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, // _texcoord0;. v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, // texcoord1 = a_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // xcoord1;. v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // coord2 = a_texco - 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // ord2;. v_color0 - 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, // = a_color0;. v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // _color1 = a_colo - 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r1;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x02, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........^....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, // ut(location = 2) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x29, 0x20, // t(location = 3) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord1;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, // t(location = 4) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd1;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord2;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x35, 0x29, 0x20, // t(location = 5) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd2;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, // ut vec4 v_color1 + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // n = 1) in vec4 a + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // _color1;..void m + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, // ain().{. gl_P + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // osition = u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, // lViewProj * vec4 + 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, // (a_position, 0.0 + 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, // , 1.0);. v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // xcoord0 = a_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // oord0;. v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // coord1 = a_texco + 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // ord1;. v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // oord2 = a_texcoo + 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // rd2;. v_color + 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, // 0 = a_color0;. + 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, // v_color1 = a_c + 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // olor1;.}... }; static const uint8_t vs_font_distance_field_drop_shadow_spv[1700] = { diff --git a/examples/common/font/vs_font_distance_field_drop_shadow_image.bin.h b/examples/common/font/vs_font_distance_field_drop_shadow_image.bin.h index 59ee3aa75..6fc79c5e0 100644 --- a/examples/common/font/vs_font_distance_field_drop_shadow_image.bin.h +++ b/examples/common/font/vs_font_distance_field_drop_shadow_image.bin.h @@ -1,93 +1,90 @@ -static const uint8_t vs_font_distance_field_drop_shadow_image_glsl[634] = +static const uint8_t vs_font_distance_field_drop_shadow_image_glsl[651] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x67, 0x7a, 0xc3, 0x01, 0x00, 0x0f, 0x75, // VSH......gz....u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x02, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........M...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x61, 0x74, // ec4 a_color1;.at - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, // tribute vec2 a_p - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, // osition;.attribu - 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // te vec4 a_texcoo - 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // rd0;.attribute v - 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, // ec4 a_texcoord1; - 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // .attribute vec4 - 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x76, 0x61, 0x72, // a_texcoord2;.var - 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ying vec4 v_colo - 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, // r0;.varying vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color1;.varyi - 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // ng vec4 v_texcoo - 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, // rd0;.varying vec - 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x76, // 4 v_texcoord1;.v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, // arying vec4 v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // xcoord2;.uniform - 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, // mat4 u_modelVie - 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // wProj;.void main - 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, // ().{. vec4 tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_1;. tmpvar_ - 0x31, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, // 1.zw = vec2(0.0, - 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // 1.0);. tmpvar_ - 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // 1.xy = a_positio - 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, // n;. gl_Position - 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, // = (u_modelViewP - 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, // roj * tmpvar_1); - 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, // . v_texcoord0 = - 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, // a_texcoord0;. - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, // v_texcoord1 = a_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, // texcoord1;. v_t - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, // excoord2 = a_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // coord2;. v_colo - 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, // r0 = a_color0;. - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, // v_color1 = a_co - 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lor1;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x02, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........^....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, // ut(location = 2) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x29, 0x20, // t(location = 3) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord1;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, // t(location = 4) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd1;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord2;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x35, 0x29, 0x20, // t(location = 5) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd2;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, // ut vec4 v_color1 + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // n = 1) in vec4 a + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // _color1;..void m + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, // ain().{. gl_P + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // osition = u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, // lViewProj * vec4 + 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, // (a_position, 0.0 + 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, // , 1.0);. v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // xcoord0 = a_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // oord0;. v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // coord1 = a_texco + 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // ord1;. v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // oord2 = a_texcoo + 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // rd2;. v_color + 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, // 0 = a_color0;. + 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, // v_color1 = a_c + 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // olor1;.}... }; -static const uint8_t vs_font_distance_field_drop_shadow_image_essl[712] = +static const uint8_t vs_font_distance_field_drop_shadow_image_essl[651] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x67, 0x7a, 0xc3, 0x01, 0x00, 0x0f, 0x75, // VSH......gz....u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0x02, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // bute highp vec4 - 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, // a_color1;.attrib - 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, // ute highp vec2 a - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // _position;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // bute highp vec4 - 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, // a_texcoord0;.att - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // ribute highp vec - 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x61, // 4 a_texcoord1;.a - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // ttribute highp v - 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, // ec4 a_texcoord2; - 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // .varying highp v - 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, // ec4 v_color0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // rying highp vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color1;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ng highp vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // texcoord0;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ng highp vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // texcoord1;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ng highp vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // texcoord2;.unifo - 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // rm highp mat4 u_ - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, // modelViewProj;.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // highp vec4 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // r_1;. tmpvar_1. - 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // zw = vec2(0.0, 1 - 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // .0);. tmpvar_1. - 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, // xy = a_position; - 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, // . gl_Position = - 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, // (u_modelViewPro - 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, // j * tmpvar_1);. - 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, // v_texcoord0 = a - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, // _texcoord0;. v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, // texcoord1 = a_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // xcoord1;. v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // coord2 = a_texco - 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // ord2;. v_color0 - 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, // = a_color0;. v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // _color1 = a_colo - 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r1;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x02, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........^....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, // ut(location = 2) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x29, 0x20, // t(location = 3) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord1;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, // t(location = 4) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd1;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord2;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x35, 0x29, 0x20, // t(location = 5) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd2;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, // ut vec4 v_color1 + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // n = 1) in vec4 a + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // _color1;..void m + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, // ain().{. gl_P + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // osition = u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, // lViewProj * vec4 + 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, // (a_position, 0.0 + 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, // , 1.0);. v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // xcoord0 = a_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // oord0;. v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // coord1 = a_texco + 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // ord1;. v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // oord2 = a_texcoo + 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // rd2;. v_color + 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, // 0 = a_color0;. + 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, // v_color1 = a_c + 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // olor1;.}... }; static const uint8_t vs_font_distance_field_drop_shadow_image_spv[1700] = { diff --git a/examples/common/font/vs_font_distance_field_outline.bin.h b/examples/common/font/vs_font_distance_field_outline.bin.h index fc8126596..709821399 100644 --- a/examples/common/font/vs_font_distance_field_outline.bin.h +++ b/examples/common/font/vs_font_distance_field_outline.bin.h @@ -1,82 +1,78 @@ -static const uint8_t vs_font_distance_field_outline_glsl[551] = +static const uint8_t vs_font_distance_field_outline_glsl[556] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x94, 0xf7, 0xae, 0x6e, 0x01, 0x00, 0x0f, 0x75, // VSH........n...u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x61, 0x74, // ec4 a_color1;.at - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, // tribute vec2 a_p - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, // osition;.attribu - 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // te vec4 a_texcoo - 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // rd0;.attribute v - 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, // ec4 a_texcoord1; - 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // .varying vec4 v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, // color0;.varying - 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, // vec4 v_color1;.v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, // arying vec4 v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, // xcoord0;.varying - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // vec4 v_texcoord - 0x31, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // 1;.uniform mat4 - 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, // u_modelViewProj; - 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, // .void main ().{. - 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, // vec4 tmpvar_1; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x77, 0x20, 0x3d, // . tmpvar_1.zw = - 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, // vec2(0.0, 1.0); - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, // . tmpvar_1.xy = - 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, // a_position;. g - 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, // l_Position = (u_ - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, // modelViewProj * - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, // tmpvar_1);. v_t - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, // excoord0 = a_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // coord0;. v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // oord1 = a_texcoo - 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, // rd1;. v_color0 - 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, // = a_color0;. v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // color1 = a_color - 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 1;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // .............uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, // ut(location = 2) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x29, 0x20, // t(location = 3) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord1;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, // t(location = 4) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd1;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, // ut vec4 v_color1 + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // n = 1) in vec4 a + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // _color1;..void m + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, // ain().{. gl_P + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // osition = u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, // lViewProj * vec4 + 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, // (a_position, 0.0 + 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, // , 1.0);. v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // xcoord0 = a_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // oord0;. v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // coord1 = a_texco + 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ord1;. v_colo + 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, // r0 = a_color0;. + 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, // v_color1 = a_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // color1;.}... }; -static const uint8_t vs_font_distance_field_outline_essl[617] = +static const uint8_t vs_font_distance_field_outline_essl[556] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x94, 0xf7, 0xae, 0x6e, 0x01, 0x00, 0x0f, 0x75, // VSH........n...u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x02, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........<...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // bute highp vec4 - 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, // a_color1;.attrib - 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, // ute highp vec2 a - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // _position;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // bute highp vec4 - 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, // a_texcoord0;.att - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // ribute highp vec - 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x76, // 4 a_texcoord1;.v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // arying highp vec - 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // 4 v_color0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, // ing highp vec4 v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, // _color1;.varying - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, // highp vec4 v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, // xcoord0;.varying - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, // highp vec4 v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // xcoord1;.uniform - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, // highp mat4 u_mo - 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, // delViewProj;.voi - 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, // d main ().{. hi - 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ghp vec4 tmpvar_ - 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x77, // 1;. tmpvar_1.zw - 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, // = vec2(0.0, 1.0 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, // );. tmpvar_1.xy - 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, // = a_position;. - 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, // gl_Position = ( - 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj - 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, // * tmpvar_1);. v - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, // _texcoord0 = a_t - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, // excoord0;. v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // xcoord1 = a_texc - 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // oord1;. v_color - 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, // 0 = a_color0;. - 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // v_color1 = a_col - 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // or1;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // .............uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, // ut(location = 2) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x29, 0x20, // t(location = 3) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord1;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, // t(location = 4) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd1;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, // ut vec4 v_color1 + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // n = 1) in vec4 a + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // _color1;..void m + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, // ain().{. gl_P + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // osition = u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, // lViewProj * vec4 + 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, // (a_position, 0.0 + 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, // , 1.0);. v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // xcoord0 = a_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // oord0;. v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // coord1 = a_texco + 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ord1;. v_colo + 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, // r0 = a_color0;. + 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, // v_color1 = a_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // color1;.}... }; static const uint8_t vs_font_distance_field_outline_spv[1538] = { diff --git a/examples/common/font/vs_font_distance_field_outline_drop_shadow_image.bin.h b/examples/common/font/vs_font_distance_field_outline_drop_shadow_image.bin.h index 0b9b88c8e..2ae3c0c5a 100644 --- a/examples/common/font/vs_font_distance_field_outline_drop_shadow_image.bin.h +++ b/examples/common/font/vs_font_distance_field_outline_drop_shadow_image.bin.h @@ -1,93 +1,90 @@ -static const uint8_t vs_font_distance_field_outline_drop_shadow_image_glsl[634] = +static const uint8_t vs_font_distance_field_outline_drop_shadow_image_glsl[651] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x67, 0x7a, 0xc3, 0x01, 0x00, 0x0f, 0x75, // VSH......gz....u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x02, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........M...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x61, 0x74, // ec4 a_color1;.at - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, // tribute vec2 a_p - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, // osition;.attribu - 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // te vec4 a_texcoo - 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // rd0;.attribute v - 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, // ec4 a_texcoord1; - 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // .attribute vec4 - 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x76, 0x61, 0x72, // a_texcoord2;.var - 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ying vec4 v_colo - 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, // r0;.varying vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color1;.varyi - 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // ng vec4 v_texcoo - 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, // rd0;.varying vec - 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x76, // 4 v_texcoord1;.v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, // arying vec4 v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // xcoord2;.uniform - 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, // mat4 u_modelVie - 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // wProj;.void main - 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, // ().{. vec4 tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_1;. tmpvar_ - 0x31, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, // 1.zw = vec2(0.0, - 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // 1.0);. tmpvar_ - 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // 1.xy = a_positio - 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, // n;. gl_Position - 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, // = (u_modelViewP - 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, // roj * tmpvar_1); - 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, // . v_texcoord0 = - 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, // a_texcoord0;. - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, // v_texcoord1 = a_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, // texcoord1;. v_t - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, // excoord2 = a_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // coord2;. v_colo - 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, // r0 = a_color0;. - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, // v_color1 = a_co - 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lor1;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x02, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........^....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, // ut(location = 2) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x29, 0x20, // t(location = 3) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord1;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, // t(location = 4) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd1;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord2;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x35, 0x29, 0x20, // t(location = 5) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd2;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, // ut vec4 v_color1 + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // n = 1) in vec4 a + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // _color1;..void m + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, // ain().{. gl_P + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // osition = u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, // lViewProj * vec4 + 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, // (a_position, 0.0 + 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, // , 1.0);. v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // xcoord0 = a_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // oord0;. v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // coord1 = a_texco + 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // ord1;. v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // oord2 = a_texcoo + 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // rd2;. v_color + 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, // 0 = a_color0;. + 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, // v_color1 = a_c + 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // olor1;.}... }; -static const uint8_t vs_font_distance_field_outline_drop_shadow_image_essl[712] = +static const uint8_t vs_font_distance_field_outline_drop_shadow_image_essl[651] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x67, 0x7a, 0xc3, 0x01, 0x00, 0x0f, 0x75, // VSH......gz....u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0x02, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // bute highp vec4 - 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, // a_color1;.attrib - 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, // ute highp vec2 a - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // _position;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // bute highp vec4 - 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, // a_texcoord0;.att - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // ribute highp vec - 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x61, // 4 a_texcoord1;.a - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // ttribute highp v - 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, // ec4 a_texcoord2; - 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // .varying highp v - 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, // ec4 v_color0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // rying highp vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color1;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ng highp vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // texcoord0;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ng highp vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // texcoord1;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ng highp vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // texcoord2;.unifo - 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // rm highp mat4 u_ - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, // modelViewProj;.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // highp vec4 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // r_1;. tmpvar_1. - 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // zw = vec2(0.0, 1 - 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // .0);. tmpvar_1. - 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, // xy = a_position; - 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, // . gl_Position = - 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, // (u_modelViewPro - 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, // j * tmpvar_1);. - 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, // v_texcoord0 = a - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, // _texcoord0;. v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, // texcoord1 = a_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // xcoord1;. v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // coord2 = a_texco - 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // ord2;. v_color0 - 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, // = a_color0;. v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // _color1 = a_colo - 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r1;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x02, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........^....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, // ut(location = 2) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x29, 0x20, // t(location = 3) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord1;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, // t(location = 4) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd1;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord2;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x35, 0x29, 0x20, // t(location = 5) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd2;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, // ut vec4 v_color1 + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // n = 1) in vec4 a + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // _color1;..void m + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, // ain().{. gl_P + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // osition = u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, // lViewProj * vec4 + 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, // (a_position, 0.0 + 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, // , 1.0);. v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // xcoord0 = a_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // oord0;. v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // coord1 = a_texco + 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // ord1;. v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // oord2 = a_texcoo + 0x72, 0x64, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // rd2;. v_color + 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, // 0 = a_color0;. + 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, // v_color1 = a_c + 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // olor1;.}... }; static const uint8_t vs_font_distance_field_outline_drop_shadow_image_spv[1700] = { diff --git a/examples/common/font/vs_font_distance_field_outline_image.bin.h b/examples/common/font/vs_font_distance_field_outline_image.bin.h index 434a10363..02325ac8d 100644 --- a/examples/common/font/vs_font_distance_field_outline_image.bin.h +++ b/examples/common/font/vs_font_distance_field_outline_image.bin.h @@ -1,82 +1,78 @@ -static const uint8_t vs_font_distance_field_outline_image_glsl[551] = +static const uint8_t vs_font_distance_field_outline_image_glsl[556] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x94, 0xf7, 0xae, 0x6e, 0x01, 0x00, 0x0f, 0x75, // VSH........n...u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x61, 0x74, // ec4 a_color1;.at - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, // tribute vec2 a_p - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, // osition;.attribu - 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // te vec4 a_texcoo - 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // rd0;.attribute v - 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, // ec4 a_texcoord1; - 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // .varying vec4 v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, // color0;.varying - 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, // vec4 v_color1;.v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, // arying vec4 v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, // xcoord0;.varying - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // vec4 v_texcoord - 0x31, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // 1;.uniform mat4 - 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, // u_modelViewProj; - 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, // .void main ().{. - 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, // vec4 tmpvar_1; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x77, 0x20, 0x3d, // . tmpvar_1.zw = - 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, // vec2(0.0, 1.0); - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, // . tmpvar_1.xy = - 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, // a_position;. g - 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, // l_Position = (u_ - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, // modelViewProj * - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, // tmpvar_1);. v_t - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, // excoord0 = a_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // coord0;. v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // oord1 = a_texcoo - 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, // rd1;. v_color0 - 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, // = a_color0;. v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // color1 = a_color - 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 1;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // .............uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, // ut(location = 2) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x29, 0x20, // t(location = 3) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord1;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, // t(location = 4) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd1;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, // ut vec4 v_color1 + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // n = 1) in vec4 a + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // _color1;..void m + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, // ain().{. gl_P + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // osition = u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, // lViewProj * vec4 + 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, // (a_position, 0.0 + 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, // , 1.0);. v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // xcoord0 = a_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // oord0;. v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // coord1 = a_texco + 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ord1;. v_colo + 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, // r0 = a_color0;. + 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, // v_color1 = a_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // color1;.}... }; -static const uint8_t vs_font_distance_field_outline_image_essl[617] = +static const uint8_t vs_font_distance_field_outline_image_essl[556] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x94, 0xf7, 0xae, 0x6e, 0x01, 0x00, 0x0f, 0x75, // VSH........n...u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x02, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........<...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // bute highp vec4 - 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, // a_color1;.attrib - 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, // ute highp vec2 a - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // _position;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // bute highp vec4 - 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, // a_texcoord0;.att - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // ribute highp vec - 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x76, // 4 a_texcoord1;.v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // arying highp vec - 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // 4 v_color0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, // ing highp vec4 v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, // _color1;.varying - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, // highp vec4 v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, // xcoord0;.varying - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, // highp vec4 v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // xcoord1;.uniform - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, // highp mat4 u_mo - 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, // delViewProj;.voi - 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, // d main ().{. hi - 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ghp vec4 tmpvar_ - 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x77, // 1;. tmpvar_1.zw - 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, // = vec2(0.0, 1.0 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, // );. tmpvar_1.xy - 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, // = a_position;. - 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, // gl_Position = ( - 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj - 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, // * tmpvar_1);. v - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, // _texcoord0 = a_t - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, // excoord0;. v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // xcoord1 = a_texc - 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // oord1;. v_color - 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, // 0 = a_color0;. - 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // v_color1 = a_col - 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // or1;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // .............uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, // ut(location = 2) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x29, 0x20, // t(location = 3) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord1;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x34, 0x29, 0x20, // t(location = 4) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd1;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, // ut vec4 v_color1 + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // n = 1) in vec4 a + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // _color1;..void m + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, // ain().{. gl_P + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // osition = u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, // lViewProj * vec4 + 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, // (a_position, 0.0 + 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, // , 1.0);. v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // xcoord0 = a_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // oord0;. v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // coord1 = a_texco + 0x6f, 0x72, 0x64, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ord1;. v_colo + 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, // r0 = a_color0;. + 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, // v_color1 = a_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // color1;.}... }; static const uint8_t vs_font_distance_field_outline_image_spv[1538] = { diff --git a/examples/common/font/vs_font_distance_field_subpixel.bin.h b/examples/common/font/vs_font_distance_field_subpixel.bin.h index e8ee8de1e..fdcd565f8 100644 --- a/examples/common/font/vs_font_distance_field_subpixel.bin.h +++ b/examples/common/font/vs_font_distance_field_subpixel.bin.h @@ -1,61 +1,56 @@ -static const uint8_t vs_font_distance_field_subpixel_glsl[397] = +static const uint8_t vs_font_distance_field_subpixel_glsl[378] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........`...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec2 a_position;. - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // attribute vec4 a - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // _texcoord0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ing vec4 v_color - 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // 0;.varying vec4 - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // v_texcoord0;.uni + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........M....uni 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // lViewProj;.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // main ().{. vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, // var_1.zw = vec2( - 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // 0.0, 1.0);. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, // var_1.xy = a_pos - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, // ition;. gl_Posi - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, // tion = (u_modelV - 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // iewProj * tmpvar - 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // _1);. v_texcoor - 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // d0 = a_texcoord0 - 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, // ;. v_color0 = a - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _color0;.}... + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, // t(location = 2) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // n, 0.0, 1.0);. + 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, // v_texcoord0 = + 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, // a_texcoord0;. + 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, // v_color0 = a_co + 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lor0;.}... }; -static const uint8_t vs_font_distance_field_subpixel_essl[439] = +static const uint8_t vs_font_distance_field_subpixel_essl[378] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // bute highp vec2 - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, // a_position;.attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, // a_texcoord0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // rying highp vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color0;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ng highp vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // texcoord0;.unifo - 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // rm highp mat4 u_ - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, // modelViewProj;.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // highp vec4 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // r_1;. tmpvar_1. - 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // zw = vec2(0.0, 1 - 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // .0);. tmpvar_1. - 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, // xy = a_position; - 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, // . gl_Position = - 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, // (u_modelViewPro - 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, // j * tmpvar_1);. - 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, // v_texcoord0 = a - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, // _texcoord0;. v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // color0 = a_color - 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 0;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........M....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec2 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, // t(location = 2) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec4 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // n, 0.0, 1.0);. + 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, // v_texcoord0 = + 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, // a_texcoord0;. + 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, // v_color0 = a_co + 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lor0;.}... }; static const uint8_t vs_font_distance_field_subpixel_spv[1218] = { diff --git a/examples/common/imgui/fs_imgui_image.bin.h b/examples/common/imgui/fs_imgui_image.bin.h index 45d8389a6..05a6e48d4 100644 --- a/examples/common/imgui/fs_imgui_image.bin.h +++ b/examples/common/imgui/fs_imgui_image.bin.h @@ -1,54 +1,62 @@ -static const uint8_t fs_imgui_image_glsl[352] = +static const uint8_t fs_imgui_image_glsl[389] = { 0x46, 0x53, 0x48, 0x0b, 0x6f, 0x1e, 0x3e, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x75, // FSH.o.><.......u 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, // _imageLodEnabled 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, // ...........s_tex - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, // Color........... - 0x01, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // ...varying vec2 - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // v_texcoord0;.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6d, 0x61, 0x67, // form vec4 u_imag - 0x65, 0x4c, 0x6f, 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // eLodEnabled;.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, // form sampler2D s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // _texColor;.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // main ().{. vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, // var_1.xyz = text - 0x75, 0x72, 0x65, 0x32, 0x44, 0x4c, 0x6f, 0x64, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // ure2DLod (s_texC + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, // Color..........A + 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, // ....uniform samp + 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // ler2D s_texColor + 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, // ;.uniform vec4 u + 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, // _imageLodEnabled + 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // ;..in vec2 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // coord0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, // ocation = 0) out + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, // vec4 bgfx_FragC + 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // olor;..void main + 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, // ().{. bgfx_Fr + 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x74, // agColor = vec4(t + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // extureLod(s_texC 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // olor, v_texcoord 0x30, 0x2c, 0x20, 0x75, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x64, 0x45, 0x6e, 0x61, // 0, u_imageLodEna - 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x78, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x74, // bled.x).xyz;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x32, // mpvar_1.w = (0.2 - 0x20, 0x2b, 0x20, 0x28, 0x30, 0x2e, 0x38, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x69, 0x6d, 0x61, 0x67, // + (0.8 * u_imag + 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x78, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x32, // bled.x).xyz, 0.2 + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x32, 0x39, 0x38, 0x30, 0x32, 0x33, 0x32, 0x32, 0x33, // 0000000298023223 + 0x38, 0x37, 0x36, 0x39, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, 0x2b, 0x20, 0x28, 0x30, 0x2e, 0x38, // 876953125 + (0.8 + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x39, 0x32, 0x30, 0x39, 0x32, 0x38, 0x39, 0x35, // 0000001192092895 + 0x35, 0x30, 0x37, 0x38, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x69, 0x6d, 0x61, 0x67, // 5078125 * u_imag 0x65, 0x4c, 0x6f, 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x79, 0x29, 0x29, 0x3b, // eLodEnabled.y)); - 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, // . gl_FragColor - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // = tmpvar_1;.}... + 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... }; -static const uint8_t fs_imgui_image_essl[372] = +static const uint8_t fs_imgui_image_essl[459] = { 0x46, 0x53, 0x48, 0x0b, 0x6f, 0x1e, 0x3e, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x75, // FSH.o.><.......u 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, // _imageLodEnabled 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, // ...........s_tex - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, // Color..........0 - 0x01, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // ...varying highp - 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // vec2 v_texcoord - 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // 0;.uniform highp - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x64, // vec4 u_imageLod - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // Enabled;.uniform - 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, // sampler2D s_tex - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // Color;.void main - 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, // ().{. lowp vec - 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // 4 tmpvar_1;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, // pvar_1.xyz = tex - 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x4c, 0x6f, 0x64, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x5f, // ture2DLod (s_ - 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // texColor, v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2c, 0x20, 0x75, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x6f, // oord0, u_imageLo - 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x78, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, // dEnabled.x).xyz; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, // . tmpvar_1.w = - 0x28, 0x30, 0x2e, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x30, 0x2e, 0x38, 0x20, 0x2a, 0x20, 0x75, 0x5f, // (0.2 + (0.8 * u_ - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, // imageLodEnabled. - 0x79, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // y));. gl_FragCo - 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, // lor = tmpvar_1;. - 0x7d, 0x0a, 0x0a, 0x00, // }... + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, // Color........... + 0x01, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, // ...precision med + 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, // iump float;.prec + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, // ision highp int; + 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // ..uniform highp + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // sampler2D s_texC + 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, // olor;.uniform hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, // ghp vec4 u_image + 0x4c, 0x6f, 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, // LodEnabled;..in + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // highp vec2 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // coord0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, // ocation = 0) out + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, // highp vec4 bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, // _FragColor;..voi + 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, // d main().{. b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, // gfx_FragColor = + 0x76, 0x65, 0x63, 0x34, 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, // vec4(textureLod( + 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, // s_texColor, v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2c, 0x20, 0x75, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, // xcoord0, u_image + 0x4c, 0x6f, 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x78, 0x29, 0x2e, 0x78, 0x79, // LodEnabled.x).xy + 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x32, 0x39, 0x38, // z, 0.20000000298 + 0x30, 0x32, 0x33, 0x32, 0x32, 0x33, 0x38, 0x37, 0x36, 0x39, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, // 023223876953125 + 0x2b, 0x20, 0x28, 0x30, 0x2e, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x39, 0x32, // + (0.80000001192 + 0x30, 0x39, 0x32, 0x38, 0x39, 0x35, 0x35, 0x30, 0x37, 0x38, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, // 0928955078125 * + 0x75, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x64, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, // u_imageLodEnable + 0x64, 0x2e, 0x79, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // d.y));.}... }; static const uint8_t fs_imgui_image_spv[1303] = { diff --git a/examples/common/imgui/fs_ocornut_imgui.bin.h b/examples/common/imgui/fs_ocornut_imgui.bin.h index 915f46878..460a32af6 100644 --- a/examples/common/imgui/fs_ocornut_imgui.bin.h +++ b/examples/common/imgui/fs_ocornut_imgui.bin.h @@ -1,36 +1,42 @@ -static const uint8_t fs_ocornut_imgui_glsl[189] = +static const uint8_t fs_ocornut_imgui_glsl[226] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x73, // FSH............s - 0x5f, 0x74, 0x65, 0x78, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x00, // _tex............ - 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, // ..varying vec4 v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, // _color0;.varying - 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // vec2 v_texcoord - 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, // 0;.uniform sampl - 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, // er2D s_tex;.void - 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, // main ().{. gl_ - 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x65, 0x78, // FragColor = (tex - 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x76, // ture2D (s_tex, v - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, // _texcoord0) * v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // color0);.}... + 0x5f, 0x74, 0x65, 0x78, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x00, // _tex............ + 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, // ...uniform sampl + 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, // er2D s_tex;..in + 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // vec2 v_texcoord0 + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // n = 0) out vec4 + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, // bgfx_FragColor;. + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // in vec4 v_color0 + 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, // ;..void main().{ + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // . bgfx_FragCo + 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, // lor = texture(s_ + 0x74, 0x65, 0x78, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // tex, v_texcoord0 + 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, // ) * v_color0;.}. + 0x0a, 0x00, // .. }; -static const uint8_t fs_ocornut_imgui_essl[246] = +static const uint8_t fs_ocornut_imgui_essl[296] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x73, // FSH............s - 0x5f, 0x74, 0x65, 0x78, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x00, // _tex............ - 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // ..varying highp - 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, // vec4 v_color0;.v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // arying highp vec - 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, // 2 v_texcoord0;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, // niform sampler2D - 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, // s_tex;.void mai - 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, // n ().{. lowp ve - 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, // c4 tmpvar_1;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, // mpvar_1 = textur - 0x65, 0x32, 0x44, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, // e2D (s_tex, v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, // xcoord0);. gl_F - 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, // ragColor = (tmpv - 0x61, 0x72, 0x5f, 0x31, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x29, // ar_1 * v_color0) - 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... + 0x5f, 0x74, 0x65, 0x78, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, // _tex............ + 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, // ..precision medi + 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, // ump float;.preci + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, // sion highp int;. + 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, // .uniform highp s + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x3b, 0x0a, // ampler2D s_tex;. + 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, // .in highp vec2 v + 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // _texcoord0;.layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, // ut(location = 0) + 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // out highp vec4 + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, // bgfx_FragColor;. + 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // in highp vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // color0;..void ma + 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // in().{. bgfx_ + 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, // FragColor = text + 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // ure(s_tex, v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // coord0) * v_colo + 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r0;.}... }; static const uint8_t fs_ocornut_imgui_spv[850] = { diff --git a/examples/common/imgui/vs_imgui_image.bin.h b/examples/common/imgui/vs_imgui_image.bin.h index 10341805d..6ce310a6f 100644 --- a/examples/common/imgui/vs_imgui_image.bin.h +++ b/examples/common/imgui/vs_imgui_image.bin.h @@ -1,50 +1,44 @@ -static const uint8_t vs_imgui_image_glsl[311] = +static const uint8_t vs_imgui_image_glsl[280] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x1e, 0x3e, 0x3c, 0x01, 0x00, 0x0a, 0x75, // VSH.....o.><...u 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, // _viewProj....... - 0x00, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, // .......attribute - 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, // vec2 a_position - 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, // ;.attribute vec2 - 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, // a_texcoord0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // rying vec2 v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // coord0;.uniform + 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // ........uniform 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, // mat4 u_viewProj; - 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, // .void main ().{. - 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, // vec4 tmpvar_1; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x77, 0x20, 0x3d, // . tmpvar_1.zw = - 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, // vec2(0.0, 1.0); - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, // . tmpvar_1.xy = - 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, // a_position;. g - 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, // l_Position = (u_ - 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // viewProj * tmpva - 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // r_1);. v_texcoo - 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // rd0 = a_texcoord - 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 0;.}... + 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ..layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, // n = 0) in vec2 a + 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, // _position;.out v + 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, // ec2 v_texcoord0; + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // .layout(location + 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, // = 1) in vec2 a_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, // texcoord0;..void + 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, // main().{. gl + 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x76, 0x69, // _Position = u_vi + 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, // ewProj * vec4(a_ + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // position, 0.0, 1 + 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // .0);. v_texco + 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // ord0 = a_texcoor + 0x64, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // d0;.}... }; -static const uint8_t vs_imgui_image_essl[341] = +static const uint8_t vs_imgui_image_essl[280] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x1e, 0x3e, 0x3c, 0x01, 0x00, 0x0a, 0x75, // VSH.....o.><...u 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, // _viewProj....... - 0x00, 0x00, 0x00, 0x2d, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, // ...-...attribute - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, // highp vec2 a_po - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, // sition;.attribut - 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x74, // e highp vec2 a_t - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // excoord0;.varyin - 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, // g highp vec2 v_t - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // excoord0;.unifor - 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, // m highp mat4 u_v - 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // iewProj;.void ma - 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // in ().{. highp - 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, // vec4 tmpvar_1;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, // tmpvar_1.zw = v - 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, // ec2(0.0, 1.0);. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, // tmpvar_1.xy = a - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, // _position;. gl_ - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x76, 0x69, // Position = (u_vi - 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ewProj * tmpvar_ - 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // 1);. v_texcoord - 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, // 0 = a_texcoord0; - 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... + 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // ........uniform + 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, // mat4 u_viewProj; + 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ..layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, // n = 0) in vec2 a + 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, // _position;.out v + 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, // ec2 v_texcoord0; + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // .layout(location + 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, // = 1) in vec2 a_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, // texcoord0;..void + 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, // main().{. gl + 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x76, 0x69, // _Position = u_vi + 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, // ewProj * vec4(a_ + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // position, 0.0, 1 + 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // .0);. v_texco + 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // ord0 = a_texcoor + 0x64, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // d0;.}... }; static const uint8_t vs_imgui_image_spv[1051] = { diff --git a/examples/common/imgui/vs_ocornut_imgui.bin.h b/examples/common/imgui/vs_ocornut_imgui.bin.h index cfea16179..88472a82e 100644 --- a/examples/common/imgui/vs_ocornut_imgui.bin.h +++ b/examples/common/imgui/vs_ocornut_imgui.bin.h @@ -1,69 +1,56 @@ -static const uint8_t vs_ocornut_imgui_glsl[460] = +static const uint8_t vs_ocornut_imgui_glsl[384] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0a, 0x75, // VSH............u 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, // _viewProj....... - 0x00, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, // .......attribute - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, // vec4 a_color0;. - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, // attribute vec2 a - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // _position;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // bute vec2 a_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, // oord0;.varying v - 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, // ec4 v_color0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // rying vec2 v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // coord0;.uniform + 0x00, 0x00, 0x00, 0x58, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // ...X....uniform 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, // mat4 u_viewProj; - 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, // .void main ().{. - 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, // vec4 tmpvar_1; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x77, 0x20, 0x3d, // . tmpvar_1.zw = - 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, // vec2(0.0, 1.0); - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, // . tmpvar_1.xy = - 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x76, // a_position;. v - 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, // ec4 tmpvar_2;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, // tmpvar_2.zw = ve - 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // c2(0.0, 1.0);. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x75, // tmpvar_2.xy = (u - 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, // _viewProj * tmpv - 0x61, 0x72, 0x5f, 0x31, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, // ar_1).xy;. gl_P - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // osition = tmpvar - 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // _2;. v_texcoord - 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, // 0 = a_texcoord0; - 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, // . v_color0 = a_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // color0;.}... + 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ..layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, // n = 1) in vec2 a + 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, // _position;.out v + 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, // ec2 v_texcoord0; + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // .layout(location + 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, // = 2) in vec2 a_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, // texcoord0;.out v + 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, // ec4 v_color0;.la + 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // yout(location = + 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // 0) in vec4 a_col + 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, // or0;..void main( + 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, // ).{. gl_Posit + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x28, 0x75, 0x5f, 0x76, 0x69, // ion = vec4((u_vi + 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, // ewProj * vec4(a_ + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // position, 0.0, 1 + 0x2e, 0x30, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, // .0)).xy, 0.0, 1. + 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // 0);. v_texcoo + 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // rd0 = a_texcoord + 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, // 0;. v_color0 + 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // = a_color0;.}... }; -static const uint8_t vs_ocornut_imgui_essl[508] = +static const uint8_t vs_ocornut_imgui_essl[384] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0a, 0x75, // VSH............u 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, // _viewProj....... - 0x00, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, // .......attribute - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, // highp vec4 a_co - 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, // lor0;.attribute - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, // highp vec2 a_pos - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, // ition;.attribute - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, // highp vec2 a_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, // xcoord0;.varying - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, // highp vec4 v_co - 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, // lor0;.varying hi - 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // ghp vec2 v_texco - 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, // ord0;.uniform hi - 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, // ghp mat4 u_viewP - 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, // roj;.void main ( - 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ).{. highp vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, // var_1.zw = vec2( - 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // 0.0, 1.0);. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, // var_1.xy = a_pos - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // ition;. highp v - 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, // ec4 tmpvar_2;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, // tmpvar_2.zw = ve - 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // c2(0.0, 1.0);. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x75, // tmpvar_2.xy = (u - 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, // _viewProj * tmpv - 0x61, 0x72, 0x5f, 0x31, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, // ar_1).xy;. gl_P - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // osition = tmpvar - 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // _2;. v_texcoord - 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, // 0 = a_texcoord0; - 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, // . v_color0 = a_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // color0;.}... + 0x00, 0x00, 0x00, 0x58, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // ...X....uniform + 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, // mat4 u_viewProj; + 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ..layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, // n = 1) in vec2 a + 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, // _position;.out v + 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, // ec2 v_texcoord0; + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // .layout(location + 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, // = 2) in vec2 a_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, // texcoord0;.out v + 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, // ec4 v_color0;.la + 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // yout(location = + 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // 0) in vec4 a_col + 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, // or0;..void main( + 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, // ).{. gl_Posit + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x28, 0x75, 0x5f, 0x76, 0x69, // ion = vec4((u_vi + 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, // ewProj * vec4(a_ + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // position, 0.0, 1 + 0x2e, 0x30, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, // .0)).xy, 0.0, 1. + 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // 0);. v_texcoo + 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // rd0 = a_texcoord + 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, // 0;. v_color0 + 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // = a_color0;.}... }; static const uint8_t vs_ocornut_imgui_spv[1293] = { diff --git a/examples/common/nanovg/fs_nanovg_fill.bin.h b/examples/common/nanovg/fs_nanovg_fill.bin.h index 5ca62fffb..1f5b42f4d 100644 --- a/examples/common/nanovg/fs_nanovg_fill.bin.h +++ b/examples/common/nanovg/fs_nanovg_fill.bin.h @@ -1,371 +1,407 @@ -static const uint8_t fs_nanovg_fill_glsl[2827] = +static const uint8_t fs_nanovg_fill_glsl[3078] = { 0x46, 0x53, 0x48, 0x0b, 0xcf, 0xda, 0x1b, 0x94, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x75, // FSH............u 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x03, 0x01, 0x00, 0x00, 0x03, // _scissorMat..... - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x5f, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x4d, 0x61, 0x74, // ......u_paintMat - 0x03, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x5f, 0x69, 0x6e, 0x6e, // ...........u_inn - 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, // erCol........... - 0x75, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, // u_outerCol...... - 0x00, 0x00, 0x00, 0x00, 0x11, 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x45, 0x78, // .....u_scissorEx - 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // tScale.......... - 0x0e, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x02, // .u_extentRadius. - 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // ..........u_para - 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x73, 0x5f, 0x74, // ms...........s_t - 0x65, 0x78, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x0a, 0x00, 0x00, // ex..........J... - 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x70, // varying vec2 v_p - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, // osition;.varying - 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // vec2 v_texcoord - 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, // 0;.uniform mat3 - 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x3b, 0x0a, 0x75, 0x6e, // u_scissorMat;.un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x69, // iform mat3 u_pai - 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, // ntMat;.uniform v - 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x3b, 0x0a, // ec4 u_innerCol;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x6f, // uniform vec4 u_o - 0x75, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // uterCol;.uniform - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x45, // vec4 u_scissorE - 0x78, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // xtScale;.uniform - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, // vec4 u_extentRa - 0x64, 0x69, 0x75, 0x73, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, // dius;.uniform ve - 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // c4 u_params;.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, // form sampler2D s - 0x5f, 0x74, 0x65, 0x78, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, // _tex;.void main - 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x65, 0x73, 0x75, // ().{. vec4 resu - 0x6c, 0x74, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, // lt_1;. float tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, // pvar_2;. vec2 s - 0x63, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, // c_3;. vec3 tmpv - 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, // ar_4;. tmpvar_4 - 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // .z = 1.0;. tmpv - 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, 0x69, // ar_4.xy = v_posi - 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x73, 0x63, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x28, // tion;. sc_3 = ( - 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2d, // vec2(0.5, 0.5) - - 0x20, 0x28, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x62, 0x73, 0x28, 0x28, 0x75, 0x5f, 0x73, // ((. abs((u_s - 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, // cissorMat * tmpv - 0x61, 0x72, 0x5f, 0x34, 0x29, 0x2e, 0x78, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x75, // ar_4).xy). - u - 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, // _scissorExtScale - 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, // .xy) * u_scissor - 0x45, 0x78, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x7a, 0x77, 0x29, 0x29, 0x3b, 0x0a, 0x20, // ExtScale.zw));. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6c, 0x61, // tmpvar_2 = (cla - 0x6d, 0x70, 0x20, 0x28, 0x73, 0x63, 0x5f, 0x33, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, // mp (sc_3.x, 0.0, - 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x73, // 1.0) * clamp (s - 0x63, 0x5f, 0x33, 0x2e, 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, // c_3.y, 0.0, 1.0) - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // );. float tmpva - 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, // r_5;. tmpvar_5 - 0x3d, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x28, 0x0a, 0x20, // = (min (1.0, (. - 0x20, 0x20, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x28, 0x28, // (1.0 - abs((( - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x20, 0x2a, 0x20, // v_texcoord0.x * - 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, // 2.0) - 1.0))). - 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x29, 0x20, // * u_params.y)) - 0x2a, 0x20, 0x6d, 0x69, 0x6e, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, // * min (1.0, v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x79, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, // xcoord0.y));. i - 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x3d, // f ((u_params.w = - 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // = 0.0)) {. ve - 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, // c3 tmpvar_6;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x2e, // tmpvar_6.z = 1. - 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, // 0;. tmpvar_6. - 0x78, 0x79, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, // xy = v_position; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // . vec2 tmpvar - 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, // _7;. tmpvar_7 - 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x69, 0x6e, 0x74, // = (abs((u_paint - 0x4d, 0x61, 0x74, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x29, 0x2e, // Mat * tmpvar_6). - 0x78, 0x79, 0x29, 0x20, 0x2d, 0x20, 0x28, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, // xy) - (u_extentR - 0x61, 0x64, 0x69, 0x75, 0x73, 0x2e, 0x78, 0x79, 0x20, 0x2d, 0x20, 0x75, 0x5f, 0x65, 0x78, 0x74, // adius.xy - u_ext - 0x65, 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x2e, 0x7a, 0x7a, 0x29, 0x29, 0x3b, 0x0a, // entRadius.zz));. - 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // vec2 tmpvar_ - 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x20, // 8;. tmpvar_8 - 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2c, // = max (tmpvar_7, - 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, // 0.0);. resul - 0x74, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x75, 0x5f, 0x69, 0x6e, // t_1 = (mix (u_in - 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x2c, 0x20, 0x75, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x43, // nerCol, u_outerC - 0x6f, 0x6c, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, // ol, clamp (. - 0x20, 0x20, 0x28, 0x28, 0x28, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, // ((((. m - 0x69, 0x6e, 0x20, 0x28, 0x6d, 0x61, 0x78, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // in (max (tmpvar_ - 0x37, 0x2e, 0x78, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x79, 0x29, // 7.x, tmpvar_7.y) - 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2b, 0x20, // , 0.0). + - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x6f, // . sqrt(do - 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x2c, 0x20, 0x74, 0x6d, 0x70, // t (tmpvar_8, tmp - 0x76, 0x61, 0x72, 0x5f, 0x38, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, // var_8)). ) - 0x2d, 0x20, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, // - u_extentRadius - 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, // .z) + (u_params. - 0x78, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x75, 0x5f, 0x70, 0x61, // x * 0.5)) / u_pa - 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x20, 0x30, 0x2e, // rams.x). , 0. - 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, // 0, 1.0)) * (tmpv - 0x61, 0x72, 0x5f, 0x35, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, // ar_5 * tmpvar_2) - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, // );. } else {. - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, // if ((u_params. - 0x77, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // w == 1.0)) {. - 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x39, 0x3b, // vec4 color_9; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, // . vec3 tmpv - 0x61, 0x72, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // ar_10;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, // var_10.z = 1.0;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x2e, // tmpvar_10. - 0x78, 0x79, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, // xy = v_position; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, // . vec4 tmpv - 0x61, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // ar_11;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, // var_11 = texture - 0x32, 0x44, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, // 2D (s_tex, ((u_p - 0x61, 0x69, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // aintMat * tmpvar - 0x5f, 0x31, 0x30, 0x29, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, // _10).xy / u_exte - 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x2e, 0x78, 0x79, 0x29, 0x29, 0x3b, 0x0a, 0x20, // ntRadius.xy));. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x74, // color_9 = t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // mpvar_11;. - 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x20, // if ((u_params.z - 0x3d, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // == 1.0)) {. - 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // vec4 tmpvar_1 - 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // 2;. tmpva - 0x72, 0x5f, 0x31, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, // r_12.xyz = (tmpv - 0x61, 0x72, 0x5f, 0x31, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, // ar_11.xyz * tmpv - 0x61, 0x72, 0x5f, 0x31, 0x31, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ar_11.w);. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x2e, 0x77, 0x20, 0x3d, 0x20, // tmpvar_12.w = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, // tmpvar_11.w;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x74, // color_9 = t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // mpvar_12;. - 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, // };. if ((u_ - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x29, // params.z == 2.0) - 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, // ) {. colo - 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x39, 0x2e, 0x78, 0x78, // r_9 = color_9.xx - 0x78, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // xx;. };. - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, // color_9 = (co - 0x6c, 0x6f, 0x72, 0x5f, 0x39, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x43, // lor_9 * u_innerC - 0x6f, 0x6c, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ol);. color - 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x39, 0x20, 0x2a, 0x20, // _9 = (color_9 * - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, // (tmpvar_5 * tmpv - 0x61, 0x72, 0x5f, 0x32, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, // ar_2));. re - 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x39, // sult_1 = color_9 - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, // ;. } else {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // if ((u_para - 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x7b, 0x0a, // ms.w == 2.0)) {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x31, // result_1 - 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, // = vec4(1.0, 1.0 - 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // , 1.0, 1.0);. - 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // } else {. - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // if ((u_param - 0x73, 0x2e, 0x77, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, // s.w == 3.0)) {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, // vec4 co - 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // lor_13;. - 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, // vec4 tmpvar_14 - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // ;. tmpv - 0x61, 0x72, 0x5f, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, // ar_14 = texture2 - 0x44, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // D (s_tex, v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // oord0);. - 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // color_13 = tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // var_14;. - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, // if ((u_params. - 0x7a, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // z == 1.0)) {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, // vec4 tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // pvar_15;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x2e, 0x78, // tmpvar_15.x - 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x2e, // yz = (tmpvar_14. - 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x2e, // xyz * tmpvar_14. - 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // w);. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x74, 0x6d, // tmpvar_15.w = tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // pvar_14.w;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x20, // color_13 - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, // = tmpvar_15;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // };. - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // if ((u_param - 0x73, 0x2e, 0x7a, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, // s.z == 2.0)) {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // color - 0x5f, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x2e, 0x78, // _13 = color_13.x - 0x78, 0x78, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // xxx;. } - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, // ;. colo - 0x72, 0x5f, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, // r_13 = (color_13 - 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, // * tmpvar_2);. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x31, // result_1 - 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x2a, 0x20, 0x75, // = (color_13 * u - 0x5f, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // _innerCol);. - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, // };. };. - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, // };. };. gl - 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, // _FragColor = res - 0x75, 0x6c, 0x74, 0x5f, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ult_1;.}... -}; -static const uint8_t fs_nanovg_fill_essl[2964] = -{ - 0x46, 0x53, 0x48, 0x0b, 0xcf, 0xda, 0x1b, 0x94, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x75, // FSH............u - 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x03, 0x01, 0x00, 0x00, 0x03, // _scissorMat..... - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x5f, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x4d, 0x61, 0x74, // ......u_paintMat - 0x03, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x5f, 0x69, 0x6e, 0x6e, // ...........u_inn - 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, // erCol........... - 0x75, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, // u_outerCol...... - 0x00, 0x00, 0x00, 0x00, 0x11, 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x45, 0x78, // .....u_scissorEx - 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // tScale.......... - 0x0e, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x02, // .u_extentRadius. - 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // ..........u_para - 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x73, 0x5f, 0x74, // ms...........s_t - 0x65, 0x78, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x0a, 0x00, 0x00, // ex.............. - 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // varying highp ve - 0x63, 0x32, 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x76, // c2 v_position;.v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // arying highp vec - 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, // 2 v_texcoord0;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, // niform highp mat - 0x33, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x3b, 0x0a, // 3 u_scissorMat;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, // uniform highp ma - 0x74, 0x33, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x3b, 0x0a, 0x75, // t3 u_paintMat;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // niform highp vec + 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x45, // ......u_scissorE + 0x78, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // xtScale......... + 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, // ..u_params...... + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x5f, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x03, // .....u_paintMat. + 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, // ..........u_exte + 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // ntRadius........ + 0x00, 0x00, 0x0a, 0x75, 0x5f, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x02, 0x01, 0x00, // ...u_innerCol... + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x43, // ........u_outerC + 0x6f, 0x6c, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x73, 0x5f, 0x74, // ol...........s_t + 0x65, 0x78, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x0b, 0x00, 0x00, // ex..........E... + 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x38, 0x30, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, // .vec4 _380;..uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, // form mat3 u_scis + 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // sorMat;.uniform + 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x45, 0x78, // vec4 u_scissorEx + 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // tScale;.uniform + 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x75, // vec4 u_params;.u + 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x75, 0x5f, 0x70, 0x61, // niform mat3 u_pa + 0x69, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // intMat;.uniform + 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x64, // vec4 u_extentRad + 0x69, 0x75, 0x73, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, // ius;.uniform vec 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x3b, 0x0a, 0x75, 0x6e, // 4 u_innerCol;.un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // iform highp vec4 - 0x20, 0x75, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // u_outerCol;.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // form highp vec4 - 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x53, 0x63, 0x61, 0x6c, // u_scissorExtScal - 0x65, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // e;.uniform highp - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, // vec4 u_extentRa - 0x64, 0x69, 0x75, 0x73, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, // dius;.uniform hi - 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // ghp vec4 u_param - 0x73, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, // s;.uniform sampl - 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, // er2D s_tex;.void - 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, // main ().{. low - 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x31, 0x3b, // p vec4 result_1; - 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, // . highp float t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // mpvar_2;. highp - 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x63, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, // vec2 sc_3;. hi - 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ghp vec3 tmpvar_ - 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x7a, 0x20, // 4;. tmpvar_4.z - 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // = 1.0;. tmpvar_ - 0x34, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // 4.xy = v_positio - 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x73, 0x63, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, // n;. sc_3 = (vec - 0x32, 0x28, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2d, 0x20, 0x28, 0x28, // 2(0.5, 0.5) - (( - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x62, 0x73, 0x28, 0x28, 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, // . abs((u_scis - 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // sorMat * tmpvar_ - 0x34, 0x29, 0x2e, 0x78, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x75, 0x5f, 0x73, 0x63, // 4).xy). - u_sc + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x6f, 0x75, 0x74, // iform vec4 u_out + 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, // erCol;.uniform s + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x3b, 0x0a, // ampler2D s_tex;. + 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // .in vec2 v_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, // ion;.in vec2 v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // excoord0;.layout + 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, // (location = 0) o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // ut vec4 bgfx_Fra + 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // gColor;..void ma + 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // in().{. vec3 + 0x5f, 0x33, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x76, 0x5f, 0x70, 0x6f, // _302 = vec3(v_po + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // sition, 1.0);. + 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x76, 0x65, // vec2 _313 = ve + 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2d, 0x20, 0x28, 0x28, 0x61, 0x62, 0x73, 0x28, // c2(0.5) - ((abs( + 0x28, 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x20, 0x2a, 0x20, // (u_scissorMat * + 0x5f, 0x33, 0x30, 0x32, 0x29, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2d, 0x20, 0x75, 0x5f, 0x73, 0x63, // _302).xy) - u_sc 0x69, 0x73, 0x73, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x78, 0x79, // issorExtScale.xy 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x45, 0x78, 0x74, // ) * u_scissorExt - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x7a, 0x77, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // Scale.zw));. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, // pvar_2 = (clamp - 0x28, 0x73, 0x63, 0x5f, 0x33, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, // (sc_3.x, 0.0, 1. - 0x30, 0x29, 0x20, 0x2a, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x73, 0x63, 0x5f, 0x33, // 0) * clamp (sc_3 - 0x2e, 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, // .y, 0.0, 1.0));. - 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, // highp float tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // pvar_5;. tmpvar - 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, // _5 = (min (1.0, - 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x61, 0x62, 0x73, // (. (1.0 - abs - 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, // (((v_texcoord0.x - 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, // * 2.0) - 1.0))) - 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, // . * u_params.y - 0x29, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x69, 0x6e, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x76, // )) * min (1.0, v - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x79, 0x29, 0x29, 0x3b, 0x0a, // _texcoord0.y));. - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, // if ((u_params. - 0x77, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // w == 0.0)) {. - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, // highp vec3 tmpv - 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ar_6;. tmpvar - 0x5f, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // _6.z = 1.0;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x76, 0x5f, // tmpvar_6.xy = v_ - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, // position;. hi - 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ghp vec2 tmpvar_ - 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, // 7;. tmpvar_7 - 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x4d, // = (abs((u_paintM - 0x61, 0x74, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x29, 0x2e, 0x78, // at * tmpvar_6).x - 0x79, 0x29, 0x20, 0x2d, 0x20, 0x28, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, // y) - (u_extentRa - 0x64, 0x69, 0x75, 0x73, 0x2e, 0x78, 0x79, 0x20, 0x2d, 0x20, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, // dius.xy - u_exte - 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x2e, 0x7a, 0x7a, 0x29, 0x29, 0x3b, 0x0a, 0x20, // ntRadius.zz));. - 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x6d, // highp vec2 tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // pvar_8;. tmpv - 0x61, 0x72, 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, // ar_8 = max (tmpv - 0x61, 0x72, 0x5f, 0x37, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // ar_7, 0.0);. - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x69, 0x78, 0x20, // result_1 = (mix - 0x28, 0x75, 0x5f, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x2c, 0x20, 0x75, 0x5f, 0x6f, // (u_innerCol, u_o - 0x75, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, // uterCol, clamp ( - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x28, 0x28, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, // . ((((. - 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x6e, 0x20, 0x28, 0x6d, 0x61, 0x78, 0x20, 0x28, 0x74, 0x6d, // min (max (tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x78, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // pvar_7.x, tmpvar - 0x5f, 0x37, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, // _7.y), 0.0). - 0x20, 0x20, 0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x71, // + . sq - 0x72, 0x74, 0x28, 0x64, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, // rt(dot (tmpvar_8 - 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, // , tmpvar_8)). - 0x20, 0x20, 0x20, 0x29, 0x20, 0x2d, 0x20, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, // ) - u_extentR - 0x61, 0x64, 0x69, 0x75, 0x73, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, // adius.z) + (u_pa - 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2f, // rams.x * 0.5)) / - 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, // u_params.x). - 0x20, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2a, 0x20, // , 0.0, 1.0)) * - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, // (tmpvar_5 * tmpv - 0x61, 0x72, 0x5f, 0x32, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, // ar_2));. } else - 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, // {. if ((u_pa - 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x20, // rams.w == 1.0)) - 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, // {. lowp vec - 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 4 color_9;. - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, // highp vec3 tmpv - 0x61, 0x72, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // ar_10;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, // var_10.z = 1.0;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x2e, // tmpvar_10. - 0x78, 0x79, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, // xy = v_position; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // . lowp vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // tmpvar_11;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, // tmpvar_11 = te - 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x2c, 0x20, // xture2D (s_tex, - 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x20, 0x2a, 0x20, 0x74, // ((u_paintMat * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x29, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, // mpvar_10).xy / u - 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x2e, 0x78, 0x79, // _extentRadius.xy - 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // ));. color_ - 0x39, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, // 9 = tmpvar_11;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // if ((u_para - 0x6d, 0x73, 0x2e, 0x7a, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x7b, 0x0a, // ms.z == 1.0)) {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, // lowp vec - 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 4 tmpvar_12;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x2e, 0x78, // tmpvar_12.x - 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x2e, // yz = (tmpvar_11. - 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x2e, // xyz * tmpvar_11. - 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // w);. tmpv - 0x61, 0x72, 0x5f, 0x31, 0x32, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ar_12.w = tmpvar - 0x5f, 0x31, 0x31, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, // _11.w;. c - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // olor_9 = tmpvar_ - 0x31, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 12;. };. - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // if ((u_params - 0x2e, 0x7a, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, // .z == 2.0)) {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, // color_9 = - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x39, 0x2e, 0x78, 0x78, 0x78, 0x78, 0x3b, 0x0a, 0x20, 0x20, // color_9.xxxx;. - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, // };. col - 0x6f, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x39, 0x20, // or_9 = (color_9 - 0x2a, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x29, 0x3b, 0x0a, 0x20, // * u_innerCol);. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x28, // color_9 = ( - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x39, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // color_9 * (tmpva - 0x72, 0x5f, 0x35, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x29, // r_5 * tmpvar_2)) - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x31, // ;. result_1 - 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // = color_9;. - 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, // } else {. i - 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x3d, // f ((u_params.w = - 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = 2.0)) {. - 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, // result_1 = vec - 0x34, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, // 4(1.0, 1.0, 1.0, - 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, // 1.0);. } e - 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, // lse {. if - 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x3d, 0x3d, // ((u_params.w == - 0x20, 0x33, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 3.0)) {. - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, // lowp vec4 col - 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // or_13;. - 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // lowp vec4 tmpva - 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // r_14;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, // tmpvar_14 = text - 0x75, 0x72, 0x65, 0x32, 0x44, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x76, 0x5f, // ure2D (s_tex, v_ + 0x53, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x7a, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, // Scale.zw);. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, // loat _320 = clam + 0x70, 0x28, 0x5f, 0x33, 0x31, 0x33, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // p(_313.x, 0.0, 1 + 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x5f, 0x33, 0x31, 0x33, // .0) * clamp(_313 + 0x2e, 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, // .y, 0.0, 1.0);. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x33, 0x36, 0x20, 0x3d, 0x20, // float _336 = + 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, // min(1.0, (1.0 - + 0x61, 0x62, 0x73, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // abs((v_texcoord0 + 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, // .x * 2.0) - 1.0) + 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x20, // ) * u_params.y) + 0x2a, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // * min(1.0, v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, // coord0.y);. v + 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, // ec4 _376;. if + 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x3d, 0x3d, 0x20, // (u_params.w == + 0x30, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 0.0). {. + 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x61, // vec2 _348 = a + 0x62, 0x73, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x20, 0x2a, // bs((u_paintMat * + 0x20, 0x5f, 0x33, 0x30, 0x32, 0x29, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2d, 0x20, 0x28, 0x75, 0x5f, // _302).xy) - (u_ + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x2e, 0x78, 0x79, 0x20, // extentRadius.xy + 0x2d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, // - vec2(u_extentR + 0x61, 0x64, 0x69, 0x75, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // adius.z));. + 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x75, 0x5f, // _376 = mix(u_ + 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x2c, 0x20, 0x75, 0x5f, 0x6f, 0x75, 0x74, 0x65, // innerCol, u_oute + 0x72, 0x43, 0x6f, 0x6c, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, // rCol, vec4(clamp + 0x28, 0x28, 0x28, 0x28, 0x6d, 0x69, 0x6e, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x33, 0x34, 0x38, // ((((min(max(_348 + 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x33, 0x34, 0x38, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, // .x, _348.y), 0.0 + 0x29, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x5f, // ) + length(max(_ + 0x33, 0x34, 0x38, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x29, // 348, vec2(0.0))) + 0x29, 0x20, 0x2d, 0x20, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, // ) - u_extentRadi + 0x75, 0x73, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // us.z) + (u_param + 0x73, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x75, 0x5f, // s.x * 0.5)) / u_ + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // params.x, 0.0, 1 + 0x2e, 0x30, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x33, 0x33, 0x36, 0x20, 0x2a, 0x20, // .0))) * (_336 * + 0x5f, 0x33, 0x32, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, // _320);. }. + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // else. {. + 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x3b, 0x0a, 0x20, // vec4 _377;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, // if (u_par + 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, // ams.w == 1.0). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x39, 0x34, 0x20, 0x3d, 0x20, // vec4 _194 = + 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x28, // texture(s_tex, ( + 0x75, 0x5f, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, // u_paintMat * _30 + 0x32, 0x29, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, // 2).xy / u_extent + 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // Radius.xy);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, // vec4 _37 + 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, // 4;. i + 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x20, 0x3d, 0x3d, // f (u_params.z == + 0x20, 0x31, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 1.0). + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x20, 0x3d, // float _203 = + 0x20, 0x5f, 0x31, 0x39, 0x34, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _194.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x34, 0x20, 0x3d, 0x20, // _374 = + 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x31, 0x39, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, // vec4(_194.xyz * + 0x5f, 0x32, 0x30, 0x33, 0x2c, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // _203, _203);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x34, 0x20, 0x3d, // _374 = + 0x20, 0x5f, 0x31, 0x39, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _194;. + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // vec4 _375;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, // if (u_pa + 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x0a, 0x20, // rams.z == 2.0). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, // _37 + 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x34, 0x2e, 0x78, 0x78, 0x78, 0x78, 0x3b, 0x0a, 0x20, // 5 = _374.xxxx;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x35, // _375 + 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _374;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x37, 0x35, 0x20, // _377 = (_375 + 0x2a, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x29, 0x20, 0x2a, 0x20, // * u_innerCol) * + 0x28, 0x5f, 0x33, 0x33, 0x36, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x32, 0x30, 0x29, 0x3b, 0x0a, 0x20, // (_336 * _320);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // else. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // vec4 + 0x20, 0x5f, 0x33, 0x37, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _378;. + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, // if (u_params. + 0x77, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // w == 2.0). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x76, // _378 = v + 0x65, 0x63, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ec4(1.0);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x39, // vec4 _379 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ;. + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, // if (u_params.w + 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // == 3.0). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, // v + 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, // ec4 _244 = textu + 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // re(s_tex, v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // oord0);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // vec4 + 0x20, 0x5f, 0x33, 0x37, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _372;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, // if (u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x2e, 0x30, // _params.z == 1.0 + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, // float _253 = _24 + 0x34, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 4.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, // _37 + 0x32, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x32, 0x34, 0x34, 0x2e, 0x78, 0x79, // 2 = vec4(_244.xy + 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x29, 0x3b, // z * _253, _253); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, // _3 + 0x37, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 72 = _244;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x3b, 0x0a, // vec4 _373;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // if (u_params + 0x2e, 0x7a, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // .z == 2.0). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, // { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x20, 0x3d, 0x20, // _373 = + 0x5f, 0x33, 0x37, 0x32, 0x2e, 0x78, 0x78, 0x78, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // _372.xxxx;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x20, 0x3d, 0x20, 0x5f, // _373 = _ + 0x33, 0x37, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 372;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, // _ + 0x33, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x37, 0x33, 0x20, 0x2a, 0x20, 0x5f, 0x33, // 379 = (_373 * _3 + 0x32, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6c, // 20) * u_innerCol + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ;. + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, // _ + 0x33, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 379 = _380;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, // _3 + 0x37, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 78 = _379;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x38, // _377 = _378 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, // ;. }. + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x3b, // _376 = _377; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // . }. bgfx_ + 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x36, // FragColor = _376 + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... +}; +static const uint8_t fs_nanovg_fill_essl[3292] = +{ + 0x46, 0x53, 0x48, 0x0b, 0xcf, 0xda, 0x1b, 0x94, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x75, // FSH............u + 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x03, 0x01, 0x00, 0x00, 0x03, // _scissorMat..... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x45, // ......u_scissorE + 0x78, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // xtScale......... + 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, // ..u_params...... + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x5f, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x03, // .....u_paintMat. + 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, // ..........u_exte + 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // ntRadius........ + 0x00, 0x00, 0x0a, 0x75, 0x5f, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x02, 0x01, 0x00, // ...u_innerCol... + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x43, // ........u_outerC + 0x6f, 0x6c, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x73, 0x5f, 0x74, // ol...........s_t + 0x65, 0x78, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x0c, 0x00, 0x00, // ex.............. + 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, // precision medium + 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, // p float;.precisi + 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x76, // on highp int;..v + 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x38, 0x30, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // ec4 _380;..unifo + 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x75, 0x5f, // rm highp mat3 u_ + 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // scissorMat;.unif + 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, // orm highp vec4 u + 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, // _scissorExtScale + 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // ;.uniform highp + 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x75, // vec4 u_params;.u + 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, // niform highp mat + 0x33, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x3b, 0x0a, 0x75, 0x6e, // 3 u_paintMat;.un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // iform highp vec4 + 0x20, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3b, // u_extentRadius; + 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // .uniform highp v + 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x3b, 0x0a, // ec4 u_innerCol;. + 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // uniform highp ve + 0x63, 0x34, 0x20, 0x75, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x3b, 0x0a, 0x75, // c4 u_outerCol;.u + 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, // niform highp sam + 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x3b, 0x0a, 0x0a, 0x69, // pler2D s_tex;..i + 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x70, // n highp vec2 v_p + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, // osition;.in high + 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // p vec2 v_texcoor + 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, // d0;.layout(locat + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, // ion = 0) out hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // hp vec4 bgfx_Fra + 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // gColor;..void ma + 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // in().{. highp + 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, // vec3 _302 = vec + 0x33, 0x28, 0x76, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x2e, // 3(v_position, 1. + 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // 0);. highp ve + 0x63, 0x32, 0x20, 0x5f, 0x33, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, // c2 _313 = vec2(0 + 0x2e, 0x35, 0x29, 0x20, 0x2d, 0x20, 0x28, 0x28, 0x61, 0x62, 0x73, 0x28, 0x28, 0x75, 0x5f, 0x73, // .5) - ((abs((u_s + 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x32, // cissorMat * _302 + 0x29, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2d, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, // ).xy) - u_scisso + 0x72, 0x45, 0x78, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2a, 0x20, // rExtScale.xy) * + 0x75, 0x5f, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x53, 0x63, 0x61, 0x6c, // u_scissorExtScal + 0x65, 0x2e, 0x7a, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // e.zw);. highp + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x63, 0x6c, // float _320 = cl + 0x61, 0x6d, 0x70, 0x28, 0x5f, 0x33, 0x31, 0x33, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, // amp(_313.x, 0.0, + 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x5f, 0x33, // 1.0) * clamp(_3 + 0x31, 0x33, 0x2e, 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, // 13.y, 0.0, 1.0); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // . highp float + 0x20, 0x5f, 0x33, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, 0x30, 0x2c, // _336 = min(1.0, + 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x28, 0x76, 0x5f, 0x74, // (1.0 - abs((v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x30, // excoord0.x * 2.0 + 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, // ) - 1.0)) * u_pa + 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2e, // rams.y) * min(1. + 0x30, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x79, // 0, v_texcoord0.y + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // );. highp vec + 0x34, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, // 4 _376;. if ( + 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x2e, // u_params.w == 0. + 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 0). {. + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x33, 0x34, 0x38, // highp vec2 _348 + 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x4d, // = abs((u_paintM + 0x61, 0x74, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x29, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2d, // at * _302).xy) - + 0x20, 0x28, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, // (u_extentRadius + 0x2e, 0x78, 0x79, 0x20, 0x2d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x75, 0x5f, 0x65, 0x78, 0x74, // .xy - vec2(u_ext + 0x65, 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x3b, 0x0a, 0x20, // entRadius.z));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x20, 0x3d, 0x20, 0x6d, 0x69, // _376 = mi + 0x78, 0x28, 0x75, 0x5f, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x2c, 0x20, 0x75, 0x5f, // x(u_innerCol, u_ + 0x6f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, // outerCol, vec4(c + 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x28, 0x28, 0x6d, 0x69, 0x6e, 0x28, 0x6d, 0x61, 0x78, 0x28, // lamp((((min(max( + 0x5f, 0x33, 0x34, 0x38, 0x2e, 0x78, 0x2c, 0x20, 0x5f, 0x33, 0x34, 0x38, 0x2e, 0x79, 0x29, 0x2c, // _348.x, _348.y), + 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x6d, // 0.0) + length(m + 0x61, 0x78, 0x28, 0x5f, 0x33, 0x34, 0x38, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, // ax(_348, vec2(0. + 0x30, 0x29, 0x29, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, // 0)))) - u_extent + 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x5f, 0x70, // Radius.z) + (u_p + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, // arams.x * 0.5)) + 0x2f, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, // / u_params.x, 0. + 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x33, 0x33, // 0, 1.0))) * (_33 + 0x36, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x32, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, // 6 * _320);. } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // . else. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // highp ve + 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // c4 _377;. + 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, // if (u_params.w + 0x3d, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // == 1.0). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, // {. hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x39, 0x34, 0x20, 0x3d, 0x20, // ghp vec4 _194 = + 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x28, // texture(s_tex, ( + 0x75, 0x5f, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, // u_paintMat * _30 + 0x32, 0x29, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, // 2).xy / u_extent + 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // Radius.xy);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // highp ve + 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // c4 _374;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // if (u_param + 0x73, 0x2e, 0x7a, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, // s.z == 1.0). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // highp + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, // float _203 = _19 + 0x34, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 4.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, // _374 = vec4 + 0x28, 0x5f, 0x31, 0x39, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x30, 0x33, // (_194.xyz * _203 + 0x2c, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // , _203);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, // _374 = _19 + 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // 4;. } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, // . hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, // hp vec4 _375;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, // if (u_ + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x29, // params.z == 2.0) + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, // _ + 0x33, 0x37, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x34, 0x2e, 0x78, 0x78, 0x78, 0x78, 0x3b, // 375 = _374.xxxx; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, // . }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, // _3 + 0x37, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 75 = _374;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x37, // _377 = (_37 + 0x35, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x29, 0x20, // 5 * u_innerCol) + 0x2a, 0x20, 0x28, 0x5f, 0x33, 0x33, 0x36, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x32, 0x30, 0x29, 0x3b, // * (_336 * _320); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . }. + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, // {. hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x38, 0x3b, 0x0a, 0x20, // ghp vec4 _378;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, // if (u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x2e, 0x30, // _params.w == 2.0 + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // ). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x5f, 0x33, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, // _378 = vec4(1.0) + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // ;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, // else + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, // h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x3b, 0x0a, // ighp vec4 _379;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x3d, // if (u_params.w = + 0x3d, 0x20, 0x33, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = 3.0). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, // hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x74, // hp vec4 _244 = t + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x76, 0x5f, // exture(s_tex, v_ 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // texcoord0);. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x3d, // color_13 = - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // tmpvar_14;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, // if ((u_par - 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x7b, // ams.z == 1.0)) { - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, // . low - 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, // p vec4 tmpvar_15 - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, // ;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x74, // pvar_15.xyz = (t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x74, // mpvar_14.xyz * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // mpvar_14.w);. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // tmpvar_ - 0x31, 0x35, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, // 15.w = tmpvar_14 - 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // .w;. - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // color_13 = tmpva - 0x72, 0x5f, 0x31, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // r_15;. - 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, // };. if - 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x20, 0x3d, 0x3d, 0x20, // ((u_params.z == - 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 2.0)) {. - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x63, // color_13 = c - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x2e, 0x78, 0x78, 0x78, 0x78, 0x3b, 0x0a, 0x20, 0x20, // olor_13.xxxx;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // };. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x3d, 0x20, // color_13 = - 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, // (color_13 * tmpv - 0x61, 0x72, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ar_2);. - 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, // result_1 = (col - 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x43, // or_13 * u_innerC - 0x6f, 0x6c, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, // ol);. };. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, // };. };. - 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // };. gl_FragCo - 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x31, 0x3b, 0x0a, // lor = result_1;. - 0x7d, 0x0a, 0x0a, 0x00, // }... + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x32, 0x3b, // highp vec4 _372; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // if (u_param + 0x73, 0x2e, 0x7a, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, // s.z == 1.0). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // highp + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, // float _253 = _24 + 0x34, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 4.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, // _37 + 0x32, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x32, 0x34, 0x34, 0x2e, 0x78, 0x79, // 2 = vec4(_244.xy + 0x7a, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x33, 0x29, 0x3b, // z * _253, _253); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, // _3 + 0x37, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 72 = _244;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // highp vec4 + 0x5f, 0x33, 0x37, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _373;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, // if (u_ + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x29, // params.z == 2.0) + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, // _ + 0x33, 0x37, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x32, 0x2e, 0x78, 0x78, 0x78, 0x78, 0x3b, // 373 = _372.xxxx; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, // _3 + 0x37, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 73 = _372;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x37, // _379 = (_37 + 0x33, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x32, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x69, 0x6e, // 3 * _320) * u_in + 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // nerCol;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, // { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x30, // _379 = _380 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ;. + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x3b, // _378 = _379; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, // . }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x37, 0x20, // _377 + 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _378;. + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x20, 0x3d, // }. _376 = + 0x20, 0x5f, 0x33, 0x37, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, // _377;. }. + 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, // bgfx_FragColor + 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // = _376;.}... }; static const uint8_t fs_nanovg_fill_spv[5184] = { diff --git a/examples/common/nanovg/vs_nanovg_fill.bin.h b/examples/common/nanovg/vs_nanovg_fill.bin.h index 7cf544694..9b3e95314 100644 --- a/examples/common/nanovg/vs_nanovg_fill.bin.h +++ b/examples/common/nanovg/vs_nanovg_fill.bin.h @@ -1,75 +1,66 @@ -static const uint8_t vs_nanovg_fill_glsl[511] = +static const uint8_t vs_nanovg_fill_glsl[460] = { - 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xda, 0x1b, 0x94, 0x02, 0x00, 0x0a, 0x75, // VSH............u - 0x5f, 0x76, 0x69, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _viewSize....... - 0x00, 0x00, 0x00, 0x0b, 0x75, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x02, // ....u_halfTexel. - 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, // .............att - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, // ribute vec2 a_po - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, // sition;.attribut - 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // e vec2 a_texcoor - 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, // d0;.varying vec2 - 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x76, 0x61, 0x72, // v_position;.var - 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // ying vec2 v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, // oord0;.uniform v - 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x0a, // ec4 u_viewSize;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x68, // uniform vec4 u_h - 0x61, 0x6c, 0x66, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // alfTexel;.void m - 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, // ain ().{. v_pos - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, // ition = a_positi - 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // on;. v_texcoord - 0x30, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // 0 = (a_texcoord0 - 0x20, 0x2b, 0x20, 0x75, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x2e, 0x78, // + u_halfTexel.x - 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // y);. vec4 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // r_1;. tmpvar_1. - 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // zw = vec2(0.0, 1 - 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // .0);. tmpvar_1. - 0x78, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x5f, 0x70, // x = (((2.0 * a_p - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x29, 0x20, 0x2f, 0x20, 0x75, 0x5f, 0x76, // osition.x) / u_v - 0x69, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x78, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, // iewSize.x) - 1.0 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x79, 0x20, // );. tmpvar_1.y - 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, // = (1.0 - ((2.0 * - 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x29, 0x20, 0x2f, // a_position.y) / - 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x79, 0x29, 0x29, 0x3b, // u_viewSize.y)); - 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, // . gl_Position = - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // tmpvar_1;.}... -}; -static const uint8_t vs_nanovg_fill_essl[553] = -{ - 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xda, 0x1b, 0x94, 0x02, 0x00, 0x0a, 0x75, // VSH............u - 0x5f, 0x76, 0x69, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _viewSize....... - 0x00, 0x00, 0x00, 0x0b, 0x75, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x02, // ....u_halfTexel. - 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, // .............att - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // ribute highp vec - 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, // 2 a_position;.at - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // tribute highp ve + 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xda, 0x1b, 0x94, 0x02, 0x00, 0x0b, 0x75, // VSH............u + 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, // _halfTexel...... + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x02, // .....u_viewSize. + 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, // ..............un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x68, 0x61, 0x6c, // iform vec4 u_hal + 0x66, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // fTexel;.uniform + 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x3b, // vec4 u_viewSize; + 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, // ..out vec2 v_pos + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, // ition;.layout(lo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, // cation = 0) in v + 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec2 a_position;. + 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // out vec2 v_texco + 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, // ord0;.layout(loc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, // ation = 1) in ve 0x63, 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, // c2 a_texcoord0;. - 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // varying highp ve - 0x63, 0x32, 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x76, // c2 v_position;.v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // arying highp vec - 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, // 2 v_texcoord0;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // niform highp vec - 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x75, 0x6e, // 4 u_viewSize;.un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // iform highp vec4 - 0x20, 0x75, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x3b, 0x0a, 0x76, 0x6f, // u_halfTexel;.vo - 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, // id main ().{. v - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, // _position = a_po - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // sition;. v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // oord0 = (a_texco - 0x6f, 0x72, 0x64, 0x30, 0x20, 0x2b, 0x20, 0x75, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x54, 0x65, 0x78, // ord0 + u_halfTex - 0x65, 0x6c, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // el.xy);. highp - 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, // vec4 tmpvar_1;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, // tmpvar_1.zw = v - 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, // ec2(0.0, 1.0);. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x28, // tmpvar_1.x = (( - 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // (2.0 * a_positio - 0x6e, 0x2e, 0x78, 0x29, 0x20, 0x2f, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x53, 0x69, 0x7a, // n.x) / u_viewSiz - 0x65, 0x2e, 0x78, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, // e.x) - 1.0);. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, // mpvar_1.y = (1.0 - 0x20, 0x2d, 0x20, 0x28, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, // - ((2.0 * a_pos - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x29, 0x20, 0x2f, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, // ition.y) / u_vie - 0x77, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x79, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, // wSize.y));. gl_ - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // Position = tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r_1;.}... + 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, // .void main().{. + 0x20, 0x20, 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // v_position = + 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // a_position;. + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, // v_texcoord0 = a_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x2b, 0x20, 0x75, 0x5f, 0x68, 0x61, // texcoord0 + u_ha + 0x6c, 0x66, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // lfTexel.xy;. + 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x76, 0x65, // gl_Position = ve + 0x63, 0x34, 0x28, 0x28, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, // c4(((2.0 * v_pos + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x29, 0x20, 0x2f, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, // ition.x) / u_vie + 0x77, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x78, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, // wSize.x) - 1.0, + 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x76, 0x5f, // 1.0 - ((2.0 * v_ + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x29, 0x20, 0x2f, 0x20, 0x75, 0x5f, // position.y) / u_ + 0x76, 0x69, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, // viewSize.y), 0.0 + 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // , 1.0);.}... +}; +static const uint8_t vs_nanovg_fill_essl[460] = +{ + 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xda, 0x1b, 0x94, 0x02, 0x00, 0x0b, 0x75, // VSH............u + 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, // _halfTexel...... + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x02, // .....u_viewSize. + 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, // ..............un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x68, 0x61, 0x6c, // iform vec4 u_hal + 0x66, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // fTexel;.uniform + 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x3b, // vec4 u_viewSize; + 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, // ..out vec2 v_pos + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, // ition;.layout(lo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, // cation = 0) in v + 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec2 a_position;. + 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // out vec2 v_texco + 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, // ord0;.layout(loc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, // ation = 1) in ve + 0x63, 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, // c2 a_texcoord0;. + 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, // .void main().{. + 0x20, 0x20, 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // v_position = + 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // a_position;. + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, // v_texcoord0 = a_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x2b, 0x20, 0x75, 0x5f, 0x68, 0x61, // texcoord0 + u_ha + 0x6c, 0x66, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // lfTexel.xy;. + 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x76, 0x65, // gl_Position = ve + 0x63, 0x34, 0x28, 0x28, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x70, 0x6f, 0x73, // c4(((2.0 * v_pos + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x29, 0x20, 0x2f, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, // ition.x) / u_vie + 0x77, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x78, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, // wSize.x) - 1.0, + 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x76, 0x5f, // 1.0 - ((2.0 * v_ + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x29, 0x20, 0x2f, 0x20, 0x75, 0x5f, // position.y) / u_ + 0x76, 0x69, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, // viewSize.y), 0.0 + 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // , 1.0);.}... }; static const uint8_t vs_nanovg_fill_spv[1481] = { diff --git a/examples/common/ps/fs_particle.bin.h b/examples/common/ps/fs_particle.bin.h index 9438c3a73..0665a705e 100644 --- a/examples/common/ps/fs_particle.bin.h +++ b/examples/common/ps/fs_particle.bin.h @@ -1,59 +1,60 @@ -static const uint8_t fs_particle_glsl[389] = +static const uint8_t fs_particle_glsl[368] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x73, // FSH............s 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x5d, 0x01, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, // ...]...varying v - 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, // ec4 v_color0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // rying vec4 v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // coord0;.uniform + 0x00, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // ...H....uniform 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // sampler2D s_texC - 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, // olor;.void main - 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x67, 0x62, 0x61, // ().{. vec4 rgba - 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // _1;. vec4 tmpva - 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, // r_2;. tmpvar_2 - 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x20, 0x28, 0x73, 0x5f, 0x74, // = texture2D (s_t - 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // exColor, v_texco - 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, // ord0.xy);. rgba - 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // _1.xyz = ((tmpva - 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x78, 0x78, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // r_2.xxx * v_colo - 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // r0.xyz) * (tmpva - 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // r_2.x * v_color0 - 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x2e, 0x77, // .w));. rgba_1.w - 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x20, // = ((tmpvar_2.x - 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, // * v_color0.w) * - 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // (1.0 - v_texcoor - 0x64, 0x30, 0x2e, 0x7a, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, // d0.z));. gl_Fra - 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x3b, // gColor = rgba_1; - 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... + 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, // olor;..in vec4 v + 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, // _texcoord0;.in v + 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, // ec4 v_color0;.la + 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // yout(location = + 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, // 0) out vec4 bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, // _FragColor;..voi + 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, // d main().{. v + 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, // ec4 _20 = textur + 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, // e(s_texColor, v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, // texcoord0.xy);. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x5f, // float _33 = _ + 0x32, 0x30, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // 20.x;. bgfx_F + 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // ragColor = vec4( + 0x28, 0x28, 0x5f, 0x32, 0x30, 0x2e, 0x78, 0x78, 0x78, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, // ((_20.xxx * v_co + 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x33, 0x29, // lor0.xyz) * _33) + 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x2c, 0x20, 0x28, // * v_color0.w, ( + 0x5f, 0x33, 0x33, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, // _33 * v_color0.w + 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // ) * (1.0 - v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x7a, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // coord0.z));.}... }; -static const uint8_t fs_particle_essl[411] = +static const uint8_t fs_particle_essl[450] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x73, // FSH............s 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x73, 0x01, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // ...s...varying h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ighp vec4 v_colo - 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, // r0;.varying high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // p vec4 v_texcoor - 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, // d0;.uniform samp - 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // ler2D s_texColor - 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, // ;.void main ().{ - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x67, 0x62, // . lowp vec4 rgb - 0x61, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // a_1;. lowp vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_2;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, // var_2 = texture2 - 0x44, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, // D (s_texColor, v - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, // _texcoord0.xy);. - 0x20, 0x20, 0x72, 0x67, 0x62, 0x61, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x28, // rgba_1.xyz = ( - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x78, 0x78, 0x20, 0x2a, 0x20, // (tmpvar_2.xxx * - 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2a, 0x20, // v_color0.xyz) * - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x76, 0x5f, // (tmpvar_2.x * v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, // color0.w));. rg - 0x62, 0x61, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // ba_1.w = ((tmpva - 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // r_2.x * v_color0 + 0x00, 0x00, 0x00, 0x9a, 0x01, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, // .......precision + 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, // mediump float;. + 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // precision highp + 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, // int;..uniform hi + 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, // ghp sampler2D s_ + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, // texColor;..in hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // ghp vec4 v_texco + 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // ord0;.in highp v + 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, // ec4 v_color0;.la + 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // yout(location = + 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // 0) out highp vec + 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // 4 bgfx_FragColor + 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, // ;..void main().{ + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // . highp vec4 + 0x5f, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, // _20 = texture(s_ + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // texColor, v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, // oord0.xy);. h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x33, 0x20, 0x3d, // ighp float _33 = + 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // _20.x;. bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, // _FragColor = vec + 0x34, 0x28, 0x28, 0x28, 0x5f, 0x32, 0x30, 0x2e, 0x78, 0x78, 0x78, 0x20, 0x2a, 0x20, 0x76, 0x5f, // 4(((_20.xxx * v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, // color0.xyz) * _3 + 0x33, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2e, 0x77, 0x2c, // 3) * v_color0.w, + 0x20, 0x28, 0x5f, 0x33, 0x33, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // (_33 * v_color0 0x2e, 0x77, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x76, 0x5f, 0x74, // .w) * (1.0 - v_t - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x7a, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // excoord0.z));. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x72, // gl_FragColor = r - 0x67, 0x62, 0x61, 0x5f, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // gba_1;.}... + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x7a, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, // excoord0.z));.}. + 0x0a, 0x00, // .. }; static const uint8_t fs_particle_spv[1231] = { diff --git a/examples/common/ps/vs_particle.bin.h b/examples/common/ps/vs_particle.bin.h index 720f86d69..93f0dc847 100644 --- a/examples/common/ps/vs_particle.bin.h +++ b/examples/common/ps/vs_particle.bin.h @@ -1,60 +1,56 @@ -static const uint8_t vs_particle_glsl[386] = +static const uint8_t vs_particle_glsl[373] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........U...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec3 a_position;. - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // attribute vec4 a - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // _texcoord0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ing vec4 v_color - 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // 0;.varying vec4 - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // v_texcoord0;.uni + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........H....uni 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // lViewProj;.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // main ().{. vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, // var_1.w = 1.0;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, // tmpvar_1.xyz = - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, // a_position;. gl - 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, // _Position = (u_m - 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, // odelViewProj * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, // mpvar_1);. v_co - 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // lor0 = a_color0; - 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, // . v_texcoord0 = - 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, // a_texcoord0;.}. - 0x0a, 0x00, // .. + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // ut vec4 v_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // rd0;.layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, // tion = 2) in vec + 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x0a, // 4 a_texcoord0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, // n, 1.0);. v_c + 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // olor0 = a_color0 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // ;. v_texcoord + 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, // 0 = a_texcoord0; + 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... }; -static const uint8_t vs_particle_essl[428] = +static const uint8_t vs_particle_essl[373] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // bute highp vec3 - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, // a_position;.attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, // a_texcoord0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // rying highp vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color0;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ng highp vec4 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // texcoord0;.unifo - 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // rm highp mat4 u_ - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, // modelViewProj;.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // highp vec4 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // r_1;. tmpvar_1. - 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // w = 1.0;. tmpva - 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, // r_1.xyz = a_posi - 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, // tion;. gl_Posit - 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, // ion = (u_modelVi - 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ewProj * tmpvar_ - 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, // 1);. v_color0 = - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, // a_color0;. v_t - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, // excoord0 = a_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // coord0;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........H....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ion;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // ut vec4 v_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // rd0;.layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, // tion = 2) in vec + 0x34, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x0a, // 4 a_texcoord0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, // n, 1.0);. v_c + 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // olor0 = a_color0 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // ;. v_texcoord + 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, // 0 = a_texcoord0; + 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... }; static const uint8_t vs_particle_spv[1222] = { diff --git a/examples/makefile b/examples/makefile index c00bd8319..46d3c5990 100644 --- a/examples/makefile +++ b/examples/makefile @@ -53,6 +53,9 @@ all: @make -s --no-print-directory build -C 47-pixelformats @make -s --no-print-directory build -C 48-drawindirect @make -s --no-print-directory build -C 49-hextile + @make -s --no-print-directory build -C 51-gpufont + @make -s --no-print-directory build -C 52-layered + @make -s --no-print-directory build -C 53-sky2 rebuild: @make -s --no-print-directory rebuild -C 01-cubes @@ -104,6 +107,9 @@ rebuild: @make -s --no-print-directory rebuild -C 47-pixelformats @make -s --no-print-directory rebuild -C 48-drawindirect @make -s --no-print-directory rebuild -C 49-hextile + @make -s --no-print-directory rebuild -C 51-gpufont + @make -s --no-print-directory rebuild -C 52-layered + @make -s --no-print-directory rebuild -C 53-sky2 rebuild-embedded: @make -s --no-print-directory rebuild -C 02-metaballs diff --git a/examples/runtime/shaders/essl/cs_assao_apply.bin b/examples/runtime/shaders/essl/cs_assao_apply.bin index 45f94b431c4a1af7a5fdebebc5c8f91a48e35936..e76b2f3fa26b4e3824e435c7ae1a0c770d14a074 100644 GIT binary patch literal 2087 zcmbtV+iKfD5LH`fi}KhX*q0Wmaa3t_@e0#GXlNTK^uc{AVNq<^7RZv3rT9|vqy3tm z*_AJe4N2(6*t;-ZpZURLOMy@||JegY~+RRXV6&zAy}YuukT3 zlod(d?_d0+D}DR-jbY@;s%&a2F9%63=h-@yOZJ(G4%@p~9o(#O^2<)Y=h;u7hm@tiU?EB+>2OeWdToahuvhwFe}FTP>pXAVY7|nMU~ZQS>!7=$;Oiz z%cjXV<(F(O>!cc|aJkXc@_90y$*>v#=S&KL z;Nx6=%gdW2zbbA~5yE$M=`2_5RI6FKu(+{%%2?aRE^KLQ!A&d4M$Ag`+{)AW{MRHY zEEyxu)_%RPZCg3e7zjsJ)J%FFxx$t_IZK(a!!0pDNh(+Lc!wx%U9Q=<$sb(hwWa?RDLMCAOh-Ssr$z?{5=gYU`LRx58{tR{hiej zA#ptj(S1BtRUwW&WlLNWF})Vo zL7#E(afdznL!1cdXIo77+F2h4<~{{RMd3xc^|d={2BH8ny`>m@Ie-;-4`CssQWuyP z5}u!fLrpQtOX$3!HiuoS{CAMB@4y@fGRJ9C ztX(8Mnd-9IjVAs0^_XlKIV%^|u&nh9RWEwkq0vz{Rr;eG-X9%+;UlQ$Z{8!uM5ORz zTF|%vr=7>`18--KflCYsQ06DvAK{SV4mF#o^jOz+v0Lo>u>nG&%Q}lJe zd*@zKpQfD{OAv?Tz4zS1!%JG!n~SsWo|QlUe*f&*4|h7v!Xy^{a3FNnnMH}pMLJnX z(+X5qd=;tAmuW19{lQV7#^PJ&PES1c;zq-XMkGADm8)O4`l9XXw_Hbs>uAGu)N=I% zr3$h|r1FC8s>YUy1goA1R$a^4rx1TJD^LovVB#=K1Pfn#|9W`%E%eFzE5rMKCNHUeWNo zov$5R7{MI5{{%WiU{Bw_+8N*cfNJ%8Qvt(o*7)Y7S(U_MwJ=fXc*pTc-!bg z$C7SEwFE7wJ_-tk4JcyAO9@rq>l~tzIDkRFC%6vMJFP- z&vseWS_Uv(&f|?F6CQTv35@NkK;jChxMB0FCmrcw0~%4EIOPbfhP_yiSrxAagwJ347k==~9=SnTj%9 zJ1p2${3ZhO62FRo9m)gQfr|R@j63gJwD-dFg&PxPY>0CG?T0zqf(c6Msf z!bZ}^Cr`(mCt236I4}gd;<+&6agrA{wi-(1cS#|Q(V$HEh&BX`eNOHhDSf#!Wu+W2 zAW@m}5$X6a-;#2)BPAVD#UyK$%4e5ZDsDb~r9zV13CRY#{>E#M0-ykAr5ZyG7HhK~ z+e-4f07iZ*f$8iATZv#MZdTGxyux*CSIJJU#WaTP1!Tl1){`Z(6=W>CW#YWfy5;Cy zRm1|-@|KlLk!9)HPFqLLi$i~Nzi_~gy!`Z2q^+%Ax*Mb_u_5vn*rIJy`Y#d{$ zsqfh5oYz^v9KEZMSgoRxxMMdCMLwn@=XDk^NAJoThqEM|ndoD90+J`Ho7#L-$5OLrUI+%7~oS2x-_6c>ekIxKlR!D{*4brK|#9z7#)q#ZO|e8sK(!B>euM9<$yO zGujdJuqDRZ5p%yK27&a6@77qsrJO6kGmkfyr2t!SxX_KWTK)V z3m3UL=`8zvt71u5F!eAGD!=~2J#MhP_~tgD5>zl} zU4*MoNmk~yfxxVr&r~#ni}gLS3~-6}C^;Sm=QMvwWn_H%c$4vCX`P01QiF^70&2;k zth@cSjVC+Dlkeg1(86H86-+pR6EZy)fJ2R%(D0T*hlg{dY+3FKe=-BAika49jP(F` ztjGknM4i%RIT1OXp6_%%xdrEPr{P)$Pv6d!#KFja0m zzgSX^C$c;R%W0G4NL)ucp8lorrITmlPQAw`Jh-(+d85|K3e%{1yvMKrtr$A^YK8gG zh{4IkmC}l#Gh8c* diff --git a/examples/runtime/shaders/essl/cs_assao_generate_importance_map.bin b/examples/runtime/shaders/essl/cs_assao_generate_importance_map.bin index b1fa6d829bafb1417ab8f1c7021f4fe090898b3d..5988806ed0dcca119b658e0c0fcd890d83da6a12 100644 GIT binary patch literal 1231 zcmaJ>O>dh(5T#KM6*=|~%yFqH0t_ye+e1`KX-+-3x5z?k2ji8N#p1&;j{Ga~hdZ-? zKiW7e4!g5&-oBYP_Rra`TccYy#-}>o@PcRM&1b{F57%uOuY}@qHoN<6d@$(4_4?5; zByaM%VlrQH8JA+8#5?!_kqu{&=D)}uBc269O-%EQp%S^m8`p+~P)|ao?V(5)JhGrx zVwD#eJQt!$awQvBi*&sKk?}O~r%=WfFVdu%m_2fvECcAPdGyBf(^Z>V@@ylM!k^w1 z1#ghySS1SE=Hdx5E)=uO7ZY%a6)-L(lSx_rS#!lw8Q;r%!R3S6Vh2e7!_?U|Hq`jG z&$P4|c7^rgELxhZr6gK{LOdE_wM?g7qlGUWuU}gh40Iy%92XCG)4BHO&Yk`9M884o zE1B~OV&4tlh>cD$M34fcyNHG4!Fdcl049{C4Crz~CUpt%Bwdcgi|K;ZU(GnYt1=Rk%NM_U_c zr%x!$#z%)C*3|{@Cl-4FTK`WWm`MsVz9W(l@wn5c3lh5ahVPIBgTbZzWv(ir>f{tX z94&6=yvmEypxYqco#o!4(==$kI0;lcdFwm)M}S`1G?NH-oygV8^TxhA_M>qay5Azt N506bamg5i5Y5>=_74ou3*C6Vwxlh#b%SENY114QT_oFFfV zSjV!oY^xSqCK6U72&{E!}8{!Kc(hdtKEa(jjT48nQhA04ko8V29mc*ygl&vP1 zY0`ktL6)dHXpblb1{`Rqx&xh56Ilk3l+~YkmRx0zg>%bI7 znai|TXN3}kBPfg_LUa!OAq;1Omq9zj$1FZFgA3Q7`d!{wWtulOG;eHphv=e?HQk14 z4Qi>r3W^MOpokqWC8~O%N)(mEK^W|hfa@U79$T!)S&;R1a(5e|?GDwW?sT{7nJ%l^ z%79EaNxGM0&cn_;p|;&wB(8vlD{jFauDHzK&ehDs?@+f18|phbUDQq59qRh1LN>_# zk60xtEf2`x6rSf{0k!h9cn44&439@GRIKKuxX-c}Fmt*XfjMu>e52~lQpSa99Tw~g zzd=Y|@C$_OP#?$+RICqAyYs%q_EDHVxG}MeHBqj=<1m8*m?&(GiS46!dNrn=u$J`o z$|BR=j6VZ(igoc8|4rKC8|@t zA{`&*2T}$-Dd~{1lWbKgpIv&XxcTiX6_MOdNH&=D*Iq{y00lTJRU2BcxHiYJZ6t3C zpyf9b=+1GljR<<;dL_-o8(hbB73}0%Ol>$^Kw1pDo-CQEAZ_WFiSs(^mZSTshy`lp ztt*!z>(Vuyu8y1+5B>f9!T~*b`SxSewpLHyinPeO-Ob6#oX0HR)?5Xw4MsxKIS$rY zz=TwvC#G{8th0a#sTSUJj)QduKJYFUNpV(uD_(nXY`#vk(4@3K%Gmrb~qxlD@N>CauzO-Nz0K`fuL zO)2vCBe*B9bagfv!ebtlDof)huuJz4tsd48C32;_b11@6<}1}&+CnDlSmoaNhdh^0 z=&+1Z8DC$2_}k_H5odE5hehiO14}B{$5p+!>vw+F?-H5&j z7sKjRn%s?_vCJ7`CCdku_o3h`ixIuyIDn$B=W@G39+UB8W*-ltl$c>$Jt8X_(LPx& z_)#ySkr_nrD+Ks+dddnQGkmpxcYL&#s={|H>VkQqob`J1z1yx Xm1D{6tiojc9&j7s2jzIdzmxv~zAbK= diff --git a/examples/runtime/shaders/essl/cs_assao_generate_q0.bin b/examples/runtime/shaders/essl/cs_assao_generate_q0.bin index abdadeb6481355ee72448b7a616004aaadf92bd5..98e49f315b3996de1f2ec83701915b3eac1141d8 100644 GIT binary patch literal 7394 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 literal 17895 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
1vWW-hf0GZoo zkrAi-17xnAMMm83VKU7Wjb4{YrF7{**`Lq3UAje~VQzsq3*J4odZ0c=o$i)&j5@>T z0b*}DLp)Oashb8DpVlByr8mQ=u7!$D15ZWuFs9RIU_#mq?&s<7d6@PTDm$uSk<-g{ zzPT(5+7xg=iY48m`^Dum?_G40ukWkO0EeBrabv?a0n7CG)VJr(=$ zv$0cDtGFnF4^~@D9^Iuy>6nCN%x{*2%Du86=Co#~760u>(&+d3F9&uv=bIC6?a!-~r;f!1d+ss$`BfsGAgB-by$ zs=n0$E}rS*1y}X2XqhZ-lBIfYAJnCm|K!FcFY*Et3VM~8ECHn;`XVr(9v(Dl|DqpZMRm4Q)CzjO#RsX~7w)ph2n zgD(4WaavYc@y>i;24teQ#%F8z*(UK|_H!JK&_1fGvt*S4%Qbr1jSco_szare!&7L z4{X;kc3s$_4U=K(MC*zgwQUahpv~v^_Ke{j;&+3dmSBV%81&6&8-9bB;xFa!YYHpn z#FBD$R-cx2=4nqFR&bpF!BN$V%FKNT_z=6^3;Dv*6*Sl|?*IElXXMmrPXFCVceD-c z=KF&F%K~)_LsRt&-Rgd=ZhAR<(e1Bq1{zC|2h{BVhPh|q4fubQA@m&qrc7?ppW1Y_ zNg9}Um=N2ZXS4iA+)QZ8VsAEENwcp>-x=BY8}B#G9@jJb7Qz7KtM9-Br28(LRwZ@& zRN+LyXMMv3^7b1yxbXQue`hUi9ZK`}z}_}s`9n;CZ3>{3f!rf#Y7Uw#HvIa|%H3ez zwG0p z4P=SXq|9GSz#2^t)#w@yYWA9Yo%2q8aqYN8i4O`U8&p;kI;@Wes4UG0ovWK8RGs7d zjybO4`P0`0eqiKMWhHl4v+5mv4J9`M7scdzE_#u1fRkDV@7~Z=0J$rID8To*^aCau zqB0KGS4DyEq&Az=%WUZqE=-XYcolu7D+fyP(1tFI_H{6-UIiAtrSt24@3Gs#TCaQo z$WZ+B7r6kGYbwPQT>)`ThRZ!wpMVlJE&7v>UoGxPI{K<+lXG#&%SgL;5d6qQyTyko z;t1Sx4zQK=g#^L2KJDh~Dcn%ezoaO9zeyFKA!RMc7|TbCaGs}+=}!>ib?aK!QkD($ Wuh7sixPthM_WI_AOh?t`SN{OMAEn9w diff --git a/examples/runtime/shaders/essl/cs_assao_generate_q1.bin b/examples/runtime/shaders/essl/cs_assao_generate_q1.bin index e90df0343cfe2ad0941e5347d9505ae9de0d5261..ed4ffff24f79699d7af128272422463507389624 100644 GIT binary patch literal 9460 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 F{{R&?kMsZl literal 17895 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
1vWW-hf0GZoo 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 literal 17895 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
1vWW-hf0GZoo zkrAi-17xnAMMm83VKU7Wjb4{YrF7{**`Lq3UAje~VQzsq3*J4odZ0c=o$i)&j5@>T z0b*}DLp)Oashb8DpVlByr8mQ=u7!$D15ZWuFs9RIU_#mq?&s<7d6@PTDm$uSk<-g{ zzPT(5+7xg=iY48m`^Dum?_G40ukWkO0EeBrabv?a0n7CG)VJr(=$ zv$0cDtGFnF4^~@D9^Iuy>6nCN%x{*2%Du86=Co#~760u>(&+d3F9&uv=bIC6?a!-~r;f!1d+ss$`BfsGAgB-by$ zs=n0$E}rS*1y}X2XqhZ-lBIfYAJnCm|K!FcFY*Et3VM~8ECHn;`XVr(9v(Dl|DqpZMRm4Q)CzjO#RsX~7w)ph2n zgD(4WaavYc@y>i;24teQ#%F8z*(UK|_H!JK&_1fGvt*S4%Qbr1jSco_szare!&7L z4{X;kc3s$_4U=K(MC*zgwQUahpv~v^_Ke{j;&+3dmSBV%81&6&8-9bB;xFa!YYHpn z#FBD$R-cx2=4nqFR&bpF!BN$V%FKNT_z=6^3;Dv*6*Sl|?*IElXXMmrPXFCVceD-c z=KF&F%K~)_LsRt&-Rgd=ZhAR<(e1Bq1{zC|2h{BVhPh|q4fubQA@m&qrc7?ppW1Y_ zNg9}Um=N2ZXS4iA+)QZ8VsAEENwcp>-x=BY8}B#G9@jJb7Qz7KtM9-Br28(LRwZ@& zRN+LyXMMv3^7b1yxbXQue`hUi9ZK`}z}_}s`9n;CZ3>{3f!rf#Y7Uw#HvIa|%H3ez zwG0p z4P=SXq|9GSz#2^t)#w@yYWA9Yo%2q8aqYN8i4O`U8&p;kI;@Wes4UG0ovWK8RGs7d zjybO4`P0`0eqiKMWhHl4v+5mv4J9`M7scdzE_#u1fRkDV@7~Z=0J$rID8To*^aCau zqB0KGS4DyEq&Az=%WUZqE=-XYcolu7D+fyP(1tFI_H{6-UIiAtrSt24@3Gs#TCaQo z$WZ+B7r6kGYbwPQ$~@$JTn*rIPt_-&giVY7sr@RmJRf; V(9kfrg7}Q~`sRjAN7d$6{{X>#rOp5V diff --git a/examples/runtime/shaders/essl/cs_assao_generate_q3.bin b/examples/runtime/shaders/essl/cs_assao_generate_q3.bin index b55d567a1e70d655fe179b291dbbd8810803dd15..f73fcb863fe75899c383bf6356eb517466f97d6e 100644 GIT binary patch literal 11576 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

XIvgs!6WAa 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

1vWW-hf0GZoo zkrAi-17xnAMMm83VKU7Wjb4{YrF7{**`Lq3UAje~VQzsq3*J4odZ0c=o$i)&j5@>T z0b*}DLp)Oashb8DpVlByr8mQ=u7!$D15ZWuFs9RIU_#mq?&s<7d6@PTDm$uSk<-g{ zzPT(5+7xg=iY48m`^Dum?_G40ukWkO0EeBrabv?a0n7CG)VJr(=$ zv$0cDtGFnF4^~@D9^Iuy>6nCN%x{*2%Du86=Co#~760u>(&+d3F9&uv=bIC6?a!-~r;f!1d+ss$`BfsGAgB-by$ zs=n0$E}rS*1y}X2XqhZ-lBIfYAJnCm|K!FcFY*Et3VM~8ECHn;`XVr(9v(Dl|DqpZMRm4Q)CzjO#RsX~7w)ph2n zgD(4WaavYc@y>i;24teQ#%F8z*(UK|_H!JK&_1fGvt*S4%Qbr1jSco_szare!&7L z4{X;kc3s$_4U=K(MC*zgwQUahpv~v^_Ke{j;&+3dmSBV%81&6&8-9bB;xFa!YYHpn z#FBD$R-cx2=4nqFR&bpF!BN$V%FKNT_z=6^3;Dv*6*Sl|?*IElXXMmrPXFCVceD-c z=KF&F%K~)_LsRt&-Rgd=ZhAR<(e1Bq1{zC|2h{BVhPh|q4fubQA@m&qrc7?ppW1Y_ zNg9}Um=N2ZXS4iA+)QZ8VsAEENwcp>-x=BY8}B#G9@jJb7Qz7KtM9-Br28(LRwZ@& zRN+LyXMMv3^7b1yxbXQue`hUi9ZK`}z}_}s`9n;CZ3>{3f!rf#Y7Uw#HvIa|%H3ez zwG0p z4P=SXq|9GSz#2^t)#w@yYWA9Yo%2q8aqYN8i4O`U8&p;kI;@Wes4UG0ovWK8RGs7d zjybO4`P0`0eqiKMWhHl4v+5mv4J9`M7scdzE_#u1fRkDV@7~Z=0J$rID8To*^aCau zqB0KGS4DyEq&Az=%WUZqE=-XYcolu7D+fyP(1tFI_H{6-UIiAtrSt24@3Gs#TCaQo z$WZ+B7r6kGYbwPQ$~=4?kE;P(?y33&l(1>hpM3mkaYxe0dM++`8EF>}f*+Y^xA-tc z9D#?<0k*QfkRaIBr`>!#g&QjRmlTEXH>m8RTL>L0@_rO*HX diff --git a/examples/runtime/shaders/essl/cs_assao_generate_q3base.bin b/examples/runtime/shaders/essl/cs_assao_generate_q3base.bin index 318252c3b1480cad76328272974e286e1bed0b12..7dd2867b742cc43c22d7a5d541e4b982188a2f02 100644 GIT binary patch literal 7530 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 D8@$QE literal 17893 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
1vWW-hf0GZoo zkrAi-17xnAMMm83VKU7Wjb4{YrF7{**`Lq3UAje~VQzsq3*J4odZ0c=o$i)&j5@>T z0b*}DLp)Oashb8DpVlByr8mQ=u7!$D15ZWuFs9RIU_#mq?&s<7d6@PTDm$uSk<-g{ zzPT(5+7xg=iY48m`^Dum?_G40ukWkO0EeBrabv?a0n7CG)VJr(=$ zv$0cDtGFnF4^~@D9^Iuy>6nCN%x{*2%Du86=Co#~760u>(&+d3F9&uv=bIC6?a!-~r;f!1d+ss$`BfsGAgB-by$ zs=n0$E}rS*1y}X2XqhZ-lBIfYAJnCm|K!FcFY*Et3VM~8ECHn;`XVr(9v(Dl|DqpZMRm4Q)CzjO#RsX~7w)ph2n zgD(4WaavYc@y>i;24teQ#%F8z*(UK|_H!JK&_1fGvt*S4%Qbr1jSco_szare!&7L z4{X;kc3s$_4U=K(MC*zgwQUahpv~v^_Ke{j;&+3dmSBV%81&6&8-9bB;xFa!YYHpn z#FBD$R-cx2=4nqFR&bpF!BN$V%FKNT_z=6^3;Dv*6*Sl|?*IElXXMmrPXFCVceD-c z=KF&F%K~)_LsRt&-Rgd=ZhAR<(e1Bq1{zC|2h{BVhPh|q4fubQA@m&qrc7?ppW1Y_ zNg9}Um=N2ZXS4iA+)QZ8VsAEENwcp>-x=BY8}B#G9@jJb7Qz7KtM9-Br28(LRwZ@& zRN+LyXMMv3^7b1yxbXQue`hUi9ZK`}z}_}s`9n;CZ3>{3f!rf#Y7Uw#HvIa|%H3ez zwG0p z4P=SXq|9GSz#2^t)#w@yYWA9Yo%2q8aqYN8i4O`U8&p;kI;@Wes4UG0ovWK8RGs7d zjybO4`P0`0eqiKMWhHl4v+5mv4J9`M7scdzE_#u1fRkDV@7~Z=0J$rID8To*^aCau zqB0KGS4DyEq&Az=%WUZqE=-XYcolu7D+fyP(1tFI_H{6-UIiAtrSt24@3Gs#TCaQo z$WZ+B7r6kGYbwPQ$~=4?Pe11b=OhZ<9%9d;Kl$|4VvdC40wD$*?;1UvH3Zs}o4 zID!tH18ih{p+K;$54-tt3ing=FR2M%Z&LkdNLkA<#?sLuoaX6M`V$0r-MH43lw|?^ W8#J^Ft{^<4y}r32!%?mI)jt64KBYJS diff --git a/examples/runtime/shaders/essl/cs_assao_load_counter_clear.bin b/examples/runtime/shaders/essl/cs_assao_load_counter_clear.bin index 28c2ea4b1ccd18c61131b53a5a9d102b0553c082..f3d4055ec51c1caaa3fcdb0a72e4afb53abeffb7 100644 GIT binary patch delta 151 zcmZ3g@QP8wIoN}n0S>MMSviT7`K2Y35A$0~aY5J`Ntt;mnR)37wh9J13dJQUCdQL1 z`PIX?s<{+^pfoeDM4>o7CqFU8IlnZoB(*3y)|#tUA>Poynv1I}KQl!kH!(9$LldeV TD6WU9+#nWYbSY317Z(EnZ~ZE; literal 4133 zcmb7HTW{Mo6wb5yQtTHH=!>)kn{DZ(Gm2piw)SN}krsUk0z$FrOoJpEx;RdQ{`Z{= zNy!o|S9u7?bNSB4kB2mM^ZDbeEBE))>#M6b2UXRXE=9at2vrBWT&InwHv5oAGL6KG zs8rKdrC9#D_)Vs3@jW=G&5ELEa1w-;5F(>4G`69!7>34!(8Pu&qtIj!x)NAQ*84nd zEZbv`EfJB&Yax%3;T&U1Jed-QoYGHAFfEx(OL}Q8wM7bo{+r}BD;wm~X-Zy`Of=CD zQ<5d>PZ|-$#Do$pRez$FYLPaHD4OHnl`d}eQymhRTwK%AguquWt+pqA=I zP+)ihh3sf6LDdhc0Z~yLfPwk7pgySdQ;!t}hv>aq+}}y?-Gh2KU7k)?W=g8|Dge{A zC`Uy$WcJpP?7O!})Bzn=ID!*gVVi%Pt651rpl%Cx)K6;qsGG7U)cL9cHo*O_TotNp z&dA^up4MRjS$W*NGpHVh^HFP+t4$L=Xq^kFTyC$0xo?}QRc^9N^IG*T3knr~2#HbR zcOfajUC16(=#LeL)47H5EX-K=F`i ztdaPc2}I%-!S+%&)<<5ZgC0a$(`0Z-<^ zb|Ub?c_+=nJ6z9k4JpXCnd~^PU6r(jT7}N|>liuOC~sw|o35Vv%_~tVzYZ*DSr(d=1PFBcYkhgY`BrBDwp-OyUtZPvZv~n*-lplzrb60$kfvZ)KYA|4nbzE*WvBJa|2K4oZ1= z+#O}P-T2H|xy>rj_|NL`eOjwQNGtbgl@|5g^6e0`m6)~;^7L7^O;|VEB!l@XKZCF(ZQVL9gBh5QPzS@329WZ|22kJo+!hLI>A8?hxh0|`o8xB{wehj literal 4667 zcmb7I+iv4F5Y4mt)-NE?7pgH_Than;jYW}e+T8#xS|q!92?Bz)X-5Su8M@d?7Wwzi z45^DP+F1oiLULx#9G)4`lt0{k`tG9n;oo0e{IFA59;XQlrxT`fZ>3XNuxzpAW+bG~ zzOqaeWtOn%c=D5wGxqB3)FL1+8XP#`3I|WWbq#CRkR7{*N3K!r8ueVGBiDdoDv@us zENZq@hb<8i)rg78x12)^3D1Uv+=O()A`FYphDDvQCbUEfjQ-l-GENHQ(`rgq8%#8D zA*7(1s5_`f6aym)tf{&Kom4lnh}fp6{>;+NZMx4nfr-h8w$8+~9t8Cu^u4d1ZHyw5 zNxn^U#Sw>N7)A(i7NO7lnfK~-Gki$(zzi;2iy9vDhAuO_VPJT}AUH)AbZqFhR2$Hm z>YJdz@Bj+gQ7J*ykE#GsQ5=AQ`G`>;Wa+-c3Y|GxA103v0&I_<9!{r+)4)zi)lLRr zT5ghFk_9b0^9W;mtdXb#TCVU2p5Y2*{&uc*C*cwGI$=xwAg7DEO?yDy996&uxc{Nm zMkU1w8Jxn?K59UtJQnW+s)ONh)Ldz`DEK^0HG|B_a>VR;TV$nbCM&6P)j2H4mHoy9 zda+-bAcy8acA!Fk1je17TNn?*44E4f+Sm}K{u_oFoxlWP8%!7v;u$oUX2V9(w>OW+ zT);_IpZ#bE`0SFI^&~B78(9sd=Ch=h#%R!_d_x|(XQgs2L^<-)ZbC(Aekjjyux?=n|ME~VJYOm6ar=`Y8irNFS6r{!~67CifT z#O4T=tlv+3w$I{1rHOuKb?Khs_0yKc8@X1&HOoaIv$g7!HkX^NR#|X;m1Xi799D56 z_1)doKXneqb-IvR ztQh8^RB`g<9#YkAm$=9$<98$Y_3={F2t9cOn3=tbONc2{1z$ygW~9qs>5_M(p(}34 zVT)hxDgA``BQ_bszj0Ng%m<@P9Vm;zD1ifIIT$5$pvc`CaJamjUoI}`QaKq1?`ED^ t-@=P0j7Iq7O)w6yT-bGYMVcuP&omyq!B7!w;XpMA8CUQ_?}o45#s38O1oZ#_ diff --git a/examples/runtime/shaders/essl/cs_assao_non_smart_blur.bin b/examples/runtime/shaders/essl/cs_assao_non_smart_blur.bin index cb0b3710dacf834da0565e9562542152a2919a15..b09160146a2c558196842f587aa7c6535043fb89 100644 GIT binary patch literal 1165 zcmbu7ZEM>w5XZf4jN!iA7r2*l>KMllOF|f|tgr_9u6s9vP!h!vC~}bH)XwO4-`R4o zx5CPpFvh-z|NZWCUmx$Uo$kDK-j`JKjk$W`IQZcCP|_pQ>`+{NbR2x}To-gLOTARb z(lk*v@XI^Lk*v;3Lu9^Tk{063X$7BQ=EJ~Jzp$LqGVwsDh3l3|>~ej86W=6YSr&g9 zEzgh1eAT=5BHJIKV27jRI=Z{nn$cZH3D0kIvR?=D`KwNejbs zC2O$a;=nTAOB<#$ZV>sDi!B_OP{eb8x`3xd`Uq$gqi!bYH<_=QT&fd}r769<3#uA! zY#6akqQzUZ$z5)Wxy>g*na(42K$w(7@}l^@X9``Z-wi1^KY5^{4$^9%WyK@|W1 literal 4989 zcmbVQ+iv4F5Y4mt*dHL!7piex+fsqH#-iA6+HHUqSY)^R5(ETe(~cIjWa#2c7Wwzi z3@M7SX(wuc7$j%roZ*=fP5Ir&zrML}e_y`6xcF|P$|@^zmW)SCRnbBhvS#IM&CN*2 zn0;lXs+%%rA*bvq+NjxtylC*u30F9H#+_@@x+d(&?8 zY2rdcL2aVpprb@FFr~mY)o@@i)s?JMwyJl3mc{C(*jAjt#ArZUXJXtAChZ`Jqpy)| zjJlM0wJs{f5r<Ok96Uj&5=pFv@ER7z0wy{bV}6bE2nK48=bWwG_LLT8TF+tJ;v0NWj?htu)%>BLS+ zRgVEOZC3da$&8kRJi^%SS|sX#E?0O2&*TbaetoWXC&@wTEn%1XGtN-zmiAfd=BR>f zAooACTB*D~Awy7j+D8j$l*i(oKn-NrAGK0i&1!yM6q*5ZJ|8f9-qvNK++-njrM$y} zT-k3-pcng<336};asU;lq z0vP$N1ZL6?wiCf@+*HzTyu%GVuAH1g#WaS~4P?Y<>q(N?4ls8O(ij2r+e8@>;!DE(gYoP`<1}mYR^n(pH zFe170#7_Fb1{)ZWobYzi4>sJu2<5(R?Bo!a(|V|&#&EiU(cYYa~*u?IfDm2L~fx(vf(B4NTGJc=K#glq+)sZ^R~3+Z(twOrz%5@Ja2I?ksfK zHX%ogS-$xUP)FzGW?V9|rNRWVmO$PH2doHV+y=b)s0BcxtG$Q!jt zk8-CtxIK3U3b|h{b|Rn8Ld#h`&q~nvZMpniR_ef|5o=k>RdqZ5d zx+$;ob>o;A*Tqa~QDu)x?ARLyyxz+GXyp-B#xcBqOruSa&Dlz3ImfpH?8XV3*Vk9z zK@+~z;=L~JrM}KLz*58S1lL!?-5zg9#=~qIm!?s+U|ed=wW_L54>IS71*QSBUXNRN zzhcNmR9XJ-XP|1`E^(2MhCdD9KgO$(lY4YGe1v|bs0XPRA2Mim%(ATqIY0zNE~b%l z8RGVT@TL}H1}_Mu0$Z(i@WV!1fWM15uY{ABF3btXGzWk@is_TZuqDEQUj^WL4nz1H zqV%st1NCUHerh|&J{kBcdlrKd&^wOSQsJh0Q(bl{z}u&<2@;>8!e;4B<$(j0N4!5r zwf#R-9=H|ITL}qB&)dhkC>2!NJZ(Mj(jr#=VkFR z>HIv#^QZUHUKINSRIEHmZj$A#F|36Pp9}xOn-yAN&nSSkP+Or2_hO1Qn^AbRa5BPj ztz-*MT$HTf$r4p9GX=Nk_Nc`cN+uMc{<9AlH5yMKPsS)&$o!|&YbNj15jWCxy<3J& z3*Q`!xcM+c7d?64rpWCc3Cau=u>-=SB$8Lv?>$pkN`qlP;rT=HM5XsG4k>>3Y+&*KmN*U!^!Ig0uXOLgZ`6|gFX>r zd1GtC@AVd;Z@)^97!wo^dhIrVD2%APhYec%Z{GNV*NuZ?buyE*zp`00kLTHBn#9?3 Qp3SB>^RUMk|Hb#czgkAr`~Uy| literal 4522 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 diff --git a/examples/runtime/shaders/essl/cs_assao_postprocess_importance_map_b.bin b/examples/runtime/shaders/essl/cs_assao_postprocess_importance_map_b.bin index 31cb4ffa0e7571451cce7491807e15c5b70335d0..acc6b228d1fec948fd55796073b092d55a81d875 100644 GIT binary patch literal 1286 zcmbVLO>dh(5T#KM6+QIOKQNa{y9q{s?U=~Qp-H4RQhQ2omW9>^TM~ZXdpXwAyoKeW;=hD_B;ZeYPz8@O&yGo^52ISiVetvW@l5 z(jT7R?=4HPT2_h(xnv?L`96tua1EgYFD&(mWser00?((m-6AY_9`ig!N8muI;?dBf zu&7q6q<}IKlEt^O%2iU_7@PfM1D=ZK>exM-PwfLl{^Y91)?5^qIf8o*^p)_ZNEa-m zQ006jiwqtMt`eDx8rD2rZ-8ekO@cctp;(b7YHD|p+hjR{POX`Lg=ITelUlNDBa*@- z9|?%Owvxw?F`g6JHG+5nM8OC-R{Bm%=?7Glbj2y1nx^>*2or*cq%41}Sx!5loBLlp6b3ikMQbs*2=?j8UN@g|Tn! zuH`BD24+(i~GT;jgEB(3{f+OPAFaRG71Ni$W)U?ThA%zUgDOG4ezG zx=hK8FTchy(Yxp#t?6F U5C{0b=egBNm+L?e_QAHTKV1HCfdBvi literal 5295 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 a)fn5?X-u`h)fg{pr!f^fW&9QEe)d0qS>;dw diff --git a/examples/runtime/shaders/essl/cs_assao_prepare_depths.bin b/examples/runtime/shaders/essl/cs_assao_prepare_depths.bin index 657e8fc93eb846860d9ffb44d174599c0fb53907..5aba7a8828df097269c5fd0be8d6b5e98cb6b964 100644 GIT binary patch literal 1214 zcmb`FO;5r=5QbOc!PI#256rREilq?I5KkJFGu{ko7FgO%w!5U=Vv8a1r#oA|s$c>M zlRZslo_A;Fed@iPlV#M%Sr$xaLgTb{NeDiSi!>OqiH>?IONNY`5c4p;PYDsUP?@%c z8d4FYe8z$t9^u}FN~YM#%rMh%fXj|$Ws;9o62p`YTd)%UXgu^gRt2uPlGx_Q@CgKQp(^mieVvO%^EMKa;X;N-^zCx(J@kUTUc6(Xq%D{w*Azo=*TPfsvhhE#(Jy4 ztyjxdzglC?-qR|ne84r;ZfP=mW3qldhg*{q}{mRwvx%wSf7bsPb z?_*I^Y>zFrOe8qYAUIA9XOBX>!4S{UA?+}q!u-K7zZF)8mP7&gw+Swzv>-l>rffCA zOp_Ko4yuUSgL*_M(C5I4sy)z3H4%jmNpbv`spLjI<_?1e^BHd)f<-lOtARJ2e4CiY zC^C`edzDLva2yJwhya}fZwk}pU8Z^CK=a0ddyX#ZSkrB& z)}R&D7eSHX2^6v8QlhG#WPzfRI0%FD8E_wD>aoR&oE@^>&mZmsv^}7DG+mrdT{C4> zTN#jPnWViWAun6=1lsmcA#n#ZT=57FaK$peo~zl3*P&h|Y^a~)v{5%{PpIpw3fUm{ zKVzB5v^XP!Re0V<1*ny$;+;XYFdUDX%UFhmvr;Ms%$%-gVD8%@D`h>|h&Y$6%Yt3u zcL>M}euID=>I>O|iv8hgcRsf`9);XWHKqD*NhOWepicRMHUy35oZNdUJ!ddwqa0$OM0Ls+ zq~pu{OiF(sC0$b0CR?4#cb6^|4_{xYh~&0Hvcc3}dyQxS3b1ynHnd=|HsjbflD7rW z@*4^CWE^ZGg5J2Uq}h0bYdNkCJK2h<4d)w3i&52+B{LnQEyFT#UTfcS^iUVEK&`xW z=Tc$}poSe*h&GKu_*1+0eBs7z8u+|19 zr20NFlX0-t1}3ChcrzIXYj0qJs{h=WNf+1Qbz4ET;d}#=y-`UkqYsX@wA8npbIxmR zV2&PYBvz~HB%YXqLy<4($a$>|%+W)6(`cizM8Ckx;1J2j8+{o>ayXcQCi7xrzKNtxd6MJVqSbq5cxNHoX1igR}1C7>@E z{Z?jO|B6y6vgoV)QpWHOni4%+9-l6cRgzQR_v>}v_i0&u&Yn6G@LO=;bd?}}f)ir& z(V)uo9ipwEPllq?vIuvWj+N34k3C*vyfGMn z-`fkA&R~v&Dv;G!5d5<5frMj0kjcEugf=^BJIJI3qIEA+))F2+5V>?lY25l?(+fah i@CPeuLBn*T&{l(J_%E7KXyG85Hxg~#pgrU1x%eL&mgQ*x diff --git a/examples/runtime/shaders/essl/cs_assao_prepare_depths_and_normals.bin b/examples/runtime/shaders/essl/cs_assao_prepare_depths_and_normals.bin index 6b9cd87dfb965d05b6d6f0109f50cd5855dc6c8c..55289e5e9597f41cd2f0baf532a731d3e29728c4 100644 GIT binary patch literal 7147 zcmcIoOK;mo5LR<4RP@wiFFaC?tdP6Q$HM5LXwWu5fgIBIQUnBT%eDYoGW4)57x_v3 zkNswLNv@=&VkI(>%B*&FX1|$l9;;tI{Qh0fKCgP;u8O;IUfwQV{m|>-AD-_Q#pU>J zdGlemnqQ22-}LAop8tOA^{R3`TP?$Cc2QQvV)8UD9)q8Pd>A<2tarY7!Z-0Cm`u<5 z{nd1GHJjfC_u~r{)W-jb^~bZmqkK7;O|dB&2IrIMzlh^a$8=H#oJ&}EX(=zcp05F){MZSyuGW&a~5$R`Ygj(Ygrs>Irgc9mR6-a zRHg8#gqBvNI#i|fsf3nRWdfDg=VksJpHC6hvRb@fE$>##zkdE3vA&;8E`!^0G7Sg) zfBONR$yE@RRTWm_#p2JKavEM&#c$Q@ysX|$??Ebx`@6TJ$MrB+fgvK~n0^4!!X~N% zdRUv$$$CjRC`7D4lnL+b(mXihy&Jny?BdNQcC&D#tZI=%DBQ0)cul+(VKfqOT{Oy) z!5}zkX|6s3T5JERnw86-$ON6b%>@VrZ-UVMVjY|Y%kks5`gOd#xOsndwHPnq5r@P> z0+7P!&_cjVJQ$1~9VE3qnZ1C$E@Mgb0>+{aWT|`sW2gn&_7G(Shi4k*=slz$I-WMP zUC!nXZ#hCpFWTmaT2*<{s*;(r?oovU5nJgqPaILJO2@6LBy!e0s!)__RXTP=YgNP) z3ow<=xUQOq$HjGXiNdJ44?nGMV8M(WQ5k4Rjo;RBgAi8#QtKqQWRe%}|B$NN9c%A>&ja zSeZ_9bUr8uZ_)e9^F>&|-e4HiujrHX&1n7j@PrQeralN7;R)roG#YgrC0a&OcFD0f^3f zEP$G)1{=X#8&LEqs4?V;G5|GZQJQt=F`m)tiy{bnH9#_r2;$EUKy>?~0aQ)|6J$?; zYDWMKQPa!<%ys~BHXR&6t(pkpl>w^V2x7uG3P4P&N^E3(v^gBo@@Nezo;H;a63+C9 zXv(07v&go48HVl5C`cJjS_pyZ{dHSCvGDXjL#ZXo=G@ZgB#O}g_;iM(6gopja6)nd zWdISPq{P!UY2wtc1l*Sz@Bdv1V zlVib|S>#%b9(}9SvU&B%w@TLxUUfp%AkT`==CbXjk*FQ( zJpzGk9edCbn2w(bE_ZVD^L=L!n>j&VQ#QEnk?Y{fl;jJvNMCSe%IQa|p5V%qxX*h% z!Ij*Uc-0eJz8ig^t4!+d&4bL$2f40Y<(4g*x-#!}l~;T>(_`ydulOc?4gh`sxZz>I~zxUy`C(hUou7|^X~LgN@j^BqxQbu1E;Su2_wQHi_jrq+Zm zH*}6#6r+OCsz{V(Rz9+YnqZa(O84G$h%4jz?sa58qRSBsTqJ84=(Y?)%Pqu^F`|ug z(0Yw%x+BWYk)m-9`mhnz+oFO4iE}gu&{h<8_hb3-Wk@J_K#OHwGmE+z!9?HMhM6<7 zQ1dNJYHdc8>EciuGVJHP_6YSkBZ}#GgM>0S(W4QO`ASXCh*Isw>v2g)Ka0JLD^arv zv}!VsdIupvm)HUg85V6)pBf2^N@k4XN|bh^we}Bn6(hP`B~-%f#yPAjsl}KBaFzIs MD?jx=_4~d50mZ{jwg3PC literal 10346 zcmcIqYj4}Q67A>QKSAJrk++W5mYn+viiQA~tP$@WoLA$Rw4~qQGvx%XRWV7a|EQP+>Vn*Xiu?#goYyVB_ri=+Hzv|p4CVaW4|BW)6M?NU z@x7OwVT~ycOGqDfp2}Ppa9DflJ29ZAUMuO(^2(0!sF+mmB{nn?gPQVz*bp?7dc=cL^b6Dq2pq{g>t-ul8Tgd(#uq?T{2bt`S_WdQMfxHdBDuSNbQjTq|lkE zGT^~tZuYa*h1?H-gx`cf8vDVzAc*5Klg4p}+p$~&7V4Tz8Q7jc5)3<^95RzZGO{~N z%-fl_ti3CXI6xk6ow=l0r><$VBrJ~vnQt_39@{*Ihm}p%<^fi zD}iOegwQnhgY8UULaOVDY3v8vnZSfp2i`RHgY8aWf~vP0(`e%c+}|~!GO#^?Y1~Cg zA|ne&M!e{EtaIk=OkmdDl}H>dn@QX-3x_lxiX-!OCNOL7;>~8)c`=t0_%i-F(|2b$ zH5?x-HwP~CN~dmw58I-$(K*Y$egf1+|DwqM*yx1t$F6=drgOlccaF{TsZKk&q4mqw z!CI{e%CTR@NxHaA&h+(o!*Ddji%GJ&FD$b^puI^bjofU}j+v4V3QtFn-GF~J_ zGB3Z3{@n&$#-!%t%VfStbrGJbGM?&1b$gyKiwOYJ*td~>+F1yO!P%gsm7nDGy{P-VwWt!U5c(na`5I! z`Y_9MQq0!+mu0HnC^z4igVp_DWl5T{Z>Q5u+52OAH*N|O@b@ZE&0c~yR1L%G>*KGd zC*ny-P6bpALWR4wy(G{|MF0QeE!)wJXV?*Kb&2>BTG@217)x+o?z5^h`6!nm@eubz#&EDoUBC(sY~NwS zQxPV=+QQt|B}{I&g}JXwn4{7%gZnmwZNzmdF_Vx*fx@KX=Mb|y93C0(YN6Ly%BmIY z0b+p6m=t-5)T<{EA8e+$yc^-Zg&ODvuAIz>* zkfdpl>ax7JO|pQ{G16Dl*__rq@zS*?R985ioaA{irPSmuD@>_??U|*Pi-j&epu+zC z31af7VKC{HgJgo?AUx_12md_kk!HP3jA@&INlmsbWU_^>hZx?u0atWN{ZUtw+uyFQ zOI;xVyb;Rb2uA?x6)ypCix$I(e5W+GJMen+B2;)S-lPg&go;-AhF8&xP{AvYO0uuY z3orfffXTUFbEB`;!@&ywDB>LoK-^Fm?NY!W0yY%FT?$c$LR2eAzF~oXF29T~@x$c> z4Lp^PE)m2vj>$5N*K+B>saJX+6S53eNi8EiIFm{bUf@~lp=`#V#q@`K+MUhb>cb4s zW^FS1usI_&B^&W_l!sn!3n$*=U(iiVx|eq~;|qET#!V+N-$R=3mkDgMI*F6Wxff(? z7AawbkI{?zco@23RXh2DlyK6gM0GOfbJ}Ctmy9|FBmBus8oYpQgKL0oa5{Jmq$7%) zBcPq7o1hKj*mxaTOrCwO(I%k%q?>>%lhuR=VeJkuT?1l{T4uiC0qr8)1Z^0H2@hPO z;V2rIXCc6!+;Q7n6^ zUR9+d%!WOn3L^cf8HhUXXr(J_FL z>*-UY#6IAcV-Q5gV7J1jG9214)$<^T4Tfj=APk`K8D!O&nYR1fQ+)`{OxFYg=v?6C z^NfjR0^b7xbOe}p-cp|G0cR2g%1yLDItonuvnY6;n-l`+C_u@3#>qq^?+l0&KUrs~!Eg|IdDqXrxH zNawZ3*5u|?^(8&Fdaa{m3R`1yYOvvK<$N=Hh4Ia6F`_Tow5t`##!l5>!};I&=HbIP zuf?mxm-N``d28HXvevt?cjqjzotOi<9O~qMIt6CV>FMnVBKU2pKJxkr*m8XHu}A!@ f_g7%kene}7PBUV6_?KbB?iO~`jr|ReEwBC$FE>vX diff --git a/examples/runtime/shaders/essl/cs_assao_prepare_depths_and_normals_half.bin b/examples/runtime/shaders/essl/cs_assao_prepare_depths_and_normals_half.bin index b32b9b71bdeecd36245de2a7510437d7e1fd57e5..af03771c4822dd1019c9517c786f508b3e4dc326 100644 GIT binary patch literal 4330 zcmcInU2oeq6!rQvco;BXe}IotYP%w-PXv1yT5K&)pby#hG8BU1$c_Nn3M@IXJ@g;# zNA6rwHt9r4ZLAR-SrISq=eg(7Z?E3}Flet=gYVbrUAD>=^{bx;1AK7(Sf@AnU2}U? ztyj~0@ZEquxc>cVFetNawQiiUnr3BM7rQ*&uwPg_V%D4OlQ%oO;Vvtdm&4(DS9YRXnVUCa;#|mfaTf+dEb) zvUx7vu{v$C)jV&!%Y!v7P-ly~GG8eXE5t6#FlH=^b1m~OmC#~T22eS_&f-&|St4Iq zS$|qLckAZQU;jcD@2ld5EwWxQWOPA87bt=6i%u>O9l%P;M`!u_kYVXmm5WCdoi*~cH zq*~P?hLH2TYWA8CBOGrckUDP?1+L3341oO42+i1^l~vZTG~^ys8Kh0)!-XJ3uJVq2i2&1Dm1UzupoouW~_V$E)0egMMBqi65<(mZ86Pcg9 zfH8EL_sAZq>?7e3nWJZiifCn8!?vkb7H(CAe7Z-8CEBWr1Eb2f*E>|fAwnzNw1?uhLl!DjSkvfVuFz+-Rrj)1N%2p3XoOt=>$(vu>VVZwbc z6kxrP7KYURk>kPLLf_$r5xGSIFOEG=7Jz)@H74)-klDKHZ+;9)+7;dkQnu z2uA?X_Gs{YEj|jbSGk{1@{ZWJPb!I@HO*Y1~S&d*jrPW=>s-&(~t5&HGdnMIc ztv;B&ZP7fRs9hhm=uq^v@Q%tiKB0b^WJ00(j&S!hv7S$%8y^UsKJieGctFt_@v~f3 z2q3@vA*Z5->HsBTcJDG$8WE4vhI$G}5Ayl5nh*W+$|w z3$!RWMroDuv1mYN2lC?}Dz&HxNt7m^a=8ta1}37kXZJa&RA* zRY51<^rQShMvETugC5qR@e@&%A1)60K|_-$TKBQ2P_@KL>i~7P*6N>-$}ht&!{OjR D4^Vtd literal 9318 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 diff --git a/examples/runtime/shaders/essl/cs_assao_prepare_depths_half.bin b/examples/runtime/shaders/essl/cs_assao_prepare_depths_half.bin index bf160d4d3331216e501cafbdeb6bcdfd8313af99..f8c12f2bbc6b40e6e10686618287a6de3459c68f 100644 GIT binary patch literal 811 zcmb_Z%TB{E5HvlZAWrs|i z=MDy4C_aUZa_M@`y8}3U1}+uC6|5*;QYzg<#7{zvsTj%yHfll-2kol%p~QMZw+R$s z%kD0cXQokGYc{$D4Dn4DOX3ajH({^eP;F8VNrrm9p@ufb6dGxjTOaTZ+HcP1?$0-B zS8xSi7ByUgW)%~UOixlwU^Q+;dT_C^#4C3^9|EskVL0oHhxT}uf44`?;Jf|GSvd~* E1oO!EH2?qr literal 4853 zcmb7IU2oeq6wR~uwqJ08y~wMV+LAGBGm4>0);2&36iKj`ARri&DV54LI^aug5tg2)nJ zGfgr?oaBi5lR88xamtB~sz1?7HI?NQ(sK79*Xgx>ECL1-;}I_%#Ka9kH;9IV?*rQy zWiGQ~qYD)fPC#jtAuw1(Lm18m&x3Y_3!U_=;KQ}3(IIc_GQ%4OhBpqvV{}o+nr=h2 z26a?l1Vx5>P{fY65>@@EN)(mEK^UBmfcqfVk1bXd9FX^Je19j>{5;ZS_2dxvp%GqKB_P#CiO4XC4ObXSyEI1VY z1VK^o2M7+RFJuoY_D5*K`P|~T7iI*0Ol)IAl>4tA=JW_A3R`31xEIf`#xx5ylD@on zy5_=wWgWuLhQJWsfU#$~bUyYPO7(Avlg4OJmwZ7Rg2r=B;hmCEaI$2h9AcnEb;%c` z4`f+7jyJucSMr1QStjWc^*DSx*d<|?IRzf@J2kUKM zLaOf*JLw1OZD2yGg}0M_u>J-nsQTx|P7ZMcw)-~JIF2_k`5TptGUnhIPfLBzIp@0G z2IlNjjl^oXPU49@IF$L4j$GH0ex5A{MvQSgOEyWWG>U{= zR5?BZ5xyQ`GP7^nn|ZEOcC(Rlb*pJ#cz8*41N$B=ID}0=-w@`N$}9RDXG-SrH}$1T z;2kvL+@J5B&UdcJe(d|jq8s}(b03oX!36vk0@$|_#4oT%jGpU8SO^k5mx(Blm)K#c z-$u}~JasJJ(1P;E*=(@Y@d8pAX92C0PG<;<^6HWZ(mZ*p~s zi^cCJ8y%+@%v*MY1cE}?O&em=Y!ELYkVz6Gswi&PG7AVDJtJ7eDSmsh!t}Ei!UJ~S zh1NN##TFM!Z^qDRE74oh$^W3r`5McyQl{0gyK0O#76b50cLKu^jFFH7p%T47@SA$v pfSA>mI&Uo(KZsZ`yFM&(IIHUi4_eyr{ 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 diff --git a/examples/runtime/shaders/essl/cs_atmo_multiscatter.bin b/examples/runtime/shaders/essl/cs_atmo_multiscatter.bin index 7abbd63e11f6cb37bf119a2b938e44f569da02d8..e9a47f3138e3d932956c6d6bcb0f3365d9b2fad1 100644 GIT binary patch literal 6842 zcmcIp-*2qO6?Xd&sZQ0WN|pLV-`MN*1{j7J;-r0Oq$E=zVqg+>{k!;a{jqE9T?q|^%}+mOYgE= zUzh7!TDJ5yx0iXC+$_A#x`$2K6!p5=c}{wHm){m5`|iGK%I#I&G{q)^FX57pb$RXG z<>lI6oIam=c&=;taUUEgp;qK&kxd~`KK$D%`@X6#^XkX-M{EZ*`|-Qg<8E;ww4}PM z>k33^3?kC59=$(*>#68)g$lxcsJ!v~Kaps$=hN#!t{Ikh40neNKkbQ%YFq3-j&Mlh zUT#lG4JhQ80+*X2|MwiBbCL>aug?#kRxi9WMqA_uE4^5F@4Ambg^?b3>!zyn2G)i2 zF%$@6`0Je)t%8Mj?uDzM7uhY1xOA9#s~wh(1|FwWitZaPf{IS!4iYmJr89ad1+q+m z`pgSfL6Ew~m?XB5wo#Bqk=3D2BHhb`;R-}?1X{lP+n+a$f0sY{FbKL*YAQ0rbg?Ag zh5K2GCkARbPGOKFhukq{`mv0koiy?rPbKqH9d|qM@_uZ<9oXUdLcJ#gr$gqc6Owlv09}zv^vtrMnry~1@A#^wRqJkN0 znmS_2xsAavFf)D==fL1MJBMuG9fB4tThdMEczFo`iP(fn`jC6b?|pp!_g-$}dM0?L zzW5w3|4%GE`^A>B_>2N<*Oi1fS=#P;9JdIJT_eT>I&hDPb)apa(^@gGu=LVZ*KEW_M{#5VV~tfhjKWaI zfa&5qFpI^EySo~0)YKjOxfvICb9T_Ib`Zs~xbJ5WUo&E{#4sethM;j|2|FrTg3y^+ z;*`*dJ*K-h>Cve<&4<-r>a(li;-d!n&K2JXV_O%mHUN}KX{-$uC(icQ#sL!up_-PRczPBGmyz? zX$!$=+7@#5c^1|vmZJ~$ zh^fg$j?o9SDavG!F_R)U-+4{(*xYZ5ztz|N-0jtp$sYM~tVgk9hkVXGa}5Ode$W&4 zenJ^xX@mp@7%xiL5#UWa0-H$8$ON#Nqkv|PIx=De1^BW7e<3UHYxZDALaa4g^H@p< zgo+mT95j=aW!{4w5j#r3dyt5=iY<+M!Z5K(keWDBI4&z4r?~V%2j_Z{dA=;EOiF1J zQ2V6X@!$n~!^ZGlgul>D>yRFT=~^GtlI7ZQL-ju32A~se_ zUhy)XMW`PacuO}#0A{fGZO z05AjW1QBDo-eZr-y_TIM7&AC{Bio{8cak%)!3~+wA^Zt|iFK5y#DvxYHL=YuO$Y86 Y+_``99^RK#;os!A;m49sr>7_X0dQl`q5uE@ literal 10384 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 diff --git a/examples/runtime/shaders/essl/cs_atmo_skyview.bin b/examples/runtime/shaders/essl/cs_atmo_skyview.bin index f1dc33af44343dca0d5a1e15a09266c3194f2210..64781ef83546e5019e8c17f95e4bc5b548420fe3 100644 GIT binary patch literal 5799 zcmbVQO>^VM5mj=t9Q%^wj@&?r;$rX(%SjG#mF=pel8S!-3X&i#${?{Op%p3D{;d4J zyw@|p3`lTy6P8LO20h)cyI=P-@VB3S`0~PhzPR}Mxvcti_wVY^*3Hw~-~Q&}0)O~? zp>O=7sqNbD^xD7LYE$=i`Afb0&)06_2pi4iyJ}mlccB$GTE5?Q&zlFk{FT;XHK>&1+rm zy+3>T(sNc0Co8X5Q46ox++JQjZ<@z$yY}AK_pzs84gtHJyNRI9uIs?f-jd+iJ8zMT zciygAziaDl_?0S5FFkx7 zI{DHUTxj4*=#^0(1BYDrPi^^q+uc>|kDK?%Hv#|n-D-bW+{)g`u43FZVP3d;eR0I^ zx~_$dB7rnbt@hquw$KTrg!rKJFe*J*4Ijphb-Sy_ zi!)k^WNs%>(9k&$ciX!9d2XYQZLH|G&kLX4FT873LFfmoWU=tx=nLE_oRB@XUDbPK z76;gS6x)M$b+Tm5k2`5q@6*!~( zZLpt_xvpgZf%=cwzxI5}Ys(pkLy zM=DR^JPg7_#c7)IJzT@R}JYxoen-ks!2B)S%UB^Zv0mr&X80 zJGawBP^sKeEO4>!EL@5MFIxl%2EQh7{fkkV)bWuj6R z0lwxWX%xniB1IVoky3G#rb(otEDSPShwNr0G+HJMRub;jo?{4Gy+F{pnvs_VqG6SJ z5;D!ck5)R}C@h#qo6&pFN2vlRLxd>IvnaxM7RM@P$e_zN%~#vd=;ajhwKdd+Sm&Lj zpt-RPaAD~ct3rRWI7@KqWI>i^d4vopmBd+|)Hgx4aQnIL5y+iWFyorje3)K#b7_PK zyOR;#8ha#y!?+(!pxI&HyTa-LoOCXveHFiTO zu9Eg;?u<-VV{Nmgaig3pW?i1546?DS>vPnv?l4CnB*)o#TFnSd1QI^CY4d~%HHWV2v({_mhbefE~vp7^BsVphYu7rR{ zGsPEM-?YYE&vV;YhZBV6PSEM8K?R|dHMMh|bq-}J9faa=3Q`Vi?zKfv@n6SBA71fO zsvssHlrbGTH(5~Bp1!=AOc-1^uN$hvqe7hOGW{+TAn4;lQ*tuKF=FUilI~o~Qt+600ysiJu+*xQaHzRlSV`Lko;1!unSx%=<>jK!by8j!S2JabGwLt{8^NXfE9r2++O=@TicE zyXN8uo)*_7e%xG!T;w1HTN1)ngsBc28vB%HIA5f~a0JBSpFVgP0G!^4l>SEA(lAFa z09NU`&?sI-Jk0e+sWeZ6B8$T)$b%?}i!d)Rqnw<^8D?wEL5dOTVa!q;P?!K;np6EL>0($1I9OaJW0;peK@w5>6EdoP>3)+ z+4Y&dQK`@#FHUor=yKk*NGKT|6HA>#(A~uK|ERI4DWMHQIjJ_z{HA9z%1j?6bkC$D z%m;XeK%hw(lpFn$Ley)ua~BxlvGX;*9yI z8$@}4c@a;$?l5DyHR*rT-pBBbA+azP literal 10215 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 NfvEA+M^KXX=HH4}H=c{?sPgYUGd9=+ zBXxy@cXlpk&dlt7x%qb1sn(m$hlf}fi~N_~q=}i|y?)i{;D`0DJos*sTK2w_{Y-V1 z6t(!Q6#v-fSwq=>+v%iwlRp$znoo5augo@y*WyxyebJC?jwD-1JX@G--0ePOW|l7( z;xU=};t=b&?GSid$&A&H1m~kiZ~KC1NEb zMC6S%Pvfs?KGErQ_6QmY+Vz#Y-q>TdC96rEr!ew-7?G{J7N0ML3Wi52O4TAW6V^wv zviFW^AmlbyO6@#u$m7tjt)KTsNxDk*n-d& zTlA<+lqKE3w#BF2M#@1Xhbrg`=}IraSA)A*n(IQugW(9in(ggw;NehEL)lr4h@beyJ93qyK$EQR0TAZrRkYoM>OL_@X0)`#3&rz% zWI_j9sv&YJRrzJABJ6twy+{43Co4=IIC_!amYVnAN&*6I3}U)b(JC+5>m712&9lN} z4|qmNgI3+&{J`B5`7*Iu-nc%BBBMUP)fT1aP(Rt_xHKX+?)7K!bZ64UnrXZuPFms_O+57K4 zRnzepLaShqAXRj>6OyO;4#j^Qsv97 zCr?2*RKKWPmsOss>BZG$5H8fG!A>uIrs9VV5v_Qj95$pgOFC11(pismZb|0{r1KuB zuSiu;Y~!%B*6v%@vLV5Ktb+Z}*gPYa*-4g}CoFBYIkC-8vdvp;HETsCDE?`ft0*nW zo(5CiHOy=#EzFq78tP^`Fq9bQ%xFz@GdfL8!g8*Xa{rG!OYXC$!ee2<)tFsZ!PGwZ z_F*<0{4y|!QRZPX7&*& zGOu*~@)*X2ZWRkARewO#5xn0B-Oy1m-EEB6PQHR*Nu7U%k_BO6;RnYp1`!< zpd`r1!I7O7`i^tXdYuW(+@}(W(XyGuFXrG7=W95!US|R`_bI(;^qA#|bl_F6i}cey zx`xG|I^6h|-s`y8;bvP{4i=+y_aj6dtZ(z|=YvHM|KM6DW1JgCx^pkdRyua-2G{pT zH*2=8P{zIr!g#w0@Ac#Sz;@st=<_n%?JGm97?pT^6krEfm|0&UKLJRa7NrxZR9ZR+T)# zs$vtyv+Z)(z_-g!N3@ zKfj=7vu5QD3p}r>$+UfoELjX1C~7Jj>WiMt!HDs;(>tdHNqlZg9D+(r!@@n@?`ucvjGquS=teE$AZn~|9*lWB|FvSXiOM2ab1^tH zt(6pz`i{h?&p%h*al<;Nj1EC}VW_^oB`M}hh2O3`{6!~;$}&usI;eJTb0jbBfDYr| z5l=^?x6nKH4vTDJfPLET;q9 zroQY^qhSJtxjML5P_QSseZV`Uo8;=^nyQ<|XSBNOv64H6OnRazA1DswJl`mD07lwa zjbO`yxaLTj7=@??My;eRWn?e-O|o^srpts`&1ZEkC8$w5XQ8ke*e?;HwNoBiAWBL$ zm7`}_6M!aj{_8^g|4d8CF)mefMP4@!*|U)c6!7x( zLpZ&89IFSKhtl;e`kALZDs`5|&&rOO8_Ymk6(!+X``;?GsPxyKx;KEFg^{PcI9rBs zP(&{}pu6#lv1+Y6AFRA!Wje$kLjV$uK1mp*9z~44?f3?gTg7kQIu72)*+UqAm+qj3 zMw#!vMY9bUsH`x4xD?RS_}4e;*I$JlR~A-o=0nqnLKBIuxN`6TlX&9j@f%Wxj`TIk z$EB=5+L#2`8pw^qV$iw^x`3GTNVheU){Ld;7+Rd?^&}0cyLQ(&_G!TB{h`b-6gV<`EXgE)`}BBL?g)h)IO;NUy!j3Ky+#HA diff --git a/examples/runtime/shaders/essl/cs_drawindirect.bin b/examples/runtime/shaders/essl/cs_drawindirect.bin index 568f54854e3246387d22e5b9069111da84a9a874..f02326d40112539103d0c0d823fa5abf0b3e9c98 100755 GIT binary patch literal 2340 zcmb7FO>f#j5T!X)w8#E{y;QP+5U;()UeO+!Mrw0vrM9OivJ4nx$=H%V5}?X2?VstJ zT?2OGkaUxfWq0Pid9yRSpMQLP)2qi>?`;(<^6>t9n1}1)>{YLaUyOIN)p8TW=_1af zdHE?{U4}(;-2U^r*Gs}}R+UDQ&BG)p;$0MM*he-IBi2~jVu`m_cC=!$IGy(UHN=c~ z(iJxB5i81ta4eJE=W!WjX|iRrYPpPZcob!r&ZA59^;=cyN&k1BVcbP?@z~_%cG`bn z0hgkS4S}6t)6z9bi>j)*ng%tIE$l8L>qwMG;i5~`Ral1CX^W>NN$($MBxtHMUS|1P zOK%?Iw7u1JlyJYx;sslWacY=#4&$^$t~{IrX2vQBz9iW!Os>;AoN*av>GjokV@_4R zm94{T+a~*X+cXh2Ox7SV0$2|iKFyKBZ~1J@mXi-BBY^J(3d&?d#v80IK~kJR6Ml0; z)?Dx$F)+dguBJBJGazTo(BWIe6S(#iVPXCOb2(+E5~$0HN^6;9Arj*gt(rp$tlujw zn!ah~!mOojhae1cA24fdTT%^22uJwR@`Pu3mcwngPCyfi^fVYRx)~(}*2O3lqvKg> z2yfy$9(R5F2|7uU7dWcG?+8XxuI5?My~`~s1?4R5$4a;*_THV_&IH?grJS8J&Kn@Q zE>!?3^8@A{(@xDjesnk7VA;O~C^ZoZ!NRpZNL#R205J(>- zb{L984a8^V52ZdD0T|l~L{sX8ZBCQcpn~eVm#tkwY9uqLn z(lSn~NUuDo8>o3v(M_)d2~H5cqWkPX8?Bqe8%MPESypRCe@=&6^Iz< S7Q)qk&053WsnkF8`@O%Yx@e#P literal 5688 zcmb7IOK;mo5cXNU_q;$6fRtrf6zLSG8Wc_3ralBU9Jd$4AXXIRu;Rnu!{uA4F!-gt5z%9;2!c#5MbdC_3Y30EBObX!+nyZU0+)!%Uqv}>^E8tk}E1*QtC z$5hsu?YhI3h=l8r2-mLS>|=<3FvNE_q#G7sSa2{b=!BWj1}O;oR|PjoUL&7YQ?jaH zqKOMW1!yF9 zs7skwk3|(bh~r=wMugxT`mS(igKvXwh7U!0WCk0qLiKlfLzgjc7%*=bO#A49j)rba z)qrZMuYv-@EhuD1r36(!#x;nF;s6ZHM}qpGES@{8(Ah!j-Q@l*1lv8Rhf{BRI#p9r zwUYsuHd(%xB%)<&o{(+#8i_if0oHptz?G|;us(=k} z|09jFIInwTunJH6(15Hw7Ow}@!ti+1Do*35cIHKq3do!Omz@j4$DM&t$j<;hq{Oa>f|+@ zi;<>v)nr#k$_tnN{&}H*19|D~N2l#nkKc+|WFGJ4q-54>mfqHE4a^25p_&{AYi(de zGWUs^90zM{U_>&)tI2V&_69~M^SDuyU0jFOZ3SgRe*>evRf(11gTt1N`j&G}d94jh z(T5s|)Y6?q6LoMf@--bPueE_G`cU3HSr%o+Z{SV%l*G?B@YXOJH2a3zcpay$gGJX6aZ{lUJ z$DQKf?YT8j$oyfs4)aB1TTb#tQi8_6mk;k{70(8#+!RgiRP`e8;WJ^54*A2oi3{Jv za#7^zM$DV#GA`kbzN%#&#h0>{SNVHh{L01Kw%y&sD?~4}=ZfbtspD;Irp2fRo7+!w z=Hdoe3u`BAJF&@)Cz@@lL!AMxwK{ zfhG7n>#V%siVI5422Vw@5SdJJ2ftkKHKV>-fEh;4LmGZei@8j%@+Zhp!_OC2mt*+I zC%?SOE`iHc9cPsaXu_7A@vD+W{28d(d^Ui^@8flnp~n`&3n$9t`nJGSV9$W41{~_a zNOZZh^f>A|E^ohJ6JfZ9I)59$+o#6~lEwOSEz24lVDm!&+le%8pCsywBn;9>I1qH| zxt2KGT~P`LWnDp_PBeqruQ&rd7@wZPrw3`e!CI}vxzJnV%xlcL5^p-o>MMr$kanj6 zyoO>jo_b3yYA6v;nE@Nk{?Eo-A#4Sk2_+VlAtPLjifU`ILLByNOBUfGd*UKBv4kZY zI3n7N1RUfF|EH~UW3ARhv_$ZQegY^NLc~t>gF6Y9dAS%cO=ADc$pe!7wW!(xxN{7SnP-BTGjCYH>K;)eSc#tqZHrLLT zbhjE_oKEh+LH1caw9fmiQ?$aBZ%6jgy6Ce86w3<2&jLrBobIiC=d9e}lsCaoe$9oS z7le)Ss{=o~6o>=;tSC1yR$3Q-Oe}!Y*eexjA3zUC<6@LcRDC%Ls WoJcz6v>L#<01EsU+UFbmck(}+xlCLD diff --git a/examples/runtime/shaders/essl/cs_drawindirect_count.bin b/examples/runtime/shaders/essl/cs_drawindirect_count.bin index b244c63b77b7f9a8b172b03cdde123c6f840713a..81cd553a11b041246c74bed39154cc82decf4f6d 100644 GIT binary patch literal 2526 zcmb7F!EW0)5cT#}Z;$-|UKWrX$0bF|65;mHv_P9v7uelX5D1Db2Lfyfu%*OFk>#d)r@F>QG-lgop(GF4?WSysx?0__t9H38Ht^Usc{MN2%-3&iV<*G!Lxyov%++I) zi_6*Yfn`D~9~%ODg3YFGNqSUm$K@JyM3IVoMEpp!De{FctIv6ppI1GeUP^ZVK%;#$ z@<`*Uo(=a?-Bw-YdSqqQpnQ*P_JnBy!nP`x^=55r?doRM-|}e(?l*P0VC%fBg0MR@ zBF#jCgU2kmUS(fa^;Nz)uWlf!rmU;;&y!s^GY4#JrRZ#3_Q{=Vq9T~AK@w!J9x;4| zV}sxG*@Zo)6iz_~-*-@O$WEAWSYv{uIDw{8cSCnv@EkKR!UnFPHQY0xW-RE!Cx*Ph_TsL=tHK++Bbp#hOTQp;q+ zele;%q6ViTMwX~0(nozqOh9~IB~XKP0+n!~*6}z?E8JuX2?-VPRHsTNaoBm2*sS+D z-vy@D!Qn(H3?V3-y%BwR(IFx>bcC4Fe8?v*33%gHT-A=c#nZDt!-wH;@Dny=pq>B# literal 5843 zcmb7I+iu%N5cRYA-sc610;DX<5=o~(RikL)HuXc$AaVO*7{rRA99Fy-yx5Wh|64z; zbJ<-|(o&8BBw6mvoH=`DcDdBM&wqY*V*dR1{mID>k8xQgMK1j5M8wr#nHI7ZW%S_i zD3q@FD$2NS%3Msxlk-r{#LM6@jy&?B!Il%wIN<5FuD*8l#jdNr;~Hq!V9zz!arFeI z3af`y)|&0Q!yZf8uHx)th<`A|cQ~XQ7GPL#Ff8bVna~C)2>MqAH%VS2pH@?{ zs$imt6FvoLqV}LYq8J!Zpr&dMv{KDv9f+)6|4|m%r{bw{2rQh8Xz3!H>Vc;RzB~9j zP>oTSGOr$rDs~XZ!7z*n!8!C@;m!sxgKma*MS5fg8?Hk2cX>mXF>e?!Zy0!ebU{Z$ zx20-8HPu%^f#DVuvZGRhs_)|(L`87`2A)TP`k*YHI;_yyLF?`0?luJ59jJ$o)9pu3 zJ(8-O48XL>^1UPxOwp8b`G=FN#z^=6o>{>b$MXCN>XCnO1S< zupn3Qs|e9c{47FpFbA>)75c+tciOiwJ_^$pc1&nvCQAKx9A?mi3Bnpo7$3#cGnl+! zmh|<-<1yzsB&#ciOu!YVg6H$1);6*-CG#%P(y#_5O-&5gl&V8_Dv|$hcEI| zybSiZQyko$TLXp6@0aT^UqrU)Bwr*YX#87w|5jG>)L(bP^=F9IJv6XxiU-(OB# z_$HQ%B2PDB-Yl1K2{-zxmU$Fk$y#3LZ+Y@77jN5kdk0sDUg)VSp30<-x3QTPqZ({( zKh2q^4}*JFa3;?2e>JtiC%H6tV?LY#KKFX*zbl$tp_?3dgU~DJ*j199PG6Mr>7y)V zR%!W!lNOOo!zy`>!?m~+Z-SBNOl@Eaz5zQk&p6{k&e`CxNERZKN$%k15i+T-7hr~w zbDxIq(_${u>--Ti)bJb0_0<@DNg%(x$*zFQbscAw3TVQXo$;%ZMf@44*?cyD#h3m% z$Y zCC-Ij8fRW()|L3NGp#LX(oT^ug#$-Kn~{LiqQd{Qb#AQHdWe{Wpm47Z%Hnw02ldNH0X#hEaDaW;iwOvm05Dokr~*6?f7Q25{n>H7SG)_=2U{h`p# zgd)2MV8R_DpgY2!1eb<;krw4_0AKAzIo9&30<>Jt#gu}mAQzZ-GQNPaaF~{LD-0jD3hxy=vX9n9pEaOZ zRuF!BIAZ5?Uk$g;${l*V2){Rih5 z$cL9?*v8%08{#}e`S)k>w^oh9hrHrM(lMvi0QLn?;J?s5FN0)BM~S$+gdIbNF)yq8 PN}$r1vj?MI1}FamT_b}$ diff --git a/examples/runtime/shaders/essl/cs_fsr_bilinear_16.bin b/examples/runtime/shaders/essl/cs_fsr_bilinear_16.bin index ccf3f6af32a72f7046be6d2bab8bdbdf434ce4a9..b8a94fece90bf43d5235713ab5956f3ccdc21630 100644 GIT binary patch literal 1778 zcmcIk+isgc5T&V9RkR;5k4u9oH{ay+B~34uBK0Au`cOp(+t^tZvld<)aMjQ1|8<6o z!8UE2hpvzi!5xy~XnDA)Eqeame zFDAa#n`@9nd@kZ8Jj7fEA__CO=ZpIl@TI>9>?`<^$eQR#t>6V{?Jrkh5F@N9r$%jp zsSB0(@6H`k+Xy~`rOzX#sXtY~mEJAN{DI9w;mb=d*SF#;k0je|Vcr=jya8qz zCcLe8wy~^fI{d3IYwye2`j}~S3BEt~XdrX|fh}{}`m+PVIJoTBMuiWk6g;=@pbdvY z4)j{2x9qCi8}8hrJ&wIN-XcTh?O4`9wALhy6OnK|(gx45-EySOCS1;W5Y9fNGWMsE zEkf^_@;i<;c%uxCuZ&cu$T~Q+f{&wh5X+OhQ5ALnZF9`Hg{Ge8A+m|XHxd8%6pLg< z)8XO*+$3*r*0Z8sYC|_sTHndDhzC-H@FV4sQACY2+ef-Knb3yZJ{%x>?a1NLo?Q!( z#DsFBLx)0!acr3~G!Qx3O^ z(xa-d< GRh2)y7z$7T literal 61053 zcmd^odvn`Hw&(n<{SvsfRVh-YWRjq5`8vv$f&Syp0 z>lTyc*2U#~cvCFK*Dd~aHf$Ha6^qHu?P6B+cDs+yhA)bLZT&JC_o)^A@EYNn7PM@; zrlmA3i?C@KG#yCOLDX~*H0>A2>TG#^IlK{RS4vtE>#{{)XWb5|UYzyhM_+!F?XBOoOkmtBhO_1Md^u?$P7BG9;tU#}mF=Sa zV(VX9n#0Ta<(eE)xCXTh<%TF@x#0)P4L|xhalwvOTqmjp6;W$JK|&7-r6X5@RgWe& zU{o{?z`${*pg35}e^pXp;}%~1zWc-XXK?KYupS=v{KLLEB&#Y8AnEPZEMhXI(@8#O zeC-E8q6l!ZLJC&M3T|#LtI?zkL>GombdP6Bbi>vYol6x+1G0a0Ik}q5ZZc*_8lLnJ zK(;(OFN2zpaDCL}OL1i9NU&UM?r9SWwgA{}gA~s`$_1 zj2hU2oIr*6=yP+*Tll>eW?7^$A&gm2iof+R2N_H-ti^=iYsuNSn5;0Hv|f2EbNv>X zwOwqp0PW&Y!RKf58@WbTStQ$+h-ugcmSv4?5E}9vn@23mRwYYkIlurDS(Y`Xqhg+6 zIjCTXMM{)ZkxI3TT}3~eduod2PD0WJ<9}|oMgSl|GE(`1f(75KC#^HNHUOL7n1Bz~ zgLOt=#o3caafh2o*A_KOIg>Bs1Bi_w{v?x`2;wW%W+J}HxFzbUC?W$XzBY1^(uS@% z2<=FGq3Fl?LIf3jY4js(mG^j5#75@dAx~nKEVDFPO9e1rFeWqy>%k@i7?Er}F$e3x zCIc9etl`bUda&sLMkw3en1c|vMdwovCEMSg4KJ^M9G*-r z29fMU2cu_qfk;LlE>>r=^Kt6*bap;nfQ=6p9}b7hNzml>?0UEuUM;^b5fl5qgLl2N zgJbyrRqt$NCZWUjZ)RF_JskghJiNT{T_ltv9 z{RBE*Y7INmtb}G|x>flv!C=eJ=*&M6^Rw1}(}4%{ zO%5q3;n%a}WFZ1BJ6&Hop7$KQyc}L#zv`JBT6OsJ%>2Ew;*GIgYt@-`u3UaFai4Om zSam2UXZ)v%65Ps^B@N1%vMh)a762-Ef^V5}Kx1pB955wJYIBrE*H`E;r>kv!L5_sg zDx3GzQ1r^Q!^Ed{qD7`1<~_9&nN#hIgs&%y*co@m87^h6rYms8oh>a;3W!o9W*6M? zpFA08KxCo-wl51JD^=Qr+(02B6Mc|uz+{6QnbGf?;i_~FFnWo8AFW}ohNvI@d)N6$ z)qq0lfXI_d*3g2cM4QyKh8EN%+N8Qww4DD)YwP5S6aS9?IAUxHOD8L;nyWUcj;HRp zq<{@4ye4b~=406_>#=C=k3XeDKnOmn{We zlHAz7rNNCMPv1#pW^fE01Rn(80}DRT-~$04IB+W9Xcg&?a&|@&`+>zaBa^13kt?F>(NSY`p=49|@h2Ltz`Z zz+sd!K+yqXP|B76p?2)2H3m|Qs1tMBg zl!4YJOs-gP-T(qtVk~dwXQn6s=hv4 zzI3BM+r5nE%hqaJP03qNcl&!~Z|_Ojeb(FKJ_dCx4hTVNO$1

lpwD2?CIU69L$H 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 literal 34902 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 diff --git a/examples/runtime/shaders/essl/cs_fsr_easu_16.bin b/examples/runtime/shaders/essl/cs_fsr_easu_16.bin index 5ded47c8e650c529c305adb159d212a59beefe64..a36b771cb92159d9819a268e555eed10eaf5993b 100644 GIT binary patch literal 46875 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 KmVa&i;r{_?X!L*p diff --git a/examples/runtime/shaders/essl/cs_fsr_easu_32.bin b/examples/runtime/shaders/essl/cs_fsr_easu_32.bin index 6590ef1bbe71ed4ddf55b1ce689f026de19c0307..a20bc7cdc941b34b2ba64b6e494a0385c258b961 100644 GIT binary patch literal 46875 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

PfR|^~7n#jvF45(=>KCO=ITNu&R4@ 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 diff --git a/examples/runtime/shaders/essl/cs_fsr_rcas_16.bin b/examples/runtime/shaders/essl/cs_fsr_rcas_16.bin index fa5e5d2ea3a4b47263ebcfd4bcbb5fc139be0783..31555a6a8a315211b3cc2694e61740961057d3b6 100644 GIT binary patch literal 7781 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 J|9bSN{|5r>XnFtu diff --git a/examples/runtime/shaders/essl/cs_fsr_rcas_32.bin b/examples/runtime/shaders/essl/cs_fsr_rcas_32.bin index ac664e6350886387a3520be138a166e5a076a58a..39d7ba2e45e93e1f8b2abebb8ad910bcacbfbc81 100644 GIT binary patch literal 7781 zcmb7|-EZ4A6ve&nWytn740@E?IF(3!5$RsGu3LZsduWF}429vQPHN1t1IO;14Ex`A z&Lt^Jl>AYnMI=%8@bFT+KT$uu{q@^{`#l?cvl-t{R+GDjXI~En_=n$jSBv}2`rUN9 z-mIpBuLk^wU;O=GFrPdwH|u!5yq?U*53{G~cpLo?71?>zxb%oiY3s@puMDHv;_~cl zvzXm1S9j5;+3lzM=wWhqKcBAD>!{i3*;bae{|BbyUFbo!oP3UyWw2c{ePZbXOSQLU-~_)eO}H!Mt76hA|9Uodlun$ zGha^D(YPu#I-PFsRXnOglJ^%+!%Mks12Gki%d*04auR=-t#4-2`NyBP>(%6X9pBE! zzcFi9i_iGOF{ddQ*K+piW6)7ARqXl}6R9>XSP-ZnjjO-u%wa@`SB^lO_!LFH^9DiqW%s>nNn+C`x$6x7Z9tG<*%4^dgBy?wmL9{ACo!8U8-!^}?`l z#Uor8;%7}!SyVAoEmb4)vQx!*uWFh1sEQ({udQg>J`Mcz`K$o8hEE11w2Yg{jrNMv z6^m#+NaT;f7<>D+QWn!@wpjl-TR*&8z9EKUl`2yfna>VxjxhV7L~bRNl}mL)ki9 z@@}+DqcjCXFya!Hh~hM1a0pRUSKju85T&?>f`6j(LSAh}5TheRc`PK6 z`_cPp5JmmoL6pWlL|L^+Ej*_j3l6ZZ>;YFAk64u*L=_wfMB5UTlaO3e!fSE8)e;t> z{Sv5x)&(Zsy6{?Db+v?rsFi3!6ePedIMWp?fZYZInpj8NFJ3$%zS{U#4STODHL2l= zh{zTZbz=BZy`KmYf0&5SI1HwiMn4gCn(z@g>?0&1g7|8EI0!j8u&vaoyfB<7(N9Eh zOUS`o2E0+FC5JS%@qi{FhcpFvz&j|$HD+SFf&wsU>IixpA;45w+9)KfBPgF##>`~^ zFjZE9J!uLZ%4;^F(vaDRvgX+oI;@-xGzEetZE=Y?bzDNCNC%EVxP%Tus2L>%-tS47 z^<6OOfM5$Xx(lFYlyIpL3;+uep~I!cJouiAFj%*^M2ZJQ)Vh*Aj|e&<@>qx{_oMfd zh{)QzBO;A68Q305)gtwuAs@{jZJL~pve+~ zO>GRI$r1vI?Fw4Fu_+WZ7F28s1!c1|#%Mz}>q52#wkZ%S5@#M!fnXsUC`N^BhM+T# zrjDR9kETGdl>KzQBV$e-f0zyMN9WiMa4(1s0(j|C_Rh^<4=)6h0vx3e4&a4gnra3E zv_d{~2@?#KqR#{W-ss-hbt#+dnm^7q`E!bGc`a%Ndw88*rSg^gOUVcEfP9%sNZPRo3aLhNY{|#_ z(fdi{vvrf-&WJmVL*8e2$f`xIV0lr^t}ALqF|k1a}A f^6inxT%UF$Dr?Ny!K$lWSn^p3N522g&IbPjj>>H= literal 37144 zcmd^ITXWk+md?w*X#WJZwkicmluQzkC9jv+lAK6Ml@fa>dv`pkj0z+{k+DQ_cu6Q{ zX8yze41|`F4{vqTixLzFIG)QTwR%;wF0?{bTQ!e9&Pk{^AkQnHZD}OPXlX zBr1|71=3WLrX|v}K-!6@shj2eE?a47H;%L{$jzo1-E104=7d<1T9zah7MCq0wzQTl zb=VB+nnZ~BuVP+LrYn-i+LW&K zZ)SIoY$1fJP?MtEh%%8IUqo(v=~RgeI~sAVs0LJvx)l@>dQc=CyAoEt%vUff83!;p zZblpji`lP^R74!p)gN0w{dj|GKf!u**!B-Q>X5DKv;axh_tR1%13n#W=SHsmq>(rR ztgJ}E8d>4y-DOppBn8oRgI08}&5-D-SxK z8j$eusLT8=AFSg3Y<3r+<>{~)sd~FwtaEcP%I=oAQ!JP?`mgAQsG|RfZkWIn$g7UvmJt6>zAsDH0!GVQu9w)6exoZG1zcPUwJPy_xK@=BH zD#a~sAYEf73OQ3QR0oh4L;I6WrXonL)SHRh4aO~V*F_N<$Z6L^E^(UBRR={oa=R${ z<$Pg=ns#~gqnmZSC!-=UvV1SL$&CfeERWVg0W24k3Dv>lV1ofnNT!~sgU7)J1DKGE z;nl(8V8a1SP^P<42SwbN&xaf;7peo8u3IaKWh8Orievpio^!jw0A}vGKw@j@Na6#P zIK;Wlj@)iAfSJ3l-RWdBTinYCe0}rFB>%OCQN!!Kb@{^ke3ReVD?Hd1meR?|^q2nz zRO$SDG5fi662$L9=Si601%)2Gc0U{Dcfq#7^?l_>XTOoxNe>B)3BS-{3;i`(;TnHNabH}hS7ib#P8(kmu>vrMov zGo?}i3QSN$G2xqH;)psQ<)X`SF=(;{W}}gO=}%Tm6I?hLP4c_pHyg~pF_$26(iPMV z{=(E0Lkx0uKAIG8C)1_i-e=2C1{Vffe#vM4PMBZD|KtM?==&<9poHH|m-#{qxNNq3 z>15t>_U10TpI@|94sDupda6F}jd%m1i#N?_^WNr%Fn2h|qD_;7aw;EnoN%jfCOjw? z&Lm<^+yJO)6TTJBl*iV>nF=Q+wN;!-*9&r()zwgs*pawfW%8a0wO$o;l=w`iwWy$@ zyk|NsbBIn!c$F{8&UjGHuqkst*}xSKrnI0GFsGJST<{817iYz%Xsk$&{|q4}As0f*KZvj>&j!V68AH>l|r zUZ~5wL3QhRCI5-n)X9w`{)2p2W+KI{lMPqRO@mdZQx8&7U;|SV;cJ1^l@yq49f0zu zgG$E&%ilCG9}qNualw_Hu0QCCE8r9q1fE1bcw)el*a1&iZlaG}aAnBr54ti7IE4;@ zrv>oTfTu2as=-qW&IO#TqWhyNJClk1z!ICWNk442XqaDFZ3m-;`ITXIuuFhn>uzE! zQ=OK{CNH=$)kzft>e^@zeu|5zZvp7ocmsnU9XfrBA~vvrBPdA$#SIvRlEe;*Si(k# zpri#9H!>7Ts!?>I$%nfZn)}I=iYbx~U&O#T@X8K>?ND~MAd!g(X@?@T1&Pc=NIR6I zIwWnY$#f@Mv7HF7P?U*%n{`6GWDnxqW{(grS%7%AS)jzLiZXaj!c-Lt$r~V0C8qMG zzE%`vhTL94IJsiR;yHZqe{E1;YSe6GKT!=Vp!10N)ZrNh#;1jl-aP*<1cC;L5TV%fDeF?o2R= zZwFmGHqr=eJ80ywkzQciK`+auw7bqivt@lJz}1rPt~K2=>^(c9Ca99a7Rkn}MzUvI zB-ntEN;a@aHh49XJ>w$5EQC}ti$$_gtdZ;)gCxU=>+xbsrI#xI)mQY1@h;sRl8VNx z+p4^-@ZjfKZxP5K)cCdvFT;VXAqZUFl?-GELfBT_34toRAaH31f{K(k^M~tOTh)eY zW^eDBk)6(Q8}0qt{5eJr`>BxgU6VHhkPHX47gxU_6EzNA~fa*Hxkp+%cvZ$bES@4{yR+cm*OB!|(q)e48lqyxSsF=B)+)neMDWCS{9Vccx zzW0U%B|A~Tv^JxWgg_wx6t)V00yL(wfVKtZ5zv%wBDV5p0UGmLK--G*2x!VffmZG* zKx5JiXj_7Ig;v(ST>T|q%${iNld!cF_LHm~f`+vf^pmU|f`+vf^pmVzf+nxve(wZ@ z&P;nuer^65$Ew=4F=KHmS<^otttV303^1(}3`74@3i--9CPl z)K%bNxpxIWUk_T=*t+ML7^BC-FR4t>zgBCFu7&5`WX^cfXm*Z|*I0e{B}$3(B%={Z z33ZL^NPxF@0&lg5F$Dgf{~4Vce38M!@9cn2=+*e`mkOWINk*^nWD^=Y-1x0HJft$^7lv8LA!H` zxy#nrTK@jn@|viRu;t))M_8eix;R@7es`P|S_wv*>y*Frb&U!ndrh`u<Tnd6MhrFg6r!kG!I9#|(!M?oF#L&3lk1`KWc0_c3ihWGS3krje@9 z7@qGGT9cIMcZ1p%n`^(qfMH8>YPD2&CL?L^pko!b<%J9jF#S=|$+&gohjN%#Z z?zFJY=PZ-2sPegO3qHp>hjMkN^YFPNJ!(pg&vjcRpW9nUuFs9)_8Gx8t9!z1@p;%A zYzpbm{JlT<`(H${JA_MV z2#4$awBVC(C%5CUVhWj`1M(k?n0$X;&BU8UlPJ!o*&_+KCpkI&`t+njmkOf5Jz-g% z%RSr0Q7xUqJrv79=bQ$eL-&W+Ij04!$T?xPO3u+9Vg#;Jg(S7LOYyon>M^JkEiu>( zHRN7`mKaI_Kor4lnpP1uBtOj%(B!8%Q_fE#h@YNT68;uU&S#cI8hVc0WF&H4AvO6t z7xt3#Rc0DaFELAePjib&1jjAKyflLNX=x?lZ%=p2c3GsMr{|>6sF0FYrIJ&M87bpw zr`rUt>g2;2X&G!r`V3x1>hZc$%}XtWTwgO;l8iLdBa@NlOfVxwkWxk}(OIS{*FUE$ z($F(yr07)6NZ%i&zLI5-nT%7%pV=)Y3mmruGSavuD9JOqWxFiW(6eNubxKgBtr;n^ z9X})0XgHjamceGE&){XGo=y1~=`(~fvSunP8EK|}CL_(6U`C1{rHoXPz$2Jzh6b>7 zCD>o{MDEeDNJGz*k)l&MBYpFRGE%$64;r8EX>KuD;J77_k;W}SNuJ3q+hvi4o+Tr# zQ-UhhXQT|E&)(5$QnLloJh|WO(^kz*XFWUn?E88qPA$cO--r*T~Re8E81g(#Bc__lzrp zJ+Ec3X96++Ufo}$o98fY!4_hohsRswq5I(3PD^7pVap0x-y)(vZ?Pe%D9@s^zs&B= zrbGQ8SMR_u9+f5i4@{3>g&K-MuauOnW1Z-siUmD|V$n+@g#}yLs#p-pibb!56c%hy z3$kcMeweL{B8G7DSLZeZ?m&{}Mib&Nns_YaSF%uSSws_JF`9TRW(;6iL=$2$ns_Xx zNGTSr$=iidL~T?wY=V=CTjXM8AXfWv5^wiH%!h!)^5N~nE;VGgat zg{;_-Ah$(=t;%^}{cu4`BW!-EMCR*~LiAMxzo7LE>JGgFO4lu^NPLlkRNdJ1NomiF zn*#7qowTJ=b6Aj{_-j;f7ddj7u>2;d>hy9~G8Xtvgw-kQE?0E;RfR^beSoV___-ul zOG!<1N*GZ>O;l2Goh7A=GR01G`T$4av5k1nqg0Lpk4XOke!|UuqD&)?Qu)aWidtnm zD7|gj<_2xuzz#yVmITse#8iG+f9yo9M=xSi3p%{iKI{s75uWIEjHwOSA$q04HJ4is zH+5H4@AS7)#fXmm2d^iTzC~+gL3GL#6*CaU?nyt@vk+Cf8VD+D5($nJ(A`2*sc#^t z%=r+WN8c{WK2^T8+nm*6o{IS-0{~c9vFG;E7jwEiiJ`Uk+SAFAjYkfi9NwR|FT($yjdH zdIY*y)?XA{Kqq6mHEmaPYk4mNO}@I;R&~-XC0ymzJ2o7iLXPQCvRH|DbaXj9g{0Cv zqC4^Em~wauS;Rb6qfinVW@pe~3S&8GD#%5Va+Xw(iw@p1XP7o{_K+ z?Iz7i@=^H5RRZ!wC7+r5DEZvul6=hQiYMMT;uR99Ry=H=s<0ngp;057&&;!wc;|cY{(oBJd-d^;d{x}E#gahUHhL+)QC~tVFX`xGFPqK(0$aP4#f^EJQTKy2&3&% zhhm2s7RBiF&f7LEr{`T#1KXnPJNB(W_2V{l!lwbdInDhTUXq)$uXcs$*2KC)6sIr?OZ*lQ@s8 zTP%}K&_BvVn@85L_rKb$r>LgxQ-Oh-Swv^;86x8#CNisHiOj^y`|%>r-GEV~<$8&d z@FJn`^rT_-l02H*W?GS3gk!gXz42-L1@*+ltUrUj@(WO)XXcJs zzT1$e``y<(1LALb*grU=9=qXn*|xKm&fD5ai)!t}WyOvgo>S6J>`2;)SyCga?%7FJ z-KCSX=;f8TaEun$I_3`)7pt}HgeOtr;*C!{7}5g(7FYHBEUvtJ%!!2X5WvnpbWGXj zFc=j29uf%cBh_)25o}Cb1ZA{f*I!1kajg&>J$CQ*TkX!v(}bR6n)*yisvA^u?EKWa>Dz5%*>vGMfaE;)nj&?9@CnO#>dqncVZIRrPf_1i)=5L z&eJ0=h-}G=A}d#Ek+*g7bs{G$vh`-c%JzaQvUk?Cvc2Gm?8L^FzCCTF$1iN3F5f~u zJJmS!?(oMk80fDJp=Yai^&S7S%KAJNuYOeUtO7q%%?l412KxgqIfDZRL!{CnI9w1S zCjhGk3m_~u8Xgxogu3DI5I_^k)2y@J{rq%uDo??jy%#iMjq&>E94`lNubaslGZVZ_ z`g?sYk#lsBYrRG5<-V7ri8j9DFNbx0_FEMdFV2mPS9 zU=NF{*!d-=A$E}(>|v=DJHOpD#IA*ZJI$-)m+)26yB!R@Au440;gHZO)G46Znq5ZI zsu5a+b_F#17@>^Dn&Ra|6>73`Lh2ApSeFnB%SVu z+*z~V!~`ec3H9P_1?pvi4J-4_0mUx55GX6BUdydOy%bSU2sZQ00mbUR5U5eVCIofT z_tluvL8YHb=;L;Z9j^>%Kv!Xnn!uDckZ0vK#2oH3zd#$tI5puaZIFE=a2-9wI_{Id zKpSkU@3T!s3@fYiYn6vxdN2mt1Z_bW;h;9*zzJW0!MYMgILeLp>o7zYe#vBg)Kjd} zTCGZ5_&t;LL0*F)y6~$e>tnhGLv&fwcI2A7-J_K|EpK1bNsY#1j@d z$irUf@f!d_Aw)dUs#ZT+pWe?CI#;w#W>5Q6DpMHF2dfRO`qF)!2RX&^EJwzI0jQwcyXmX$3 z<^X!TUb#pZ_NCFqa?u-P%d1&7ypUHBM|0YXs;c~oejw>0Uk%2wD+YeLk;k{V-5#}M z2it5i)L={rv?-Zef@ncM_Gk}p{lh+5#2O<7@lCc|znM+rJ))Q8UHHAKR?|Oj7mhoH zQ zlRUBATJ0*^ZCCq6Ie?Y)oULuu#&2j<__T`G*tz}VPIkuq5!ks3?ax+{ove3Q4`+ny z)ELEi__qblNY|;clLN<#)hl&%gnLfQb?}>IRX%*YY{_nh!@aLvyqfH0H{M9T-EIj* z9I8e_8ns54s5yE6Qo%&8$-1<~(%1KH*L zKq#VC^ANjajxbzSl*0*OF6p4k)a%& z#=W1WM%(6*>K0vwzv_pTl4Ng<-Ebylf837xG>+zij5^3!`3h zblDu0FN}N5@nv&N7nC`#y8Ux+$D8cbi~GI6+5V+r9A0&YLB?T-acCLyt8N}-%tMU1 zWgJ~~M?uC>h;d{Y$5-8PkZ~Mh99zceXKWy}Pn=sv9U8Ouue^m->g+Ihb`(52zBsz#{w*PrXKS+%xV6)um5`2t~+Ug31~YROdd` zIpUZC(~ZIV4Yi2-g<4}|LZHPBwdhg>Tij5KE|uRRcPR5b`}D>v>O}QBYGK_cCh00E z#*-CH3YlOEJuGwsLB@+Dc7X)~!Y;Ke);Q7%q=k`cS!}ivOSb8CW7gnkbI3B(FhhX@ zp~Z?zN4sou>499DDN;aBs8j)R?tz@wgPfN@?q+?IUh>wVGI>*JXoMvaal0Zx^u0wkiNq5%R8C7k&}g6=)8+ks?|?st>T|3%90`b$NxKF8{Fba{ZvYU$xfp+8sj>T|3HjF_6t2 zEA^lOPcH`t-FSr_#olhk`+XYwbZ6Z?$(87EKu?tH^y+%Cy7%FMw~x|n!PNL#dv0*F zXbz5U@xSkHd}n-`^ZV%EO@G;~0j?~L=O}iP&dE!D+m#m`qDe>~G*9hI|BIgfeLf$4 zJ;BgX9&gWOU-Ae;IU%7v^|lk5A8iis+FKo1w8h=M_+T$(-X#k21AcSFF@-vojN-3G z>3gKC)X~dVbe-N1kR8Mi`+Xd!8=m$x1FjuOjW?&h8I}KslNGe#$e4Cn2KaYxN_P!r zi+JjV1zu9mspy>~iPQx(M9sR>{izw)PLVe@7+mUpw~q%N(l#~*4G#NWFNHY}r(ItT9Vmt}w!v``3JgnSpbJ+X2oIZVSlKHQ)Ac?ENNg9hmX*MNEkwQRd@M zzZuP`F=+-)o{Zv1c(L}g+l|^$V{Z`ccOxM1{r~ILY>~%r-A4epjX*<&7)ZE}kFP2A zcF>%Jro8f;AwuaKWOp}9+ylP>aP%^5M$V}RoPu7?na^~lfhj)xM>EL#3}uk?akPb9 zv_<$6w%|`#L3A)$<8;iI$dotpY?0kBF&jR@X5KxkZiHDa!FQtD4N0We;E%be7aoB)^oZN;jRAZx)~MDKgfAB>3AG1Y4dN>28^Jl Z-7?+ibp1q>hi5_AM2An56QKoF%=X#|Ma&i*{_+Z@EiIeRzO?6W%Yv!_axi1aXAAD)i z*~U?AQ=yX@hm#gwVEV-2BGvs*9ej#`GBF{IQ9D}|u$Sp0T#>|owOnO+3AHFnEvwla zM!;fn0pk!CEg}vZWwy#>-j74|FxxRW8-7*FNo#ZmgS;w4Cdb8>jYHDCRa+>8GL(^T z0vHORXOK*vQNRDDnNHrd-3Yxfd)$f#SWAQMs11hwpTGsVC7lwKPiUN#Z|GOVy zte+XIdOJ_Ja<-CmWCIAvJqzzwN%88Wev>ZE$C^)_5er)mQHY!Bk7*dO6Y7y12?>4y DbPKCW literal 1913 zcmb7FO>f&U49#tT_a_MKA`eEE*v2kFPc6FjFmyxZxJC*5!JZZi3>=XoKtf@nSiUU+++L?BdQzLk==4~p*qQf4Bc zsi}N;hMb!+S3rQ+pbsC>a3OyIFXt2;E`W~hg2Ev!h2v@|;=YO)Iu&UCtBMl^s;F^J zMa}lMijCCFK%QizwkYdi=F{0H%9{0tE(`UCaF%2}1T+0pYSgA;JNtaLI~S>On~H)j zQsax%&~`VZMJAbP)%Lf_387U0v}zk1xea+05|J9xhs72azY2?cunt;U3EgTL@zyncmiE&sE^7;nQG!G&&|vRXG9wQe-Rzsbcu zc5+WrJJMF_o201ljLNDjmDuP!b>jmi-3xwL^29900xMo|d5XAp)sTTxsQnM58u+tZ z{~kCo`TLmPiWvt`Q!Xns1E^oO>c4VZXK`q8n&irYGHEqKljL!L3KK87E)HeYh`MOdt!w1*wPWy{D F`2$0@aTNdn diff --git a/examples/runtime/shaders/essl/cs_gdr_downscale_hi_z.bin b/examples/runtime/shaders/essl/cs_gdr_downscale_hi_z.bin index ee7eef659b226402f3b22d82909e48a5edeb4782..18801ea8707e8cde52e6c7e06ec137fb61e7ac5b 100644 GIT binary patch literal 846 zcmbV~-%GyQTYaR1p_~bwb!ocl4#5QXKX)^j_YbX2Py`~dawufnG zA(z~J?!MplW$||79M-_Ot(es7s{B|ks1ih3SJsw$8&73(scVe319@5Uvzaq9~Rr z*Mx;QanHaOL#gF-?b{JL;%JP-e)4V$_kfVDv7NT{Z&8|DkTVvdMz59P*-u9@Ufb82 z{%&}Du4bmagKjn&Q|i|kwoNX|hlkFCz{kH}=nqkwUsDequF2mi2=D+=mh#Urx(RRu O3;QK@7Vh1>>pI^K?*xee literal 2353 zcmcIl-)q}25YFqo|6v^LMcz#2*k&)GPc7RD8!c(s%NRmUlte?3j4dZlO8@trHA)N2-`|k7ISw6q{_IA+z-n|(N-miI<3#}j?g}`%f&8IO4m75=hB<_ade*i0H zVxTKi`fv{!H$|p^0I@+IKA_=3{umw(DOy|rE!z==Ls|;Q)lei|6$!K|(EL{wdkR!h z;hc(!?Rgb*shNRnnv%+*tb-X1!%vje&l|Zc)E~h?lJyYG^!KT8lZx%^^4abjr6x@( z3O-6rj#4Ar-H7I?WTsKu9hDP8%K&KEG&ptxc@h$n3etro7M45-OFFO?T389-{%dd{ zl(BmD3+19U*vYhx*n#3FK_@~jFmb>}YJas}scu_v$-ZQIHPM^gz6Ushuvwl_V?>P+ z``*1*zZE89Do=IJiRB>{MiD_VnZ`c&WADN1Ryf!4g%$dEYt|T!bmNv)y3wd~qY*tO z7yH=C-Aipr8>!EdqQV0ztFBODuCtX}A1LTr@Xdrz&A2ac%S$fz5!bE?a^e(f{S&E9 z{As5DoH#N0y3cRL^ag77-q=ddxcn7Izfa1zNUy3ka>!V1D`hfWvI(CjV^6ZJE)2=y zXdb|wP&1(xXQ7WrFPmv4x6rh6DHh8V#ELC=bOAXvyu6xDWnmBX3!a+grFw*IM(Pn_57mo-#>u^wAQ|VDveFj%$1B+F6&6$Ntz`Yca!5j!?vI zs=)R{Fx5JnVT!vW3rW99eaGabT4N!DPkVVWEVuZ2i8&A^C6PSOZ znf)Kt$GRNK4Isqt%xjP%Z(tkpD&$UihaBhE83UTc-jiwyL;Qf%*4D=kb|Skrvhh8; j1h%<1MrXWlP`JcFHIV8A$D_I$eGuY>OXyDN2XF8f;iLZG diff --git a/examples/runtime/shaders/essl/cs_gdr_occlude_props.bin b/examples/runtime/shaders/essl/cs_gdr_occlude_props.bin index c90ff10824b0595a645acf20b3260f5333731265..22fd0cea1340f522b6fe9ae5826b8b8c3a8ea2cb 100644 GIT binary patch literal 3566 zcmbVOU2p0}5T#X~sIL0ZKd_JX4RP_>d^NeM+C*w2Rq9o5-y*a!#t>J=j*J})QT}_+ z>@KVg<~Auxz@FKeIWu!+cW=M^{#{3ZE;`?rA}o_6PM5b?x`>zGe$(mT51(!+p5tiq zInVyNfaF37Ka?U)pUUE|zrV!0$SnS0EsCi6GYpe*9cSrX^i({OALZ)#L#LAj+pH|C zBnyK?tYIuF_K6Ms9;=DA5V;M>jwCjV)9Y^cISPFy{J|K{+TAQp=fJMa*2UcS`Zmj> zV4kJPmd(n=BFbUBE`l_S?t&t?Pk)ud?n{^9BV9K257X=JE5i6~QFxE-qiE;zJlG(m zP)7nMlo;gPsO5~F*Jmyb_u9ju;`DCc*qg)`LUES|Gf z5T}-{n>5R^g!&HD)U$ZOtYsp8OR`yjvOj}S1vqzq=Tz*5QMIk3bezhzrKxHWVQ*wvXOQfpi;k}N2g7)zg{ zfm5BRCY-`SwLMjhwQ6Tn65}kZZnHd%^7X@biZvvBm|E?iC8FNf;36&ZU;$>2^_{-_ zvfpGPSBnW|22bxW(RSmvnMh#&BZ@Q;llMgVPhf@vcB3ntD(sz#F!#hQ`e-uv1J}sF zc^4gYoqk>B`>LzlqOvwL-d+Qfng(;uEZT*Df*94mR!=u-> z;+fe1Fe;?5YAhqC(;lI$g(MF;C3h%U3{TF+pfw?Umy)DNO|5{!q5XdqRF*}0yj?Op z!Qn@?-+P>`ZP#Bnif&C`L}7#&%Shyx#`H(cZ1_7uu5$O?T7L*H5c$|-2<#Xxnjxf; z4lt>#4Xn--9B?PppfJG>ht!o&L-&%`^$1EszH2$jw%@mRN;Jzrr`_Du-W+&LBFe5Z4ug?-oS9LPW|VM4IcWI4kV_B)~R9mENH= za`sL+2J+E35JixNswl~h;6g;DSANYh?{pczylnP0%+exG%g9Jy4|Ae;!aY5AJ}~$= zwvPbB)M6&ML@HlEXTmMd36I#@I5E+S8ZJFWd@wq2Cye3*H>oAJq|%bv!@W}>HvM8G z?0wCS&%#}c?;*{F@`5l|G|R_Rq;l{kv>iywM%5E|EBMf@vsI@$mP99*0@ZPL8{{Zp zY{NM)XStF~(n-0gt~%}cn9>z|3|_Mv9MbhYP%oL(c2v3)VD;$SZYH>#J?U_J;?Q(7 zO4iY#y)TC+Ic*0QBZJmh>OT2{i3E;tKLbB1`xAZ!H4|A88cd8B$|1Rc0mUQDTzxC6 zw@O-VnpQMTU$;_~@+5cUgrStwXZpv5y(shOk8EzW+{B1U=p5}(Fr3)Ltv6Zhj0Gt8 z_CVOT-x3l1>*&jBCr4Z|ZDpI{C`l zNEt#P8+q^ni{gt?9T;ZVrB^NjkgvW}cq4uYTf4@exvbJ{PhNk?A0WMUyPbalu_mK~ literal 6382 zcmb7I+iu%N5cRYA1ASbeKtRQ^B2#QpR56OgPSXGl8aQc?#4rd-S~)BzQsBj+6y!_$ zGd(kVAtkM3D?nuK&diy!XNSWjFW>+9!-@U(-;XCJKi$i`h_h4-&j&&lomrAarN}1> zPhEvkS9}w>EUP>f=l#L6FdB*PoqIX)*^4hWoM^^_XSZ=38rPxNb{%fH2F5kmaSgUy zeL<SEg{x7A+q_X_iZ?D4Z(R8M z=t4(Jx1nl54b=xh!EghL*zs0E)z`9ws3Z!2?{e&5!4*S2En9ZW1=sH*&hD>$Drx zRjUFUaDSD^xlGGFGB}0jbr?XUJZ;_{R0qT3Q45*KN$HKVED^|@PJ2T4+cK}D9n7Mn zkgaCHuHttQl9%{RgzR7&vI7PRgNoFlD10 zFd&gl`G9oX%=e@W4y2?eWfs}0RPJ4BtN8NqI~9}MPDnQB{a0Q`6aWP{D^(d?*hU1kaJ7?q;SH|icJcMfa&H^SR+fVf1I9O)^6Ot8P4~~O%7cfED$BiCr<9a;r+E8WKU%+HQ8%J4M z>O1ap&g(2-jy_aKtd^-H9_Sl~A|KL`^EwNdqYvdx<5`x^)d{=`?_;^V#;IY{sdfz? zWG$1%!iQ}YvNIW{_a6bZGr!2Qe|IL~{LVE`WSj<#?zGLbsZ5-?5%qSj(S~h;vi4ON zC5x}owVVYz+&K=X=f=Pxo?4vk;rcQ2ztHZDapUnDa3uS5}+vi^HA zNh*48zLJab>!_1NtE?)$qMQapyiJS=C%wBk@8Z=tnr3OT660z%lQ|ClMH!_Nc@>q> zoAjlc{HFGJ({^)@cx_weaVcHg-{o=| zPoh#5HVvO-4gbcjb8HoCoGz;J`osHp-BMU@=cGy!NOzf~v-r-eUU*4{C58ne!dhI2 zUxJ=!O|3A6H@()(nr6CCd(^ql;;EQNaq7`a5EEUP1;C5@)2I{Agm;&Ouaj&XLCSmN zE3vKFY$6`laS)D>wFX~&eSMQ6_#?%>dP!o@nz`d7VZ#D zgCU^T9)JV|a5BQ~*S$e+&~^IIZ2=f|TODv}`>owj7Nc%+eBO!iZM2i<5ZDEYa!3ckzi(m2Q z^wbvDB#9UAvI2HbpbAazrPl{_w1=){!(x0jK;iS33?0{}o55=ar@~w>pPFXaUlE!e z;pt#}C>Y$Ecn}9|W2PFquz)mrW=AcQnr_iaf-Y)-uzBJPckTHG+6EXXv6h4W&+x@B zy_+>NG%@NJ)$w-&o9D@{g>Nr{a`U{3r)^Z^2n7GX^z0%~JhW40FZrWRAfWg^A8ALx zCZLEGH-30x_khySPA;$1@+Fz~x`r)N>pF z(AtaysDgOW#a2BwWKE@bTu8kt~qFPSP$U93?3WK*NHnO<@k z&@+?j`3r3kyc8Ig5i5Ow$HqUfbRfW661YDlE4*l-h|$pWoUEztH97=moet^h?UWGNpT9kO$ky%(i6N1XZ#eU2hP?apw{HjL`7rpt@Ha&qN6G#!O?J`#!#9Hg{n7KodcS-2 zqhuRp;U@nj+usI0-7#WEu zSqz7UWDQHno+jj_IOJPb*&~sK!8T3e7qKpOyD*~#hdf9&;U8JJjW$6Z9&UMJ_&OBy z6j73QVD49o;hXSXr_0*3vi6ikdDvy{V~_{G7kR_hW4LjTwhX`+a^_x_B?>{GU*K6L z=j|*LV@BH3E;AJS(u|4PHVd9ep&0B9?t-1DPaA6G%(|%Uin^^#NkUn4$ln`+Fz+Cx zG1=*ds*JV#Seh)jON*o_3MW8mrvWQ%DMgMINwiC|2f^;Q3SiNk?J5FdIQ$b(3hIQ* z!-s$GrR~lr&4!O@v=t9QlvpE^lyKdbSCrWFX0@zMUPcQ}T}CN+0`+82?4R#WQ6+^K zi+$|>8mH?ZUM7!Jgn5)E%a4<1P09Nr@QTn_XyKo#VDi3-?iu#uwXlm(!<46JF$`V^ zr>N6<>a%D8YtXWvR~}d?CO0>NiV~%({YT;8%U5$i>T`}W*K?$tfGYsm;JNY^`u#@O z{Ko8rzdS;Kgsl;?zw$5atb;6z!pt&0V<_4Q>qJ<^&pM7UJknHHQPJT`OEgE^IOuSt zMh^&Y-mzx{p;ycD2|X4h4ZyR}HGNvl@k;#%-mZL#kuvx<@sHt@V1-+YP& zLWQu7h13u|y-w3u_>RPePx*a~#L$Zn9-!Ni)Y~ITY3s<060ePDj}~?6ho=at zRtfO2sAQ^C!Y(!3E6blE%so22LaYYh9hs-mB_kEfb?wkaCLt$6rD4q$^p^Nyn^Z z1dMbiIxv@ynxlu*g0Fjo;`6BN$tVKu!Q5UYTCI``aq2|V#FEci@E;El@Zd23^h4_7 z0MI2%Pw8Ku?vs=9T884iCxetr)IV_rv*>GjoIlnnAfZC>hNju5*z4f5M4 zKm3*cjdbq1v`wCo7iTPSQo!2Dy%0jKT8+NjHRh_hH>b<2U6lVV3L_C$PoJ;txSo#; nQo)?tr5qG7N`DCDy%T9JFD{w}HffSaNfB0~<#F&f91i{mSoq~< literal 4060 zcmeHKL2s)@5YCw%`WHs(1rqla1C^@soJvj9)`#{*Y1K<)A#9dB8q8X-*v^ac1N*N! zGs|Ky#D2Z>)JUf{-(Ox_e6S&vZ-Mv_;aLn+B*o*vN zVYzh3U@|MVeNPN}2O3fR;Yk zPcMP>b)?F?A%7$5Lbc#MWqK~B@q+<=UvSpMC{Cu+aNjzxD>Eg!$Jtf%Lw%q;kQO99>!F))w$Iz-i#;C4N1|`;;2hR<@!<^L_26iqnd!j1)B%(dcVCs6o1Ui$? zG})W^L^BQ^PH1gqmf+nWD{N{hEUTK|qWv+Ce$M4G&gaDz7f^V`nBTtJhZZ&c-=s{9 z>eZdxeMmhFL5p2SJ@)UOv0a*o+a}SgH+*-EuT0ZQDB>7eoJAXxT^y*Bxsy>I-d~V3 zN}}ay9?_ZhV;`b_fGKKLd{*4U^dnl|w4*I<_lBT_8i3f_VG5LpnqJdOs!u87^@V0&Uj3 zCMEFD|5F`ETgo=d6{7R`gAksyZc|gA z`=NDHzX&L|sR!r?Ai+)k>h{hqngjuMTK`x)CHN@_T>$4%yfY~Djy;d!pF!~v1ru_p zFc-kts{UW)Jr+BBrpiqNGG))N2293M&6}LUyun)MN~aQf;%EHQ#ojji5T35CD3^P$ zRr|@g^sZbwaK7r>#@gP39uVphd{|7{8?*b1`9m^mJ6So^VV)tNyKT*uG{I1ue lxFR&E-hQnKxV8Dmn(i5?i5je9nqj;3V~duMy2z__@ee8#A~*m5 diff --git a/examples/runtime/shaders/essl/cs_indirect.bin b/examples/runtime/shaders/essl/cs_indirect.bin index e485495c1676024113f977a47caa02aa894f3983..ae17d9ec4368886ba84e8e33f69316c76859d7c9 100644 GIT binary patch literal 552 zcmaJ+O;3YB5MArVtXF@)9KjF*wDm$fh!^kbi4d~DLN%UUrV3EjP@S46FEbuV!TJDlvH3HR82>?K$`*|zSCGilwz(hu-`s(8+o+uII! a=5Kxfp#L8&IM8q$2Yl>5?x|)&Dft3J4ye8W literal 4343 zcmb7H%WmT~6wTV*^b-hlBTbA{meej942ovZ$EHA$nd!zb2*svT6?zzYIL-{_Z~Gy= z50a84S{?v?&0AjO}=~o$2T|j@4s(vZoWIJs!q#7M5{okda=*Sq!HEj;BiYP zzW6LE)wES1R(HYoGPxID7Du%W$%`6iPB`L$r{B3o#x)W{*J$7x8`pT`8V_7UfvIGD z$dbmeJ@wcU5qVk)dGa;q2t%UDkjUeZeprlQ@nl%s3$vjuQV{g5gWI%dkWZ&6S#>bc z#DR!{3{iK`h$sfe6lkcr1D#a!q=`k|oPMjy{IPtgJpz-#lBO=?$}~dLi2TLpg)WSy zN{aeW*2+U155q7*g0qZ#;omR5EczMVmD$V;E?kWo4S7SAF>h!vZ)k*<=z@-xZb#LE z8md=8f#DexvZJL0Rex6vh>GF>4D^?R>YyrLdaTgdL+d)&tR>hspdNNt=iN|uN!4Bk zVA|%zD9M(Fop~hNHU^0*pyLW#aDpo=^Vf6LGl>S&O~Q`)Sxy&qo%W16A638xxc{1| zToug)8Jxn?JPaT!kBfH!)xmH+YOON0ZM>(l%midEc1xkp+oo!j?d+4RR=vZ5T*c2q zqL=tdNOG_TvI72lx6q!283{Kglra;f`kRLtU%&)mEhe;Q@eC~{PnadWK6yOm zLXTwi#TzEzi(A3tMcEh|S(%dkEiuxt1~%mtZ4esvIl7NhM&4w~PC38;iEPR%($Qgl zA!R&~5)Uae$zG+>*~Lpm&97gn6yckq>gBbSi;=c; zb!Vs}<%L6kyk96_A}`&3OxoV+@vVqO=JqfrC37CLbX#*3FdMXlx-$>fS-^;7&lBC5 z2kR_gM6$x`&OBIm0V9T$|nvRs$S-=!MmA6RuWtH;{yp_jPy*$FL;eOGM4Ik7=Wu1jC+Z-|)OpD{+ z05uvvROP>;L2&-dHI8JQ2955t<>gLg&fF07=S8CpI|n80TbX2sf09SFk4M}o4sOq# zfkK|1_a|BGwyxo{*rgR{{7d!xkko46(#k_pC3(G$05eNo%eL|AW*0~BfOx{t;`wdh ziWybU(s&PDj6zH&aKP5q(#2tVtdooukVd&Qf| z4=Z@i(Ji&-MPeFst=b*DZ*K)2t&nFa0(jOM51#v)^RK%6AYjm%e|U}z{Z|9NLmKB~ Omnal`f|g!3H~$01m7;q9 diff --git a/examples/runtime/shaders/essl/cs_init_instances.bin b/examples/runtime/shaders/essl/cs_init_instances.bin index 74e9daab8038719c387f665300fd7609007facc3..31f8982e8f0acf98a04136636d681e424571049a 100644 GIT binary patch literal 6246 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 literal 5217 zcmb7IS#RSu5YDsu+8;omFVe={)rF#H5)@6aZTF!EvfI7{hM?GVR)r2jN8;=v|GhKA zO9w4S0b-DxnQuOR9MYt3KK}mAng09p+q1Lp9(mnlRmq~jXS{KCd6l-T-t1k`N>Yz~ zWi@ZRx@5sy|6P(^uovf%Z$k2-#=r?jT=4XaYouHwHg=6huCa2BC$90xHDs77Y4&;A zDz=9nTOyJiRxCMql5>P1(QHWMijaO-jA8L?SlkQKp&e3S^eKb8tZb2w(Uhz*m}ufa zL_vzEJ!nD{17iwQRPBLQszutytY{Cv)>Uy^JvAo=c^+Nqpj1j z*;fsB5y! zBq%T(Kp{I?N>KGT-h!wo4!}Tv#i$PI>Z!*Hon5rv`Rls`Y->;tyTPy<$}Xwe%K%Kf zqMRhz(6BX6B5Z4gL=|AT!WNw23d{U@u5u>Ph`LH>s1I`5sLQki>f)#ZHo*OT&I?|) zM`W-HPxDZKLU~-gBd8XJ%TXJi^G)mCS5?j+bGcnHdET~l$8~3y<_+&17Uar)W(j(+ zpIAZ;`argzLVbk7o%SuX7hy)sjtONfh*JG6!;Ft$g0LDB+KYIG8dFSINP2qmc+7<^ z$?CB;f`G@)nHVptR@ulZDCzGKC5_NPr#ztzLc=~s_esjgolR+!0}PNzr#vAY9p*<; z#xp7LkW!QERVtlbVyUS4`jyI1ZYv}i@0(|7BC{|^F(%* z!CDI#k+kr#vkcZ=zzC(kZe(YS>(aPwL51OX0i)fhB$N>wM_795TlP8SwH7c%&lM7> zr7DR!a^qm+DIF=VwSXylE^nFbs=5$2@Gg1G_|q-i8ZMk}YWTztJU14)Y>SY|U{*f< z3s95seO>)G83gCQZR1GBYLMtwTTyL!Zp{r*e;hUHupuaE-z90j|D4|PT|D7Vad3M! z1`4@<*d3B`yRi*t$Kq`moC|-by_rcAz(mZLhFFZN0D;9Js)*E`B4t=2^4_&SRBrS&?R?i*GFPr30%C9zU?lOXh}f zuLK6JE}mfh7JdNuo(1si%69IY1G~IpKHUGEMj%EVK1@by;QF2SCOr4okWw5e=)Gb- zOoJX3*ICfLjDz1Hl#fvHPUZ+q4n#NqI2E~dR75al6?W_$ zi{SH|6h@WtAJaMg<$)anFJPFAKOH9m!E`)Cf6I8J$0xhNq?njYmWjzEnwU&3vnQd{ zOrF88$uSr<_=91MjkVks`wIs?V9H|OygzI{r{x28ZQIC)pAmeJ_|*Zy(tr>GLdfvq Goc#}KhsS>a diff --git a/examples/runtime/shaders/essl/cs_terrain_lod.bin b/examples/runtime/shaders/essl/cs_terrain_lod.bin index c55cfcffbc803e6880d0a693a3706699375c4261..75f785570e447ac43db807ed6186da161cf440cf 100644 GIT binary patch literal 10117 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 Cf47zZ diff --git a/examples/runtime/shaders/essl/cs_terrain_update_draw.bin b/examples/runtime/shaders/essl/cs_terrain_update_draw.bin index ef7ce7f0c8f6ae238efa3683bc22979a3fb578d2..688e3cd1907a35538acf5d2080c448d92680181e 100644 GIT binary patch literal 641 zcmZ`#yH3L}6g8PpSowfE+9;IfQ3jd{Q5JS!sv^rxlgd(Jqr|S-qW(MAX^Mb`E6c<6 z@p(PJzFd)hJaTFIhiF9IdLAKoaITl@a?7P!$)?E7Q?s6nw(u?p!Gn_`suDYG4Xt!8 zD&ER{!M8AjFn}MM-PvaEHVmYi`hL%_bTVp<4@m&6Staq9!P1sx(SR_zmie=`$`sAK z+Z}KJ(+33BMJ^)L z|MfD|C;r}Oxq@0qMOmN71>$jnZO{mAP}tCK)-W4w8G~CuVV9my!qFdR;|zaVXNFQo zlg^&bq-3$<}~ZAs{%PEa&KAD03}cDEP95M-N9Rp?>pk$88p|Go2| z9+qf%6(9!5nfd19$00>NzW?*Po96HE{msn}FFG%xECp}50A0)uaTb=4?~Y1ZLFm92 z$aPueDJmWc$XIRq!iaP}y~8x8T4gmlAv3iC(9{7zUCS`h`{UlUwKX-RxqP1$OKnI;W* z98?pv2Mvf)pwEFdRePY7Y7&+{B<1P%JWHOk*FrH^u$c4IAz0Q8w{CdO?90p)Mwy3c zam)&>2uD#EMFi*^cn&zL+1FV&!($dt%wWScs9v8pR+;d|hVaIQdx6(+mm>@4W>+3B)vX)I_6x( zvO4fa2sm&HGM;8-ZDXrYYQ814G@?P1@`^SDjr*M32Pr)@nzB_6F;Jo=c2-YrMIy4a`#Cw8^_b<`nyrAvU?eo1X|UD;CZy&(F`a3! z)&eG^MtIYi25T>1f@(fDrqjn&JZ@W1Fb#Fj-(riy88)am+l6sZ zM4xqVf_qq2bLb3x8V-HtAqS_kn!RMv9+EIh6}>0;@Z1R*bh71U@%b82ZTIN&6WrZ_ za`CE#gR0SUxp|9k;vZp&FOle=#vI`89u{~do)v=VRdiSH$*C638~1jx!HlxW$axMm z*LQ#qQ@(FML}l?I`$%NCENUFH{>17QXr5|OIdj0DRc~F_l55%KTA-xuKfkSR{s$jl B%>)1d diff --git a/examples/runtime/shaders/essl/cs_terrain_update_indirect.bin b/examples/runtime/shaders/essl/cs_terrain_update_indirect.bin index cbaeffb8dc8763a8a7c91245e4f4656b6ed8e7e8..5c7386f51055b72ff0741d196c8ba8fa72b9d947 100644 GIT binary patch literal 579 zcma)2&uhXk6fQf)f8re*R$P;Y$tYeXgWY$O5@H)&pe9fgQHTHgUbVO~bMQfO_}+Wp zkGJ^xoFuo(pOU0iM;CnBx>~hzXHHrkU=A#U5pujkPCY`w*piTeVP$M%>;@YmgPm_g zkyBWO^;&nJyxW?3;ez$Ld%s}UpZpNO3dZ`_(6TDY86@K|nc_~SchKqD#}xLu7U*|8 zFt7`T?0aV#*eYXFI`$;l8wR@C|2Wj&%5HRuex{K`%e=}U548M?Bzf`pI*Y8&aJ~2N v0z8a)i`U0_Ir2(A8+=K@rvJ{sDg5i5Y1UV^&b%EMcOqQThggUP;`TBdnr()MK6ItC^DU>(1#&Wj&~RN?>n3! zDOsZAD2IUL%zN|nIHIZhfByX8#{Rwhcysg9Nz_eNl`PtCvYVPXhLh z)k3y)$u>W)Z+Wt1Z{A6yA!gy=B1x_IkQsETkx7l%Ff|&a#wIl$rN)EQkf~CBC|Li)UeR4`!jQlECo42De!$m7dO1jA}5-R0|P; zj8HddBvb)o1RAMspi^p*$e0!K{Ciy$57leqBN<<>@X;CHm_cX;QQ&>^bYsXmDVt-} z2w(B|3Z@Vol6e%cVC%hk{R;P0zOaIeSF=V#-Oy#E8wR8s2H})k@X^Zcq*_uV^(rYS zyr5F*a4W&pKZFERl{r8I^A*EBsH@kWDwXW3=;M0#$RV}^_tbQAISus`UF}r>rEO7; ziln>ivg`Gfdb4omO}SXSBjLzhA3{rHB7W;*9 zOt1&CgBAKCq;!05VZ4YlVs1`oV-kw}w~RBM-~?kWCyW>A3@s-;Fj;#2;ngu0`eFlU$ogf$0V!Gt7RXWx9hXGH(;sb@nZy=eh_D>eaQKtB|&J^Q7IPl6cw2KdFa@-Qda{hx*}#g)o+o;;jMmw} zipd(UC(CHv4Xmi_&yAi8d3{`WZ72n%8(76Vm&h4z zSXcj#79sg>*SZqp3}|*|tf=-Pch&~fUz0%#yCg;LTb|^{m*hbl;*oa5!R@&VAmr)! zaOUMcbuDM*KC8jw-|FX2Nh1a+Ek7o8QZ$btaOTOEs+E2t_i+Rt5KjtPKHtIT&Qp6h zh#Ic=#PtcM^dG+asAn#Nk2|{GLco0rT0}^N>LAa)o-yQ;ewm_d6gzPZ?dm~ zpV=MTv@6zI`Z8Ynic0}J&el6s*`5_iR{H9D0uRrW#DG((zMh3!Pmcghnm(V?m!y0a zzDwd7K6TbDe1;hO`(PUbquNmaj`^nWEeqR#-Lfcb;X=1*wL)1Ow;ud^Uxg4V^ce%t eIM_OW(*_^HkLw*U(i@$Ya)rh!bMdj>yqoW&z|__N diff --git a/examples/runtime/shaders/essl/cs_update.bin b/examples/runtime/shaders/essl/cs_update.bin index 22f23629d4200e4f532d28b3428000d05cd8f41c..567f6f100ca6448ce487a2153dde17aee208e560 100644 GIT binary patch literal 613 zcmZWmO>e?53@sdX$o_8Y*B|RZ>5{ z_~UuD{CxDz*7F{!#E6{td!C0M+O+R^GHrBasMOn3CZ#y?q=t70A|I}x<{mm)h=EWs zAzQ6V0|&l+h9nGD(HdjcTdk?RXfPc4FghR1Z(|PZA~#^m#7GBrew*VS{Lk#@jA3h) z5?{K=ZOJjX`D1c5vk_Whx7goCsGU%mbBb(}zB1@u{}jS-tz-jxk?p@h(URN5OQQ=;FKK-c zt&H{zX(p2osW+)yr~@v|4zQRH>js6f6`Vd}O6?{ru!bkp{$;{o;Dj%+Ij6+1#@HBz gZYkje-&!$IH`|Lfn_w`w__%2!RK*=~A}2z;KapIb6#xJL literal 4416 zcmb7IO^@3)5Z$wS>OUBu7im}B+LDqMbr(gNv}q0jf=$uO!XUIZ?NuR*hCaM`^xbTk0n@ZPazy6YA=yLN>_#&y??Y zR-Tc;Dm<;j04n9>=AA*cFr1EB@RYAg_fd!xuyVHcL7%r}Uh!tKiPM624hsr}-+{>} z_!SrhGzYQ;75gJl;q=_%coJp^c1&zzMU?t)8fJ6`6NPOsaXg7<&|s()h@$C^f$&MjE9-Q}Ti~5*nX#89pc(x}zmq~t!fU23an`0YEDNV%<$F(rCGQHLfCA)1ymE(K^OMk19Qbs*E%F|Kb@|;s$YXejE zSR;{Irjux*9~_x^Nk^({ZD7hCtD7Yok?+(EykduhKi}i6Vc}Fm$3ML0Y3rfOwn`Zo zlkD&>LJjQuT>LjMV(=%MU6QdnG`iKd6KkGYYh%{Ov(6^%6qK~DSe)*k;(NY{2HYtR zZ_llRQXaRPnq}*i&75TGBu9|pKb4E9z5qs$wihP z!R*FUvVGb^vWvGoc=smH<0BNTg>Zze|bKIDWmb67%5V|#Op{i zCyb%7A8Eod@@3&*6N4*n3Y&Pvk@sw&M!&&pHM+SuWsWg=1u|oKJ-hw+6<*2;T%r>0 zw!V`Ewm3x|GyV9kpX6KUdZQ}#X;k8%1TJD{{B{=@O%-EDoun>8Zh`wnf>=ThX{ YZ8ym$5cPuV5(8iU=b_&UU!1G|0YwL>ng9R* diff --git a/examples/runtime/shaders/essl/cs_update_instances.bin b/examples/runtime/shaders/essl/cs_update_instances.bin index 7b15aa769bcee19e5e9cfc3d2792687ec11e4a6b..c379572d62c01873600ac03d230cf0bd9dff2798 100644 GIT binary patch literal 1901 zcma)7-*1~R5YD!TP3)iWBQzN^U?3>%9@eyfwd}TtixwK8Cee`jgl@jDC{M)*|M%*LwoLH(1u|b8VK` z+T=jV>o@T0bTgn{!n#m{|D#^KfhV9ocQdFyjR18i_`IqYx(SctG7dm{tGUhUBFCM8 zRPwf{e+XIgq8Y=a;Qp%OIay>}*iO5XX`H|~K;PWweIMVH>1A0>v+_!;VEk|*uD-h) zNVlJabg1Hoq1(}=SK|Yc`mwLm;Tx2K1Z?V3XAh#BfIVUYdt!4TG0wv|9_hDJGB2x4 zo^#p!sjh^y_u|lryLFToW{0q7phEh6M`gTMPt1L!8kGJEPh5++$cxPcb99rnRY@m! zG9A)~b0_T=k~kB0v)ySz2t3Vd=u~YR%4otmb-6|zG`7jJJ$Xh>5pzT|A9Or$!Y?%v zsn4)cM;rl!O~@A@lpGg?QA$s!BShKqN&-EWpmZ#0)rp>}*8Uk$9^{1BN8<0m(r(7i zK^M=Z4nR&67H;AvDo9gBP7dS2vtNibw_6h?mNz&a>s%3%Hev29if z$;GlbSRYio^-~Mug|Sf@Frk=OiE)qxOKKBX8(brh7f}c=3vnZF?G%!kZKHY|Xlyi^NL}ELka%G-5Cr`qbQr=$tatASdNC*o+;d2 zZui~x(ouz~fC;nBj0{xuI%f)Z5@zeTvtG*vGV7TGiayAJYHQuG@pzJgC#r9p0lBNz n_M;%MP2E5*7Wh%j7>$!~m<(AEhXVow1`*W7Nr8VR%j*3Djv5_; literal 5755 zcmb7I-*4MC5YDsrzGnh^ks2?xC3O$Wx}oj5uD}WuUALFO5EP3}6v&dNABmHq|NFi> zQW7mua@~iN! zT^dzQw0k334kX;qMYwl$%s!d;lP12SOiZ(Y%z{a?z%Xk~YYIW|Uu|3`Sw-=5oU&9K zbC|T?vr!YM-DnUf83t_FgladmhPsWaKy0i1A4R_Xls}XXgN2JZr!K-}Gw_;$@6Nu= zbYoOSl$E=@ln&uIWJVStltbSY?&a+3%=GXkPfzqtJHwNBVxZtr3 zw+poeZ9+W?iU<#&C^{}BSbZlekV@nL2J^Y#J}B}BBPvpMNP4wcU4@XXz#dJPhf_~a znN`CBBCWUCz{#4It$so!TQx}B0bQ)vf)lZ#%-6^A%wPl)#I~3ipA@IpVyc7{ zrN@(}W6pD!R#!Yz0l4B^sP!zb8W~GfNbPS)Lyh8~b$Nsvg2p~4^?^&@nRMAP2Mkcu zx;#Q1ALb)2g9(>(NHs|soyupIDisgEy;2F$ZG~ikuD{Ycp#jLi+Nnxlz@j#%McYws z5}@eU6sXB*upJ31aaBp3c!z7*t_~~Nim3$S4W!6u>dBPp4pNe7n%J+kZ`pdPin|+wYYuj>?#Yq8Tnko(YCzuftf~+d0jbW6$d^Z z5Z7dy-Mn15cr8b9o~4iCy54MLA$Enl|CpCag?ILAUQ&PY2;_i<@~agt8KW+iLl^71 zD5hKt<p32*(kTG%Vi@ds(#oMeZ z5?NloSb8WNudkzY{c63&HN1$ZE_^G)jmmJ#7iJtJ4AGEF?6Fe>4+Z> zfiCq^B2LQ6gLaH-WoJGY-53us^$Z}@pGcKWo*n+*C}Gq54!I9Kd~XrYg;V}l5HxJ* z61%uq0#HBE+umKQE}n4J?ax~;oVD<$fq!B-oOV-^#e!GxhFkI52#hE&H##%BBw-DF8s$F#LlncY;kPA}Yc zqu>((YJ>iv&nxIJJIr(8U*L?Uuaa|Y3-1N&lZ_bB{uL?<8%HlihTr2T#U2<0guF)m z&%2a8>^?ZxpN5cCbFd%>51aVe0b3yNfXj2yZm&PaO=j0bLF@ks?a0Q49ic*s^i!<}{6mnBjGD~v{6w-3? z6HBbQ5E2=g=@|tInR!4#uF|~BwEUu61&CN#YO;v})L5WoPGV(#X^BQoesW?7$V6KO z15E{>2(s#=^t6h2x1z*!m&B69Xrox5wzB-p6ouTx%sdTEu4*m?AV5`Q5DPR3ZVRTo LA&Pu07Z(EnxeZPp delta 67 zcmey#*v&XW!8nb9fuS@nGcCU;S0N)aJ)=OOEH&9gp)@`@KPSJ)nyV~7GesdcF*8p= VLzAnTOF5gg5LJVrMLqN%l%c0p>WKZ&dL`WC(h_jf&d@1w=G6W+XQa{_n^IN z^V&9*E(h1B&9xmqKaGN5-4t`v8e2nEEX<}_!?Luxn}$Q+-mLD|U}|)Ro7ya~DR|#Q zF;CzG(l35DJxObIwJwW>e}g^9*AhJD*D|z4Af_HLaCpeOVmr6CSYd$mq_lJ0 zxy7!5Mu487Ac5Ixxy^4Iz541%!+sCeETGb+CQ6VKI#k(>)9QO}H`H|8Vp~ReDQskufZ6N5}xnYdhdV z7CFv?D|ntg_ODkomLj84OjIfvmrC%2vsB43G9;a!r;}9BjB=V~6PgJZ!m5c9DN{5{ zSwa|<#%5Bm%0jiq^q|7$U7W$7E@n&g6a6`v9tSu3F*)0vX|G9lrw?S`9pXL G!{9G9;V*sw literal 997 zcma)4O;5r=5M7l-QxEIU!XyVb3%>o6Qv|ZAc?{M>nJ6kBFg+w=- z&Gt=a=Dj!D`}(+-kKGr7t3qyLK9s(U$Q4l=*Imp*83n@6p-Rk!%s(IIm=g@V(ESvV z2;%E&LU7~yxglgBqO})JVCqe#Gg!Do8x}lqS3@bIk=fDap*P0*5Q|{uyOI442MU)% zdoGt_LgqL&szZs`x83h(3+as@5MBtBX}7HI6JUE+c6*{B0*sy);9KGaO3;XIoSr=_FH240$WTL*-jEvId@ zEXLA446`l6R!*CSlNy$4QltM{(7Np5KC8f4$O7NoHTBNYXL)!Q4He4n#xn1I#L#p^ gDJ@REnhii{QM^+X6QB1YF-adKCS^4`+D_BRFXo0HU;qFB diff --git a/examples/runtime/shaders/essl/fs_assao_gbuffer.bin b/examples/runtime/shaders/essl/fs_assao_gbuffer.bin index c2592864326638ff5a20b40b80eef4af476a29f1..dea1405bcd03b7e4e32c9ab170be50a20e90f7ba 100644 GIT binary patch literal 439 zcmZ{g&uW7}5XQ}|Y+hoH3Pr3fy)357HquPnm(tA3jBVCOXg>0oYphYP=-9V)*dd@D1y{z{Q zNJBx^8ChAU;V0IjZj^B82Il63Nb{TRMezuIZiq+4nZnU_K2)|qKh1lABm#M>=%ogH-{|}8zXuJU( jmeAn_^f7G}lefQS9x}?2d*3+`&fj&v+$iGgi?QGg(q4=J literal 303 zcmZXO&kBM-5XS9R+e^$*Aw(^@NH>x09YdB)H(gj=S^pP3L~qhV^k9vFAv6rku-`ZP z{le36{e11;2G+t@R+PyLPZaKBW36zsOb?<+Aromx diff --git a/examples/runtime/shaders/essl/fs_bloom_combine.bin b/examples/runtime/shaders/essl/fs_bloom_combine.bin index 17eb99f01111bf1a416a123aaaa990ac976c0eae..513e6653aaca9cc03ca5e2ab36d18fabdb0164e3 100644 GIT binary patch literal 440 zcmaJ*%}#_c5JoSW`VMA}B^rXjDjU>`X0vx6fOJb?n-qqWA6bowkM4j=(3m*wVe-xQ zw|UuK;N|1JLv!k!H>of?m7#OujGyMLNsTV{?Sg#Lp|(ouMq>q~%5+!OkQ)?j!j{9H zR5j>|K-N_{M_a--)`+q;$_CFc$0h$TrgZYq)luFn89<-5YLJLF^Al#o0lStPl%gFw zJ%H~5A&Ve_U6Bvz#){$z4O;T+QD;yJU2&JaGoblRAs0%Dc#W@I8mi1GvF)tlbL;D$ zEnIInyulSLq^bB{4k1d0-1mI3` D%Aban literal 390 zcmZvXK~BRk5Jg=!ROSw7mbQqjw3Jn#o1%&pn;yV2iAgOvnaD|#7R22dM~YfhY%fOt zkLSPH?%wY3e*Mho+^~78jsLI(vKfny&TXr`EBD=5c_*Vc;pFNP_GC5C+k6SV?(8u~ z3`LspL+w5>RM48L@ir`9VVeBEH%4Ti8q$-Hs3 diff --git a/examples/runtime/shaders/essl/fs_bokeh_copy.bin b/examples/runtime/shaders/essl/fs_bokeh_copy.bin index d3cdfb8a1cda7f8920cb1909e12328b5387aa121..b5fe71802d0a5e315ce20ffea78d4ca450fe499a 100644 GIT binary patch literal 267 zcmY*T!3x4K44o&T{)6PWfd>(9Q!k2m_X9@lx-HN)rR#Rz0KtdB!h*6RsN euo7LGiKhU@{|T$GMeKr3#}KPu*DMz=A(9W>{Z&K& delta 149 zcmeBXy2Lm^L3=F&14CJ2QDtUcxeo=~nHCJg~W?Ftx z?!*KUo3i}O6ouTx%sd4RO|EJ#1%;gaaFy@(K#+Iq_~qiRsSyIr&8(X}GRhE-nTDtXMG# diff --git a/examples/runtime/shaders/essl/fs_bokeh_copy_linear_to_gamma.bin b/examples/runtime/shaders/essl/fs_bokeh_copy_linear_to_gamma.bin index 72e215fc025abe45951e51c885c2f511fa299ede..86055800481e5e397d14979845b0ddeb7dd94b9a 100644 GIT binary patch literal 355 zcmY+8%WA_g5JlZpLH&m^OBq6NTt8x*X44Y7?*|w~mK}ku5%MEWOaHy&#E^C*keIpm z+&O%HJmK?x=TSX)k6j_LK}X;DQtj!nPD$NqG|;M253Pl&LDA>zJ~-+6WI-Ehvcc#I zT?@BfCtBMm7rw*7CWSW3a8xpcvFOz#5nUPNtPvL+dfuQE{has;fe+NV8zMN?)l?ju zsNd#Yi8rDyp%vP2pM5i+x@8kSf+C8ELJ|Go6knED{Y~}rtLHzKJhPo!JacjEIAPY) n<;y3hk}o`1NAdL}+aTLyNtA}0B+Zg-8vCS~)o0@VFy{RNgcoZR literal 340 zcmZvY-wJ{-6vpi;Snm+$aza?Gy0W?{qWc~|mM$BpN2Y0i=-oRLC85p+`#3xMeIGlV zjw2jz*ACUd85Ti^2^x}iQ%&ipq&JxHYRuE17PyuUXM0*=T+d&tM zs2h=z33fS8)q;OL4n66a^IvSWAoOHw&RT-OdfW9&2pu{ukjEl%h9^g)c7S^@bh-p8 zAGp%AGbo1Xqam7&lp((BtyDa8ooU^qbu+D>wEoY8h-sK6ZkGH&qIE?^*RI!aItfX2 z+Zir*MSa6}ZO=4Z&v#dzbC%JPXDm&A!Y!PAl*}U~iUTEP>%W*N4wzD$I8T4@U}NF< IpQ@^S1Lc_1qW}N^ literal 558 zcmZ{h&rXCe5XRAqNlko&%^XXD4NKP(>P55h?gKO|uxyh;N%^}P-`PiSsIY-`ZF`u` zOn=|kcKiNzt5?sD4vuT*rV_DM+BjFvuyEW}Vy7Bo(&S}X_{Mr0nWHQ+ILPc!LYu|` zw4zS?SZkB`A!!P^*CvN5%1f1+;1x#x<Q6| Ui_4VQnkcj1jXqCr{Y8lL1OBn9EC2ui diff --git a/examples/runtime/shaders/essl/fs_bokeh_dof_debug.bin b/examples/runtime/shaders/essl/fs_bokeh_dof_debug.bin index 80d2409c44031409694c5e8c87403a9a4d58c762..92f42e469c42dcac176926209ca41f601a4f4208 100644 GIT binary patch literal 1369 zcmcIj+iuf95H%nKGD7?T+Q&6Y&E7Ahzyqk_okvtzj^iYj?5yQDtsTU_GrrYnC3wqt zW!W>cGjq<_z4`g$jeGy)+5>yxy*@@|T*bxV`CHF}1@`I?B`$ZB_sr|o;8~|-y_-Gn zUV2_xrAc-m;M~sW!qhevOPHc<38KCsz8J95Eo^hR_r?(yDk5d z&^LdYaF-?mP1FCP{1$p-`>{L(8M=$=v`L(+)@14DaqEsX&Rr7M-OQg62@rVZ4FavU zn>p)_rB(^esM1y$ErU6SbJ7{*lybtTkwhA4xt0q=LN59s;ZiH6 zjWS9yE~enWb_PMPJVVpV25@u-C&@t>j4=%f`Z)8;Z^Je~S7`Ll7<+A=VhjTG;nCjH z0$oAH1%lVudo_}1D0JQ%t z`hgI}Eu#`hvQ%>-tYu0|Z7A!xBuooQtRV_Wwu)$FmE@ce4hbL}`ZRSQf>W-UR0NhL zoM|nMHkPQN5*L<$o>UpZn6k!dp~xhe6cm^iR$H!^Fj`wSNFFu|5CO2X7st|G97{W5 eIb9sf>Ec*U-Dy5MaNQ;Ejw)QE=|KPSeeW-c7gY5C literal 885 zcmaKq-%o=u5XY-~&|v%*%ssY~Ay61Do4#lk-+eR-LB=)`SP8ISF8klT7B-k!EKSqg zmAlV<@5Y}WcjDo7L~wP;?aI%BJV=Y{dqQyIx+(lnBqAqQMDEHmjk0plSROlstb=?P zFXym`=Zg&1QE0>3FQaWJL_Rf#+G-ikM4n2I1IIL97N0b(B1p3&%I$Zkb6$3-BQ<*TRhL?uVf%3OO|m$5o#Wm#(aN$GLpM9d&ZXE|c*V8Aq}(K~aEGiogKW zGR!A>QjbrJ9b?kdgO>k{U#az%U;V_O+cW}0$(nkYKnFY&UOdChwM-mFh;K3mdzGrC zF=EzQcw8-6qRj`k<$CgJ+MeT@gJ%`<08vsz{{=A}ZgJ1o0t#~Zn*aa+ diff --git a/examples/runtime/shaders/essl/fs_bokeh_dof_downsample.bin b/examples/runtime/shaders/essl/fs_bokeh_dof_downsample.bin index d00fc4027c26a6aaecb639a07ca44f0206da4664..11c1bf6f7474040cb0f1b5cb718f083e9165eece 100644 GIT binary patch literal 497 zcmaJ+OHYI_5UzUA)c6<799zR8`?#TAG#l@GG#gT(K$Dh|@(5`BJ^oFHT?{SeJZVF$*}zd<66LNL3;)wY0N0*lYez4dNkfjY=RFssP66 z7X{E}GYBuB&P%it1tFq`v)}bwcm{M-H&&ts+lzRAeR6m0q-=vlEY@fZ7{h*mTi{P0 z*>Q&X+V44s3GDC_g~98&0_WT{dKjMpTWq-p6Kw1OF8qw_xbu|iXlX_I>b}E`a-8y; GQt}JPyM~Sc diff --git a/examples/runtime/shaders/essl/fs_bokeh_dof_second_pass.bin b/examples/runtime/shaders/essl/fs_bokeh_dof_second_pass.bin index 20cacf98b78d92ab82bcd9f63b42859937b56dd0..944a752dc56c7fca4dc49d14a4579d51f261546d 100644 GIT binary patch literal 2136 zcmah~$!^<75ak2|Bv3HFFz6#GD>QqfNXW@0fswqO8czy8e9aIJ+uK^ExlLY?H0>{btA3MVT~<$)LE;@9uXj z-$FRqZ}W9oZJ3okWT|2UsKt4;h4+oioBuGNqzu@X`a0R{imVc!Sc@G9^6l`rU=PbC zJEmn>t%Aj*NFK|5;}&I_G?dYM7I+Mj!9lUxyY+E-T_txPi3`MgDDxHDB>C3$CO;+& zXO!DgMI2%9MzgQ7f6A5H0-23pp0U6Wyv4}baLC}T;Y~sO!x^;<71YUX?ULoW0CFC} zVqGO^dnOwC( zflk^VmK>8rJzf&~~pU20iUKl{gJEOjOh_9476JM$MS!sMus#`2J zY*$wuSzF8kb5B%S#z51}td%ks z$`+cKF6ObN(vfGl{bBwOEcb-AG>~Rh_C|v_De^UQd)(s2e`HsNRvVfu=$!hH1jwn4 z`vQ=xJGWJqe796}qUZj3lC;h)4S{WQ*Dx`CiDim5Kr?f#Vl?SoC>{weqBuamqBSoD zKGEQqgLkkuEjmug%*R;J_E3lI1>9$LxX+8sT_;7Iwc|;qeTyk70oCJw76eVD9m}-D zu%pzNK$>UsX~(l)g8uQ5B+#L{Q^Sx4^I^pd5W4zGDgZ(0*354vic?#fRimZ)Etf8k z3Ws7*KOm-JA86wA&<3Y1fD~v)r3H31_83QB0xFu5w%e46elrrLq4*gn?K|OYM2a<_ z89ZsKO}dJM*G+yT7CF15l_u#s09%F(>^lPQkorVNe9~jkowPot(abK*^99nEaU6%(#(|3FVZTntp>$+I0T$Y%?@rnr qNQ&ULpezNaKVa~rA7M)Yng&peQ%eH&=OtAUFy9eO%I|qHaee^=$r^9~ literal 2692 zcmaJ@+iu%N5M_e`4HWbjipks3mT8gHg@l~E*bVy7zSKcp0%O5QYncEg3KVs*gZz8W z?sBOMMMW)i_@YktL11u z*l+U3vRYgDm~0gPBUbTPIUGwv9n;q^ez2llw%!(^iteZha6UMc`I6RIz9Hrhz7NRW z9uZ=@m9g<~4uO5658c3x(PL3&H5FyK{d2SAku=h|TEUmB*b5#@QBfYZq$PD(XT`k= z?mmAJeB3ux3VhNt%f9Vy#ikaOGMe?I3oA-m5x|K_)rP0;;h5_676sxV3V~eB3sObi z^}Z6(-QVSs@URBEp$o#0M#0FJrj2uHXq*J6=NBb%BI?MGQrgP~3OHfb$x*p)kbpD{ zbf|soAVMtCqpU;&I1XD%#1DbGuq{+ic#^hYA~Cmm^^>SGK7}rOtg=PT7_^9X`Gzga zniyjand!ozZt!yS>5`aaJd49|Fd9-gNr9JAYlu2}2wr?2ph~SU3eqG^hBQlpD2{#K zmzQ18IG#B~L9GnZ&fV9R5Uq~nos%H~yFznJ6r12)vPjp#VyH}w{VNKGvZVFI)No<+7V$zAqYt}TornKY2Iqv4`WWr{|#ldLy7&PaKs8^3zuEdB(YF-kVH(bzx zNV7&4+L;?o@KG}`+E*K&;&T^=tM(S3uE}t{bKRvwQb%3a2E(&iHSV%uX760mIzNE` z=KY$Ql>uuDHZ~H#vH`b!)j4BvFha*LKnNgP?PeSkz8mhJ*+J~pQb#ZL3+dYP31LdN zL&9ZfuNvTYXPE&;M_UJ_`qf|nd-D_A#}(H)I*vu6LU`4Dk(%-*<4A6BSycI_PXBSR lqN60s>ts<{v#YOE#neTsf`6*A)va^{yVlEm@MAFWegefo8;Sq` diff --git a/examples/runtime/shaders/essl/fs_bokeh_dof_single_pass.bin b/examples/runtime/shaders/essl/fs_bokeh_dof_single_pass.bin index c9c488ad08bfeadf839c09885bbcff24fca849a0..d864037119bb6c02f8516d3a1e4cd23084348a08 100644 GIT binary patch literal 2353 zcmbtWQE#J05T++pJ#p$^sP+*Ohr+VEuyXERTAljPr?ziZgb2nlDmE72*v={ctUs>b zEZ7(yjVg5$U0`;0_M4gS8}9S(zkH~E_;hb!eQUknCEK)4*Uh`{EepR`_AYrY^8Igl z*1r43vha)bp)>xGAM$dre%B;fRaP}Qb$+lc@@=~sEPubZtZkiVMN?E8w$2yDZoOs8 zvP#>zJ#4Isr`47f8yIb~$&$!dc-d`=WmT_P=kT0of}Jq`8H5k>X@^q=Z)}@fuJ@aC zy)E;a|IGT--f}RR0%EZl&~f&hwD}>cs(Rti?J_-9yVfbIENva`4lRQ|^q3%=U%H-X!{wAU3_2@B#+*?Y6-%H! ziwz9h&nO#eRw9I+(~D&HBbS4*8W%}5?sHCn)VxqCiR9e8Q2Ycn16@r^|+OW zj>t-DQJo(LciJeH%sE5l5Cgk68tFol2d(iLvLpx(6yWl33E62q)_MBZ*!+6Fo*eqa z4w1W~uVd-oC2{a_y-!C)`LNkSw3jY@z(NA<5GWuRX$MOL2}O1vx4Hdl+txpg#bEdV literal 3172 zcmbVO+iu%N5LE*dEoAf;ig{exGR2EzOR$p{J3$^&ps0hs6b8XiE13YL6)5Ur1^MRw zLT6{MWZ43(VmRKJoy(q?GouerA1}nu@9qcq`F=3mXNQs>f8#~-=DWcFfADjmgrE6| zS5ErlKHKJXzTUn0X)wSa{QR)X3Q>t#+9^|%Ecmv0agskT27^Ohzm}U7yp*e#EgX1} zz#(h+sSu)GM0dmerd*18?er6HdHsu;GIV-$EDcqbf5hptQ|%80m3x;2Z;1Wv!(|(X?XYm~>+zH;c-(-xImB<@diekU}Rg{}1OQfBDMoXJ? z`W(JWy+X>feJb*bXQ{Q-=Z@{UYg-AieZN^`lRm}od9~-+w5w`FlULb|6j$Q71(ikq zW%s~04X>ZdGtXunZQ)dNtHOGuKn;?`SmlUmQkb z=ED^Pa1Ba~=r{YCCy$@Rf^O^X8~LReK@>(ocnX3*y1Z1_Yy5%{Tw{b0;I9C6ej!eQ z%-Q6Rsr7^-ZEv_&s)dh>^k5z;J$DdAHAH?Q>FsnDPN!JcOSlP>SsKr#!5#LVd+9x$R3n4Q`sytt zVLG4BZ_)t1%G!4N^@&JN{TdVN+Ptd77ycmjNXeLZCC#102QbmBY}?oQqTKI(DK}Y6 z^aAiD9ee7AKKn;rHFu3y@U4YFb}Ghb2ljgSih4<# zw!X(RO-JW>j&{sjB1kDa0cMtQpXDYFPp|TA2$18&r7H&VNj-;VHmyRPUP6Pz#!MoN z`Ol-wylJlHrsq@b0ppYgw{sfHhqOlb{~z9+6zu5!@58$_5lrTK6xbtX?hW1~);OZ9 zH9#b4s`C@=fw*F1F}wqR+IxiQ@uZP5#tDHv0?8DA%VNC~oT+{Ns;a>kD;{Nuo?qr9 zYvH%aHLgG$sYD@frJLw_df6kIn@Y-r+9+Iui4wpV46R$?t|*)$talw30d8WoYE>@Y zZe{lGD_EB&q=6NTL2p5HU~-I*4QIs5oF|Bso)9e=OT$QhT|gA^hP|zq4_MNeJ&QZV zjx-;^4xmWW*6KwhyxXc?G+pc?Bs=6+W&9>2NsK|p%sfloH@r=4nzRv2&Qq+)Rvf8C ztShx!Qx=7jDgBcW|NT!DV9jw~;a98HY@n54V%&sBjG_T>LWCN{=1f_ws_a9ZuO8%+ MJRN%bHXIKA0x7AVssI20 diff --git a/examples/runtime/shaders/essl/fs_bokeh_forward.bin b/examples/runtime/shaders/essl/fs_bokeh_forward.bin index 8061faa0625975c01b8a83ede27c5a61fefb7078..67deff674c70919b20296bc0f0acade6d484ab90 100644 GIT binary patch literal 1735 zcmaJ>O>dh(5T&V9RaE^Cdt4F+u^(V8tEX00kCl3?B18;HkbrdoyO63sufL_YUVH7# zE|`x*K|bKwd2iml*i7SqVY=l5f7eF4D!%`ya#f)xDoaQaXC-y) zpEiNVIAXkFG6WhUD|<}oAko>*QzeO*FCZ0~YmQY)>%N!OM7_5}!7xM!Jz-URb6a3Q zBDb9cyCK*uigL&eB%D$M?#LzKF7$j&&}z!yeG1Wc12KVS4CGK|+OY`zb8WvD6aM&$ozMYNji2^g;yCstHIR1JZvwXlR>zxH;pJ6>$Ui2jE(`FAQ}2 zgXZaf8#WVWR+cj~ab%l+k=PB605{}3Y-6gqL-WrA@BpWzl+H;!Lvl$D>IaQ)YdUVd z`Ebv-z8|_?3+{4HKXM&}V$J*zx@R1XftIM}GIQ)Px$zha7~6;ta{Yk&FwcDsA8KPV y;J_H@7EJbBZ$)t3f#u5VpAXAs1THb7HKPYyyK-gtri3fP{Q!v#|JMFx+tz=BBAr2B47h?w;^`ZI@eU{#O z?X|ND3j@TdWyKLQ^L;bl{BZs4^Sj@F{{FJ?^V)j5Tgvz@3{vZrrM~#VN1HTDWZXV_ zzh5S45XN6+CX?OSnPuS@KR@4C)wrs zyHD)=KX!37+HazJ%oTPr*~VceK7py{d0SOjYr}MX=oEJ&Zjm;P0!U=E0cMY$MgVd8 zSl3n|e39EFrU$g@JlSHoOUw$u{0|?X3W$y&GqTvqgWxztiGHX`zRyA|ftdzOh#0Po zZqEiX*25Zua9kTMfa6a;5#P&rb)I5n~|{Dkg*r$8MZkIn`0Pb zb@9Ga9t#*7Kj9pUQnjYF;{$3(_e$<2w}#}BkX%v{(IxTvB$~A)@s#^1k_91IP?C8I zFm(zW&YK!8TgwbBCwj?o-J8YW?n!8r=LB>~q3`2V=0;Yocd?e7bHt7|hcMfPdeReF z0Mm0`dn_g9F)#R=|jur76& zCEY`=7LhU5MRY5~G2nOrY|}?z@@~gE_po|L4esF)+o$Sa!Vwd^detA>MkE_6XRgC> zm^AJx##cml47k@e+eakV!S1V@slxRXPVq#JtCU^>A!4v(yc$@RxHPBUUdv>&69^$)tE Bgu4I$ diff --git a/examples/runtime/shaders/essl/fs_bokeh_forward_grid.bin b/examples/runtime/shaders/essl/fs_bokeh_forward_grid.bin index 5e61b76846f8b010cbfb4e220fb9150da5fe8ee0..6d5d0468ff3f6fbbf62eb2702b99376b9f3c4772 100644 GIT binary patch literal 904 zcmZuvO>dh(5T)sjs{dh*OKhY4;LAl;4w0fBBjs3GXam?;30Q{9#%7N-n@CU4^Q8}y#N05%fj=?`g%x8o#n-&Y-G8+xv?y~c-EgSt8VgC?Ub&d z%rkW;YuFT8?qhpMyr}I<4XVPReW=t%HzoA3W1f02A^*YGh*H%Ua7^}jn`+%;ES{tU z9Fq#!WHF6<7{8YA*e>KrANHissoWc(E1(WwWZdIAnE|5k(?+8w-8#44`ZhM9q;AEUEs7ooQ{aJcTyp#uwhG7)Z$X|-kcN`}k zv3K4XdLQXc7q|UyI=ZG$<1{uEkg%?}_eGs^)YiWzjV@5(A<+Pxu7a)I_H>5D$W5H? zbiNQxEkho&O+rYme-h)&l#F&{&fK5`;qJv2FAO3PGC$%}pm4{5TOb7g3h7K(075Co zdYil0El}6^2CJ3%R0bHK$dAAXt9qaVclZi@_y)|q_Mk4iEQaA$7z-F%iU{TS0s1$C zw2);@GL8JGYmT-G57pyF=g2}$|8C2I_?d(x5M`@9vD*JIN3)x{KuA)l>S?8Fk1OqQRUtQ!)Dqx`d^Du$&)eV9Td%$L z*KGtXCle}8*?dj9WWeeu3;(^6%5@ki96T%VkH9v&?A)$?|uZe+Ej zTe-Yl(Jr5lX_r>2E=6(S9|aQxH~D_9RGmei#N!KpTge5WG;Bfx5&zJ%JA-IgxjK!n$P-yHObUVKcOas|~X$f@5WQ{1fCqJV71oC^52SJFCC>^+7go>pnD^~(>;NTkk3rg1Leg!KaNK{ZsQucAII2Y zPMxBrfNKpV4>_jM?wxiU6L#D)Cvi4NWJ5ni#ti7rV7$$tonx72a$6dICsxzB1AWf# z03Pvh@DJ|7U&ff}#!B50(?06_7>vwy!MtG``!b`&_-*R~>{-Yo*vx>;3jrA{Qya3j znU3t~86aW9krvWg1Ziwy{AAcafOzewWAIpC5MbD5!gE6g2%k)~Ax-<2MS4|>PEGN>_A`*uBExm9gLr`5H$~ literal 420 zcmZ{fQA@)x5Xa+Ql!#wJ?y&{!wz#*ty-bGhKFSDT&DucHgf#71#qaJ_)~yqE9OSqk z{C}6t$NRl~T)h&k3AwAe6JD5V@<0eS)@{Wz=|VwnNZ(i*pGNpjl{pkDFB~*-$DrXs zwmWNmHcM$;s=f85Ckq%tKj$yoGpdAfT6*>dM?*>*t1>V`l@P`Bn*wNiaIn`_1PI2V zl+ROK4>K$wI)%@+Nek1%@uU(n{Uru$iB4zL}kwTz~s?8UFeGSA%n*yyats+;BP zb5SJKO|QDFqb6y;h$@dW?S+P4IJ%U65SgfYq5VqJ$|{+sbt(#yClDhq$z3MmW~%p! z6_6-NT7Xc$Pv$m>0v=3tX@~a^$UCM?w$&<2??|-WJ8wsvIcADL6!1M$McJC9{!ul^2dFJXLlrj2yNh9* z5LHYZhG1ts$!;Oj9p>1*SYPhWFAT=~CXe~KK{)2eAM^79Hs)tP=4acgEm|rI#w_MC zb$rKVZou5o3%L!GJK?Tj5(=lQMn8F7HLl1!gNdVg+)@BCyDD?vB&xB}T|y(Mr~y5K z4QT+NG{h!BVfQ+9E=04co1`3#wJ`}em?TSzWwYuK-;F-f1|F5X0oG@nyO($(=P-B< zXNYyi84*V~qbYEHfOOXePa_Sj^c>Oxm_%zbc$Il@Rv4*52;s|Lp zMbhUB#CC9&A{>n?+#?Px#fHYS`gH%vy?eI)cF@yul(@y!AUVDl*#5)~IJ0qxzySaK za98eB@Y7YU_8pMeZ^nUI?mkp^yKkW0N$#K?2j74ire`cLXil;n00Z59Zp?CA`GMkw YlhAW~KJom}3w)X0z;OdL{-x{MKO)+i4*&oF literal 4767 zcmbVQ%Z}SN6m^TNoK4X$;8L16sz}KXVUTVb1ns6MrpsU;XvT_Tz_wi5V|%9Puk?HJ z9r==;OOeu5L|I0iU`7_n%gb}mIV9)9pTE9NzWn=jfX}PJaGxIX^Do7!*bTlL(0_bh z>zBV5yLGmz-~RBFu9l0>hd+w_T{d4n?Z1CT5$I!^?iLTfZ8rJtu5Nns<6v;icF)Vr zLVU*XtvKe7kvOIg%R{zV4^;?_6+ITkZXR}wJ}&c9N7HFr>~Dup zo8>1=FZS7byUKU!y{KX8Y%TGso3YMVe2dw~_}<;4f=>517R$LU$$p5c=Y+koZNZRe@d*XaCpk;CX05hk0=jUe$Vj z9@SmX&%Un*GiI43#%#GUB9;M`FS&P2ss0_q#%$P_7St+Wc#rg7kk>IKvamRxRz-FY z`FxRw>4f5#M}#p^>LMcwC}`_cjx?E1Sqf8(eO!TsK-NQd0aOVZjfv?$9@(;veP8@! z=c;6iS_dbe2EVl#Q8$CG$vA`uTwoEd;Hk8vZ3 z*uIupcBYS%!TE%_C`&@L2C(ixxvaCZ@HD{YeWHWcorv|GMhY4#6`P2k-%(Le)thzz zT4WdbrSsO!GC^ETa~k z@v5KCl51URv9}nFBx=@lQCe!TTeK%wrkm7q+#poVYOZ)W<*aUop7zjMPP%!G$t!5P zh|Lu)XMMz;>131(r1u`LVH;EIHiR&U`3AYTq|luT;JPjq2&K-Y{NhSR##J^N z@U~&gh9{EQ+LY_PL0#nnO8ai<0xCqH*3uED%LNqoOC>S7*9DS_sxooA0L|BM0focF zH=7z>^}B%LR;jdAwp}2(!UYsRU@5Xnw+krcb^*oBQpMZ_nxW$!7f?~R3t;jJ+71^` z+!oci#|6;AxxFC?<^t&DZ~=gHX@dg>9WKyt1*Z}Xt(~SoDPN~VkhNA~`NgF~CHs`9 z_zt0HhiEG?x=x9DuP{oa(_u@Ah|{S=Zt#lEaD7TtlZq~C;#MNf*Hq%PtwcB{gPfSr zwkyT$N@=@lDG^DaB*v$^_Tz}35+ky!4keanFnhJC_Tz{fR)hl{BG@S#p|QKz;Lc-a z6kbqb(yPRXTT`TZl!y*aB_au?MD%hf5g=VsA~5*hN;I@~Dv?rVw79T6gRD%6`ioPE zv!)VlY3oZcH|dB>dRv@?mp$xT7gv47Zrxj7P&N7k1`Y-|s@fmsuu|R8EnB#yM|A$x zrzJfehZ0=e>Ys?qZB5r~u}VMevW3n>UpnC%RcNMzQV5OSbSJ@eget$z@y8n6ATe!q zhl#k!M=*Jupcod7P-wG@4ug2C|54`c#}Wpc;W(fq8lki?@i*vDb-x|{GaL^711Qsw A0{{R3 diff --git a/examples/runtime/shaders/essl/fs_bunnylod.bin b/examples/runtime/shaders/essl/fs_bunnylod.bin index 9dfdc327c7841732e0655780883cab49dbcc9910..24e04ba7fad59dc2bb030514f39f295e00026d41 100644 GIT binary patch literal 404 zcmY+9&rXCe5XSLZUt*4}5>lZ23-M$^y!!y80?Rf5N`PhAH6BcS6JN_m@!%BH%}$dh z-*o2pea)VqZa+T1zOA+1Z!D`HszQxQchFX)Idk;XGVPu*VN}34+7Ss z0m{e|fiDLM$GSynakIheIKvjoyzJ>@z&tjG&JwYZh_ht)L-J^>I!0@`&`8wOst4Lw zS1Y5(J*5}~Kw}R+j6GaNt>9xnFweM#A3Ow>Jd}AJV|+{@<5_q>Ws2OX>dx;AlUsWN xIt7L~t}+dqrGkqTzWrFpp6f^kS7(>0u1rDtFg7`4e0>{^@9^))u;4Qx$tTr>knR8g diff --git a/examples/runtime/shaders/essl/fs_callback.bin b/examples/runtime/shaders/essl/fs_callback.bin index 9dfdc327c7841732e0655780883cab49dbcc9910..24e04ba7fad59dc2bb030514f39f295e00026d41 100644 GIT binary patch literal 404 zcmY+9&rXCe5XSLZUt*4}5>lZ23-M$^y!!y80?Rf5N`PhAH6BcS6JN_m@!%BH%}$dh z-*o2pea)VqZa+T1zOA+1Z!D`HszQxQchFX)Idk;XGVPu*VN}34+7Ss z0m{e|fiDLM$GSynakIheIKvjoyzJ>@z&tjG&JwYZh_ht)L-J^>I!0@`&`8wOst4Lw zS1Y5(J*5}~Kw}R+j6GaNt>9xnFweM#A3Ow>Jd}AJV|+{@<5_q>Ws2OX>dx;AlUsWN xIt7L~t}+dqrGkqTzWrFpp6f^kS7(>0u1rDtFg7`4e0>{^@9^))u;4Qx$tTr>knR8g diff --git a/examples/runtime/shaders/essl/fs_cubes.bin b/examples/runtime/shaders/essl/fs_cubes.bin index 9f1d90f476ea73c88facaee1aff1f4710bf765f6..0da8d07580e757a84dc277a36e3b2e58deb97de3 100644 GIT binary patch literal 191 zcmZ<@_TXO9{oa!S4Aub2f}+&q%;L=aJcZoUl+4oH0)@1k{KOJ#E`&rzW_m_}LS`ON zkSiy#GQYG$BPTyOu>_>aR>4410VtvXQB;md>R+O0ToS&0lWX+YChb&tb mp9~T<02)@7pP8bNo0yrWp~+Rvr2qt|T7jk`RM&EGF#rIj5k4jW literal 93 zcmZ<@_TXO9{oa!S47`A3Sz=LTW?s5NMrL|OfkIhovWY@jd~$wHevyGSS6O~$ib8H; gW}bqECRa6=f#!4^qnEf*I9028Gf$N&HU diff --git a/examples/runtime/shaders/essl/fs_deferred_clear_uav.bin b/examples/runtime/shaders/essl/fs_deferred_clear_uav.bin index b092092dcfeae706a847b0b80914eedea61a7fd0..c05c1633106ba6995bfd6c3cd721fe65eb7ceeed 100644 GIT binary patch literal 226 zcmYL>!3x4K5JWx4e~>*U5Tq0jLe+~R-unS1ZDYESWJ^q|Mf^s8$y5aAurRYT?_6G% zv^wk-U%k`qgKqGKZl8OcUKRPsB59m|KteR+u+)|_BJlaDhp+?`LH_7A@ zf~nP3z~J#p!NEOX)a301Ka5jG=O@6*ChUwH30rUqJs0fBAPMJA87XM~t4Y97H#s-9 aItOKrM4??jCLtlk8=kE*Aqw_lZ1Dm1Lr2O0 literal 2718 zcmb7GU2oGc6zy~P59msJNuU~Sk_SW?2sQ>UNN7X6Oq1m{Zfca+k>hrmru_o`G}m^L zek5(zK2-L-_ndojoY=m;{qah^{`7HRfB(F};B3WI$)$j3JOWmFX9=5g!GLP5_;jfm zaM1==R6TN$noyzGj9cJ>r;7sSnWTEs33GwLhO=DIL_UO9J}GHlWK0c#%%oIF0Gd^L zsaQAD0sm6+Z?~)==+AnM@D-bdup-#a_8m<;s~gm;@ZE^e0G>cGR3l(~K6*#!1fD$$ zG*x!6Rb(PQRtD?R$P!{Ag5A<+r!;O#<4$S3Q;N#56)B61>PBs~q1Fl^6`EQFwdTk` zqJxmgcaTk3Y+&(0SiAvip*httBd30PcFLH%3VusNgJt0 zNm1bzl~HGw(5U;)G@5G6K^mM7@jKK&lziAwWr}^1y&K)%ncO|PXQt!rX;@FKs~a6q z=`t6cCNmrE?Sr4Nf!sGt_6=BT#q~d+6_@$tTI(l?cBD5A*V4Co_DQeXZb^6FKdM3P z-!hgnq4(I(YrK7qhR`{07HVOJJ*2br z_`};n!MC;s@Wu%U;4Qegkh;m)tdrDk(2X_DgSO=nZwxhl=cc^VGV%|$TswyxXi?kp zh;?=|-_tTa&~hpGT&mn10ZX#t?BNDq+lkkc_{}PotuuDFcaTnyi`5^b>ck7YA9R9P zY;FdfxDnHvsM&jSxlCBr+Z$0o_a6E@7!qntNdJzWDtbx14@tmeCyaG-#ywu?mtt3w% zr(F1E>*v@w1bcIW3$Qak&B(Q)>7}{GomY=|2w0L^E%7#2^9&uvo%#Og98b!vzxu!& F{0E6ii-!OJ diff --git a/examples/runtime/shaders/essl/fs_deferred_combine.bin b/examples/runtime/shaders/essl/fs_deferred_combine.bin index 0feb42366fb37e3f77a0e377b703dbd7ae08e7f4..c2e7ff0d580b7a2799e48798005b3dddeb6f7743 100644 GIT binary patch literal 614 zcma)2+fIWp7_Pg~)ORqwEXI&h7>A(VXcq5%0MbFXH7S%7*g@mF`@^=dxkUZw)yH>g zXYX&f=I;3s0Ve3C$%LNE!k{bEAHa2!X|-InBjZjGs;$gbqfA9gS*Wh8$wC{^rg;3Z z0#{8`1tjh&wJ^3Md#({>t)=C!Foys$8Uiw3F1Fdsisg&Z#zNlOsDhM2Rn)AO z)=4i+iGOAqmjC7P7z0yZN^7&BV%|_FcelF_2dpypDR(&=5JX|@N8U8%%=h@z0YNX_ zIOP6EK;r*90HmA4RnDL2VihbsO=WH{9lkJTiI;>y#Jw;|!Z_M5>*am&7slut@_@1= literal 783 zcma))-%f)t6vpdrH24nYT!JBFD{Ne#-e?x@eSoGwWh6jJ`L}6&PG84TY1U0lRvL10 z+I-*doYU>w>n*=~dO&h5&`m>V5wnz|D>QDot{YP1*{(fiz847fR2=dugPlC8p=Sw( zp0sSAa4yniWOY^k&P53gE$e~_`~q5e{!Cd!R?qVkN}5+-JJzQKQ1C&?2hf(aG$pG@ zW_1jYAU)eoFlk_G2iHV##`}L%u%Uvz{oz9@)qDV(#*MAj$GjuOSmN8*!!GEbqeQ1` z*c(QSiOw5l{d~jEKc`l;UjQ8#BEdh<{$kl*qa*818ko!AWy{ zo!%In8?&*Kn2EUbg0=cwm96vwMC8vG9CJQlN%(lIVUO%~1KyB~mbz_uoZk^;ME{O%su7B;7ehd!PD zFF!haf4kH7&yNJ>n%vfjQ1d*~tRZ9|n#Mbm*j0kZ)&gTaIOa-VCN5Z!R4~xG?qEur2qVoMQ-GK0eAf% P^21=y*2%l%FUum|@4mN3 literal 862 zcma))VNZiF5QeLM(BOYC_sM`E%~rrInVJ}v#qa(A(hX!Ju#&=HX#DS98I{h>L?EQO z_TKloyDr{duf@&N1HtEZfi-RwP{%6< zby&r_l@Kx-&8+PveHSu^lIKMhOE!O&lDDAcPaMF#&Sz%TB8?#D=>}}a`m|s$@u12J zv<}BJ4C^)hfJYcnbTwkT7J~;!0GVhyR$r$wBZc94ETG!TSku}X*VPGQM`ax8c!rKg zcdY^{L<2TomUfTHRNQe@uRNPk=7Rn?ooIi|qm2UDm&s^z($6>ie3Kgxx$7eO4C6Qr z9T+0PAJG2)paT=y{|z0=WXZ#OW!EneS+~W5J6&yX!1*)liNQHB8{3PSh$HF;-Rt6o wI9~2MoySqS%@1$F)G(R$&FF_<`cJz;wQ)C`BnuakCodusa+n zjP|PoPWEzS)Q!6k8!l8Bowt}KD9l&Y>tc8SM@tn2IQvg3i~l_!R*Ua{CcJm dts)mEa0e9ptL1^5htBJG%CY=4Niui`u@({ZCzL< zqzpXi8m-VR#tA$D(a>$8>~OFhv&(J9({GJAGI|)DWKKMT*8ew?;83P4oKVxl!S#c^ G0HP0|b3=dt diff --git a/examples/runtime/shaders/essl/fs_deferred_debug_line.bin b/examples/runtime/shaders/essl/fs_deferred_debug_line.bin index 9f1d90f476ea73c88facaee1aff1f4710bf765f6..0da8d07580e757a84dc277a36e3b2e58deb97de3 100644 GIT binary patch literal 191 zcmZ<@_TXO9{oa!S4Aub2f}+&q%;L=aJcZoUl+4oH0)@1k{KOJ#E`&rzW_m_}LS`ON zkSiy#GQYG$BPTyOu>_>aR>4410VtvXQB;md>R+O0ToS&0lWX+YChb&tb mp9~T<02)@7pP8bNo0yrWp~+Rvr2qt|T7jk`RM&EGF#rIj5k4jW literal 93 zcmZ<@_TXO9{oa!S47`A3Sz=LTW?s5NMrL|OfkIhovWY@jd~$wHevyGSS6O~$ib8H; gW}bqECRa6=f#!4^qnEf*I9028Gf$N&HU diff --git a/examples/runtime/shaders/essl/fs_deferred_debug_ta.bin b/examples/runtime/shaders/essl/fs_deferred_debug_ta.bin index ec5820e562ba28b2392f6f238b18d7ac97378d1a..399e0f14fba6ac4ac7392998fc944e39438f8bf3 100644 GIT binary patch literal 344 zcmZ8c(Q3mm40QW4@cyCbF@Z8lx3_GA(Ngxl4+vi3qypOtiXBqQ{(VZ@k!^=Ta5~+c z4%Lx^t?D? zd+Y#%kU9lyh&^1n-uTX0-tOO+%?aj=;-7G^)f3!GiHnq@6f;MaiBt3oY;q9hW_wY8 zw#`@`*tD0@g~l*%w=hiKsff7Vh~Ge1gEttmT%R=v{$5Lf$YWxg%^lYuIgi;dr}a<8 MhcV9!{iU_~21CGX%m4rY literal 350 zcmY*V%?iRW46a^;`VNwVhYdt@dYcNO4DUX`D6Y;zw~p+`P4V4L)j170ge2cj5*!ah zGuo^eMW69JEM&bi+92yOn-qgG)S{8t|8~YyRRSB8#&A*bC4)+yJg6-AWDG_#pO>jR z8%!V5`&E+1hqG-;)+HcP%E?VSplj{mkOt-iYqOIeP+Y CMr>FB diff --git a/examples/runtime/shaders/essl/fs_deferred_geom.bin b/examples/runtime/shaders/essl/fs_deferred_geom.bin index 6542474fbdfd24b63d827a760c95b34b46182905..0272f3f10563a58f4d91740ad1620dbea6404846 100644 GIT binary patch literal 876 zcmZ`%OHRWu5H)Hygd4D$r2`>K6C;EoRv^TR4H6qvMQ-aBOG#W(rzAyOh4XL@PQo~@ z8n*%~i_v@YdGjXsPY);8-(Noj-+&y~nJm}OQoIk32pJlXoUAe}nnzU?JST|ahtKQK zTa~M-2TuotEGsdUE2&B-#7x%366U$$I`w+uRW4qaAWHr&2f3|M}} zi)AjV_zoNa=|NJ#HG`e#L-wFWrxxePaytTt$FMf*O_i!kW_iZAZC<}dNsIHKeX3NB0PdmkR)vwn19 zv*ZfIm{z+J=-n-4sqfIm`XarICa`}SAmSh*blpgjZ1E?!k7iK5o2Lv z5?SmZ?Y6YF*#0ij7}-6Yo&EbV|0*1rLKMI#wNA>7pmcX*T&p8{4*!9~N!=aI51>zS zE_Q(19N)K%6N)uQ6zttn{L z7|p2k6>_RCgzGF7w^v0yjoY)f2)8Xf6}4~=otAd~OET07h7x?VLG>TB7bq*j$e(2_ zoHD@*d&?$@u9~!7$4F~3!X~ubsN4pU0nqx~q8lZZXJSf9FfnFZLlZ95LvqEzg6FY1 fkhL9St;tx~fhVXHYuTY@(q*Xqm%Wke!!XD%Th&vd diff --git a/examples/runtime/shaders/essl/fs_deferred_light.bin b/examples/runtime/shaders/essl/fs_deferred_light.bin index 8c98f586e45ffc2d4cb746cac37736b315d7a8f8..051770e9e00730fe3ffe8a5388dc1c8c04c40638 100644 GIT binary patch literal 1142 zcmaJ4dn|U+u%{=`2{+@sQ@>#*>TDh*gRMc0m6y>T5C?6^>iNi?z%mk z8}5E&87sCU^se+WUZgbXQv2+;r5CVVL}TRd8%4yh)XC4<% zFXf$Wl6h*JjVdfSc!JeF=S5&{)Py#?5+vb16`eKrU}}JovEU^8p`hVcp6~*#Iq*1u zl*Sp+)ZZ%Lb2iBW&$3oXLndwD1}p=4KLLud$O7Lt&&wR}Y{$kjX#wVUs!2y>)VicJ z8jKDLFj^f5st{Gd$Z6U7RG4Pe)AYLQeJ*ZvxG;i^Be<>{;rSIlnomaEw8%iZA?5pR zH=x~rAGNs}q;l*fQsw+e=&mH>w7+pLC(ax26FeT0(wdltsYAd8nJDWodoB%!nL27q zM|J3vS;Sa_k|U zFb!uZf9{>RUaVbbWi8y*+PzyX2YaOd=QF|u-AkK{y1#`P+zfDY5pD;#y$Bx>MztID IkE$yF00ALayZ`_I literal 2043 zcmZ`(O>f#j5Ou3GspzG@pxUDyfy3GciV|{Z6}7i2Jw}n`fI}?#gBpVkRsVZuXTO63 zNZ32GZ{K@6Gk3p#e5$_O-Z=0%cg}b5K1ipUL;LKIOEqL*cy?i^>Y`OtECQZlVX#nb?}`?UHvf> zs6&YMTI2(L?9WhItqd+nPzK@GgMF2)NRebEalOIc0U>$SqUew;^K28-Yiq43HegR2 zuvPg?7Q}VIpJrF5Aj*}hhNf+v-yM$Rk_7(PBO^lLuNOHqkVDvm;D-ID5Q0YNA5V#( zg|B%4guE2LV`S9Z0XcEqe#h_>cz0yPL|ov#S6KTc~if&n5zS3#sM?rIJP*>5Jx$MLV1}z z=T*`W-j&#Q@mGdrEdU`=(z;;BkABM%btMYQbA!s9YqeYc0k$&7Mp9LzHE}iqiJC6c zF<>oo=t`(#7Y-&+!++|=T~&>;Yd(~ibI&7JlC_#P?C92Gn@6@nmh8f{o~(OA0!|L! zZUu_HCmB;9$){j;Oywoc-_mC`C=Fn%sU=WaDAfQs=;Uc;8&c>)K#(B|I`mmDAh_g2 zDM%GILbvNuqyhS)N;B}lf|095aqIak)!Sxl7rR!^v&gCnrC4*4UgUSIk(e50yY^Qn zFv>;J5f}ZJ>j9$6w}_7utQweZeC&afw+nV_Py&}d5a5Q*F;uRZtxhLEU{kfkO`f*0 z;`-Wvk4#aTl0)PljLH#~a_e}RDYnde`z6FW#AGOP`*y|%MZjhD!0rY-48fylf?sy% e=_A*>&f~i}S%0hYsdh(5T#Y3M)cBOP|b0PDB&x1EH{;^R8f1Y++!4>HLNibum~0#sQTYCyV!3vseSglDu`GiwnO9!I}{}glPcjkWDMD}0yZh9VyO?n7TXt) zR0>~Gl1f%6)|6fcNmv>~=-n-Fn9M#}p0MrpF! z$kAQ_s>Hd*=6cFp6Z*QOV>sg6H4MW9MK5(5SRvC;P?d2mwv}MT*$MZmjR`5sW3lb2 z;0AZ}w?SwE_E2NmmVc{$vpaj?EN1@Pb!PL$>~4O0bV{w_bWymgd*ztb^k*@F+auhb Tg}Wo%orU)ZquQnZN7uC%^8Z_1 literal 2127 zcmZ`(+iuf95H+Z@D7^3mXdmq=alO7IL8X-tsDd|C9;?c76F0SF$H8%8JBWYd)0o-& zwju3!!*|2e#lJerMZs znQz)Bz4LyTmc{C+{ZVgkvt_Z{zE;UHbh~=^zFz0etq#4}rB&POtNxxj&OU2~V!a|y z0JkCgd=Zj;+UEVDuA60WIohp@N1!9(Ro2FYGkzX|qcM3{J@)B(xzNFFR&C0>3BP`B znrt9a+>r!`F_k*RAfGF}qxZ)%lwd1^>k_;{{pDz17fVuQ#hSR@==X?_vhJAjh%Cxt zlhRArQ+7n8tu|m%8sfJ6_7CKWP#^p;_WA)fE%QulaWpcHM3C>gV0OD}a_NvOEgGxa zJii|fmiEfEwEz)JBBk1-XQc6LLOv#3@QXzu*Vpif`A7=$T#+TB%@XX zxU9q!8%x-!A$IC_aG(7iQ)b$g@ut!*1u-)qW@r}c z4`3wdO&K4tNH9Ts&lvWF%$xb0#avx5H!henj)7G(bHPzwf$6;R9?Lpw32$=N#_2~4 zS{pz}G>0zz;NI^rQEFA?OU+uP0at6!kUKbxg*K7860M5!5j-ht5w!rUMG0*Vwd}&x z1d8WZ)4I#LRff?(RWl7dk6cLRYJlP8orlLKwn|KP;b~v&dt(A_j{n~d)NENA0!=8%{QfyRHPNda@8h{N?>5AEl6q*qbWXOV!eQXE@u1JNTRX7PPuj`RU z%pg^tkp~`3T&;?`&*!r~Hpf%=vYuy=Rb@(9he>*g-(xqS8uVQotP_xOmG#7B4uQSD#0!e!ju|j0YQ0MmRPzFW7W&FUm0S_baC{EZPUi$Kr>s^)UO_Qy@ U)Mee+LxD2kR$L9cKckWJ4-!axZU6uP diff --git a/examples/runtime/shaders/essl/fs_deferred_light_uav.bin b/examples/runtime/shaders/essl/fs_deferred_light_uav.bin index 7040a7df3d45b0da251e91870fff5e80bc359e5e..8e5960d07db65f13c66c457449e4bf84c918f9e5 100644 GIT binary patch literal 1129 zcmaJ=!ET#C5T$LRR`k*@sOGq&lwfRQM^1Zb6}3_im2-?Dw1zca33d@IHg?r7?oV`f zaSWzaun+9KH#2YEEO+-7Ip`0 zuzdksV9>4wUt?WpV_OzaV3n?$NF?!M09G_FGFAp(;YrJL3?pqw$f=ru@neXX&O>J& zMvu?&PBs}{M)$H-B$F{!di+n|yRhOS;UdMu*o87((YXWXBlDc53}@o)R?reIIyVB? zMv67Dlx5;0wv{}AoN_@N`oxnK)-h_G`$p^e6@Ks^k$%8dL{DShuk|G3_PleBrHtG6N}~9q;d;g} zbip7$Bu&l%2R^ip6mm!Csv_igNxJ19dtX7E;SD7@ZHVvT?h~m<&#LzG8G41H`zsoo z6}ixo`GKMSx$iiR3#O)a&%q2$!)dErO0}sJEB-5MXY6(%VQ iG2fd^%`cq$H=~?WMgrkZ0UEbQO5ZT$tPUsY8A literal 12882 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 Kkn>mXv;P62E&Zwh diff --git a/examples/runtime/shaders/essl/fs_denoise_apply_lighting.bin b/examples/runtime/shaders/essl/fs_denoise_apply_lighting.bin index 54ad7e6101cedd08db4ae86b8008e44e402b9ca1..df7b29ca63ebdbc1fe556bcf3ecfd599984d46fb 100644 GIT binary patch literal 459 zcmaJ+%TB{E5DZ*E<{!`=ZB#{$nh_B#>**;J~l^FXp zJ3BMGczwCS+sAv4aOqw3S&lV2@50-C!gZhNdT9zgQC~FaoXKr(v4zGIc5FH*Yt%!^ zPJ@-LRvp-uNH(^%MAyK9>vhxB#;IpG#-;xV4(a4!+vED$_%w?I~*(YP(H#*9S<^TWy literal 417 zcmZvYL2kk@5JgQlAomVvmUb0ckisf$H?2_jJ%D8rH&}8qkrNVV)w_2BM1a7ytkEC+ zKhIu$eLmv!?S;{LVB=b+=rOPn>kq9-t&LyX49}9IPHV#6l{su&zNw(KX$-Ay>@GzN z*(~AP(tTqnpf*M2ZHPbMlzhK+9Fg!AT?U15B?!rXIe^FR5Wj$?sA#C3C!`Lw>fjaT zisoHtyZsNT6?P!Zx)y?{nr*OzAWjU?C971u;Rz@L&aNxdk?z(dNwVp)h*ccHa7jr? ia%j!eVtLpR+$*K*(Q~g?!Q}7#&lCFax`h96&i(=Wo_DqY diff --git a/examples/runtime/shaders/essl/fs_denoise_copy.bin b/examples/runtime/shaders/essl/fs_denoise_copy.bin index d3cdfb8a1cda7f8920cb1909e12328b5387aa121..b5fe71802d0a5e315ce20ffea78d4ca450fe499a 100644 GIT binary patch literal 267 zcmY*T!3x4K44o&T{)6PWfd>(9Q!k2m_X9@lx-HN)rR#Rz0KtdB!h*6RsN euo7LGiKhU@{|T$GMeKr3#}KPu*DMz=A(9W>{Z&K& delta 149 zcmeBXy2Lm^L3=F&14CJ2QDtUcxeo=~nHCJg~W?Ftx z?!*KUo3i}O6ouTx%sd4RO|EJ#1%;gaaFy@(K#+Iq_~qiRsSyIr&8(X}GRhE-nTDtXMG# diff --git a/examples/runtime/shaders/essl/fs_denoise_deferred_combine.bin b/examples/runtime/shaders/essl/fs_denoise_deferred_combine.bin index 5cfd6c41b71ee3eb5860bf7cbdb1333c17aa968a..7da54f79e9a4278f623931046e1bbcdd9f4186fd 100644 GIT binary patch literal 1277 zcmaJ>U2oGc6b%y(QxJav-A8A1kw4-jW*a+bF_=b-EreZMUe}=vCw%tlzJr zXw}t|X5H8&E$V5rS*&Q*+N!^Zhrn$!zg$)yH{};`TkY(oXRV!7y_@NZctY423NrdJpKZt2T{Zt~ zTiXHe&Nfq8RLznl@voS$!gQVpjb#B~x7*B!iB!|&vysJ3x=VaCRJuG@fzE8!Rg<2r zfjhN5o41cmF=@Kp(R*T`FPRcq%10!$Nipl$A@(*Ik;eJ640X4jsj4{~YP>LO$6O$P0%;nhbIC|zs_nc$`)&2t5z6h`duH)`hxw`Vz zgW+&`z8WX+)cz>ys--UbQig+gO*4yS0C;P8S&Liaa=0)si9e}J*{NSlSJI*nw z&RMac=WO%5qhq@C=@{2(vnA1}7nu}`(Xq@{ zv`w;tm^=D6B8|V!%cQ1#5sL-RX81;4s>ai~) ziOd_&)>X2s8QW(CQzoKSSp#{K$B$LA`6+er=1kv-Nwq8xQ|^sPgc0{#x*6tfTz9OB z!i3MGc{Cr>Y|i~4a9ss11E#?&obxbr-Ij}1Whk|WZFyVy+7h%DCEGYdyT^f~1zTYO zgn4b5h+Zkp_vuG2x{`4Dh>A)$2v)g~@N&sb(X*m9MV_|UmfIBE7=weUH_@=zXPOZ6 zxrbVz0A=;27iYR9SY152VX~^eiw;T9Ayxw{?S(X#K^qHdFim?tP!t+P{VpZ(ojJx| zXzYd`L)jRc?pz25#a8-4E@lcMEK{vp8gB`4)gAtjTEd3!ty&p_3`lDhSG6NSo z3Gc>b;AUsaj*PvPT9~Gw21T!&~kugj7MuJ9i+<+l2#0#~ebd2yMLa182D^Fyx#uSP`c2{QW50eR0YtO#)c|^!> z3~CR_HPXYut_rM!+Iq&@=M8|&+aQC_&zDUvZ%x~Dl^xJIwdxI?S{n9+pAe*Ht2>mv U>li3BB2_zkI0U+cH_+BvtZV-Vq^1p0ah4Z@4x6 zIb~Re4nvd_0UT|MC!XBzIIvgyGUFXVvjI5Avg_vAf(Q(AVGBnu75JeHTrU)kbcJVG z^RpPPA0dWGK7Y=5N5rYBVzC=2sP-_7(HO>g03|^-Wfo&+*YH4&?0O(7?x1Vjr|5LOb9rzTTL{;#_RWpKsiiKF#Sy@p6p@^`aeHSbNvu=)$Bl%McgiK6_nGKY$`z{|( z5a*7ZW9ad2M8udF-4JkW<>`+fIuZIv1;X`%$PWX|ff@UsQ}^hU_d{WwR1!?06hwIF znUwn%DmuNPN9otGJz|>bz-d2YoKq{~Xr0#(g^^x?kJ02R;e=7BWB|87MZQH~h$wV~6i^EM$kU_FG{l%N(dV{Y=}G*V{tQe}27erM aNpX1rnhH3~N9cTzkV8Q6K-qpxr;~pwsRHQ$ literal 2492 zcmai0&2F1O5T@;=bzWkROX_af1)Nw>Pl=*l+Dm(jDntTtkibyDHn{3T^u_uLeU;8G z>@r|GaV!V#{CqRt{H$-keLnm9=U-&O>y34`3ARbR`yMxO`ude+!5dz0s~}A8<0zNk z&Cxn9voIZwvUirX4a+uJugFufdMd~^esIY)=oGJJ2SNeDI&L2Fyo{V9au3P*3vzKa z+pLpEh-m=#2uf#=S7BD9aVc(y&g;0$#GNM*$--n!s6G2NBLjdSMHz3Cd{ceBxeg#i zLehL!kjFF+Yf|Q$)zdnzssMuPC5n>H@t3d&+_9j}3Lq))h4tk1kHfn$f-J?R$d))K_nO=0J?enHWm-rHyULK-$teDanvn4WH9wJW6T#d$I(oA=8 z2Mj6go8f}B`-YrrO`q+XR#s+^!vU6q`l-g^Y8raSoMRY&46~TRDBJ;NA=OX9sL|3e z0>eOVCY4Lp*yO!Q1mZEGC5TQ82Up{%ox7)<152lzx7c~N7qmk>=G+7C$$A@?Rje95 z3mZaJyK8lrX7dO$K9aeE%djO96L;mYh|W^yphh|>+3|_Y!tb*1m4Uh|)QzC2 z##@BTHKNz0+{lV4gX%*Lt}MdJ+9Hfdjc^ SN6n(#;OOvR$tZr$X4ZdJMh8&< diff --git a/examples/runtime/shaders/essl/fs_denoise_spatial_3x3.bin b/examples/runtime/shaders/essl/fs_denoise_spatial_3x3.bin index 416b679c37c2932a1bb3827abed1dbdbec984f34..7424fdacc7ed9257d666ccf6baa908fe73b93703 100644 GIT binary patch literal 2087 zcma)7+isgc5T%u>M2`9k)jmZ_ViQ;}U^(qetElg-)Q8AI#KsO12FpN#6Xmb^fjzSe z1{^2q%CcZ)XXebA3pc-ho@HOYU28a>w9_)!gxhePfBdXz_~D$D!9yH9{*J0B`S?N8 z@WVODgL#%@TY6QJ(>zGC?K(_a5iTvFO>y5!{+?*sW*g1pJkCUe{f5OUgo84Tm+;G!EDzV4B-)A}tOhWB=YqoX-VF)w@WMkhcUVKjt!2;NxUi=M zDC4vS2xGw>f+DKsS+-r6(?JsMva;YwHV+HR`YSVa21#q+u)Ec=3U0RH>N}ANe-Bx_ zVCyhWxjuLvFdUV?#1=RfydXqTZX@3CKJ13or+p)v1;TY;#bInzyC-(RgaIHU2A4Ls z@O)t6uwZQV;z+jM4kOD5BO69AHL9+|TIsn^w%m%DQ2|M(#g1C}Up}#kM7awTapBUh%-vN#YqY} zkkUvHnAggAmKJeZMt#l8o=I}B=SaZGgfgNP#5*epBX$Y=k}Zxva_VW|sXaVb@AZta z>s>~ASP{)--`49bL6Pb78eRx$cpg<7&PU;0&S@8nIxSi+5W=Y&m9DcZ?6`_gjEOv+ zSJ|lVUO(K?t*QyM?O#Rk>HE0K(ekg zWW1db^+lj^O9V&PAows1b10KO2>K*r@WYWNPLEAB4a@9+Fx+jL0YnF&tY2K{n|`1| sw9xDEmdL4au2J)!>l9~0SJSQS^)7Y--BX-0?azgVYwzYGT2KQP%b#{d8T literal 2154 zcmah~U2mH(6lImBPO0`6ru$Su^RYnMbyJ$YbgK5gN_(gx%T3$_jR4{!fmZ$9d)@Ul z#t@i>q89t!dwhI+kGcQ(<1G4gdt>4A-a5u=V za@Kox)tSrLmwJ&ZO)AW;>sefS25M*QtEnfQQRO?SGW#Y2W(14&5kL)q5!=SZEKdZ= zY3oBCH4B_cQNF+hc$29EV{q}G#3u>aHA1uiX!^LG@^N!=J#(hsa#A2}qH)G3lAnhb1ZLO;x)ESW2HnX9)On5nnn(1BM>*Uc$&i-NhX!~pe5 zbu>I|{XihyBp14@<(Y$Wic3~8pwykpwGX;SUGj^}@t?5?X-&9Yz|1ko08feFzZDgL zH~m5tHtuJk2s&_n4r(m->9imSc{tRy0IMj>{4f`KriSe>#P(E&Q`ri~L*z+jy% HU|{_P6YhT( diff --git a/examples/runtime/shaders/essl/fs_denoise_spatial_5x5.bin b/examples/runtime/shaders/essl/fs_denoise_spatial_5x5.bin index c2516164c7ee6ab040de4118a2868a89d4c5f27e..d1d8477ea384f7568f62072f8c063053ef8a3a4b 100644 GIT binary patch literal 2155 zcma)7OK+P%5T=o;L`3}y)t;gywka%cIqjuY)O#!S5Lt*|>>y!4JRF=T|GUS|>|*nX zZFOZ?FwbwknH}zb{k+aTf4h_5e3Y(gKM#svQ(k2I(uKjHsJ^zlHD7p9`N$`Vn zS^8m?WCgwo$yMp6S+NO{P6S5FD6gJ6$=^#!%8MwB%Q#EPCR)bzCMT;T3#z%?DW2l> zQ%>R(gmRt6D~L;ktPD1J5*6$RX#vd77zjM)EI7Qe!8Qs_vM1s}Hx?%h4zvKuIBfxf zGb3BSikdLXilsJ}lVF$C6-}}*sIcmDZv`xMd5q0VKT{)u3k zs`9~tJ|dB0xwe4dnyT5%I&Po~gHviI)P{4y-8k=Vj?;@qw|wau5;lemDQ}Mm-*ezI z*XT>d_%PQLLQtC!zMCX|r-vPeOg^AEIPmTs1pTRGuG7!eR=`|WNZ}R}3U?YN(Pc>a zTs++oi$5U}P&rfl=UKp&zp%+f;jMe+|JXz@afN+bUn_Kku&ob;1B9L~uyl$&N{@A# zK2qy|)FOMNBD2RhIFZrQ`HQtjiU~Tj_!h4SrBF97(o)FH4LQ6rMbw9Oc!r)R@tKF5 zVc8u{RNw(6E(9d+y)w+wDo*QYsChdui2)8AF^q*3;Tog8H3rvo0{A&w6cRxJGqFHm zJRDmY%#6Al8neE!Ybfoe!OVCD1J4)^JdK*1(pm6WQrsuA-iWqK2yrTEqbTGH?8%0D zs>hFGI)>vqmTnuCW$C8HY{PbR*NtYHJsmEQ9bY}-gZH4rF4{r3TastbG)&+_Lzh_v z#oFGK(C&_iuL`!CBRINBfe+XyQ-W)Cl=Ow?pyMlzoF2Q?AZLpaVUT%03_!FGlnt8; x`u#j$BRc5q_2$U&UV~>Zw3rF;Kl~tx;WB}0Tp$$r23*FJ{1@xk?>AYN{sHYoMbrQQ literal 2222 zcmah~TW^~%6lRsCRjKwDrt?&p+!jdFZc5XaPSxI5X%AIoxrvjY5kOoLXx0C|V;f@# zbVE^#&*k&ybIxZTe*L@%zuetg_+K^<>`5 z0&jyr#(xDhR>qH+!lRfyIn$+aC2Sx0Ja&ITNweFf_;&jw@p9@hmBI=Q==gGyZ!~DmoQzmAYkFl6Wjoi3z=Wnjw8C&#YqB z2RdunGJ0KYQih2N)0@hQTTelqjD9ouvd&oLdr@WjT{z4N7R?qw1%MtxFfh$xj^!k} z$-{brJ)Q@+RKR;~SGlJ*@1#%voqpBazBW+lK0!8=lLAz#u?XX4c#4;+8il211cw6DgRN=xg#|vV!RCwvfLBy z7BI67GQe}p*&js(;7z~C4C2CKp$OV=c?oJQ&S^IwB=TUOa{*Rika|JJwWWe>F~kv9 z%_*gc>j83=r4Y=e%oTN88%IiOeORMrY}qUk+Qu$Uu!}Bid7L&hYRo`aMHhgC=aC^u zMua^lglN5wI`!V-hPQ^O;a9v~b07{MO=iOr@fTA3`i95bpumihsExiTJc8k|^6}aS zvJO)q`T|76=G-gCuwAN-OUxdMYhoxbv~t&B?TdqaUhn|@E_up%=$5Fc_Rtwv zjzpJ!+f_wARj;~ssY#ibZ7S=amaS*EG2C*He&57sw2fthjYIE+g%wR#B)2|& Sh}l*mA&!ZzzMXHqp7j^PSdx_h diff --git a/examples/runtime/shaders/essl/fs_denoise_temporal.bin b/examples/runtime/shaders/essl/fs_denoise_temporal.bin index 5b794345471e29a7a56fe9d71d78756fe591a919..f4d21a81cd181e3d3a5833f46b8cd8f588888a0b 100644 GIT binary patch literal 2062 zcma)6OK;Oa5H?(j+yndqG)KD$VRvoEF$r)0Rh&2g5{Ig?jI(K1a=el4q)Ds(cV>4T z{79N&MTs->&CEB?%b(xQ<=am)3!gK~UdJ23?|$&Kdilb#@Pp5}5&q&^o;A|5GEQYC z3k5Q`S7n^bVwq%($S&gz&txj9T_b!`#;byFgj|>3d-&Il>Py#oa%Nd*m5Nfx9F}}8 z*2@(vGMQ9UyHVVVo7)wL9EJ8e7Yp8$s69ALPDa1alK4!yHADSwj zQ0sd3^=+2jBK;3i*94{Soxu`%^NY2-o7 z!ZBJoaY#nn-920Y8zK33fHXXZ;(IR+gE-O_POAinZ@BKe*o}M@X(sgb5ZXrgVG+LTgC)G=z1%)J!^oysnoHSv}So z-D6o^X?|GY2nK2{Ouw3L>ZQZ}wrH1EnsD2Oj)EbmMn7Yy(`Xx_%@7Oxtf5Y>ZFtJY z>{>kq9`V|3GaKj;-w0!T!~Q5K4(fg(Q0k!+1qOvz5gfdcfC@F0WNO}K;7`HTyZWHN zn@z8yGp5`-&RpUY<2nw(X_l#buZB=JNCmlepV(LzX2>ffAtmE*9Fd71VG1;g7@dTH z3!fEh_@IVX^`bK&+Of$<5yihg43OO+BYnqugw$|iI`yj74m{;Ri92rDV9@+eWnPJV z&5h*o;Iet7-U+b))dNfrnR)%PqD(F0QfwVOphLs{0@N9U_r?N`lIi1w=!epXk%&#A iARys{GMutD37(a_*Sk6h251Aj=N(BX*wlWsZR;=ZWIY%F literal 3910 zcmcInOK;Oa5Dr|5j0F4wv`4!QAztTIwdDe;IQ0NX99Nd(rk0#KvYl6}{t*5xv$Nip zyRm3dqbf~y-t*0V<6Qpy{YqA2IXGjDyHU4xmHkBF|PLyVPac@-~Ld0NtMq$$xY61BQz zvS_!|s=ixAwBgL#6xp0Cg5WCjD^?;^@Uszn6i3ZrZ5wJGZcMu_5vPLy5#DnAC&4-w28fG(z9LaUH1#5$+w!pd za{0r-xKH3MIFJFtFEbcJ27q=^`toFSzznBDDowaq87H;NOiYhd#j#Oec)`#dUS`wm z$zZ1=+NL;CQg7xm-J@xHP`Rcwn?j%D=hk0S+60zGxE_&_0UdyL;RP+tI*3m9qS2z|JB9p1SPxBAea-G)^`rhM`{YiLMf*5(F*Zv|^p&0N;>QlzfN zGY!GTyr_wTFhQf0y4g0D%BoRr6%9^Rw6-@9i1Dr} z9iE;89=#oHcuXRu{N6kd9=LN)fCstPf@jnT55JGi+&kgnau+-ioGW<7ZFqq6+6^_} zae#IL&dgQn293AE04)*=$Z%(%<}28MUIIhj3IoGQCx$L)HJXz{Xto~(n;IjN-Xp#>pLZi+ z3;jEq5wf(2CPeNa%!pG?2bw5%p=mxgfKrPv`D4OMz{z`Izk!Oy;7AXy?1$y!h7%WS83EsXkR4ow{X=quO__the2mu0*_At0CVU#|H3 J;lcBIe*uPUx*Pxi diff --git a/examples/runtime/shaders/essl/fs_denoise_txaa.bin b/examples/runtime/shaders/essl/fs_denoise_txaa.bin index 7d9353d5c15c7787ce843f77b58d70d7780e4a6c..dc13e426577874aa3667cd1a4a3825517bc4ab2f 100644 GIT binary patch literal 8183 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 c{i7Fyj$VYZH_80)g~TMIzJ~-+6WI-Ehvcc#I zT?@BfCtBMm7rw*7CWSW3a8xpcvFOz#5nUPNtPvL+dfuQE{has;fe+NV8zMN?)l?ju zsNd#Yi8rDyp%vP2pM5i+x@8kSf+C8ELJ|Go6knED{Y~}rtLHzKJhPo!JacjEIAPY) n<;y3hk}o`1NAdL}+aTLyNtA}0B+Zg-8vCS~)o0@VFy{RNgcoZR literal 340 zcmZvY-wJ{-6vpi;Snm+$aza?Gy0W?{qWc~|mM$BpN2Y0i=-oRLC85p+`#3xMeIGlV zjw2jz*ACUd85Ti^2^x}iQ%&ipqO>dh(5T&V9RaE^Cdt4F+u^(V8tEX00kCl3?B18;HkbrdoyO63sufL_YUVH7# zE|`x*K|bKwd2iml*i7SqVY=l5f7eF4D!%`ya#f)xDoaQaXC-y) zpEiNVIAXkFG6WhUD|<}oAko>*QzeO*FCZ0~YmQY)>%N!OM7_5}!7xM!Jz-URb6a3Q zBDb9cyCK*uigL&eB%D$M?#LzKF7$j&&}z!yeG1Wc12KVS4CGK|+OY`zb8WvD6aM&$ozMYNji2^g;yCstHIR1JZvwXlR>zxH;pJ6>$Ui2jE(`FAQ}2 zgXZaf8#WVWR+cj~ab%l+k=PB605{}3Y-6gqL-WrA@BpWzl+H;!Lvl$D>IaQ)YdUVd z`Ebv-z8|_?3+{4HKXM&}V$J*zx@R1XftIM}GIQ)Px$zha7~6;ta{Yk&FwcDsA8KPV y;J_H@7EJbBZ$)t3f#u5VpAXAs1THb7HKPYyyK-gtri3fP{Q!v#|JMFx+tz=BBAr2B47h?w;^`ZI@eU{#O z?X|ND3j@TdWyKLQ^L;bl{BZs4^Sj@F{{FJ?^V)j5Tgvz@3{vZrrM~#VN1HTDWZXV_ zzh5S45XN6+CX?OSnPuS@KR@4C)wrs zyHD)=KX!37+HazJ%oTPr*~VceK7py{d0SOjYr}MX=oEJ&Zjm;P0!U=E0cMY$MgVd8 zSl3n|e39EFrU$g@JlSHoOUw$u{0|?X3W$y&GqTvqgWxztiGHX`zRyA|ftdzOh#0Po zZqEiX*25Zua9kTMfa6a;5#P&rb)I5n~|{Dkg*r$8MZkIn`0Pb zb@9Ga9t#*7Kj9pUQnjYF;{$3(_e$<2w}#}BkX%v{(IxTvB$~A)@s#^1k_91IP?C8I zFm(zW&YK!8TgwbBCwj?o-J8YW?n!8r=LB>~q3`2V=0;Yocd?e7bHt7|hcMfPdeReF z0Mm0`dn_g9F)#R=|jur76& zCEY`=7LhU5MRY5~G2nOrY|}?z@@~gE_po|L4esF)+o$Sa!Vwd^detA>MkE_6XRgC> zm^AJx##cml47k@e+eakV!S1V@slxRXPVq#JtCU^>A!4v(yc$@RxHPBUUdv>&69^$)tE Bgu4I$ diff --git a/examples/runtime/shaders/essl/fs_fsr_forward_grid.bin b/examples/runtime/shaders/essl/fs_fsr_forward_grid.bin index 5e61b76846f8b010cbfb4e220fb9150da5fe8ee0..6d5d0468ff3f6fbbf62eb2702b99376b9f3c4772 100644 GIT binary patch literal 904 zcmZuvO>dh(5T)sjs{dh*OKhY4;LAl;4w0fBBjs3GXam?;30Q{9#%7N-n@CU4^Q8}y#N05%fj=?`g%x8o#n-&Y-G8+xv?y~c-EgSt8VgC?Ub&d z%rkW;YuFT8?qhpMyr}I<4XVPReW=t%HzoA3W1f02A^*YGh*H%Ua7^}jn`+%;ES{tU z9Fq#!WHF6<7{8YA*e>KrANHissoWc(E1(WwWZdIAnE|5k(?+8w-8#44`ZhM9q;AEUEs7ooQ{aJcTyp#uwhG7)Z$X|-kcN`}k zv3K4XdLQXc7q|UyI=ZG$<1{uEkg%?}_eGs^)YiWzjV@5(A<+Pxu7a)I_H>5D$W5H? zbiNQxEkho&O+rYme-h)&l#F&{&fK5`;qJv2FAO3PGC$%}pm4{5TOb7g3h7K(075Co zdYil0El}6^2CJ3%R0bHK$dAAXt9qaVclZi@_y)|q_Mk4iEQaA$7z-F%iU{TS0s1$C zw2);@GL8JGYmT-G57pyF=g2}$|8C2I_?d(x5M`@9vD*JIN3)x{KuA)l>S?8Fk1OqQRUtQ!)Dqx`d^Du$&)eV9Td%$L z*KGtXCle}8*?dj9WWeeu3;(^6%5@ki96T%VkH9v&?A)$?|uZe+Ej zTe-Yl(Jr5lX_r>2E=6(S9|aQxH~D_9RGmei#N!KpTge5WG;Bfx5&zJ%JA-IgxjK!n$P-yHObUVKcOas|~X$f@5WQ{1fCqJV71oC^52SJFCC>^+7go>pnD^~(>;NTkk3rg1Leg!KaNK{ZsQucAII2Y zPMxBrfNKpV4>_jM?wxiU6L#D)Cvi4NWJ5ni#ti7rV7$$tonx72a$6dICsxzB1AWf# z03Pvh@DJ|7U&ff}#!B50(?06_7>vwy!MtG``!b`&_-*R~>{-Yo*vx>;3jrA{Qya3j znU3t~86aW9krvWg1Ziwy{AAcafOzewWAIpC5MbD5!gE6g2%k)~Ax-<2MS4|>^uK7w!K%Xrds zY{Nq+$$$QQ=TFzK&sV=ct7}FzW0!4`8g1+aFh+~&d&XF8vlMq|Dkw9BZCOLEjcg)* zY;3XE)_@g>ysa=dwgj(rS-OG=`*ye7kRjKyA@5`uSA&ZX Uqx|kSo(JuR&)YF+#P^)DKe(@ii~s-t literal 494 zcmah_K~BRk5Old9nICYPQx!`nqM^5t6R3hSM}#61C#j`4j@%@qp#F+a@CH7^nkJNT zVP#pnvoq`Qt{(2rKHrz;jAF)4yELD$NKJ`iZ$j&t?}1T&T^ diff --git a/examples/runtime/shaders/essl/fs_hdr_blur.bin b/examples/runtime/shaders/essl/fs_hdr_blur.bin index 65ab1f7e0df375f83a8d17cf8b065e0f2bdcb7e6..82381b9f4f2ef260b7992afa2596d4e072a2f9fd 100644 GIT binary patch literal 1000 zcmb`EF;2rU6o!M?%q2XgfGYdhj%`&;po*OXR3S}UOGzBLNohgcje9V%asw8eQkr%M zid3Gw`2F^$@7d#r`-}IFug}2OS%8+4DqY{&%sRhoman(-AShj$n5D4=&eN%>^AgW8 z8&@OL1`9J^l-Lx$iR!}4tjqCFZyD!hmO8k@E#4o>;*G7VFtbTqHRKyi2H1CYw^nJw z@#B29o{U{Q-#U$uDcTh9stVN6;Oy?udK$l{HhG$EFAe=mlY4$EJRm za93Wjs$CkkvtJ+B`H?R%83J&i0+Fh&(qng~THBU(|;1*6c*2Zp~sr*YWchj7A#lHMVrkp!S5 g(u@iJWW9vgUg$&+Z;iS?zQ>R8R;ZgZLazt~-@+9ucmMzZ literal 1015 zcmb`GyH3L}6o!M?%uAdx0TlUGr6^(oRqQ-K6q=A)vg622(iX%s@&Jsiya5Ytn@cN( zAX3Xi?BD+M9rHLS%~q>U2(_ z-X5K6Z4w-!UpYU>$v{pAayF3j5LLN&)<(fHR)tIry@$RMds~YHR4j6EJ@kqIRGNrN z?F!*gs>13=))GMKRkQmfD-&5Wfc+QTf@=#dE0bEf+vBefD#adL0`@88luW31e7oUX z{eeUL^`=2#65O!B8^d~8or*;}FG3k3Q$E6r`mNV^7VEq)$80hU#)z>_>;y30o3&l> h|EJ`=*%7SmVB4d8+h#JFnK;}1%rp1X*cwL5t*~Mv;UA=G|_(ELo z!y>M}m#KYkAh(9Tn61fA;Ez|1ljZR;*(YX)(s-4WX@=HY6BP^hv~Ztn?lY9^0CdY; zvNm~&8f+h>**4DUS9CmaG0dnF=yD$7B}YeRzlgl;A+$ari)7a(09z?~ux^*ez zx6#3rg|{`!sIaa+Av{5VoHlTDw^>)=O&)F9bleA%tWX*yJ8$Ctb`eD5ug)waM1c&P zQIvV?9i7gepF3Inzl-DUuKKvMedztkIKK6(!zCd>#|e=>A<4%H(LNz1#|g1MA+5&= z@g5C&vhw4g_OCAcdxw5h^+}$6m3juQ-h=4@MXBFkIiPx%oM& zk$?Xd{u5m66sAu*RsCv$J~W)=7REZF2l;5UnkE2aP=k_jOQ7gRE-h}Q8Oi*_iUk8S8>JD$DFJbKaH z-Wul6#I^)e)YvDsjcxNjeW+1 zXUdWfyQ0Dx5|^#YIot!5uxsiJ(-K+uM6Jv^8^u$icxR&UGo1iYjtFl0V{sns_F(bQ zoD?IFBa?@gSGb0(tz1Ho6%^A88r&eT9g7)mfx0oyMIc#xSE;Ws`udFY45NU(>4U71$p1qhy2aNXD GG>v}&Qo#uT diff --git a/examples/runtime/shaders/essl/fs_hdr_lum.bin b/examples/runtime/shaders/essl/fs_hdr_lum.bin index 6d2155a61e4f29b09a041b25a5352632bc366b58..185adc7794206038e2e12571e4143d5ef9cbf931 100644 GIT binary patch literal 2472 zcmc(hO>fgM9LB>=5H5TI0psPa`1 zY^rRYZ*#vUWwyw7<%TQ^pVqVR+;EexZZ;%eLkxH8eCex_9JOs)Zi=kpU&+~i*6Fj) z=91h2{b2eUF8TUofJRRC4cgrMYC&gVk>2`U9Tk3_)(zDsLSq8uJV274tK}iNs?t^a zJ@DK6d_l@IUq^BHCnTsNUpsfgD1{B?sCQKsok=J6XD08?ko0Ie`9A+f@jFcK?r234s9%iKbjEos(WcrM(9cE-78MS+hBwRG#79DHh z>j(=~M0Cm-*M>VPnGnWl?U;2^3C7ig(5YdHDbA^+LL2myT3RVg+eQs%Mo}u1wahuq zlr$FIHCOS3G+O{m`Zu{G*NAPA!ZVd*|x(-1}l(z*i#VN@VvIzSLc1+umS1mP*5`)BX}%yh`i zHaag6hU~7Kuuchq%u|-rCM%y9tY~w*&9l6~&0@tP*tqy~!auxCpj&fmXnT+k$GA)| s94Sht^z;)o3Zn8Dnut*}QQ`F+wg_JBtk9AxW5I;E{)S=j59qoG)*_HqU^J*B7|lbf&^p4FwCS?-o4jm0H=yv zfyKgL`#U!FJ=gb-51;s#@81k87sllw;oI##YcD<<20mEKebQ#9AH3v^@xc%emdlTZ z(WT8xvCHAP$e(NIvNeTHbX{}aY}}Q3*cDseRHDU)f%}UDPgB!At?Dvs=uenLR%XYG z4OD5d1Isr5m;fa|*03#k+Ctjp30V!_B)Y9?oJvB)*P#w~fHP?iO@?f1g5Q9p%n`1q zdAU!{>BY9+MSBX`n~x?Mw6CE3`Dm&^GX>4&qdg5eP|(4Aw68&j3ObyRW*T&)priTd zK!c7IbUYs&YS08jX*}4(oez&DxQreoSeAuM0BgfrjEHRQS*}9~4MG~W5k{$~ zx*;VYvoUan*upsZ4OftzYT8qfGc_Kui8AK6Hhcv_Bdka%+qN;>7U+38J6IklwC zD7p0QKs8YliUXySj3lX7Wt-wq$y|g0TN6u`*vx)A$R%qmC^A diff --git a/examples/runtime/shaders/essl/fs_hdr_lumavg.bin b/examples/runtime/shaders/essl/fs_hdr_lumavg.bin index 26598bab2f85c524686cc2284e0c5f51c14d37a8..f191d08377ea3e410d61b1dd9993ce9cb8531b8f 100644 GIT binary patch literal 2379 zcmb7F!H%0S6r_7<>1Ds5@)5S%6hAN+rR}BFs`nnN6`~2rB9S;EB+aVozjq8-C2nFQ zTPVtyVf_63=K0~r_qXcZmrowXjrV$2sKsJibvL)3hX=#o7F~7tsv6aLuRQ%=+`jR= zOxF7pY?#}Yt4&k2^o^b5r~h&G z)huBz0sZ9ZBUI}3Q2;NA?R97~rP_Hk^_%ip?Yf{*v$E4seP&U}Fmw7KVZWA(L-Ej- z%YHx5+pBucR%N{oLjRA?FoyX0wTp~H1xs|hwhB&x-k&eb-k)NO9w&$AaC)I59d)=x zCy(9YA&U-=gqu)o6XKbhP+}9J+)YT>gc8SGr#2zsnC#3ZlsYC`+JrL4Wak$`y+c{S z`+^K!2I_orV0WxKY$ymc`VB-vOyHmojFZHl5QQET(qIBzV-D0jJ{JYDQ&ErSTn$Ia zJTu6EBV@`AGT;a~F?PoRN65n19|s&Er{)F$N64AELBMO|%QnNMqlvh!VNvAhB5rG0 z#2szKZB2{F(MR0YwJ3Hp61TN2N?bF3*|(0KB%y;EEZG}W+YKjblrP}5QWy+}LpvvH zI6~$|`Qn(y$Yhi+PGXE48|8~+kC78&gUF|ae8-|ml#)2F`eWu286k7Cs%~)kFDWRH z%J6s#n-@N4`eN@H?Bmey3Va^kYxUz#pl8tRhPH=Bh*wdZ6BntJB9BukQc80frwJC4 LoCMbT>-*k6%oL#> literal 3294 zcmbW4&2F1O5P)e;744xW&ez5VJFUE8+Qu`|sc0$oF49Idoh(ueW14pRe=H)jP+blMZ)1-sFd`vXr&+%26jB zzu!8}Zc-nM3yxxBiiQ1E$C^He93m#r3s5m<16b@$;V z@;hh0e}Ii5L$1kCR~cU5GPIEy8f``q<}0lG3@;EG+87OuN}~u9SeF`JU^TSS8XCPu z5hk#1HoQP>XyZ0C%8erb2R@CrZ70+HhDvbW=`V8&wEM81;htydra`5eXl z3Nmloks^LfKrlgB!eZioF4KfXC(khr=Xk=bUrcJjl{P|Ikty5)j#2h+ zpzyya+#1FO=fY&#DuG;{Nq`!Ga!P;#zz!Aj&E_0LxgcC6soFBam%eX8R&&-{*MAW;YL7xX*lC51woC3 zTm6>;cowF6-1LqfCM_ntTUBo9y=P)_i585aWZLa9zb>ZPiD*)PkzVRK{Q6y?ZCGMv zC11D-aJ%-Ng00D=cYjP2THN~`tK#l3y6#Eor(AGSPR$6Q`3Ztt3R3}(nRSeFYY;!> z=9O6z5}mYkWd-kxHK*7ie$isd1PJ)t0fhgvk50K!NSt_Y%Fpu2Ql$%KcdzgMEEC>4;^shGHLv4-FlB;<<7vYaE4E_LkOMBe_ literal 1809 zcmah}OK#gR5LL4%5O>!T%#w<2Mn8W7Bi#fDy6UC}5ENTc1W1-3|6~`vK=0D)^gNvz zk`nDCh!MmzIrHYto6qCV?_Z{Wzy5LXbLCv`;%&7~%cQ>gDE(`5+zcwIGRQY;2|L_3veL$Z zxu}w@2@+a1}UA!JuW*f(mDNS)RxxGKf>l zaVpyb`cj?(a~}Z-aQ065Xh1vSRG#obFe70E4dL583F*3+%PT&pjjiojGBYdYjDUrf zNo?}9KBH*+7`qs?zkv{=u#hn9+f*JnvL{0quRS?qlOZU@#j@I5LLEPZiWJn8py;T1 zF_z|Y(jaeA2{Z>!&Y4^&{m7r(g{(496ZMIacy8%1=Oz=ZfXYDEVTSSMDt{8%lO4x1 zZ>roo-qFY2T;8{1W9uq4Ud6WN_D6h2Z14+dj7^95oOYS6@?FVmtLsYNBlBL6xXGSk zpZA46sP7Ryj;YUW+a3Ks{xGpCo+vAB8HT}-@ z<~~;XdorL7z*3@7T^&$foEHqB9YP%235vsLyiy2_4YdW14bE6V)l;)z5{>}#P3N)C zi;i#42E@0wj8B_vndXHksw@yaLq2J_WIFwOt`Yhc(zXt|nuUsL vXH6TUn|b6i)EU7o1QW{NYD3>cW8+EpSrI=rN%l|`RfA7j7png6!NBI#CI^~vP?uMKSEG%mMq@;0Hk9bYeFeuu)vJ(>?3&EEpvJT?cqE5 zeh$lz_d9j}_F`dOTQ@@?`*C(BG3o(4KzVT{1UW%Pi4M@HggKS|_ zE7s@s?_evcZ4077&>kAGQJsV%CRrbWG0Oi>{zu>wdzoBuf!T86Af|fPaCj~$xuFmBF#_* zE&8G3z}^KsUGTAWym2}>PJUr&{u>lQ z=%Z=LMUAUelt?z37sGg?t222MD(M>qP6~hbLcWP(DANI+^k+!;*ixeP9psw^9w4Bp kPC3`9{4k?IoTO=-g-IGGG|AF1iD>+s1~f*iFWa_$0NBx=wEzGB literal 712 zcmY*X%WlFj5KIw0H2sHak4_%}oPdyMdqG0I_XDB;CRnoL$Rr_9^&|SnU7I8r%LjWi zJ2N}Z>ig?aJ$=4=xCY+CAt_n2tk%rC^UTI|UnR0^hIkp;``^Ix>QtY2p241H`vPjV zp-`L7jZ%6$UiekccS=hT>R7-bm4#s1utLv&#auXKTE<|N7JjYx7G%nEAc6nm!&N4N zQWhwlOcq$~&fyt8U=pIPQ)^CGB*d`=&p^X*0B;5x7;tYt?zpJKLBk_bjBj{p*qn@7 zCvD(%NX(!oi5!y1fLT*kn%MwIpTH~R7*Q(tnGs?qM}sXd4UA4;O-i=qm9#1M3h}M3 z&em+6O#9+asI=_3W{#T~y4f%;h)@|NGHrn10DxiRsnw3c=C$jM!c%|%=Z>bVt5&j& z!|BC%M!=eacD31UgUOWi-{1u%bZ%Z{1avxW-=%dDBh(o!6Uj=a*-{CmO{$ka0i*c! GeeWN1jn_y3 diff --git a/examples/runtime/shaders/essl/fs_hdr_tonemap.bin b/examples/runtime/shaders/essl/fs_hdr_tonemap.bin index 66432d2d2ed9b4f412c240d5a6f09ab1b88d459a..aa77fcf999bdd7bd63aa46c22e27fa7b66daa5e5 100644 GIT binary patch literal 2630 zcmb_eO>ZJc5G7F#G5HgHoblq>uI{e>5XvQqRypLBAAnely-2_y3^v{ z>F(EhUa!T{7=O&hKemh3bd^oN%(o}YK3(;CtMzm;dzjTrwV2+{wu_azo7dybu-`g9 z%PKhW+{Yx!!Jyc|93#gu|beE)^^-IH%s<-|a^4 z*5mtJBw&B6XSZrGo-K>A|5sn(Y1qs>jI418gY#^*>uJ&QIygCsE{ENHR*jq^?33-) z?)js-R@2?e6h$^X;iqA)0PaSSiTLs&fWuBJ0Xm6MtjlS0pCGUI*mhfQ3gEYet{fT1 z-X7#hQ+jqINd0W^6Y)2B(b`LpjKY>mWYnPTkywj1MMh zN7jbqeWI8gTQWI)ASO0OJ8gZyO6Oga3<6CDLrAVI$4Du8VizKod-E!Qr~!Z~t=_g2 z2ql8qr$K8(21?f2q;-tIW~0R!iKEd6ctlA)$p^NEIK&i^OGok&YYXT}rvUVf-7)DC zc;G2l0BFjyWJM`duGckQ5mIS;??7mh^9Xcw%!M`9OM@2sMMvFMyAmW6lR0Jry3SIy zJ844vJkx|iJn7~kmo$+F2{yXmg?MrMl%E)NNIH;qdqzt2My0B81{Z8Vi;=g?OlTi3 z1&(ogqxl>atW7?G9OYUSQolDik^FqyPNM3$Ec2NfzqmWWgl#qQAtF|0z8Fd1Oq`dE zBOD2h0OJ7B8()#L-3Yl@BkzQA?H8X3Z&NsgKWfZY#%afnl20ZjOWsK%4Ac!(Yy*Kn zZ?yLw9g|xG9_TVfD8Yeb23-jq)Hp?7I0RnD1XwMhJ*Na2CiEz?KO~_l2CqqnAV!jJ zt-_%^SW(fS6I%-bW@u+}KoD5zpoj=mft<4xyz$tUoI|MZc<>gSXMnI!KmrW2&5H_@l zITtX^*t0Xqqcc%qAo@a>k5B(Y7;{8J1|p0WLxLlbMH#_yCig4QnCgJ$o5I*58X3Bb zp$<|ABifMm7>5kHzJ?rog!6525VTVIbE`DKXLIdE7wKoIgHl+#BBE3iG)2a=$gphyB0% G{oa2f?XZ#n literal 2726 zcmb_e$!;1!6eLj&G5Lu;&UhL3I*Tk{;>gM&x14f9*kFtV48mZRC|{amuK9ypQm<#a zrvW=evJpbhy;Rq$uJ_v4Uq65N`RmW`7C!GDxE07QXnjA3F2?>Z%-- zGa9J|-`l}2i*Yk_WQRVE7QwQscB}Q+ovnwH0lOa#?x*are=FG|A>Nkdtj90fd-FP& z7YF9$fq8XcUSG5qli^)C8#nwk^C~p658d%})St;utdZl{S?KcY90>$c<*>)b-Qk2q zar=9lu~E6S;wbiQweBG8W=OO7cnXy|NS67ST{4I`U(EX86g8wy1NC?u;wZNlqIety zoXFuPtM!H*v;Jx-qX=tQFtx;lG$!FOO`I_ybHwr137#or^(W{jm_nd`@dS;IAqX2J zD zKM;FMZGWFx0G3&`>ZG^ENrK1;dhCf<$l3r|LRr>}*0}I`Jhh9gF%vih&Z`WW;V(L4 zKfgRUIw#Bk)K^!sirG1fZbzssw(U2KG@KEgJ$2G}Ffbs_x7Tm)GG-@qkDQB2tBNxj zC~`14fJs=a#MZ{*Ik+^`)@1Y8@~hU?Dd)R)K#CTWtqrXDQRI&G3PLHu^15xjH;aTW zrryxt*oz2oYI%suSp#EPh65W*dFPm>x6B4N9f6+9SQYJ*mP(}N+Mu$|L}FAXRE`h@ zSL8+s4O`nJE%zE=yRfjfNDG;!bu)L2R^_dQcIM-O)1#z!jr>50$nq%u(-$yl~oRL z2%zG^{{q`AUkyxpW_ya+r}i3XXg&3Pa%YYgxI;JG zw$K{;*2OBq*Ih{Tx=S*C&_^){`;)h;+Cu}wW0=BvwZUk5w>>%Z@XZ(W=ugWfi@G-t zt}RyRC^7fQ8Z-iG1t|Z$usUVj?+q7d-Pqw@ei1(Xg0u|Y3$ew5`nk_>FzQ^-x&!-f OCPp1?p#5mKTYmuqZxoII diff --git a/examples/runtime/shaders/essl/fs_hextile.bin b/examples/runtime/shaders/essl/fs_hextile.bin index 4ababa30b259829565089a7fa222f24878c8ebd1..57e0ef0b1ee87e50b95a9534582e82695129abbe 100644 GIT binary patch literal 7161 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 Z0A~z~fO5b9yFUV#u~I==Kc1hT{SQufom&6^ diff --git a/examples/runtime/shaders/essl/fs_ibl_mesh.bin b/examples/runtime/shaders/essl/fs_ibl_mesh.bin index 3816bf065728512783fb1ba66558a215c968ca38..0f8e21c442a9895d74a33d50bd677401ef0b37ad 100644 GIT binary patch literal 3106 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 diff --git a/examples/runtime/shaders/essl/fs_instancing.bin b/examples/runtime/shaders/essl/fs_instancing.bin index 9f1d90f476ea73c88facaee1aff1f4710bf765f6..0da8d07580e757a84dc277a36e3b2e58deb97de3 100644 GIT binary patch literal 191 zcmZ<@_TXO9{oa!S4Aub2f}+&q%;L=aJcZoUl+4oH0)@1k{KOJ#E`&rzW_m_}LS`ON zkSiy#GQYG$BPTyOu>_>aR>4410VtvXQB;md>R+O0ToS&0lWX+YChb&tb mp9~T<02)@7pP8bNo0yrWp~+Rvr2qt|T7jk`RM&EGF#rIj5k4jW literal 93 zcmZ<@_TXO9{oa!S47`A3Sz=LTW?s5NMrL|OfkIhovWY@jd~$wHevyGSS6O~$ib8H; gW}bqECRa6=f#!4^qnEf*I9028Gf$N&HU diff --git a/examples/runtime/shaders/essl/fs_layered.bin b/examples/runtime/shaders/essl/fs_layered.bin index 5641182ad5ca627fe9df88458e687404f2703cba..e46feacd262f15906569d33e52283af0787be505 100644 GIT binary patch literal 385 zcmaiw!HU8#5Qe+g_!4tW7b(%E6)Bzs*{kefk0sW$4zx+BwX}*)uutb3nM6f|#r<#d z|MPzXv-8cUMQkS|(o+OucX=ZI^PIMZ#PzhAjCno|% zuT?|075bJ}s&>vfPNdM{c8=L(B SH|HM^_Z{C%)=S8l5bp{$2WwgY literal 257 zcmZ<@_TUb@7~ahQ2Je7mSz=LTW?s5NMrL|OfkIhovWY@jd~$wHevyGS7pi1hPJUtu zP&TzP6)2UTnWB)Jn3<=bp~+RvrJ#_Tnvz+X3pJu7w*aU&-q0E-0b}cxE7&R+>H&>K z604}J0*Y$DtkeVXwG?tQD}Z9D$;KK$^*Ra$dWNPDQd0-yL}Lw@h=~r!M35-RRhpV0 av(t0p-HH;^ok4y8nhmqwnyZ$Jiva-n|4aY? diff --git a/examples/runtime/shaders/essl/fs_layered_blit.bin b/examples/runtime/shaders/essl/fs_layered_blit.bin index a729dd377ca6593b40b52c1235a8bc044db1c9cc..96026a0b415c24393d87c841708adce41d49d05c 100644 GIT binary patch literal 356 zcmZ8c(MrTX3|#MV?;j*j(!wFf>04D0c9pebqcm2_Hf~P^qn(&cztHZ2^Npy-{N4Zdsqb%C5IEGm^rF2&i0S6&q0`9 z>GQ>B+l=Lru{{Sbv<=Jj0K@!JMa1=9^aipuc(ftQ^_K?0-)k|D^_bXXOU@mL&t0}s P+O1>Wj(J|_Z>`l21-fx| literal 362 zcmY+AO$x#=5QU@5^bRsh3#Dl7t}2KkE(H%zg2ozXnlk;dRlK_srM3=P3^RG(d&&NE zaLi=AWK?6ui@21{)}#j6h}lEsRIzO3QJ~Pp_&4>as|B_yOW>xGTMo562T)tU*%-Xc zB3@8Kb{j;|LT}Pv`5{6W*hRcH>H=D*45luBa_GGlQ0kl##Pf*8UGFz7 zto~CBmJiwu@P1>Zskwi`haDss00UCci^>XR7k}F4_d3bkwVEW2_b8Ij|5@EPAK_k{ Fvo}JjaRLAU diff --git a/examples/runtime/shaders/essl/fs_mesh.bin b/examples/runtime/shaders/essl/fs_mesh.bin index a76aefec73621bb6afc31a0dc28e2a080a4313b0..2560c66ac9883fcd1d2956fe5379c0a107a7828e 100644 GIT binary patch literal 1447 zcmb_c&5qhI5N0d2hx8?U3|rP3kN<`CRCU$+K0uU0U?TxR{6p1KpP|P-X)hhyu)qSR z){zorKKq-QZ)W`T{Pp9n-(UW;Xx+6wEQ>`wuHM~+pRj(uZ?&egs#nkJX2Ql*zg~`~ zY%prdMK?PFFZJ+c%IXOjv*n~7G_x^FwpGg!imZR>4eN|WMOY5|m zpBoiX^qNsKgKjn|x6N{qkD6Y&2(dmgXfv`L9V+&1IM@_VvvT-39HMwuP2FeXvYzDa z?0d#&y+$or;T^H05bIr)AHr>SPj*HrSb^Hp-hQ*l=~RbN)-neU9Tr~?fPJP)4FQPHHa+`NZ-(pHpz;nsVnGcF!a+5s(z+n>Lw%ONdJdkKoaHt-(5hI_%7Q z&HO;Hy+xoB0cdY12Boak(t{y}w-mcu6u75A?*JvDbk=w+LlkG32WdzzRFwF%SyO0x zt?W&LsG?31IinpVs61*dt$-j@#O)qOA)EoDjg<~xMMz$vm_-o%o}uPKqE)1s69C#p z&6A$DabIOfm|CSEqJ3q1A6qvSt>~=*#B@~I66uGl|w)+ zsBBJ=82{oRoIOkw-)wi`e_U=-Cx;$y$9{+vOZMAU53L8>C8;htlZZp{X)f49oSqKT zVMbypgWG`47uEE{_h~R;(hiMtI%LEaCXlw~G*$FTQFqS9INUCjNrwq^$?2X->G&82 wUQpRA3S(2%_APvVfzUuc##ZK=bS1ojw+DE872X}--Box^FzM6Heq>qeFNhavkpKVy literal 1427 zcmah}%Z{5s5M(1I2l5kr9K7skV0bvPHkT-?-17kldA(jF!&tT#V@LUn9P_2Qq|KlYJVltH>=|!eCe7e%=gO~R+y!lM`-J&0~UqfLin>s z!lB(FmnvD{XSarXFjSiJiaA;l?J!!NHmW|j-Km$EV&6T1z5rcl*C0s-v z6oylWBt0a_2gI^4ehJA>t_XV#8}5K1Q2>^50kaE4L?17&NfgB+jpU)vYa}uAh-Fy4 ztp_lg9Ko@o%vH_3#GDUD%q77LO^AV<7{y7L1@tTC{EPvn88PQ<3Lo#u(I`Su6Fz9t zRWXHEvmjt*{bKv3vukv(uW;b72{VvbMLP<&U?z$Wx~$+b!f%3?I(`erceYgfzj03g z#>os$K{&Luj5LsCa<&Ll5~-~&_*~PHJjs&$gB#iaInQ$6hJ^(Xp|@Zm%lTXm!^y3M^FO&js4eSg>#-#N6=l|s7q-)91$E~JZ(1DbOB<>kvg3&8cy0dGxc?* j-HQ{AC#N}NIxAYWU&aphhgv=?st5} diff --git a/examples/runtime/shaders/essl/fs_oit.bin b/examples/runtime/shaders/essl/fs_oit.bin index cc32fa6535a6268c3d6c488b405401ebef4ae05d..1a9c83809f9473f829ba6918ed58ef6960377a0e 100644 GIT binary patch literal 213 zcmZ<@_Tb(dQg6)w1dI&qrSZx6Ir&9Qj36EeYyjedqSWNf;>`R!h1}GX%+lNfg|wXf z#1d;RghWPWdPadlW*$(Gt28e&Ex#yN0U}nGnrxx~H5MqDlUSKwTB4DYpPX0%GSODS zKvMxIf~-0zJ*^_%ttc_w8RQnArn3CZ6ouTx%sdTEu4*m?AV5_DGzD%$Ef*I90Mju- AUH||9 delta 60 zcmcc0m^(qi*n@$Ap)@ZuEx#yNAtN(Aqd=i7HQ7X=G(I^$C%?#=t1Le=MIkpaGfzQ7 PldGCbK_NY7;%+GbR(%tB diff --git a/examples/runtime/shaders/essl/fs_oit_wb.bin b/examples/runtime/shaders/essl/fs_oit_wb.bin index 2010d5c680db57095254b4088510845d89305e2a..553187270c140f9f1dd4eb3d22ed0e17dd3e736a 100644 GIT binary patch literal 619 zcmZvY-A;o*5QS-POz+a$AvT@45AsjbP-aq3l`nYFPMl=;kT%Npi|O*gT77M5nQ ztiehc6r93w?)xZmwcDhb{)G#da&D#SJ*7wv@wrBd_ZzJ`o5U&lgTPw zJf)lTjZM*OXUz=C)Ks4Dez<^j5t&eiKEJ_NY6wY4QN@{He>lSE)HU%RkBD?rosvW( z*ta00!TyX6JvyAxu}8-aUGGk&t%}wo@Y)R;Y_cLPYmWqkMO}p~;#?^%nUY!vF0~Ty z0A3Vyy5cHS$fyj35R?lhL#e3N`8|pG-qB=%tM z?9A+A`S$vFUHwEJ#lRb$;>2X8dKft5;+?))RcBqKIOz0HqTVGl)NyH!5jz!nZ>qe{ zv>hT=8@)xYbOA2d7eimv42i>ts%;urEYNxb+b2HH7ozwd=iumHDV#LT;$@}M7xkgm za^uu(S5kIHOCZTqUV@Va;4+X?JcEb3CppI$rLo{Qj@ahH;6j31W<}#7JdxxSKIZfa bSM@=K(8p9ZjJVq=bUSs2T1)qRGv@sQM9^tt diff --git a/examples/runtime/shaders/essl/fs_oit_wb_blit.bin b/examples/runtime/shaders/essl/fs_oit_wb_blit.bin index 6d30aacaa12156eb9837e76283a097038b648340..6624ff7bab1b6a253b15a77cf32423dba8966702 100644 GIT binary patch literal 480 zcma)%O-_VB5QWiY&mBxHAwi@EnxCLNC=KaPpB7-@$LfqB$m;Sf53iK`yeqf+kHkG)5s&O7B@nPo+30 zUBEFeDw%4&1`F^%9fY(|Vh=?uN^o3yr2ta3J!J}YQ6W3RPw@6(0f??oIz^6Sfjqk@ z*OYt-aZ8B%-T8uI&I{7NCy+>-!iu&YFrP6Ncre2YeYY2XmT|xR)e%-$YjXY0&@&lr Rbe#3eH-(Q0v9TMaq~iYblANG--JV@nw7jf7DGKg|Ukx}CgeDM1%u8`!4>N%IbT;di~ z3Gg7jk!xJT*_IIRllVu%zp51^LrE5~z?ybJHj?xZEU=V45#7`*k2j^t?p39p<;!F? qO&$~Vg=6sk=K~2RxkLYr+@s|WIGh8=bD;ePrYVCi&s5wJl-3qYhyQLBVV3mBb94h8M;s#m#*$NHhaYjF$mc~%S$n}Jyea%$CRv% zgQyQZhz?CMb)u50g|j#0ZQpR^J;P>e`j1Z(QKI{$%)Ibm*0BpIRq3Xr$&Ydx%|;ga zsG~iAYXLgzKmc!bwPbsh*QZ;NH%n1Mn~To0$R`2RIV9o($Y_ETTrp0Ho13)ucC(e9 z<}T4Vrx7M1oaOidclzm@MT5tie~I*x=qxrQPI6KdM1B-UjD|jAj0VgL{V<|&%x_(0 T19MT1Ygx9A>%3!{FG7qTR_T%y literal 423 zcmaKo%L>9U5JjWQ_zyD679^%YS3Wk1xc37}skIHHO^LOwivRAU_=qSDflTfs_snFo z+Ya<_IVTu>GB}1+(yp}9hLaw#3&T-^x0+$Gj?7sWDP%IuN~n`qKy4jjt<9d#=&6tg zZE`q9d8ra3*5CmCmxCFtwcJA<$pSo|UMYamO-GqPm6ym4@e;gpSOB7{lSz={IiQi- zly9GW841Tou=adGGw%uM&SQubPJ!w#M)1jC?FcyIoTEO)4RgN(KP&}nY`2dgSYzp_ R3O6Q7yU%|Yv9TMa=IH)6^)5qcmw#5C?(hgpcvsD`G?mGB7nhy~2kLv`d1aNX?9RFZ=gHbOd5JffGxZFO z#@43W659eq)D(8(svP&)K3Pe8;y#N71Z**S0`He~($1Z$)-#luqibrCxs|EAdH0z5 z7?d$D@k_dCmk*Um=Pq*<;P%e0ac*oueDsbm)c*)jx=)bYwgeu6(16jtnADW9kTES{ z8HFn3YKmzP4=&T3Y94E)XcV*F<3lUgG3A1D5l5j`0$hLE&H2TvKBRO=WhiA7DWT~A zA2^f`ArW!KH3gmwnP#%folxU$f;ZpCx0w8Gk}ZN3gwh>IZd$?uitlii6luLBXKn2f USTvw;pSK=-5TM7Op$~+-ACNYX3jhEB literal 380 zcmY*UT}#6-6wUNS;=9lHF_9Y5Zi7MbX)t^je34OttzE{_)T|%r#2===&YMCvb_q#1 zhkHIYuP^uehreHfGb49xRx78>@#dBgJUDMNLOSIJU6ruY<*tUV_?SbNHHBYW>++Pg zmHxEO1Y!Y`!ux!i($4A}jM5b_PQNLDDRSMKQDXs(sZlwLQzWLp=;0Y+A+In$oDgM3 zdtkwxNfAdN#VTA0kH$y=Tm~Rc#z!X0z?^f66Ng7&=X~*2cm!(O1H%BAO`$wPZ+L>^ xmupyV8}z#f_~A;=51gZe6q4h9bZL&tJyM}UdB`?Sm1}#j4l7J8Q~E;rJkH`P;Y|=m?9Q0;2E)2r8UO$Q delta 89 zcmZ3*)WSGHmL-XSfnj2Rq*qyfW{N^?VrHI#h9*}vmx4liPP|)DV!CsFPJWSIMP-$O btwL#hW(tUDjV@gdlr+>cu;!}e;$i>*q0$-t diff --git a/examples/runtime/shaders/essl/fs_picking_shaded.bin b/examples/runtime/shaders/essl/fs_picking_shaded.bin index cf915884bd0045662e741d16a16fb63d2606635a..5de62342b0154aec3bdc098fed97973cc67e7f1a 100644 GIT binary patch literal 832 zcmZ`%%Wk7U5VW*6@)Lc8#6~j%^Ag%qlxXk!0f^Yd9tktZCN_4I&&V-fx|i*lF$&IR z8wrW7?&_*;9)JJ3dH;C$GxM?dF`IR}dTI8?wy>>N=4IQ#b7QN%h(3XhS#LTpEhZz= zLijw?%M1=>Yj@kKDgMbHOnto0=2*S7jopzVYO0fc>Ep&OtKNl&CfQNDSNr!OlFYsxEPv64l5k7wl9}&j=6wzB0 G&He&|Vcz%v literal 878 zcmZ`%O;3YB5GC=3e`1cim2T()+Jw}LvGMNFLqpn1Nub*hLTQaZ!=t~{i!-|{E@_2? zEc5Z^y*ImjeYySme*W?F^LFETZC0O(eGa=K-yNXcu48CdYgMW`O#O>wgvq_CtE~Jd z*%sR)rc|+kDl7KDxc}k9A9@5$bwJqFEXA-r!vYLyao#dJfm4N{^Ut# zopBzFG?Gy+uaU&qAr|BGD(k>#vINJ9Vmmc)8WYhSv6lohG$8G< zEhZPK$XKlBq7jlJp_n5TjjkbZ1E>(!F?giI0VKp4?I-pWnwXKgv#&+T=#QM63M%eb W9Vhyw=F8(1$>cb)Nc~UW_kICj<@Ue; diff --git a/examples/runtime/shaders/essl/fs_pom.bin b/examples/runtime/shaders/essl/fs_pom.bin index 8751203b86b77458e7938f2cc93d395132855b18..74b1814fb7199467731c13aea88e5b8deedaa8e1 100644 GIT binary patch literal 3841 zcma)9&5q(m5GGMhUMbJeM|)~rO-ZvWyotc3)0*Uwj9Racik|MmNa|Gxe6eT3(ik#$(?vhAN?9&UgBX*9wIkF{SE z(eYEXD>k&!Ui>XfvbKAGSNTPO`9=Tg}EM ze%|a@oMO>>iI##bq?Gu5NaHmuGQE!-$r_aNv+aGj-6c`ZKd}b%6&V%76&W28z{F{T zL$H@cv0o&>U4XXz+_byS!{@=xmpFRuZ*sC59hX^_uiUwngs1FK*h#hw3nK85xemih z14Oc?=k;;%8LrA;td}fav27Tqwqt#@7@nFw5bFgTW>S@>_${(k92FS$QO8vwcjjGv zj>PbpUX0hwZjv!RvIoY;uA>yRTXIeE@Yjio*58#}l>x*C}UErGpQ@`;;CVR0xJ~qLT06kq4 zw1QxRZm=NKwu$rc@dO|?a$6ko$Zjh1uFZ`D8gEn(j>GO53Z852H>XSmxv8F~JPN;b zfoobTftucGp%1xBo}k+B#x8ufD17buAY<(;2`Qk}ijtCW1|Lzi4H|-}ElR{MDT&v( z8bVc7f}~uKt?_Y4lnAD*iM{}>LcdqI6_pJOl|O&dw^Bz1H^MJZ&ajDz0Z7|~m?pMM2xm`#RC-yj?`7TiRQm`hAYEp>dcHBNXH?7if zROlX<;C-cGMcM)H3W(&K-Qu6%ec&WV59NqJQ|>?FpETq{OOot_3dB^UWCllh*pCW` z^dHFO#2gYiGV@VGkem(*nHcs(!U)J$f~Eqitd)XNTQt;aThP#Z+S}be)ZS6tD$Ex= zK!}R$a$pehZf}PJ$G)z>OF=KQw20F~WHw_Cqt{le_=d9uEGkoo%j}6vKuBc?xGxH+ z3>lkN1>{0@`XTjKOxK^N?)J(DeVYSD9IEviyA`Po!0Q7sGHrI+Zj&OQMg|yCo%o?s ztW~P^9h9{Cbn=lda|+7Xw(*fVlDtEW1|IHkbyEx2xJRp^Z@T!+y&>@En%7R8vL!iq z%npB;D=o%=fy;Wp_Hj>1I}L9DPbk(AD~-MTEAQXu;f?=Y?gVq^&5!1(D+ z6KsN3Ci@K9aTppMW(5t%?+E@KjZN1;)_hPP zyHOmZ-_c#QUOGAb-H8wzw?6f1B|Pz zz?mS!STBFnWvyB7zN=^sB?e?l-VNSajy4%NdpW6JvWN$I>#E;Q$c>mfDghXnZ)r+U emfW$>)4u1;xI5#)%=g`C;Bg9@J1gk9l66Rt0Uf=)6>U6eYeu$R~c!?J;E7(TQL)cQN=Pb)-?$kQ5`($4S z^E_N2Bd5UIPFr-tB=|f3(7UzM_{>+|#!o5O@kCAP& zdRiOk*X4Aa25gb8umr(~j^(-qP?T)P6G}sY7!zDP2ivZs80_H=h6C4e;1#Vp+!({v zS_0q=qGTN@w-fMd0vB!ONfs6oc2Zgtj|l>s@sDr?p6j}pLg{y!;Qf6qL!IL_K^aM+ z47M$D4fY4P1kQ=_va!31O&(#7+1zB@Cq0v+gIZkbq#bpugZXL9V_B(&7OHzn(lZ)C z9F#1jfeLO*QX&kG+Vdt4Hrv3%L8H`awpo-EAzQftD{F~Pwg1WC+N)>2A z1*xih#F81^Y-DOEX{4z`=^~)f=po6nSw@2RpAM4yaj$`0QjM1d#K8?BxKqBk1AoX@ z-L6a>k#7~wZaM8Xs-Ol(Fu1ia8sA#}=!2n#;Vx4=(q&X*Y!-vY>%m_1QHw~r2Q9dVPPyu}Lrqu3`R_S?icxtS=X@!lwXPiHde>9N5W)ePZ} zezhlYQ=VIuQmY9q%GP`g-Xqzc08X_%RGrk90;FM=k`N=dHVb(GdCxCMj4QqNJR68e((uQ;!20uTND#>KxX>F;z8s Y>z2tZlHd_vN4a{4tz%8CH_Ph$1v%kcjQ{`u diff --git a/examples/runtime/shaders/essl/fs_raymarching.bin b/examples/runtime/shaders/essl/fs_raymarching.bin index 16d475f909d38c2f312c10e4c0c46bcae030fcf1..cb74faaba7a69c0fa37bbcf1043ac0cfdccaae72 100644 GIT binary patch literal 6096 zcmcgw&2r*K5N5YF7gCjLu5*+OCNt9LXJRKgWNRz;U#Y#U;UNOv-fy_UtItE*y}A<*)+e&i-nkH7x`ws6qmDNvOeoK53ZrS6!`*+{mml3 zELL-2*XEP87HsWo>&b04r6+B>(9Rd7A|40gcD&B+r$w>4kZ1kbZ}8&0XL;(VD)c{{6fqp`NH%24}F2l`paI8!!QCo zyDd%xt$8h1hC+_yP^gjg&$_Ci7>8Ozl@LbvU%rZ;NIUfS{oS^>hFl~MT7r?imSP1} zKu5A`3h(cHU!1ZtZ4bF_Sd9ZH&a%bT`Wou7+V+dWh!e;xP{_$F|C&7&E3uR|NGIiQ zOt;WMZg$wj!^kd!9Kr)tNFg<(a8}-)i&*nL;}Bjnw2uY@pKUzwYo}W9)xvP*2b2%E zeq!Az18WpYucMgiJ4f|*{gs)SPwu_R=NpgkDVto#U=;a7dy7DQPO}`r&nlhd%)kn0 zsvT2>MFByS*(rMZ0$E0^Tibwy?KL)Rj0Msw%`j9@d|O`}Xrt9Bz6J050TvmMa{H3sQ$FuWl{hf-A1{Kb&Gq zmbby;Bp+;hhkapva_AVkxfI!rE>215@a3r1;=&ou-)p|LG~Y0uX$prcWZA-XdOpvG zp%}!m={X?Po*flm71>biW}$;446(QA)d0t}mT$oo2m061>}>yaN$?@?c5HbYDC^tX zU~$FwwY|eBYWPMD?PzMz)nu8O4wgNAvuI4u_Ie6h)z z)n)?Hp_tYoNJADpPmWSLV&kM8t0+}Ekf}*E4*y^e&9^v`vBI{2d!QI;-K?`^`$1cj zc2;+0%cI9rj7(^7aUv)x{3{_5AEt3WW?m{tk%Ag(KX1tkcx@*aN|`{KAT<~-8 z0CEvu_rXs#G87TzmOlh&90wPwr`W>0t|R`5Q)!fmbrPsJv4f{3m)*fJ@`o=L8lyiQ zB8Jv09W)xPs~HcQKW5AIHEmRQiQ*#WvX$5h)$^%`dP?=wTs@kmTGO?K4a3&%WB;+= G@BI$|vx-*$ literal 12628 zcmb_jO>^8v4pmawi?%A~J@PoR#OaDkNaP@cmLX6Uw#i4;6M21Z}rj9m(AV7_U1$N5$?FHzFeN$>dX3kceT4) zy*oa**ucg8<^B0?cXt8TKi_QM@9wV2_{V{^PjP zF6^&w*Y&%DbKuXq38&#Y9xoriR(}s(H;dJBbyn5O)k${!{vlk~KBMuvhSLl5wR)4# z&@@ei;qyiznqY_CE$<&5tDnL>>w5V$H??ePm8n(Ef}aP@T0ordtj(X8oOSAn?rCS= zU+p$~_SOemHU9f`8_vN02q?_CtKRbcM$ff}dp`Z=ZojzL?W+aYoCU*^5jQ*KW(Srx zK%>po_VIENX7}JZCCd74^RVs%Mmz!pGQ(i0F|04Pck3Fs3b)2Xxfh*?_tHG<*LCDq zIDi|0RKXHRUM=E{+nas0-LC6Epw&A%{JHX$j!#cdsz1Oao5=O;?$f$P*T9YV1MC;% z{3#rfZ$QTI=s0Z|292*qN~H{_E#O>l?yJRO^Y2d!!aji*K~k7Svvg+_|8a7176ycK znL$S@WDdKB)L~CgBbW`O#WV{jV=zb}h6$u#rz(PZI}Zn`$2ds9!X5O4u}0m&7&A;@ zTImkLB%elckZg?8kKwRSV=xWUiC~)5Buwxr$H|hlL48a_XaXUxgP6)6NW-c;yP(sR zO4mfLGtQ&ho}BQFZz1Xq$TMU~+&Lp!J8c!zIGCXTC5sg=Wt74S!cp5H2R)`*6I!_Se_Mr&9j z8YVDFzM{a7NOPk#tPu?p9G0(17^5}Jh=vs~$){Yy!m<>z#gKquKn-rlD7HL1=nnfd z3WM|~Ni~7sQQ-@B5av))l{t!)S&ZVR!+Pd>Z9~X1EcC7dY(G7>v~nx5Drtm?=tG z&2WnhXN}P+g;PVk8gPkBEb%=3JX9%Lzl2g&6W=27F%QAv=TOQL<)baCdjXTeH^~L7 z8E%E);tq#z8b&kR3d0MS zM?5D47noiwe71iHrJN?d6KMyBpF=69rQM0N3rq^%Bo~}!xKj*I?r`{~VKl>?Vt5Xd zd>Z3|(+qct;W-ZbGzy~`?i9lZV5TVLG{YS-Tqs51LSOig)zG$#IYc~9KMyJ8+80qu z6W@ungTv3El-JVkMcM@>g>RAzUNhVa!v%-KHw~j1?uFq6O!8@r3tlta3&RT>_GuJG zGu#WqhhU~C5vQa<0F`@r-9L)L@EMiGk`G z$7EnZh(jTd!2YQ&)Kg(GHigAND+&I+B$J-kK&S)c(yS|Gyg zNLfRXvL+webfhd00|RWc4rP`J96*&omU&@Qa`Su+M9MN9Z0Mm8s}XfHQkJP;3q6>K z6!XC*EqJ{IazFzLi;F5SFM%8jfh&YyIxLRGz$G!Lc;Yw{2EyW)1kTJzAjh$HQ4%od z(_wKOcUS1acvu_<-z6=eupA`N<7*_40~&CoqA<*i6l;Skv|&0@p7p^eeV7v|&%E&U zj7WK=gO8FhBT}BJ;0rw%kCbOV_@o7|mq1=N20p65ys&r{0$&Kh6JcR7@JS42g@sAr z=WGmGj(t0OW6*Nk+d>b;9^)v@oDf)f&SJ4KN5JGUYx=E z*p;$=3G8ls$AHgP`hABgu8J*>oNcsUHUAc&8zgbTi$;Kh%f;Q z$W-|>LB`nO7#X^Fez!y+L?6?uuGUq*;2U&ULEj9x2eXzJ4RMIO^Ye8}rI6wYF8Q6V zZ91%N$Rl{2B(IQwJ#S#U2;_@#QZRITN5xJ0$rC7V(YsYx_`~~w=e$Mlbh*<>xdYBV zr>5+5J>N+^FEFWon=A%9UC?(@&l1|~knPq(Z(X;~FG?9(WW zF5EjQ+=pOvO&O^Lpxx$Whv`;3>78PrQ+Ajp`Vd2;T0<8{&=yu`5@@ zs!AKm!xFRO6|pN;#Oal!<5jUstKyuMq~o1Z$GTLdt?$5)c$3u4-XV9qFm}bl2mWlEtJuWGQIQV(u(C2%aKJBSwOVIlliG!A}Ui!n}?6br{w}*Ra z4+~66#L29#S6Zy#S6B}t4U^sh5Q6$^aFlvq zGh_k?kPJbVSP`BU3W#?yY}jr>Dj=-se%TjA!yp!&d^Q=sNW%>uD1NVm0Nz2uGC)q= z?!Kna&!851g!-omDDm=}v`pYPVPWS8rmJQ6Pz^14s8y()fG`x{RNlcB&jp`AWPx|& zXsC(k{>V6HV*X7XVb!a=K8D{gDtvkzV}P~}|E29u8hZ)B56}f+y~@jH_`M7jAq*%h zb;J4a)}_Quznv}<550C+D5kq<=zuj#<{3HCW0}W0-(dAz+Z}%U=$_RQz2u%~e hzz<((c^vmQ{Y_(mD}S#cpd6yoVBtHa}2Ra_YDeMTru!El@OAw1=FwcR?E~iBQ`z{7CF9_P_U= zA@#8A>`Ji_1Qf|{=HtBh`0(-Xcg4?tydU5<91OR~EWdx)T<5FrzZ(qjhu_<6k}n=_ z9+z+M{f4{Bc{iI~-TC7-SwE!H;^{h{um4#*))L-rlhu0u=e*c1Hg)gYb+RZ{^K?df zjH(~j$uwJT9_pTVYb*37UDmyrcU#Pg)j{hxzy@efn5P>hN$9FD0e6&CaCgpnvs@S_<)g%E@1acZ?D3x83GU=Sw6}m*Qj1oY|(BP}Q$!^S2 zCwugkQ9OAb(`tN-HhXs?aaqsVkHu+aO8cy=jJi^tlYj=>=Qm>*{(c&fp`Z;myb$ih zb$!?TWaw(``qGVJ>HB^hDPISpm$Z5^P*9sdyRkL0HBeZV>1(a8=?+eO0Hdg!`_vpJ zvtl$R3mTcbz2Fr{u#Tb=u7ze@lhCjtk%+PQX0M@!-u_<)iADG2j&6ANbN~Z=Z0#iyc}i6qn^WT%V0bHB>cO}6^?Aze6@A!4YC+L2vS16qovuKZ3ozmT+1rJzDlyDTE$ugp6>>J6f0NBIE-{~nvHg2tb@IN#AYlmIk>xWiakzr zh&+>%bicx>A0=OtC@tMHDe<20l9_sWE)IEh8b$m(&na8@+HnK}!E^mMMYJ;{TFEmx z1uW+{wtG1ZflQ?-(E(MxbAmhMfILZuva3hFd9LI{(V;q%lcs~riAZ9%_41nM1{?xf z2WN7M*xpBWdPO98u34Xs!ZSI=oVhP>>ghXEa&@fF;}p54OLspuo}{fKfw0%IDfa+# zx^?WYJ{(sU0p7)Z+FyL^h1e^0*w_>79izHMhnH_bsiZR$CEh}*#V5pXVo`ey*4HH# zt!`L4=@MlW%@T`NH!O;o!A5?GMXMVYm4~rZiY%C$-O#8J7A@lnjb=AAve}{oS)tMF zhDP35G|uFWW;Zl4#G>Po$UA-Zcts`j6jypkd~Hry zO8)7i2kLU)J=OCIVL0`yJu$BjBG0sw*?EqtGjr-kNqT%{h=McE z9#MGu?9p#al|FBU5Z2#7a1q}qxE>?AWrxa25o>csm8I1~GxiaT z2CA-}7nkLgo87V<4l`(Yu*`O9c0(biFC@d)MLX4HQ3{+fa2cBcP&mo##7;Wn2hnp6+m?$31LXZ1^2yjF%dI zJi%it31P16b-aGmDtXGWO1j&Do!yfg@2j{m+JziGirI$(g_>;Wwua4%0fz01L2Hp>6sak1L{vp(7pULCUSZuQryIIQ=!b^Lp$bIiBTi}eF}1b;W=IKQLhnC<7M zyQ0|6MmOEVdT|fywf&rYdAL7i>)D;{+~upya=xV>Nl7Q%CozS)u zX8bG}!n_8iwKQwu#A5ZkSNR^h72rsxbPiDa-GB?9Ra0x|5gUX5rh6<$DY%*%v?w3WrC$q)&UktR2nGP6-k#)wg0p7@a((A!~ z?ho5J>`$-Uph0z;`@_@onfyWMaMUNS$(sb;@p(Hu4718lq&FIl24q(3Ne{*zRIuU* zefdzi8beZ4WYjGH%{)eo@iV#ALCNXIE3l7 zNgAGfQh9O`n0z94RPMdngt2URTMj!OKH*N|F2Y=}t0U&_o>}I!GSgJ~SRM!KpDHdX4=VSu`8u41RwW>z(YRn;fa5m$Q**Da6&zSSSov8V7&hi5P} zG4|ZA28fze#=Sb0deMmthf4c)zB?@USt5`2m!epfcoKQA7x$!>ub+Dl+j+j9Z~uGD zK_Yy&A@o6{dk|{_d0zVcKKTk@%@Io|V8_9GiCon;GGFfI0UMlZIp6Ir&La;z{DEl@ z(Kq~qewIt5{_G=|T^|Hz=28}@S+mqE>o!xtrPiy(ba*=1AS-vbDww4kQts?nd?U3J_wLnW@BgAXOWjLD#fn(hCMl>3kNHwwE zrAjBgp`p=TL<(UE)A?p+P(VD>DgX#EaR?3jmwIKL z95+)&*+CDhl;x@We#%nne9Dtcl*duZQq1fEK$Xxt7avNeOBoM;jq(H<!gKgIdhmZ%o$?enRFUcbEaiVGiRtGK68d*=r9MfI&&~< zk2y=C%$ci(3}mi>IhfSq{7U3n&Rpa&+lquaqfz8;p2bi_YRFLxUF4`DewZ_m)z+ki z@i=l<4H?K>6LKw>)iA$K&6$=n7kPRi%9*M_0$-raO}d!QsJx+T$WcUU$T3}PD`#Qj zIC57E8K_(na;=vN`HzS>(`x2&nO;J!iq-&f?&e%vCsf|hK5{S%AjjOXE#w@kFmXX;1PcRD*Z?pR3@#<5!N+_DE zPcW$v2iRAqNm6~cCx6LzF8F$tPxj|orLAScX0o4DDyyC*#iY-< zWRy3(?kyeW5#=x@3rVHgmBV0Bx>~?BW6+fp)%)BZz~w{rK2zRCxl^H?{T<&tSGfd- jTSD~bVVQl}<_{n6`d&U{F07PePCq8p@@C^(x7+z2737xk diff --git a/examples/runtime/shaders/essl/fs_rsm_gbuffer.bin b/examples/runtime/shaders/essl/fs_rsm_gbuffer.bin index e4e1b3c1c4617289f5b8aca0a8ac534f731a22f2..35b2d9bf45d30739d098f1c19723ef9f603039f4 100644 GIT binary patch literal 379 zcmZ{gy$*sf6otXTp}xc&bs?y1#LWMC zm4LU`B(VqYR?1Kg_7a*%637dm6}(fmo)#+R+6-EOI|FhC+Jj@3woy>=Y|S;_FG8wo z6rMnEl+zizF(7?IZs@es)z5KS|2NcqLfs$e`UzeCKo_&Rnm6vp;Q!=o@f>?q%nkLseo)H4J4 zff-q2=DyB7=iaB6pErO1y*D$Q`Rt~mHD}E))-v(&!)%5h&gY8qw0^GhIo@+^`c%@G z<#MMY`k<1gS&@X|WU3IG7cAl>&r*`Gm{&}}nj(ursYpMNrA1&l&(nmSig5dwiL3~&sz%DZ1YDi*m?R-jP0M&S2+mO! zkI?lUs&57DDrH6Nw0p7uq2mN$2rkonLhpT~N!H4$U}mq3t*Tk0SU`OHida)2Er{oU z$rpl=c&3Z*Q8X%h?h@gHph!{UGf~880f0Z%-Y`w)V59QA@3iN}RzVy?_BNSDa^3X> ziEcoXELMcNo{GMn7UVeq&Qy)-?_1UJs(Uxq1w*~GD7ErXs{B((GtQ)`N&^-5WVGkG zol1NI6qWmZs*T3dLweP>nleQqV3rP+K)v7e%|ywj10j;;p%B2~YAv0n=h78AE|Jpa zZl$&9c229Xz{<5Iz-^*9qH%ZKJ5D>W(mP<2PI-P{S_=!aRLu`+Ty8o>{h$$@w&OK& Z?+16kwIlaoa33bK8@M4vV7wW|>_6p1XZ-*G literal 1462 zcmZ`(%Z{5c6s1+Fj+meD5~?W^$P-2FW~!*0uBKgEZekK7^C%D?jPf1*s4n_Ty|%G2 zO$J3teC>Pgx##$@eg1m?=kM>vf@fmgpKu-1<~waEd;7++-~-QHiPNk|2;*xRdSBu_ z&8y=OxjW%Ft-saz1Wrsu-j8>dRg>Zzrw4S5562wUbT>ye-eoK+rW^a_CWDjJ6HO~x zJnsmj8~c>T5!5#^44yale;%S1r~BQoS&}4YvWqB$w3J`<6-q5eL~KG;cY<< zPgz#%z4nYg00nIi1YDlLvL;8ea-TalaONDxsc2iB3JSeDy>Ab?kn6Potn~6)7kwO7 zvV`_-rm_}Bi3O)7s`PCDT;NSPjt@VhlN}s1SxPy))`$aK$8-8E0o|u8Jg$MJ+6in; zZmy7*M#-huKuO>+inV86@P-!}V`ZFQ@$QuQK%i%{9OM_)_TjaWx#pQ;_2nRqrSH?H>@uvV^{wgYGpH&(y)SN>J z6Gyx^={cl)hPl2X1QpQ>msmQq z454D`bM2%HaYt1Hp$i_2IS%%Yr4rMt&;me9NQ)e3=K+~|t+ighF9p-%3@<-njWAKZ U3&mPrEk6*&M+y2KUu@g@2N4d+Qvd(} diff --git a/examples/runtime/shaders/essl/fs_rsm_shadow.bin b/examples/runtime/shaders/essl/fs_rsm_shadow.bin index e1a7b6f277ece1ed25992f4f6ebf64a39627d067..65dc279cdcedb93f51ac4680677920dbb70b0c69 100644 GIT binary patch literal 350 zcmZ{eJr06E5QV|QV!gzaP)IOZN$d=Ds*V6$&-e`=-~HN>N4uUQr6jqY$gSfH;#}IczjiOws~q(_yR<7|Sw; zVOB@M28LAfGTzEc8JP^Y>H~LRn?RFq_>#np@0L8-bHz_9&tWJ=e+{)SD4u5&S4#{b s=O_%5-5HR6mu=5#=*Do~YMlQ_J0k4_(v3(rf!qjLetxrvdN8KF0k8#a>i_@% delta 133 zcmcb|w3Ts!yuw5V28Oc4qRPy?bcKw}^o#<9veaZ_g|hg({G!~%9P5dJGErsunJEgn ziJ5r{8k$_yTnY;5Iq_~qiRmthC5h1nv3eDiRSLEWrST=1c_ko@HKvkspaNYDn5lYI Ln$}#kTwDwQnnWt= diff --git a/examples/runtime/shaders/essl/fs_screen_space_shadows.bin b/examples/runtime/shaders/essl/fs_screen_space_shadows.bin index cf0d662799914e7f744258f492dfd9df4b6ea8d7..56ee15e63e4cd2e142b7e0d88fad6d191aaab80a 100644 GIT binary patch literal 2813 zcmbVO%Wm676jjqj3#H#s%qk#bnc;9|_^6$B(IV)gyLJ}{1S8Ql0ZA0}uw@zfrv75j znW6Yl`EE4A2hR`Nd|s}158S$wf5)TIdQ;A-ZB?(tvYc1@SA{@?gS6j{li*R zD;$m=%b60nP8HVsRdrWymcq#)(c*;Vvy7%UXBW1`a=j=w(I27#a(1<^JxFf7%rHzt@X;L-=(y7t5kr zdH(oiEb#Qe=Q4_520nKCP3bi#Cw;g6O;5=ZC7`9CMdjeo7bBcVfQJ z?*~@JRmU9U$0r{bXt-~$ai=mvcd+}7JDV8^DYN9^ikY~J&-jJ4OX#&poRjKKcwrEV z+YXAH22Z{X_{DycuN(^SP<+{Xcm`1cbMGXa1`M-TiowB0puHsGfG2$;$5Z6KxF&Yf zVE$?Wl#6Y78Bc42Ze2i5rOhwMktxYpp=OIkbu2sdia9ybqfR9ecs9%r9WH%sJ7cq}1LNgad}Ax##b!pW%X_s_6@ z@KK(;B%>fpvos8~Q8JA~Wu%ECgv3a+r~ipBI5`` z7BQGG$Wi}sikd^kIq*z-tAVi=S;na7rkRJU;)At>qQ9WSgy^PMXpFnyK)^6{nq;lu z`6Ot1nSz1)gb4#m8sV5hL)qcNUf{YzkVlEZB(mkp4!7G*Jjh^_vd$TMz-iFD3I3|* z-OGUb6BdBq2hHK>WkF`2L?Rom z*j6mh>y|wfFJ`)9d=j4|gMcz8$?jq{p&2{ZX8Y>eV-+5q|Lb{*dmo zCfl~Jei)7LgU@$uniu=-iFU|Mf5ULhn&)!&D4xp4r@c59>sTDqt~jsjy2-=a@nKhP z>Sk;0GvOR)?eHXvJoF)oSJu>K+kI6u@vlN5xE&wsG8fyd+zHPge;Er=)u+AKRCU&g z_9@HjQySf3S)!8bo3d%UPi2=TWN{tpP51kHT^;fwPiNO|wYJQyWt(*~!K~GvoBFTx zXA===BtioIT(@Oc*1Pn^SS64q%gaNXF3d7JRUojt?}~l8bPY4nZTBEKjX zmb*h!fEP~@Gj+N5-7tx0iY|?q6!~9pent$>^9dM-UJ3_ELP##+Ck5J*;v zhCwLqtSwpvC*K!eU>3r0&i-sc2(JownOMXO@^)4zI#!%k1{Wa9>3uBFiW}tO%h-Ji zO`haIkYDJR(+^0?GyD+_1Nof|4@4K~e%*d>x5alSLdWERFki5J(`4(;^V)JJ$;j&t z$v;-<$0mFHg(jOiWgMq)9wuWzLPlsx+7-pYa^EE(p@L%70ehMff@&JOhaA?jI|SJt>^jlwH)(lgwU>A<#h2=!;u%{U3ju?<*pNDN>d%)@;`S1OLmU9N7*u&=<#DArVdfE z$?cU!EU8MSSs(Z9J>LUHRwLF`yTvLcE32h;5uAWXRoPu8jd?$));4NlXk%Hn?n}6O zJ%;U6FMQ0$iO3OR0C(UjuNy9A%XUW zAhGgeY)G=`j|4BrL6-y~Xu2p4rNX0YxGZK5-zq=|Ra3aJ^;yMpZe4BUE6E~^2;ub< zf-pqW*WGV*PQ=AhiBrt-nzq2qM{dUG{#nr>jYysL4Wh;;=jQ6CM&p)i7sA_u4}a#NYTxHU3kaWh09 zit5}a?9bjzP6V;+UykS~#ejZHanQaz;2x4?b|?{FT}TS68%KJnWVPYz^t6SKR&P4o z7kXJH;cB|NBK|!Y6hX&9lQ|0bzf$Q(`H#u;oeYetba3^%38{gWuSVUt{NSPfcWy+R ziYXlJFfO1_NjxoIozdTid}LdxX9zhMxOVy#3T`6)wJq?dMfXChjS$E7rQKWR3tfYo sv8w1J=xl2tEg813a61ou>qA;U diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_black.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_black.bin index fd7715392464b86201452d5933e41f01bb15004d..6d6ff8c0a936489dea8efcbf309cc87c00aeb170 100644 GIT binary patch literal 168 zcmZ<@_TXlKgQ-APK~ZXQW^rbIok&~aCSOU^yt6-q102EPxC@M=$Hc?1QPpgP`D@sgv&d*jxZ3! diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_esm.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_esm.bin index 91b1faeb6974d127d945d60914c808e00a6b40b1..2a4ee3c2a3350ddd3f8517856360653bd3685719 100644 GIT binary patch literal 3861 zcmai1OOM+&5O#ZM>m=x*y%fDLH#xCYQW7b#i=YU)2vQV91EhCBYsrwQV{NNE?$?nVa)^eT^S{x_iD_06CKUW}GL7a??0@Iae$t?+Bd`Sg{@4-7oj?hbp=M71;{@w`H~$ zs*R~jCzGLxM>RsWBn|>h6rPR>Ba4NH;UH+9*7YeOvk;$@X`0vRc?^Wt&a|f9v}!}# zbpURZw_gZ#eX1VDq(`L}NzQ2)F^`jMY8}Y0`bOsZz(DLQ}|w2qr4Kfg@b%(@1zg7$&3?Tn2(M&bjZ0 zlJY1@XEd5ZnA{JekkTMxQcxa9$tef@kV2m@Ekz~}D9=t~pm%fO&@Pv$f5qMk? z5s{#o$c#8AJ$Zz+ehd2vcCI~Q+#U3w@}M#L6j>R2BD;qyPn~4~?PNOkgwdv09f5rU ziIo}+YX(~&uiv%DRy%mX`=t&5fY6sv%9FDjrVs9^9feq1d~C;IfRjfL#q5|m2xOw} zRZXXdiox@;cB*8NB}EP8*LR*XlN^)PCuop?kYm5)X>s2?oI1ozfG~!*dTUrj3kM1Z zH9^*0cDpBU$yJ2|Ff)b_fC8X-RrT1awx3}0hODx^qg%jPC3~#alpxb*81&T2r3v%- zsfcv}DnV&t$SLy7v9r2@^X0PbZrYal+yM%GI8!~q^cDrNMW7ksMRaj4mZcsgTgU?iR*7M8Yb)?2jJS%iJku>mtJQ2g0h56pb z8WyGrkY>B!Dhu8zj zDfXhp#=^NUeif{VYH(E^f(}KesPzE#pptC<{pcictf}&utOZYF*C=N2589%PBRp2x8{Ih8aDJnH#@WN=mmzMwv5 z>KsGDLCq1h{bX(sz)8j_gyTuy2P;9P53Ou9a65B{H&=HLv_N*adrg`X@u3wT&Wew% Q_;^;l1F`DZr}2379|Lzu+yDRo literal 4266 zcma)AS#R4$5LWxrR!xzI_NC~{_9a+4lEOnL3>Qdi1SyK31>ARnmS~#=C9*uMBglX6 z%++xXJ@|ar`=*V{q)OIx@Z}f19{j>buZ3pqt2SO1 zc~O~_7j3*wnzYK2{Ewu2dDXpKo8^~noM(?u&0j^GHCeGSlJBMD?fO1TH=wXht>8*} zn>{?Vb$TTILE7Gx>9Wm}>PY;f78lKJR;5df{QG8O2lz>aZ<=(|Ca7^&7R{e6?ARpv zqK@mQWL0cGB&Cnl69xSBWv};~RQqi6$ev((C3{Yn5qpj|MYT@y>;8#w3_{^)SrpZ( zLj%p9vvhmiZ#UTk_%WWxOgHhOG(01v#-5Rx7XP0DB;A>r_E4WuZ~$;g$A-csJsT94 z^c;9xRy+pECGEEzkTLpovM%$q3U8T>9cXxwt=KxrHjI1yk9}s^8?v}bcZ7>LxCV*! z$Zi;SkTcrt*&7#3qpgQl_kh8WHR}?<7XuWS{u`V;Rw>T%-%km|xBL$fxgqyQ{(!-k zCp;BJu8bpelsz!cmFLlpy?Uj@;b`x9>?7zLB``)iox&JW$kVz$7eB!G@Fn7Fvk12@ zgC0@WDj|fG%E86E=!9E#v!SS7J2Ln3KEeA zGNuWa`cunx3VGdVM~+|*f}!#_Ay>-5=x{0%Od^tuS83TieQ5J0EAuR^;u(5AUB$#T zIgGZDw0Sz1p$O+ZDFooh}4x`O@x+^*F=)@HRTm0}< z(Ex1IUDH-6@Bp`oV4$F~@Td}FJ{|dyKc7bF(4XTFOrqI*1`iXONIzPH!DI?$qw!!v zm_)ZR2Us&r-+3MM;8A8CM5MByC)y}}X&^)@vw%oQ6)J$854kwlvO@~N@stvS+F?t? z)3HuGBGw%+21FDpSO~%7!K`i!KzIktQ>ox|+xc{;i{z96a*ymR@fehV{d^h*w&c=C zfXTpcImZ`f1ND|gz`QyuNaSL2Mt(6BREdSu1fzvJQ!?qGt6)Sv#%c;y%cABg)2`Er zhynH;%*K-_Tqu_9@=iQsywAXU{cqJsOpC)M2sMg>P&reXW4Sqpg1_OM$^!#&;jRVj z`TDZL9!O0&pLqhxV559rbbfGbod>e_py^j^o$VNx)2-dE6Ii5ip>dY$%n*7ok-4ye zN`_fomV3rarF#cO2q{YlKh&F>;^=bfrH;17`@(rw+kuvz>H82z-VapW7;M)Df)ie3 zWswAt&On@-pViDQ`{jl$Ab@ZMv-7@jntgrZ8t%>#E?5AwC)2RG z(4ebA1avf>&=2fhzX!BKeToT4IPxt3iw@&Y{eJI19#amo diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_esm_csm.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_esm_csm.bin index 3f56fe02b4e1b0e4b4941a618183ff4da759d540..693b78dc3c53895c3262e3b6107c2d454f164920 100644 GIT binary patch literal 9884 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 diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_esm_linear.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_esm_linear.bin index cefaa92098217ea3a8a3069d4faa4b84df63846f..5ee303c95d9e7ec014ae14d9daccf4dc52a182fd 100644 GIT binary patch literal 3872 zcmaJ^OOM+&5O#ZM>n7--y%fDLH#xCYiV`WYi=YU)2vQV91EhCBYs+i3vSe8DbFu%c zKd&<+B~glP?ZYe1lkDWL>cf zYhJhZo$>y$tg<>Qi%#-m8@H_Qvu!#@@$W@p@AIdo3U!?py96~pZOZzu9qhgH^wln& zmw9Qeyr|-8l`P7`pUH+|&2-uRdpR0yAW~L=BeG5x*>1fd%e+kLyKyI2LE$$fD`0WF zE3##|T@$^wPv-$?aBWuXVJzqM#i05WJ$;daAA{7*vPSDp_yx zbj$9EUD~0RsgL&IU6HC>8$R69L8$x8xTXE>0!OasE4Bc*Sz+V4H=LQ5CMqPfq2ocJgwrSW4a!Iw7!P2Y7f~9^?1h}*6JS?FBC&C1i;?xHRVj6JlQd(wGbe<5TSFwm9jS^}-sr}$z z_{2gA6Qx6|3t{7r>KX_9t3?f8F8ai2Zys?IYxtg<|HmI-v0Y2H4$d9NX0 zO!y?09Of|A8S#O1$*Z@`3D(SD_b_bswi&=d$Pu=|F%G=O4Kz~`{o~WK6F7wQe9X?N zgN{trovLa2P_cDhR?aqAWJys0)cX2!VW>m8SN(+8TX|YM)~jJatON+-P?+I^S->K; zx&y3)!HNvK9`;Dykedo8U|}4F(PV;}H&xG#YV!#;ugN+)I-2gzIyoX*Q-Z9XVbW8p zmL|>54@krXs07f&P}2$S$*$@ej+*PXhiL=zrLz=zZl?I|>5)u>Fpy!uJ)d$vk^v2v z6j8{n@D`&LucxG{(~Tq5#%`6mMOaURb|^iyL(ZT%>-c5-wWP*MbbVxiZl{lS+-sl6 z4}l6;?|rP@!sGzb^jZziUJ`SP+(wMlSsa7u6cAUtQ=7vTM08Ug`cSsMLFh1G9Z&{! z6=V=>N~|sE_EMw4y6{)n0FC(@fULXI83}dagwz9%A&ZncRzTOIw`6w+bR_rXd~=|d}94cyG!{w3Bu0xe=-hkMkd8Hi7f X*j$4K;&UTDU$j1eSat04cs%+aL(NS+ literal 4310 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 MGEdZxmzNj+1u+Tdc>n+a literal 7656 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 diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_hard.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_hard.bin index d150c155a0c7c2ffcd5abaf66d39c322fb995854..9f257825712580835763091bf86b116992234a30 100644 GIT binary patch literal 3818 zcmai1OK;mo5LSCht0w57y%fD{Zj>Xl%f~LcHH;#t5u|8~25|2LEm0O*iX`~Z!+|gP z<(=7Gic3aP>DZ2TX1?A1=9?M%-TnJ-zAFEDKY{1fo9WRUBpK(c%Gez5{SCdHzJEb)MkxjBp+f7MUSrIok)84QK;!Bd|usCh= zbX8OvqSm&_!YAFCjLh7e_Um(W#zCgo%+?vdBhd1Ug9I96@QmXTsXpVNvpTlc@utj@ z%Dp2dwPP>MkHT=ySmjweJzVm^R1cML$@}dIjhyk9YJudYxtZ6k*36|5U0RkQ+}d?u z8@byrgxVgJkK+iJ3O5vt(I9kOMt%mPMj6F3h`&Z0wa36JJf>Ec#prA%^E^O|A;bU2 zJaVMj4+IjGABOA$sAk{f$_NW}25C$R0Amy|UE+8OSi}emXa})a7q{J$H{_zjfm{JR=d&4lUUYrxT)W>8b451k z-dbcZGc9Wq?=8rd((5%IdTwy3+4+3bVP2p|Luw-66bryIS>3?UI3EkuaglaFg(Fc% zHCO5fz6gBgc$9ge@Tu<#XfMpzUY3&5wEQ_IvTB9A*u|~746Cv~cAt;3{p!SFHm`eq zX}qJTk%_*4=tLjei~=5%PYCnjR`!Q&q+p>TfM^D#hEtS8jN+)o9LcE~LFgPZE^j9< zhbx%Tve*q%2^~vegVAz9bs!n^l_`VG=H``Dc>$rAnEo9M3!n>sbIL+(n02a!xu_!P zjtrRXL6;tLLb!@98NH$D1{Z`b!Z=PR)F*zHm~(l#_@TD&8=fwq#v86|6IVx7nU)=1 z!MIf{r7PFuiOqpM|E4%v zU{=ZWY1Vuuzj#Om%n3hm9hjP`Xz)zZ3*SLNcrX&wPsNjd!L|=7t)A`^s&6Ix(gl_r z+jZfBlrk!4=)2VQeBr>P@jXsG=Ey08f`gnRYWLf*eIMo!qi`HocpgM?3R*-7Ni~~8 mY4|#7??D!*4tuXeGcq4K^WmiVsWU&FH1EJHEB1Lho%{z&gFWT| literal 4149 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 literal 9781 zcmb`NUvK2L5y0KN6mJekg#n5{duQ*hC~E&8NP)v04hhnt0j}>0*_M3*c30c| zO#R`3m`tnHh1&p_Y>OklY=7mPpPFhciEpD7}0C&8P4F|I5#3@aOZhKkeu1 zVpA-)=_h|UJA;4l$KBKZ-XHh#>v~ad{GHGC^JTFsH&wCtu87~hiQnG(+kf8A7uDT| z-S_pj+Ew++xBSJnyk1^aRCwI(|Fz zw}1M_+1Y)ud8}4<>I3*_t?tX~Ox@2{^=4TtzB)f@G|;#!AFk_qbCW*PuAgboo@qCc zb~Nt3Di2?s?^o3=Sn2IH%Eei4E0`4>OR?9{=A-br4mZzr*miUXVzjT1jMlz>GH(0& z1rgleu^r2OyW;tE(L<#Nim@m-Ik&|rQ||N9!kmDQZg&$3a08NGZq5IAYf5$xBvZ6 zfZKSs7sv{ojE1w>g~Fc$n$cBVFW3tc6jI%)ga?g>59-S=xp_Q%91PSC&_}62`4q=F zFHAxG-KNBSpu>VuiWZF0#sW8Rf)lsqP6N$T(2P2MROMn@S`%zf9EFoeMoky&7g#sL zJGS#I<{EQ?Ytj))k-nJ)7S6hSlTv6p1Jbm^JKl&6@1!H)o-_@#!)3RFXkf30QpynP zqEyFxl%L`w$|&ih6jDG05L|XdP)cd!y@Z(*iy?1DmzOf>B@?PQeO|(WZ7<sBT{@-KRRO!heyGWZR9g+~ z6gIk9QnT;Qb!NR6*hjQ%G1V(aG?;zL9huwZt>bL)@Z!oqJS?pZ!`fApRgoNdA1)=?+GbfaqP-k+h$tV55vzRAH<2X=BdZw^dJoY#&5 z0>(MY#W<(iY}Ux;kaT(+k}k$Ni%V|?mNt%N$6BD)>2D5jr>8b;mFfnbGvOF{nN8tn z32$-eOwTZ*1@<~ia9lPSPMO7LKl(B#T&aroQ6SLgtw8wFIx_sa*F3|%Q2;t+M*tL2 zA(A@NKB>JaST#Bf_LzbFPDLSj!R8Cv2<8obI|>1|9)=or%s32H@K}ZqRE$I6lsFPO zkOC++>uqO~iftqaH_w60Zjcy1@-BE!*x&ighQnGE${cF_q8*jLQdK7&TM_M`8zM3b zi(5z9A*iEk5Y$$IaeQ?% zG4!bE)A6}*7TdCMMD8c4fts$5q}~=JdW)qIjD`K9JasA~JPiUzFx8}zsZL3Tj}(Hc zeFjnAQ^^XIrCXNYkE{V(vmUmFbj5=vPuIXj9fWm(c9gc!D$}@4SHje^9$kP};bEMy z2Ve+;7OjlHGdmKWL^^6s1OB$BV*HHZ(Id+PBOs08!Bw7t)DQ<8aM=q}Bbe-h$sovL zHK((#7p8{Fa-M8h{~D}+{fv%Q#oK^FJ`ScvYz(ZO3g7^y#+(3CBN)e`uzYq9jOl`c z8alW~ax)ea^+JMDH0aX_Q)$gHOpO4)2x`{oGQhhQSs`kJ=fYXQG#6;bsOx$nH}G_M z5=?Uh`$xc(`p03)DnA0Ixp?Zt%w?b9Q_G1kHQ4u5m}VZPbmaZ}l&Jws&B-uDXnhn+ zeW2L~efp1nxVX#MhdFJ#)}c9WnU_iPPOy3^A^7kWT%$cQmM9##Pb_Wjlgphlf*~tI zTH6<+{Kgi5{e;xvE=XW$Po#Te91lPm*@z(8LXfF1j@7`F!gm2VZ5~LA_MH9Uj4U7Csr+ldPA@o@n*Y z`zaV3T+n#PBDlG%9#nF@fVYzFI4wz*1>7Vc(P9j5JWo5Uh!-Z>&y>f+hzoc_Rcss@-@u=DdLZH6sL#1MK z!bm?aEF-M|wx&ZL97)bVK_kjSN^mC3ecJwbZIQ<0YW@Pj5jW2$Q(T_87nM2fkSriL zY03lH%_&o29c!7-roWne1_G$HGQEh?ix_j5|s~Y4NH^` zC*w&r()iNB2hJFtU0uM#1w}2yG651`-|PZ+i}^eFO5zQE$VHQN8(I?`LHhw>jP~Up I&(F_(1#x8m+yDRo diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_hard_linear.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_hard_linear.bin index 887cd763b4135109df1d78c18041875c467f6fc3..f751e75dbc78f6a3e8aa5ef48f09804d0be51cf6 100644 GIT binary patch literal 3829 zcma)9OK;mo5LSC>t0w57y%fD{Zj>Xl%g2)38bJ}%2vW2~1GsmBmMDuYU*JQpz(1k? zxih;+DZ2TX1;lRGqd!&hxcE9S^oWg2G7gcw{4gvPuu2g_L#(Z^P$+s)#snh zX7CT57j2kDO0;8DxjU~naCAXIP^`0cL9Yi|Ur-Q0BL*)h_DJ;w1;y%AT1Q!##+7|f z^wLhXRDC3dbwMg(?fT)G4pKetjBDC&&-BOzebFsIZj$S~?o`jLilTx#>q3X@!d(*Y zKRwN%IimD#o<_%_ZH%;7i7q8?2wf03(H%TKZ4TkPDth__yA}NJieyc)D9Me*{NtR! z)3=#TLf7^IW)ziqIFcU;RM|Gh=ljK-uzxIyl!Tr`!7@ry29Fqe+6*+n-2Q#0l$ngkCdKG${OP26xUfdA`R!w+XM(e04aU@000++GX`Y7Zenc7ruKd4v}IXE+)FLupVqaXF#k zL~daVt1V+5mSkNtMiU>Jwu*l*)`q^Kme5OBT1;6K*fl(pIyCTXXekSl@fdeK%VLZ< zj?XCzg7}sO$RBh3z^Bv=EbdX}a?U6NeV@7(wU`HLOaN1d+weIE70bwPJk)J7GplPIr^?&dtRsUh4; zIDX&(P8#P=&35V#D*?jL_tmsx6mS^8p#iN1+tRq|_CQ{fs|rVQ1Mq>jSfJ)r)l;Y1 z{RW#Gk|hUYmBRID7+G{cwq(EFV$e&ima00R-g?LjtZSeqgqkieC%vi}+#i>1_sfpv za~Gt!2UG}&T5``)*LS(^GRvXN3AjsLn|p!JH20$8WlxKrOClzei^TpH!*ay?P4iJ~ zVnrOXc{}u%!t0wFD>3W}MRdPXB=Bf_0vE3X+z-1@!oos;rWuVIUZ^Bw7T%i3k+@(( zFkJ%UB0G^Bo*<)Tu^&^}V}sDJq3fV!P*+d}&X#&ga=f6RNX+m$h6B)3bEIMG@4sX0kz|U!?y!+K^B~8wi+A)YJO&+$rl|D@^(cz0 z{=DcVa4!k^RMlK2zPx~PxF=lSwme@A4XzBKg|8#fc&-C2g+FDT)VsEMl(af(PsqI$ zA4(glWSO?ja5x#|G;nQdJ1)22rg0sQI?NKc5H=iej;P&l%XD41hZu!$Z0)vS}vbV<%ScHWTrw6Q9mn??Egk_IW;^{Re>-L398B literal 4181 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 LPSj85=V$*0a>PRx literal 9917 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 literal 7528 zcmb7J&2HO95O#Yh>K16z_EO}sy#$maE98>;Ly!V#jI>36QTNi5z{s>sfD%=TvLpvN z^ac6^eTBYbXJ-GYCFMGSZ0^j?%+7xE?Q-<`^1F{-|Ml-bC-C#=f%XMDo<7azSJI38`g*g@8qzQ1+{;xq-xO)p5Pzw~WqpxX*&IE8zg*f59xL~C zoh>&hYFw_$`j-u?*aZ36W>#l)mHu2-i?sN*$})Eamhg|PD9Wvw`pB93O|i+0>{Cbf zTW05RJzL+VSLODnbQR)$i7os4@yW?uTJ7`Y4ZDSeuGn2RkJ;U9Ns&E2JrE`!T*<7r zi0f=OFU#sGIwI#s{R9gZC~S8~I&&b`5mtIn~gu*sO~#?U$YkY0J&^vv5%530?(xal7K~*@i>vW!7W`$sr8Gw&5D0o?jgt=Gc zT~?(x*$fJTv4;L&$6m0jvSxu({FJA`Zhzmm>J^`RJ{xtDs%$XL=hPWVR55UyGnhV)s&un9ZEk(xI8=!Np z;ur}#GEE~ea#Lk^6#ssk0%|RX02-JVgoCip;6tnvtd(V&vh}(xjtJv`4;6==IL1Us?-R%S1iT9`?^sr>Gr0lIOk7S7Dm9@^ zrRTtDDg@HY6g`q$`5pJz86+u|c1-Qc8BypMh(fB^b2WV`=V|Q$7NhdkoQgGeFttGv zX1Z|gB)|(+@TgrT)~2bi`gi`%o)(~CTO_^Z38WlcBXQ~!Bh)$qo@VD zE_x%PQjE|Ba0EeF2!=-+!p*RVXV8QORg^$rJ|OF;4v}mo$Cx0s#Kesx(QszW*-zU$ z8gMWTx&lD*NO5o-Nm?-h3^4!)+fnR-+di69q>@#PnGpe8i4VL0FMyv8v4inwDC>i< zc9_c$8j0~j9gJ(|Hq^VgS!1PzpCieIxEF>*BO)gQ__zu9*aCbLTbdzFT9G8%KtFB; zeFOHA%rH_1_%3-y$e!xVLfuAqTvD14$*tre1n337ip~dqvp!;0ZOef_4=wn63cxke zC;_Vod}Y8jS7|GpsLCybX|oVKrNA{&8B@q87G?8D!`arsiqN#)qJw3j(qqNkS`{Xm zMqPA4-QqOwRfJo$V4%*4x(w8Tyxa>((hhZQxm3$T8f}3(j~@tiu8GHmI(L~B9=oBg z=?%fI0>rzM59&I)PN;JtT5ZdPI$oO;X?H=LjQmfiTRf$_6G=Hx=fj6U{g9wIa)^Pb z#}}{)C>WfNt%a(1CIg55xvkRo%6{8(OLbp`ed zbzdchPa*T-HG~$Q1fxM1hm%p9ore>AFBrz-$rv7nq!q?f9t}rR`NqJ$KG?{6c5Yfh zgI!O&R=9A9mHU`TT`duBp67vRj^+0m+-I@bBn)V%nYqN4o^j$lF-{55&WN;>Gh|iS zPE>tPNChEEsUTC@@p#llaB2clkK7}=0Kg`*uMXY7lH?ncnn)DyF%P+vNf4~%S*`ot z86$a`3~Kw54Ae8OO#Lkl_!1^*Mrk6Q&C7KF%@FFB`I<~n@%X|PM&o1{^Qn5N^jVj@ zqO9W;Z2f0dOZbX*LkuU9Qizo?H9$-sK*FB|0lmZn%DY0_v8UY%dx%{bpY(dd=2NC@ zcN)KU<~k2F9|{2m7df;`<^^=Qm=0OAPlynxa-}nDFYsOZ%+c`%- ztC`^bTrUn@tDiv}xR=`70-I~?rnY@8ZQ1v8-1jh2d1J6#8wiej5fxF2pc49oE)e#b zR7@(G7JtA!Q*aM@t~1@11Y-zgVp2MAD6ge}=pUaWMbTA40JR7pML53@50o_4EW z&mw|!BnK|2?`jg3M0i?~3tffQH)XD6=W7GlS=?1C`nA+nIg0QeF5!X+Fl#dYV?ZUU z&^;iA_GB`oe^{i4e~L((mqxTLzPS|Loiir6POvoXPqtfe*q>-H9*yIWK*N#iE9kq^)06)I@RrO% diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_hard_omni.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_hard_omni.bin index a27c44c0224beee2554757ef076ba1ac545a0230..dbfd381f0837f3cfae7edc60c7e6a8045a47f305 100644 GIT binary patch literal 6703 zcmcIpU2p4187|zcC@aAN7p%DP-Z^K}V0%2ahw5mxaC89iwc@}9SC-qjt%VauvD2ho zoeTa4e}VtV`^=0zGmevXg>c(Mp7;BGpLf3c{=@Hn`2Ju2`S%4qpI!WPm)F((L-+OS zrYhInH_g7>e*b$H7xYWdr@MSrbmg`x>OT}_xEFd?-QDfl@{G{Z2>nc3`miZ)cXhEn zBh?zIAMEl?u`O0@WX687%e%7M7JqKGtD^qxwk+3%NWNLbf0T9I><#rZhx+S!R~p)n z9ok<@%lE;H(6IkV$Ma3oR$bLtE_^;j+H~)#ZFvjw@7HTPv%l!`-gV`ASAgTgrs@8& zqih=+pX~D6rf#f}PuskGD3;CsPsJucl~ker{_~5A4OyyMQsk}5Wwl#vyt}$7y6a0r zc%V{mylPE@m%DX!M+x-Q*kgGcd%aH<7OtoH3@T1ANKo1MIKek4TApB#iX6r2H zCm1x2PEak-NJPENrm*!gA5iu(7vXKp)E28vU2dayo?Y}Ym#&k0Ip;FmZi*i~yAagX^%x6kzvr7I7&O|xB6Ok<&*6rCoq)1=rXG4C;dtjhiI z=vq!N*Ozti)a*LHZf<3xdT+g8=Fx~9$<6)UA%DLu?tg=Zr9dB>YU!(b2*sDESevON{F8{Fmpnc@Xo`K2X+EzlzB9oP%V+#>dupPy|-`4G7o2R zRHfado}?loCn z-$=T+Oi@ee#aCXiV1azXP(*=K_|0kTZJmHs}U$ z1i~_YMU%jZ7B+C8LxU$_Bz+7XL5Y|Ik0qK~nZ~dJQNj#}FzR}akvvT?%fP4wrorME zOb{`!z}t{*yx=)$BTo~Waut*MbTzpE5ojdo-FE>Q^a4g4Wl%5@)Ou7H`XsoC)WVTw z=9t~Ani(IBe@>KcghTyfSmstEL;pZk_)3g&P!+~7y^b*ks%r-$gEqn%58X+MO=685 zVGVjT-ZG&}?@U&t_zd1GaWRSpB!#<7xVQu5I2w%RslW>5;?H<6g+GXy%HR!;Qz13< zg3Ub5gj)`X9cy-Q$>pLfz5cGag!YjxAnz(CoyUFv#mJ08F^_0{Bu4caj6e*{5_{ku zCdISOc9gE;@;G2)(w9MZJPEe=4A`;|J$W>_ahALaY*}PY+K3mA1RE)SHP}dtcEU_{ z#)JP4*p$tj+&nJwOJHMY&>R~6cd*48Y-|GbBd{?6u*DK=ar7#%jix;}FsMiMr5QI1 zfGr%ux240#Lk5c~zO4*`9}5@0H8PZp(_uu^`eVescGCq(mcmj3X_USqKJlzsO0Gfv#~4(9W|=LY1r-s2UUFZKTPU)7XmuZguWD&3+OCs8LhKUdf7jZ%cIcF>t0nf7XD#+&KE@vsp z25}aOB;c_SJmAEi25}gKJRvqd$6hsHBBJ*!_0A=`R%(L^9dn)^d5 zYJ|tOOu3@MsN-w(T>4OCHM--wNHGoFHm$!cmQ}HC=|HNk1Sbyn5Ko@IURS^IC2dE>3BgMVAo zor^Dzu~aXG*(=H(En_B|IzPu(C8!LY|EM@QWfkD}?Yyq&F5tB6e%@na>Q-g3C#^tn zs19TS9iT)?CtVhBmWeosBavh&x6Dh_D_qOZx$0CQ1AA4CRj&_o&bPz%zOU!iQBnq6 zn=1=|voG~9yC~HT5W`@&5_!y(Vwx9#9H-@QR`T*h?vHWZAkR)Ygy&RtIT^_a6EY36VZ9M|{OiEB|~0eCrZd&KPe7c-fRaVz9z0 zB!=afys=ZSXec}yHTJ!(tJ|TBb<67>*hBTOI7qcaM_B(BaFsf@zm#^@d0kAZXQy(@lAfwB#h{YnLWhQ1xz<4N^AQ?5|Dth%DE@HYPqveXMM}jeuN&>;Chpo=- or(5@Wad99R01bh($ literal 7494 zcmb7JOK;mo5LSCB>IP`j_EO}sy#!Pu%jA-JAxMEVM%toJ)V=g1FcNJOphT6VEZad2 z{U7}c{g0iQeN#)xbpqMs%+Acte)H|_=*`9VpS=0|-+y}W^SJl%cD_lgbX7+me$eZ| zfB4bwxOw-{cD^W!vNCTTZRe}B$*MdpeoXzZm;TqadHv~jUgTHT&2MF$H+i`>k}ss> z)#`1YtwCXzS%vXr5t;)$rjrptynH5F3GeaLcL%%JynUQ_w$bQf4 zJl6C2I$f5#pVLi<>m`<~c+%_Lq}5%%zGByq&<(rE7BRb-uPL$@CwsyKgd3Ul4sny+ zF3Pf6Mn~lQh&(^nvaWzpj$Mvv&j%z_B8KpX1ZHlbo z=gclCfMS_1*(%M~Ea;!SJ7G5PMCnmc%%LhA*=4%OF0w+f$sEAP7!P0VAU%=_kA|*yf#D=0FQf{|yFL=`9QBV=r}sy=>m~2Vy{57ZTZiwd+$d^Gg;4Z5gb} zOC3bN&)z{yj5#=f&~9KG&|HZMnu9shqWK6X#OxO^G_b}(cG#J1Y`CMy7<&tJ&Q%;^ zVMnHE3`VZ147cJxu2Vp*QUsyW)s24){=U=z$YVg!DdjyidWq@baEzMV-k7a7N;Ef>5amZ7Mwn zPBS5pUS{Z#aN z*G>YwUj%pvtW^jxNQd3OaND>Wa#+>!Ey`upK z)1WH=B)1d?*O8EP!`av`pTA<>A)$pAiX13tC@-^P|^NRw71$u7`OIziup zy(BY?)B(Oro)NOA+Otr%6&{zACPZ>6c?bb|!LOq8f#1xJm{r?y;Lk$~{+OfxZfh6gMI=5V^=^>4FK%K`AggV#6<3gRg%nFZ(p|0r- z!L91!g5t;_2BIEc zz$&0%a6Yjns^Xar9s1|CPB+wbG;+VAU-Yqmp5w%U7P_VDm`F`OK%{|l{t=jVUx{Nj zu7ZL_Or?q3ny&8x2gKU6M6kh#=31qK1Vn2q=)x&rTL*m@94ZMMmRrYnN;KsIBU5^j zqImg&BLzcL2tS`ok_)T^bmN4}OS7#qe*ROr#PSI28}UG=L|!5&sw5Z>!#JFdl5&QeDVv3=iwO|B z$K)#&4M1X%3rO2L+}+sM`)*)L@;;;n5`lZnLylz<1SffB>)tA3q(+lL zZC{qUdd8Wlzoh|R!X$|(O(d&DSqISSpl+D2g*4pJbu5e~$tdPCb!GHfm#m?z;{mJw zt7;^+MKd9W{YELo%9wgVJRU&8&jJn7L!sTW=h&v{j{Oc|SH`D(3F+rd6~Mu<_s&@7 zfyP52z{^z*&5%U_JuFjKqB%mBeJX3|jv1qPty$Itx@XE2@56)jT~7^M3~P-b zB%9CMLWIN=Lc_^;=1&`|G@j52oqBrejof6cP{qyBQ}~HZ`U#T0DSN?ouvJ;qzt_@9 zi20Rg;?97QNLWta0;&y1S>HopIY5Al0c^>R@?xbc)yj12p-So_f0&g~@U$EGdK8h2 zBiVC7T~(8?B!XR3xX@K-eGleZcD@vVmBm%HqOYa4%29-;YzY@kfSHr=k7SK1bWVt& z`IwC89~SBUpCZ!skq~W*?-+C%fHnSf6M(8BgMnn3%DxgZ=fUp8o$}3nd;q4K*N#m0ARE!zdt$Y{Rb8szXJdO diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcf.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcf.bin index 67272088ec7de766bffacd614eb611d7697422d8..162ccda839bf8d0eaf8ba793ddc878e3e1be56d6 100644 GIT binary patch literal 4947 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 b;}89~c_fL(AN%pgB>x@8RkD72czEz%9I$+Y literal 16400 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 literal 5802 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 EztCf#umAu6 literal 16916 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 H%ZvX3l#{l8 diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcf_omni.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcf_omni.bin index bcf1853fdcfc0db174688f833e428145f45af722..f183352607ce3fa0e35f5bb5301ec657c0190fa4 100644 GIT binary patch literal 7879 zcmcIpTW=#t6%M?t2rDftyrAWw_pQB2Ox^lM7@>vH0OB@cc;U(F#GRx?+iiS_lZ@tp z|G{72zwndzPE~bRRlA+Z2+_OaxT{W`>vv9_D!+O6+wZ^m=fD4Tg6GSVAMIvMeS5e4 zc5zi#%kA5CU#-9Uos$#%kLUBUjwyn17@=xu0Q8vF>SJl!@LN{;nZ&lN@dpG;TVD?wd zu5xof2~14hxJn%BFJbC5Yg zpb_VT=LlWTXnur1GYSB8gs|tdIYMATc4XE=l!n{K$qev5PDc>@I2FJ+B-#-2s z`9U92*~l5|_>tKmjE|6MXLo>pj)t%rLi;)DZ%06WgkHlP=&YAMFz;t8n`M^=Gu!In zx^35Um_A(8O^M@E^7xbrr(|?LyRWPL;pkEqsms%*d~A2yxM{C-K1Z)2HiK_b$iZjcZsVYIX^2iA9-q#kRp%Re zpInackZO#F!S9QiC^p7~!2MztNdXp%@*$>wWZF3llxlLW2WP2b=ZB^uF-8SU0#kJs z%y=RYQ0GL9$_S$}Go$rQq~%7hUO{qFOf;==d$3AiI!mDKJ+>N)FK7|{ECNdr`=fiS z2d%$q+a{V7idL3Q6W^{Y+FSp6S1utpOAswu&ZcbAsqZaIfKz&+b`(PGcW ze#U?$ciI@hQ2zLUISfb70l>)^ndS5nqreeUA2`I(f+yoxeE=RXJpvwosi!#&8xUpO zfrv((N9c{7S&>ndA)yXTPT~+uw8X)J-gs&+mKabCV&-&o`UO^o7WVO1Bw5&UV+`ynI;o=d^3YBc24hrS zhZv*TP!5gsvIuJfz2zv@+WhKImjhcN`wIu{#yqbG=w8Ty#eSy2q)Me7b(htSmfveElfu}SPhW|H<+AX5wy zm?#O!RBJ7gCHBZ!WU#@5OZB|)?&iyfgxSe=&z@kTTg3@8&KfgTB0Xd>GfvV ztO-2GSw`@^S(n$_I1$q#7X{CQSh8)h0IbRSjLDwy1ofSq*IYgo+qH>c~<1PpkB#nJ=8aa zz8jnl5cW)2*AHoEqq}Z5BQz))*d;jUw7tbKy~YB)A(S}0+n7G>X+jhAcQVr_46!Nc zjxXBH)BTvL@Sho`2vHByH-4eIJh7JI_92RK7eP#QRZ1hr5Vc$9ZzGC%f!x~xvj_| zHh$;mP0wwd=sWpp^N;m5h885@4Bkj+kWI1GnO<2HjPn#Nv&>bNCMjGz6lV{CL}MJ0 z7t@F1M1%v#1JUD<2#Ql{!gbceGf0**inKDAAT=R_0t`S;q6?gpFp}Gm6vhQ4=>*FI zlHB40B6JeykD~@9%B$h?wvXof{+si8=LDfqrETaCNJR9Q(AwY#X`PiYZ*!V)toQVx zWu^ndgl>VBkKuU@Fou(cPB-w5cFKYVbgi%S*AtE>FK&d#LVsp$>fnz97k`@W_*z;Mh&_)y z%S_V2vlJoss|Mvn$KY&i2CW5J2-l@*a_tCHj)QzecjL0iO7zKKCCUpT4JyJaz3Y3+ zb8TOFwTbB;o-VT9k4CzBP={#}+@H}Mre{{EQ4G86FJ0!9vdZJ_|Be*$4rYeD^}Vsq zJ4BCm70tF!3GX+`kZJI16Wp$~^8!IoqZks`NA2Z6c?6lf&OriTP+O;CX+5YC{a>21 z0$Y#D1jp^BNhQ-#(eZ}dVSlcI1RYXo%Y~_6)x%1_L3}C%P7ydqu!7}E;8dw_>cFli zQzjFx_c5)il163omrs?#PL?o87lo8ql`@=E2tFFjl*C;L4u7(kJ^&E}jII$KOh0zh ZwgnwbKXubj25p1sJ*IWeemFfn`7gEc=wbi> literal 9091 zcmb7KOONBm5uW5?WMaUMlS`0G`(jWt8m-tQ^}u=!*j{WBaKq9Ax&l%8nLUos=E5CuOFN@w}1KVn;(Dq`2v1EyZFsM-DbON zU4_5?)x`z;hab}>ZQDotbWyI#oo)GepRThy-xb;FZ&`QqU3YV3n?Kp7tK$A${aslV zby04tzpvRo;;PLHE7g=8OF*+cm_0G~%*;UF`A&dj9KX z<2v{gyRYkfv(HfDc3al}+QW!#ke}_-YJHonx2s}v{~hJg6V`dX%l=vJ*4gUMyFB-Y z=Lr9kuU6&3cKzKxb)?^{_PLdP>dC&(-6U6O^)9XEZom2+?`XXdKA23IHlv3#VI|vKu+m-rE*%aSv04#zwRiX z9{pw^^{6>@K_zuwO%>O9JuI{HT2OFSslw9Fck;DxD-RG`7I$Ku6&n!@F5h1Y7oVy^ zsdiE*9#6K+7Wr+yQjC-WMuh-g(Dh2t{I-0^ciDZOLfvrJ<*LkTksed16+yqnD-m!V z$kCH{A>z?^fYOGC(GgVd${N+1nH?P;pN0+*;B%*q$4(n6?awyy)M*6gV~asJ`RSeLsJ(L*=#xtD4E4l1VK{!uUv8aRC+I{*;3;XsiI@fOwz$#G1T z9i5sf7`fl&xB>Y0y9{vd*ay%+zhFEX4+VUvae}q7T(Pm4GDd@Ei-5&1zF>vv=+TV3 z5y)KiHM2B_P*!UZXf{fyDwv-0W)*aByGjy;l*s2qAZ&lc68g+3B z>V_73pe`K+3w24e6RccsvbtLvILn&OdIT zx_I71cN*$Mw8oYXb=*7g9_b|1(a8S^b%&?eJCT$R^~rOf-XNsd=CT zR>g*Q0g>7sS~=!#QC1Ckd*d1rK{)=(<+94_G$MvF4`3|_XuB_Qn++crbNgCs^mIUh zQpKYxK6#r%sBeFWvCy|!l(95Yr(4yBo4~zi1Yz&aSNgWdsx%^k;P23f&&IHqwms;u zlin58f4?tly75aRVt{5F7%=(7?oRS{d9`0bk_fuy0Xo1r2vy;-N(3svVpEGEjgSY% zFV(j%ML1DkudjLSbY_5^YN)#7)S}qm?#GBsRhj5X*GgAE|BMmiI?Mz-p{y~J`HYIzOVT!b8SC7N>%lqznFPf&X7QabV((;CM?o;7|Pi0iY)VUa-y zF~DI=G2<}SYbv{qq1?bP)ulOxtIk#h_L9ylM=%~!)on*!DaLxiZ8V}euPKUQSjM3? z>QoDh^g7#tD*w_U#$xeZ#IP3Qp4jsXjeHQq<;{ek7ZlvKW}C;r+aGW&Q_ahE`E|Cj ztb|J*Eu0MM#{S6FLr-?0X9>G8v%{0CmmiFgb>W8Ky#_ru;mQpWswwSpjykIN16qIJ z0;t~aa{2o2(p<(YbJWG_VgATIzsD+B!iI?Z2%qumX&P z%o>zMX2?XSoLXd^n?Su9DV}n;Z@^a#Dx`Mbgyx{5ofuWM(^|bOcj*P!+16>L8xh=ti0Mx?VAi4!~wG?r<6>k(@K0x~yv|<2dl# zK+B9O8GR=VI~!Io*NEIeNDCn0FYMBEDzqa~{V4@pS=cyi1XVp_BNjmlJ=QvanY0-Ae*`x`Sj z*aN7>q={I#48fnkG-{8EDL(ZFk;krQZ+^eXF$rOXpCtTIz3l)xuqv`Pn zls5+l%9LiVzGFi|3mwlb@-wBHU&LCFsb$5~nYn{cXgy>D-YuDLTiuWaIV2 zX^feI)(4esdC>1UKr&Q;nG^)DuXn&i$2*Q%PpzHS5Y`UuDu&V<0>PO#rxh&BFxPYx zK%3W1Awpu-WNJHpTETf7bnv8CGu)!rE+EKG0L|a8WGYn7nMX%{a1nEgy zF6iZ$ld#zcHnB)iY}k7<>|6FlEz_0O=GmFyJ&A@3Ccuu#`j4biq3uTm?~vkz{$Y`} zzp6-^hkCTF{-{OL&CHe1T&Gx?<|jXHCCpDanog$CSmKVx29eAWpd2<}7$FNlrpf@O eSL=y6&%>X^&`8Z{rl8@;aXU_n@`uaIi~j)}1(Wsw diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcss.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcss.bin index 7841db96dd1e8bd1022ac6a9fa613b812bf5db7c..3a3a43a8fc7324764fe34f30d63294857047ab56 100644 GIT binary patch literal 6943 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 literal 8246 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 Ee?5(O7ytkO literal 28444 zcmd5_TaOz@c2@EdL|Gun@V)u7yHZotvva~{rYNix4qqMF8_5?e*C)p_#lt} z`hI=6d;9M0xBJ8HZnwXdH-8u3{O0P_ZhMUe4_h^Odi(9}&71qfHhcT`vG4ac+l%|l z&29GjANckD?%Un%_JT(Km+Naiz(1zp@9wtO_Zw>Q{muUFKkhMOVe)V9*N3a`H&-{8 zyX&{V^>UP#zc{Q9?>4XZ5C6WoS(0djboFCbeq5IyH}d#*S5Kb2-`sx0u+=*V@TPjd zy=bcU>+AjP)#mccr<0d0Ufyj#TcJu&xww|)5X>HYQY4Y(A( z+lrO&=v%N=?CTYC=AEeMsRpl4H8{*PFbaIEjaKDj?X*%KYiHE^c*9)LkG1|yLFH%K z=gKe54rCPD+xpu|TfvF<(95*I#r{eGitkA;_q*5C)n<2HEzX|)@U*Hf_YXJKo6G&? zu6n;a>|X6IcXuDx7%9H;cH=eZoBjLk?dI)vjbSR$&bqq0x`8>ZLA~O?tFNntGN|(p zAFD64g`Gc~m8rlsm`ZD@)H#)UmP)6nbe2k!Q)wcVSC}eKW~B(MK;UwFIQ-|k4aAma z`+{6by;z=)9dWR9fdlT?)5IgYgBf|i$TY?us_o@r8(D}gsTWORu?$V9o#Aez zC$aHZ5>5LE(YPg1(Xts0hvS@VoL5a|z_}Ue2op2XaZ4p0=gjE%I4>aI@u-BHw~#0z zSC?eeJw`^}qO^=0Oh73RKF(;6^JXMcB1K|8WY6A+RHdyAKzWb_LkGSXtY z{;YZi7u0%}p(95mQG0V|67>>_^mX-;`;W0BH$VS~_vP`?`BSlT7Nvwh8a=352zKjN zyUk%;M{klop%3R;=O5+-QhWPOF)+|eoO_#rbrhN!%xt17&B zy}zp#Z!g#1A-aA;`6nWjXyU4OZrQE8LN2?Z>0NhrcIF8ndOWLE=k?IIp^Fk!=9E~n zzMv)}{<=Esu9NiZCX+tw8Z9pNhe-=9!9+fqYU!1=y_#&#nDD1!QXtavp*xMUs$S~F znV)a8(A2N@^QHJ0)>EF-Eakb9-1@NH++MuQ$id&Hn!SZr#L{&K{Bwg9xVdf`G%@GE=&Rni3uxO_|9b zt16chbxbQ$))*95)glOzrnp--lnE@q41ax9A!7JHpFd9_Dp|Tt5Sysm>7DTcO;kbF zc=vh^tH{&?2lG!FQhP|kC!U5%1#;BWt*@yybkaeMr zat(zx-iWyaxH+;Jbo4l(=rAA~Dx(2o#(^Hxy}~ zRk3P1XGS<##B{jm|)?xHxK$(of0X{Q;_UD zPY-`Gp1f!Aj(-2<&0%}DZez@@Dt-U~rln^2a^ld!b$HY@BoA$j=_s}AV-QirRM$WPP0^;*pURSm_8NECI^nlf-bqwB&5~ZZVx*5`7 zr4%h>z*eu?Cnu5FddH@kS$pSmy4(S9`0m6dmf(SoZCGZ@9=_vjR;ED~xG`Dk4(Mc~sOVs;S`!o;(_&QqbdM=v5*`MFYoDdU1pyDKHi`tNge9YwDWimT3rZ zOFVu~_E`NI%gAZJA0uDCPl&}SEN~q_ElW#1BPZ?H7xF>0vuDj`>8d~xC%R()%?}{l zlxM_eZH?^Wi;x7wgaG1a^0AdqajteqJiJyZo?_}G$;gUQ_2k3-2bR~OIbTxEQsY0* z(u%L3EwKfwO`Me8oB`*|3wa5n7D}(&QuK-w01dOQIBW^-xT3hFYVX-y7g|TNF|gtw zmSjvJ%-E$KMj)=BgDhul=_?LrJ{4uc@c(KfMdRR8wx;o9MR>TFZhqs9WT;)%JcSh4p{eW;dZO_XmHdKTAZ8^6b64NFQpr zG_`1K(qV9&r}k{vsc*bFvz>3O7IFJKRrCq;b zEidTMj1>$V z>6pk6cdZ_a2bU0GWGGWac#uk~j0vMbECCHBtT_v^ek3aVC*Uk8Qk_7dks~{!!y{>U zQUN7zPEj(4B9a4<3BZE-Y%S=1Hfjo|-G(#|CaGxg{ zMHIO-8@E*J%537Pccz>VjHNB*5n#AZIM8UCaG;S%ILsI%i<4uRoMUbblXHmMWI)+T z!K9P`PmhDjid!6h^z25Jfrzjw5m+7t|03$i$7F88EtQF9o&xVk76u!H_uz~HoT?1k zSS~Z9%wKrmz~PoE$5!+5X|@>`ycCdTdMbr2O;bZqIDIAl;W*w5Mot0Fian|)Czx{~ zl^}*#64a>(Jj>W{Xc18}a^-}B=oyr-6PS?RsnMv=Q8Ap}8L*Ka&_B$cR7R&^Xr#W} z4{`(BKNAiO|1nv0fuhGcVXT4o9E=XypwVcRUs4wxJQDglc3Pq3WRB^o3V5EliW2e+ zQqQ32VK@p+^9uN^YYI+-y$Lw&mQ-M*GCO=?cp4%s0n}*42sI&HtYEBMWt=);beZyK zEd+x30}s#Xh(@d3QbkO`Z1EWKQb+^bvb}APPWXrQHkh?rstC#pKml|Hx5j9*z;*67 zR5;b>HO52;68M@v!^x}ZXTUlRfNBqv*z^a{ODMMRSc0)xSKM+W!3jCb6;5jjmR+>_ z)YH@Po=gV|R*9lZPv`h)O%fe{m_IvNyu{v^K3YueQxM{c$%Pa5^iEL==Vs)PvD0ye z$0R60A4Q&PMb#2_Qd#jV+HIK9Fk#4hol`-LA7K!MpUSEiTt_AJM`7W%T~R2?g%sZx+=27?wA4C{ zcg6a%P9B&$@0Iw|FoTSjrJ_6sQwVvuM!}V?hm)K3Wtd;6rWB0i(s6i_xyG09LhHEV zK~pkVxl0G=J+1terl#VYmb(RhU9D_F4a%Uhlfyv9tCV0SS1SWh_LIXHuAcBVfzMs7 z^v0k{c!Oyw|6CwX4Rnz?!)@M7&l>L@AK@lKrQWPZ^O`s*ex2Xz_SG-_naW@MeY*a2 z>EJx6M$&Rq0K0TDKD0;-))bWzx{jfg<(J7cO8R0F{!};58blvm2D^0H-tyJZ9Wk@@ z=F~}UYMW+&mK0O81Dk1C>rx%#g2@T!F4Zsu_7lqCbWb3gRfv*Ys$$tN%^ZM-o!f$# znoTQWYBp06HzCeGVjNQx&yQ0oi>-P!%9*Iep%Uc?AYW@h9{vUrXDw>z?oQ@1e=;U- zQF+%i6IdQ@F-s4p&^5dm<~6~t>9JJWjV??`59U45EItpnDs|h0VD1|=NN;K(l^sr@ zdUC4vgf=l-_N>Jz7x8*fm4c<1(3VHgsJ)rPG!JbQ5W(Ic99}HYo~ATSyn0nY@J%>V zwC7NKnr$ljWFRl=0xQtD{6sg2JdNWBN-;n{R>@K0Bo4u4(v2Z{E5w?(Y590izXYB; z*B5Yo=({RV%g{cxDP#MFM{?n*3NIZ*H;2Aye$&I~e;gh~&Jm+?av6#Ekf)eIT0y%M zoLl8Mp4?m_N)|=&mzY%AD_Ujaax7*Vl}dw@zi;XMWhSn6rW8W9Y7@yuWuhRIzf_ad z)r83pBV^-RRk$&bgQuWjGBlJy`7JSrdpB_>fd1rMs9ol{P?ClzbXo(DrY1IE$#n=4 zz9?fWsM>Cg!A(XqLrOU!LrNb#a3DOB6(y>64l1EGL?@>ZTx+*3)LbTK5stLgClXv+ zJd!|saD2vmrrQNG8wTYWs#3trFgvB-a8$IACD8>sy=_3v3Rx1GWm%GvPj*~kek7YG z&5o4iN#dqu13_+K(3}-7{i!Vk)7EYxw1h5-E6Q{>`LNvow8m-V9>`zb$go{_B}s5v zd-}lmfaD3~&PbSTVnxE1zU-mp(fQ*6)+x3~mnTQp9iD1TfQXna1$|$HUQ$?|JH+lf z!1-i{;k+@TFj7v777~dxJ%8_{u&q!`cqSdoTMNtqoMdTh!DK~5ljb7~%`@9lt!MHI z>Rre!=y4+GJB0%A^df`qhc1M z(sl!dET#2wOmsrPYqt$Eoe4!O9dfoQ-$@UVj~+V_uUEyVh|`@1;&i(8fXhv4>%o6w z?4O91Hy>~zNsCl%KNtlpZ$UW0ODFop>5$oO&{wI{b^~rb888Ovz1?nTjqTg*hEB!h zB;<}_^4xYq*F1K+p;OV>r};wP0{a~uQnxmlF=?V8lc55$xZS`!9^Y>0{JC`@mvM!_ zr-H;}jl}*vogcZ~pf4#g2Ogmfj)b3KFZA?wL*Z7F>%t)|CZqsEenyyy-fQS|xKgdm z$$Dp6&2KkorZmJFvu%B6iXVZS$8I;s4VsiWS+62@No1wMU6TJt+YNF>MKKu=Fpbu& zN;^fXfMDtE2GdTt19etR=@>&?q0oPi&aHUhaM< zsf3&!@luscJXlEL?Mv-M^>%~Y`k-`9zF5Vr$e{>H345B7t@h-W$fOYT7e<(x3UPW} zGGu(EDoZt}0Piy=%8Ia=T(vN1=LBr&C%jF!8{~Eb5=Z?VEUu^MqX6#$d1`QSyTRYv zFwOL=Ntd+79gT1kp;B*NiFr+&me~IELfCG=pIlD%ltAc3Pprtr4r(D! z!EOiwD6UubY+I2`F*^Fo2Rv)s6`3ilwVH)*EO2sB#PAiqw@AAibJal202iMz2kpS- zTAJ#=r=x+#wi_^uX*rE#4r*g^uOx2cROEt-nN^6AvJKD^Iy%{ISY>y)9hwyiX*A0U zXynx62JeaHw;OtOOl(3h_l=*q-2kWhi0y{? zDVMh!dhFUrP%9*~CF$8q0;aA>K!qH8ksAQw4Tf;OwLn{VNmhck$ZWstaU`+@~+s^>uDdLgHfJ4DnVHL(?&zHdWqc!G20FLVvLz#ekcRS ze+yX>-Rm^l4QN)#lF%&6l9YV%V;Qp}**s}>q%2P=Z8zx4JZ9E7SoZ+cBPA$(4Nlh9 zZa4U^RTT%N0xxw-J}mb?qj4I!2l97+vh4chv zos$w#br6R>O6bC@dAk82OVavLAI8lHlnlUZ>9KUk+2-2~$VVT$-QZKi!gd2Voo+Ya zMx5Gi@SlvV%G(XNzotcMN?s+kne7I_OJiIAAOA0o*OJMP9*JV%Py~Lt2tQVWFChjN zL%$6YmTua+4maIOFMJvnUKqDjhYMSAKoG!y@h4rD71Bcv$ zGQwzXz7l{vSHGMNgo#Cy<(_`0wJ-p3@F;0H86{t$^2 zMHhnxx1}VLa2lKv@;`P``h}2lIxd9y1Ig%`8U?oIKU6) z+ysD3AjnVr*$LV*{(`@p_b7iK2zfX*0m>|xI=+KESkUwIUFOGUPv6?9I@?d463h!v zy+ud25KVNkkb_lT0P%Sx-ydHun`Egk5_D9(GIG3rz6)mO_Fiiev2MDkwzU9@=#q+{=U5(3W zV4isQ%*XG1z1crhxjLlppj+7QQUe82sKk5}xmsZdfkw_8{d&s_I6(e6qyzSF!4^^Q zWS{3RNj(N|M^;yogAaN?><@5_SJ;;VM-hIOjI2bfy|0jOZ{F_Xyp^< z2DMAu`Tx-pPyY60hnpIU{G{;FJB qVO*T^8VtRLo~dvA=3kn?&(-<)O4JKFVj56E1_r)-`iG}apZp(f)7+B) diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcss_linear.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcss_linear.bin index 827165ff0baeacab32bc97d7a957477aa5148567..a5260cf01ac91509ff6995c77a67fa2197cb3f41 100644 GIT binary patch literal 6976 zcmc&(TaV;86>fL|niWXE%ZiumTY9=W*m2_6^e$+{Xtf9sBMtAROn16FOI4+)RCQJN zYJM4ij_=q`Y}aj82#L&0cVZu(>vztvJ>R_l_UAuce)sJKo?l%2dNZB1k5B8b=O5Z; zv3}QWo7Inhba8>dcs|=q=k>Z-we{>TwI3c9y=@;JHhptu(Y;^v8z<@gvbo#L>eZQ5 zy>Up0Z8RLHJSDR@+e_zj+vv%?L&aCj0zjUJCb$z>TyM>?md{nAizin5| z9Zmmvu?U^;+rdTab+g#iMDc#vt^dA(V?3vyY^HbJtP4gy>!x&Vgi+3n@5 ze(5&rbk^M&FehIn>?*-XDB#26!*2S`s($KSuXKfc-paWSqO~mb&`;=A#s~E9I=&v9`X1Nkvm7wIR(n{szSZjdC z;$Rz-3_AC~D!f=KXa6y}9CUYG|0%kP`0cqixj_+jMJC(rt3tR>rkt0AZWBxR!xN#d zV^m7*hhn$O$^pjUnd1|DMijY0scF!&a9ou`)1kpqxy+#{w3H+r6rmuqTceXozD&3@ z??x*0RBB??HO5F)*-v$SZBvifeQ#hyZ}i00<5o$rjWXfsPn;Z)utFhIn9>F~-fYjoc|9*oyr}fp;O0VHO&lQTogmf!Yqd_H4N19%YfBnr8Pd*X zaiJOK63Hx7QOQyQi^oI`n9Ga8DqXM;4PG}-NKu1a5C(|wgf9KLsbTA8x8AIpG;Da} zd;->Wl9Iv32uOc}VJ7n{0F%rrv>RbC-3$yQsPxwym{ev=FeP);MJ^G`QWtP+S(ZXn8VRbJ8wOgQm7-D= zL!7ymtVBI1Sqb`z6`Vml$XvY;I>)zCr4|ykD3@9ZS>&aux3=i*Ma%RG4nm+CeyW&9 zE}0RdmqrZiO{6IKuJMhAaq+Yl<=^7y z$ja4x5^o(sO8)`INOjEAE#%eIV}3B)wso z);1A!DP&a$E(?Gg{ou5wiZqS5lbs*1t@!6Lfw6B;Rm;rEueyK`q^OOK zY4PAVb^&@1y8ub~A9Mj>IuD#9tq*r?4e5a9kJ&L=r88&4&o)AI!M5!ed zwQ$s2(E9x@{8jDm9f*ZJN^o>)EUFhT@mT`n$Y=wEaO)q+9vJ8#6^3~#OkY50qRYB-EW1$7uaFV(1e=-xx#w&Ft7A8r>Q0J{!q z?4a0QtsRCBMN?TKPW`$;)wE%Ljd#?xTq52R;B1|`jnH4a`-8oZ2`{>hWOr z5qEq{womP>Ngrw)Iro+zaBOI{((E{*jPqWE_e`&wx4RUvuw_^x_2C5cNbGdyUAKNR z&c%>zH4|TXC3?|79PZ}=eUIrGXR}nof^5uN0pLqj*iix(WG7#IHQZGV*C^T6;?1Kt z;!u?2gS{I&)Bu9VaI-NucyA%qdwa>zzBWJ=SOqSQ)h|rHr{lq@zHjSAkKS!>LXX_d zK;_en%prc(EFRZS2QrOApcUy7cV$Iq9Eu)x1+;HCEqezjoF#ZMMZds3h}qbmrM0^e zqVoiw;0f>uOZ;&4~bMLDfc^j5z1;G1xZa#uDrS zJB0Pdqs=iKK~B!FnLuEr1r+eHa$43gBuha(kG%dowTw+>qwiQoBiga|R0V;ZLS_2e zlw&cDd8yBNGen_XcH1Bt_FX$}O^o&oEf?~uZiB(TgT9Xv}B@>jQ%69a?mV>38Q zn+>i}5KcGb#u1@8Zr7?LwQiS1PGU#~CMYkO)2@lIO5apppcL6xf9TD>)TdH#Gj6KK zn-O2(%$95j%&HBF&6v4)wVy~p^SB^~m*p|~EeG1keH0GMd$$p8QV literal 8263 zcmcgxTW{;e5qA61)(u*q?MqRh*t`UkFEp>Z;3NUk90V!aqCwqvf|hBUjU*}}W!VnS zpX)E{%SkkS ze#xYMZTlHpt$7^r5)pEZocfIM~o9U)|U+=0VTK@B9;~Myb znD4r3voBHNcH4A+-@}frlfT&)?fSM{Z&&r^@jHs6o&2ON+NbiqIsC2MMi^Qh-GBe_ z?CiPRy}}Ch1bg4A=W3a%=VH_B*5&Hm`Cu}GNv&zwG`sr|30(eMSBH1!`%V1-daUM5 znG-%an;e;?Q$I3i&;Mfr;Pj|xMniijS42`Kb|X#fu)g5dhh_ndGt(wDDJ*=9t6VG!T<`p^Gp;@t(PSgbiBqa^BmQPo1?> z@aqes$eVbDiEGiAlPXaVz76M0!O2A3%uzQB53mGc-~Re-&P>U0*zQ9dQaM)^FQ#rb41f#m?j3pEXsc^c1kyiH6^X2g_Y;#W+k z*VY?3rdWf<&SQX=P1~DyLnX3q&c(^_T;9~R8$rUuh<}uEqBAA`ATvF$(-6IqQAbD7 zR^@K_bX&hwMNBE^kH9LU*&Y=Yj^e&rAL3vSx)}AQ2?s0>gQ_rzS?$A zMNH6jJc9~H2U)~~DF-^sRnt~&_or2}{N5}lAUQ(i^P?w_5TLaFdef;pz545Bzv+sE zoa+r?z;Me$O*)h~H|~m^cQ#=|F#~Mk;(h?EL`=v4>Q{mFxGv%;YJR8a)8{Il>W`O~ zQc&ISaaku#ex~w)CWISP(h{tKx}>3g0^9gHzfvbyss-$zzixx)h2Ek821k z)^bjmb#f-j*u1!!6Mmhn8%R+47;*5T{b2{y0>X?xj(?Ys207+F{M@LRILzCu=P4C# z>#45Ymf8~V{6h6n4^#u0Yit7LjS0Q(`>mr;k zk~p6(JP!AohMD?&kRYaUIFgjXNUB~+{YqvWkrP?FE?-nIp3_$&dU^%p@=}NV1OB03 zw4H%3<5Wol@U-Oh14L9ScQjXcIti9fga92^cG0fL7U(+tA6@40$KS3)b<4E;TFY zxuHW1hEIIZ>TqMBp!o(kK!Lyv(B%|Z`g(*AsF#3l0(Laq17rm0h{8m-7_K)ujK{q> z{2#orL2Di!+Nvv3;ytCzSBSQpD96(d(`9+}ATIe2*k zAplxtiiTkGF|iEx8S5Il00NEU3b!t{GXM)0_BinihbKtG2%iQL_;X<(JC&A!J2*^e z!>OqeBYKeYLTb1U^u;nfufsJT-V$pCBWsBsM#ib&yZp=gbE>Ig47r4F&E+~Da*}R+ zL)o$j1>1Fj;F;H6IaP@m>xw%=iOgwxP@)%LK&xW@p?W!%`$WoeK1j$E zYI%)iLAD^knmjYCo)ZU)0)3$)-#p#=CI=q9XcM~A6&B1hiL@e zse$Ttpc;B|h6@J3?#Uh))M}KVCNhOiJj>}H=IHRFc9f4An*n(dqF;Yqm|ldcGo4HI zvQ6Mz;&3*drBQ-cW!88;bD;y+MX0)63#Fxb{{gS|X@{1@2ol~rK2#7He>gus`wvV8 Bo*e)H diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcss_linear_csm.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcss_linear_csm.bin index 4292922b374807da1ceceb1477366019377d7f90..12874c73236e9687aafc05980b19f06376f4fc1d 100644 GIT binary patch literal 24635 zcmdU1TW=dlc6Ra-#91KNBric;IB(Qg;&xZxqum6H9Sk-|f($Tu4na$_O{^qpMahzF z%tQW1{zCrae&4BkcNIlhUKrCe7Rj!vQ|Eq8ovyC$fBgO5eE+}y|9>xV{qn`%-z_gT zZ{OYi_VV>+eRcc8_I`cymw)l%1^&nNi@W9J>UMpzSzY}5%HOtwzT3QcbGKXX8FcOk z{ezk5$Lsak-Nou=�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 D<9@yJ literal 28570 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 diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcss_linear_omni.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcss_linear_omni.bin index 4089d252bf039ccfb1cb3541ac7da522c6fc7854..3dd86f1b04d728efddf64a7327e977a86172ed74 100644 GIT binary patch literal 9876 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 diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcss_omni.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcss_omni.bin index d19a57e05bbba7d8424729f8d3a45eee0f48b674..14acf4c5bbc2c71b2d82fab44319b5c4e9a22e82 100644 GIT binary patch literal 9835 zcmc&)TXP#p6*jz3n5_a9UZ{PUt>QtBZP9a|!3oqtDnN1DBE0aVn%HAog`^R>Sawo* z;D7KJ_>X+w>7MEC(MUOQwV=R2oQ_vqE@Uw`M--~aiK6Fi@v{9rqoP4DhE zU(Mf4>&52lW>>Gi`Hhnk{Ez3e?POkU>eaNG{kF2hEz`^C?d^75A7Q$&Og}W5UN7tG z?W|fI;aXd+Z*M2dYE{kGksbSdJK5BmRrQBvHLqsBTGjQ!PQo^4@-Ovl*6i%;_r2L) z%(k_i`<^%Vr`oZ-vm&(Quwp%bUCo!X>EiBdvC&R`*DUtyWe zn$y2oEL^vL(FSF+sTbRd6t9=f=8s#1!s__ec5>a!8fWCQ^<;ft-88%3S4+hZ>L_l0 zd~&jcrs*1jf_Z&2-OiW6?X0ObSEqL39ynMA(**`kw~Og5yc_7Thx$4RTALi8Tn*D% z$Q&RL#JS)(K-USnIY1zSJU|^F>?ExZ5Ezghm~{{(aQiTs2HuD12*D3i0gQd3HIY}Z zqL+ai^gfk|oL*gcV73qA17zat7SP9Nh*clj$Ed#=0QmuWfjiJSUAVw}m@G|}UG2?m z>c{J*S>0gieWrFQIy@C0o=W_wICz*mOzYkL=t7Fr)#h71!Yb^Akncf8RYPuMmoxVE_@aTk;+zlpqnnBJ@vl)4%OCUOae0qBU zt6Jai``Oiij4T?Gq4E3iLW&_F1ouaaC~}CHSC1q9;nFU!z$`kukU@MbF7}s-#28d? z<}FpSU=kJ?U|^ky(Kx_psr2adHW0nRix<#b%WAFtlf}aEs z8I9c0ow0-bZ<=NXeJZD~s@ZIGx2n0h{`tOIj3^P|BEK4|v(|o>uSm6>91~k9N*l=` zYbd`#PmvluvwFSmD+zl_-pgXiSrdL2x4O8b~1kHrSRbspyzK8KY+nL?4(WcqJk zmJgGd`KS&26s%D&(ZppLG{wk6#0P%^b#d&#$q;9L>SO=V=DCaY7V0mugF!;gnUmBM z)6Hs_Il?(>poRj{hZ<*nJsjzz5pt<-cRUEWcn@-v)51ia1Ho8L2ETv!qC3`V$S3N{cuTld=ra>Xb2B<4EO- z;?XUhK}9x>ia0D%P=-Zb!gzL9cF}#C8G<#A7LyS6J7Mb6vDRKU>krW-lm{YscKjB- zu>Q0=3odbWU=E<;$G$o2RzMod&Z1dtC*6v$Ot_s8!KEGY%`I}LI)guF^u6|yLQ4)> z5k_k1>`pzYWnrmtF%pbgLs*K{mDp4S&x0_N&!QEIN+yBP$FFQr@wGTVw}t1OSHpe1 ziK6*(+7r+Av#C!_YbGJNo(0i3F3U2D@ii&(ELX6GV6qFbCBsA^2_-Fg2+;vgRDtuC z1_?hCX6wJLHX~R=E$47;%0V>_b$73TP=%UgM-;-yQ)X-WkHP|NwIVe zbR<|QSY47_JR-uFq3}1KJV)L}X~APoRHP{0lA}X5cZ*B7IF<)lfE0yfl#NxaiY&r` zDa;Vdv`paGG)?0;FHsMQ`ceU5;W&+PUR8*5SY|3kjYw4r`dlTUf_jjd8WNWgz86JW z#u@5Ul$AxCB~dB|F-pSG)3;M^l?m*7PCq57MJ{9X&O%aP1Hp{WDzQbj$Z00c)i7;lB#S(57(d z_}A+57C0>G62Y;CTUKKa)IASImug&=Iupw@&hjJlyAbN4UT0UqWIJku=PbGrgIx*Af+K zjC8sP4s-5~a_$+`<{*lsT`ukC<(jv3_$yCxXTNYa1!=tWrht!jQ=mL#L#}s$JpJfh zpd@Dpq5OD3P33L?dcgH>?E2{8U z$993FO+WN`=Y(3))qLvmYd(c~HQ$o7HQ$oxnh%^8Ne4*x(uuj_1Ep|*!fDe^@*^KV z-#Oy*quv|j;6lhkl!Sb|)WYV_(YlQkWH`XrjNKV2O}PhGizoj|k~@uQPY<1M%pohy zoK$FqvoL)*fsoQx$#!mk$(#XkCMSDXVo&yt8OTQOYP1z+t6@9h71Va{xK=TB-@W^? zb;X6LAHOa@03P0}v8`dfTH6lqt7ciEr1hpo)nqY=P$<0)TbE13TVI!(M(B6V&0a4g z;iXIeukFSVEd8yA?sy;U?x(YQbX(ziy2m0lRZ!2G&5py%IO|1B$X+*}K8_FzX~x09 z_LX}iI^B8GZ0^Om7-D*Jw5z;Xse4_$p<1Xo;Ty8k&*q{qH!NM=%2i)sdL)7ix`QuY zv~OJ7S8li^kv-g^*prY&1V-<@GY*)9NBeTB1(wek^C+y}Q%&F2KovweF80mOWWVR} zU{&2rtHm07xBdmez_6G>eiB`b*&(=LYqH2_bjcuunlcZD^ezcu4tp)&b0&!Nm?Ix^-0oV;Pgz^!h8)%8~8<=EIlm&Gcooc^KZNP Sw;E=>`5opZS>KEPnM>k=3w!;fuCT-%R!)vR5#8`tvFUA3&Y&1PON{#f@n-}X0muK8!XYB9fm*nZu1 z^Xy;(Q2-J;$E-M_Zo?e_hA)68(@ zKde@Ag5U7;+ikPj)hKbZZnuBk!HS)cpX{n`c~dXfi}~vQYx1Mlxox(a`Y-KfSucLK zX&QfdqVw;~V$ts1&|mB-(fj3M*SNl)dwt(D(#c)bJ=C}D{?GM#jGL+Vv$!}pd8{|j zV552fZ?Dy3GfUNDwIa*joE~&$(785SGSIzko@Q;kxs6}xPhROyU+K?!`qB2sd9#0W zx?9cfU=eOvnX-UB+6!j&jwO%}^f|b{CUEG#V zq`&A1p8@$WkOss=Tu?~8E~bO)bvX>P*QFrfoKT0M-)xfiN=6RqWj$Z1=5;WhnkIkmOZz_lzr2_fUlX|Oe+pUT` zjvzmco}OPWMOfqWS)Y#QULD$rAFbr2R|$IfqgCvCRe<{kHE3?TTeS67ZI^3cwF=ln z*}p;IvVKw#{W@^n<$*V!&o1?VP!=2+Hto;Ine#gpMPVQ8%3Ev1*_rwdY*Na@0hsm( zly4~&1uRu3%63&bE=b7+7#fMO;2m`>m5ugfnNlBs^%J(E(0YuU3Q%&tX)vAt?V$$L ziU|QUFfJO8#+M3y>2-p(wq3BYQY)jyvqr$;r=PMwF?zP^4h)&-v38dxV9KKDx*(ql z;H1>(aj|Pg#A8oEJf?`f;^9*>&PtCk7fL^e|jCRUQY}znf ziKYet8xzO*n2lrfoC9qVf;O?B4bT$X$=F8;s2YH791mdEM{i72iWW)$$6%B|Fg!{K zhh`Dapb87BI0M7_fNZTgM6w&4qJwyenQuvE;jEOmpK^9o;9(kMHGoV?@o*g*T5$&C zXn=?9IQ79TQxjWiSjDL+2;kg(FbnVk%yXpM!+4yV_)uyX=Ej7;F}+X+<#uuj^<&&@ zu`_8Uj8QfDf@{8Pd5GNpcAEIqSo zgF29xUyx+OP*22^yga1Q0jMYGM?yWZ#N$If@tGAKk3-$k8-kq;#M-G3>ejlWP)~?x ztu7zxST-?fAA>q6`7fa^c#3BylJcOQLmWhV<^om$0f+NaER^k;j6C{J zq|7kXtu-d!(LeM{o)4-I^SY}N;z0fz46>I8qbGFyVFj2H-APTx+LYqZK7g+1Zd1>; zQIsd6=_HvZP#RM0uAAwYcE6~;g45hPyhwpKad0lmI3DK(Rovrzl9rJB&dy*sQ1Q7c zM#&_NCpsO9*yP!Xd+Y;kMK@n@J&|hOas9Xxv$hNR`_@Pi&jTsYBd;!m4ZHRaHW2LU zO1hQyxyNRCQcE!|-{NV*b1HifG-#6>+LzNQvgnBsA(dJeuAx+?EwrIPi+kUxdXW#Ph zjKC#?>c@Lufc&BL&sSUZL63gd?pE6>BjbW5bQmJ}P?L5g_Vt_M`o$ukG1zfpcOL}$ zz!`c5hX!Lm5-o7Ury{rLd6gnljo&Ex>oXM>`p=6Cu2bX=n2P|DtaOi8{AMQW7>Hz; zaWo5}e#1+B<4jiJagxbF$+=2K>2x|R_%zsKlu0P8L08Kn6f>@Podkw}2<8I`d2+}K zu%i3N21tmQN7*w4*mnW(l_RCV&$WW1C>*K1#meh~%uqPnQBr_LOc@yzv@lf|IFP;| z_=V7OpU@Le>y+anUse8e25WdtIV5zQK}A&YJSJ1vN0^jY8SuW{Z5p`Mi{!Q5B~0eR zSXwvx)jlg`p(s z@!q(OdRi}-0<($n$dSOO8?t^{xa`praL&brcDc*Ew4y*teXam;<}RkkU_d}m>$M5Z zK$+fUuej|Q3#L{P0&cJ&)ZoH6ynlyWZVDEq zZ$aq>kmD^)A+itcq#6aP6j)MECqW*6L0zdKVwM5cXg>~Hv;RL>EL9XGiq3`m&S8@pTT3NFqZL}PXIqbLS{8G(G_N~Hc$!^D6T%v`I=VBAbdqyK9tGj z{d6$~YrMqlQZra8Q}aP`?zP(B)L9h!2|CAw9VX};&$}W)gV14u1|gfErFvYjP0>T@ zy%as9-lk}GjgoPc6$Ywq=4AA;hpBPT+&c*kP$>jusoVS_hPB%mw&{<k!rg)sDYoT$YI&IkcAL3oZ<# zdMwOMuEXX*Gh6{5`SskN+FKkLRCPS3uE_qUx=no!U^68)%@FR?3xpX{xv9BP?%K~8 zu+Q)w(c*}T6cm$m9JvRFz08a;BLuPY;{5u(Kr-UoZ$z>wo!%)qn?w!HHj0f5l^e@B zyhA0_2wO}EgEg`~aKRMk{)6#Pl#a$oItl!9Zedn(T(oMT^x2a{q9COLWD6z|CN%%dR|M?q2h)2ToSJpsy^>?iz+Dkjz62ER4R<#Ez zIOe-OsE0L-WA>YZo5^T%99y@0^9>91 zTx!Ft3w&BF>HeOrHe2hqbqvYQm{?5k#zK73*+D7-lMsZY^CIj-NK8zE=vhA{99}=w zz64ut(O283om+H$(YF_p^h+dt7xtR%ptum!&t;v>8l^nem&BbBIgwmme*lJZu_`_{ zB}P4G)|X%0;jK3KMYyZB!t`c>B8l#&+|DpOQ>~prri$>FLRT0B>7rQUCw| diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm.bin index a40793b75dfe432a2396781cdd0c2a32b712289d..2c716176473f9a4905f353bdbfd357ea4393981c 100644 GIT binary patch literal 4187 zcmcInOONA35Dr{`u)qN>h)eIyo=vjtNBhArLMukAMF_FdaJM{(Gch=}#M46zkPW3<>%#J??&)^HTt%Vvh-=yyjee{N#49Kwn_Er zC!-Pkhv!8bt>Y%C(m4Aq9+o?!`*gW%>*R{jVletndU`06d7H)66{~u%`l5}>xQf@c zeP+!X*1nPG?~6KZ(jp%u-}iot=02^GIf{SHb9J9TbXjPcByVHXcqohJj~4bmAbr+G z^CByhl^1nXui{0q{XH%z=1ipRpRY%w5wy**6gZH^;047VslK2fSv{84@w&{C z%DyLRYLB&KeguYfLCRz8>fxFWQmt3UHSITNYUF}GuNELT%~f7EvS#K*Q9+(np+h#& zCQY`dt2q=$oZXJIcwe-Qkri`ZrR0uKlfa7V;PGj>i{4i8(=S-9;D1x33$l*W+%U%< z#sr?e%xn_5t^+VyRI}Zlye5!k+tAmy<}J5>EQ*Xop6h{SoMpySmEfHCa~00wOSyI=>h?au*%uSQ5PR?T>yl^Ho#in^1;;wyg z!@d1X=**$~v8>Rhp&f*bQ9rP3Mt%e#6)3trv%r3eIA^35rE;H(;wU&Z^*%)qJ;fhO zJtj${-=_>SmGAZR1E@^Dnk>c4lA+-e((p0@B*6nN4P4;2$hSBj;AP-raG^4c>LSzl zSI-N6Ig5#IMea~#u;iryZZC#}*@d0M_6Bo=c!VnadsrF}HRgO^^^O=vm3<&nn7DGH z%yuT$zuKs?tx0Ya4d_vHiBHd{3)!**0B@3A(^iS0&aepxsU@31GlL%V9jr#)aEqcb z5C(d1=pyQbw#B?4V4>p$%(J~Pa6H#$yhtaQ3e%jB-uAHlkG3D#oNOB3r4S}YJKGKW z7koihe*%$9|1aA3Tv*3D$PW1517GkL1au?3P84zuCu#0Bz* z?j>i=K?wIEjva!}EXkjm)v-gK3M?!LOeX~6G@!VVkgJY&NY%B-_Q+viho*^|S5*(4 zYWE2?H)NgejClsv6T`qF1inPSO)=_;l1&-K>8%2pf#VP>53-6A#!&ORhV%KdEj0AC z?QH=SLZVPq{BeCZ^j&5-lsQ4@Qr8Z>z-Nm43F?cL;@EkD)x}paX3Or#B98nAWeLvMqoPu z()kAY{%{3JEsL$rW)BWR!-m4cssUZj8hV=$WmlrfAgM^saOK4|=ACRG5=$un9;Q9^qQge&@bu-d5>tEM&_Q+4F>0-$?s=BA z;DKC7y2A;SX>%F>=LIyhLeKSW%kyRHU{G8OFMUva&|c!VdU)Eiy&%?+(?U$IWLMgd zC2MBe3>%cukOry(einO9yEkX#S@*cT~+Zs7>u$|_z>Oba3 zaL$=~;&|z+RTy+m3*rtZNwZZ+w9?CQ>91J@6_76bvobVNqHpx-iV9(HY?LPdj55_avl7j-Pd)x+9arPw=U{G zHjuFm@>Mmfo{~ke{XJPnSUp+5f4}K;o|AH)tsdDEq_<|z={#o7vsFBF zTACL{xoFV9<?X(?`*iydfqkuBIV$yO`~yC1sDwpXxOo$d%1 zGky&c=aJp8z(Y=dw`XsBF!i?~uDS;d3RW-I0KOSOftl}M!;pOdoudE-xXy$yfDrPus?Pc6=pR0$ zf3qyc^p)R%=XU^p(ZdT%^D0#VC{0{-4=DtZR6)JG*sj?_UL>`Se2A~riXr+TsrD9! z>;eiBlLcB#6Rz|}&e{>gbz=;9f;|YXw8bHr(gym6Q`u>ZV>D+7#x!^0c$r}6{}&-n zU#DmT`*KRH_5JvfSF=g$<(xI56z1CQZQ!5HZk==QOz18wYPN)b*xJ zfe8Ya3VM3Ygi^M~On*5|uQetJVvC|Sb>SR%z|L+IPX!;2rcE=%VMHOAqt%D)M^^CZYPtzJKo0E3Q#X*3Pxzb)++ZHsqKY6pa#{u9vxGpFuocvSja5hW zGiIi~YXc1h6Fw&hj7{+3%LC|E~CkY|Idi76P2i~NQ4cqXs zHm0+{at8qv{7n!jz_y0AV*u8+*!LE|LWH5TdC9cx*0l$3t@l9dVIJV+GK2Y^=WxVg zCggyIo;DInUAbd+>lKlTh4pkW%;~a936KB&Z2D#fFYzJGrL;ZRuHw-U``L$=_&VY(YSWfPNp)5x^ zw{si^2vDQSm29alPPr1JOqWlZq!9VTc1Dkbdz&+>=+5X#PFyUMvQA`3hYECIrqKCy zz_;w(4572wRVVuD#5CM;6kM%H;7E{GEp~ Tv@=MM@Z?(n7H!5a-EQYUo_dS1 diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm_csm.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm_csm.bin index f1f44672382fe599121ed5ced8f6ffb8e4f539ec..1ec7231dcf399fa10c6a6898098e19f0103ea439 100644 GIT binary patch literal 11605 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 Bp|$`3 literal 12227 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 diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm_linear.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm_linear.bin index c93112b9b904df8491e8cf77d46ff5edd6ec54e1..c4a4fcac5500cb9f71bdd99cf8b84b72301e7a4a 100644 GIT binary patch literal 4198 zcmcInOONA35Dr{`u)qN>h)eIynN70ox6QCZD@LnD2(i*|w>*h6#r-AKwpfeKq)Y6J_cBL-lrfmnM1jq1YwsPd^z9 z@QdrkCR)Z-vQFddx42!dm2T3-VpAp;l;*9{cgoW3Dw%Dvczr>uY_-1FM5}lmFH7sh zn%S;>qtHJTWm=_0-b%i2>=xBcx=v;!{x#3_IDe?KP*q93iD}2}s;K_hAodpNvrRNB zvO-&VQAXuMJTG>?$16@blWF_=>%m|JOKAxpwoK;fX1QXEtca`YVJmn*;#Vxqu{hl1 z>7rOKnOxf@Gl$haY0O-o-q&(;W`m$uXY0(q255d}g8=FLe6l>&J7uswa zZPR4;d^JaL#M$*Qix0)7GO}VOs+7H9e8jM#8@Rh)?4x(<`2H8FR@mPb>6|U&G&e@W z$05Vjl$pgM$F%{|@oKt1u-6P(wv6ujZgeg5?}{R0k>`5QjI+$RUnevt{(OjYg8;`; znNRs>)K&3piI6UsK>#CxC%q!iBF`gt2sBH|vX5wLh)+T_$;#w32Ej{Xa;FShv>`?9 z!;G-@Gvia6i_0`ai-%Sax-Rzv({kC55ORsq)%Q&3PYCCP)Z~^cm*+*#IX(5hNls8T z_wsx`|H!OfKhxuwQBJ^^v`0CV?D+5=iOdgOc3@MnqvujnvlT|$)M>fGcR`X`MAF(U#E83Od>1xPzkQpZcP?hYf%{npkaW;m~^i^MU)XgtK@9?~o^7BQxhvfQaIAgh_wl#0#Bo|+<*Kr{_| z`KCVq>l19c>yJtuA+U*#-a`=Th6=YnQ^;4kx_S=uMFaYEo^Nq%2F^bLwsKng#cE+KT(80cvt5K_Avs{UP2~xE3NOAZ#h=j@z4me;rUjjA z&t3=-1Y*#_ibeg3HSvrqzfv>Nr4aP@jV^Xa(#M|H*hC#2wE|XQc3wTYpj}ZPwd|lC zM3&X-Tq8l!sVf8*ls3l|KVHB?GxQwaGCg0l4ml-~OV58OKF2fVf0-!tax*>DU~*c> z>6PqP7P4ecEz6}AbvdfavAAVBp@~!7u|00Prk6~>BWez$6KZ`or;dX&-{o+}3T+!& x9uI9awARLTUv^&wrhC*ygz~75?4I~gi`BDaPkgM!M_F?{@eX3qwNJz0;2-N}m}39{ literal 4736 zcma)ATW{k;6b`%qVG%;`0ODnMS=nux^^9{>Dbk8+wFn`Q%6sG{ZfoSk#&(*^s{fsH z&fF6xOLrB;K4;GLJKxOY-QD{yKQI4z-+{lcI$x}3Wl|-}nt%F9rvv}t&%6`%-Dm6B zyvU2nzInBtEt4j#vLydKX@9+Fe_h+xU$19*_W0ENRn%FN6)P+GR!QD2@3V9T3Y*k% zuBErx!^65x52W9zwRdGYU*}16ApXIKi{>_~(m8tmZMAY8{HWbGO}bhqsBu>o&7W(? z*arEkp4CsuqS*YAlo3`>7V!ITI-TdF+GVRp_5|sb>^Yss?0L2-s%4U2caMYv5K2q) zqNo-v8o2y9OE=fu^(uP+JJ#}mnI@iq` zxu7_w=fUH=;vrDZX}@iOjMcA`WtpdyxMePOpy5TfV9O+1u^{Yz=rY@0!DdamC0xw- zHAtLCcEbV>IsNU9z45`+--Nj89xy0avn&C8Gk^j!-@(XZmEtV_{gi-z$9@lyD}tyW z^%#7F(o#|6dU1?~vIiCf+H!x(Ucc62(cgt3`v5uz0Ss`R31I*s^3Tyfd`SOh zS&Zo`zXQ+j0Q{nd7nbIAssd1&xauBK2qLM1dU>%a*+X6=jgEYXuhohn`XQDHbgI4+9Dl!0?tZs$CTr-Bbh)3$lz zFwPLq!Rr0yBdhg%*r13tY*6kTbJ1ETmtvsYKkM9i45ihLG!~s!9&kV#in$^qvz#Lz zEt9QfHE^?oero8TR|r!9N5;@|+PhcnX!SP)l0-RL1=DupX;GKK=>^CSiVO)lzy<85V>ghJzd3LWCTKAaZBa##9XZZc z_@p3^6l?``U}M!${fwEZ@7h31!Guo>0%>7h)Pat)?aToi0`5@}9}kAHm}(HTS@%go z2(VuNTQz|<>0?7Ue5{S>EU?@`00n;&1PZWcL)$U{>zN}qOq&@mA;M7Fyky$;*|mFb zt@l9dVIJV+GK2Y^=WrZjCggyIp7sq&UAbd+n--CZh4pkW%;~a939kzN%>n_fSAu&p zaudweC*L7o%t_uXuy^M;EcarnzvnNkOrZVSxwPC;9 zuqil@rWD;cJmc-1g2-P(9;u&7tuIFwWD}YcGiPS^5JcD70G|8o1bMdM5J<3;Nyzh? zrb`iH&=@lXeIc7!78`bm0aJoN0Ebvq(h*Qcty*i^$|s>sWE8@Kb6c)q`-fg52+8K< zp%5W4fzXg?TJm>~rh+yPf~~2DJgVDJ`P8xG_rfK8fuwK8Ua}o*?GE+po!smi!aaft z;?97INLWtpfuSr%IX8J62MAE3%9U)WE>5`;qf8f7nxqi^^s|~5h=J}0c=jTVH2rA$Ep}EUxOk2!@eGW z1var8|A>kzf6xgCEb<+`ojC;(KwDodKEe61u?=DbR_`02vqs^sxk{7r~5v@=MM@Z{!Z^3v^g{sWK^nBM>Z diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm_linear_csm.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm_linear_csm.bin index e0d7245d4205b3b70ac84a764f457451538447ed..4cfd6917e2e1ce5c129b659fad79e81f0aded8be 100644 GIT binary patch literal 11839 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 diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm_linear_omni.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm_linear_omni.bin index dd9ee85e0ffead78ed792bc112389708ccb1c463..c693946625447b544c7494025adccdbf25169d1e 100644 GIT binary patch literal 7083 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 E0mSHH?*IS* diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_color_texture.bin b/examples/runtime/shaders/essl/fs_shadowmaps_color_texture.bin index 10539e00b146e2e0a61107fea81d9018f419e4ba..408d62e9afe58f1e9111daa16530284a91d006d1 100644 GIT binary patch literal 651 zcmZ9J%Wi`(6hvt@mE3=*yaY8uHkg-4yJ=N*TlE8w!y~Z-7#T=Ns{DJeAuXX77HHs} znKAEQ9}n{JWn;jsjQc)GWhvF_&M@GHL2c6I!>bmxGKrrn!)R2VidM)PS9vD-s=-Am zc^9Mk#a`_84Hh+ssINsKRfQ+5xKK}R3Ax{~;<^h1Hue+c-_@GmzQmTx^ zsN^TvcV;P5-swQkm{=H;d4b{Wt{9Sc#dl*B;2osMaK%M!TId^Lm?_$5n}j}4z@qC_ zZq6Ckx5ieyTyt?k8H2q>9!1@GPp1P)EJ7gRd_@Nt6FLa1Y9nV^T##026 zt4SJY50j55usO;bOl&%l2xSqW)TcCZL%@1I;Ko!_C0#2MZOT=6y(yd4O zdh$G-;Q`_wE&Me91dUrB}T6d+e^rx3!iC{Z_> zudr(O@D3<@taXYUZvahQKfal;oWRaX&-z9+CSbG^fbn?TQU1DLUJ(cM$D_PD)8QlyEji}B}LIwH$)Dz5&r XOT`Lzp=5cq(IV@9zacT?T`491*7DK$ diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_hblur.bin b/examples/runtime/shaders/essl/fs_shadowmaps_hblur.bin index 41f41dc75df1908ea63b69499b823a109964cc17..3deb0b4e2ab04627cf812adf1e0d8f6d2ae45989 100644 GIT binary patch literal 2373 zcmds3&5qMB5H3doZ@|UJ6uQyO*yA5noIoosoOpmLv}qfut*bQcb{Fxa9J%raT$p5+ zwtJ|^t-FjOIi4AN{N=O#<@(E~S3iFK{?!wE(R;laZRYtT-h9s2ApPbMd-Jl_TUW)n z+>~*pmc^vpF4to)6La zkUk$Wvi4mpCu*6OtF)hdOO)6>*mlt)jVx%URX(oM#*?CDkJ@nt17#VgeIafe%mnsZ zl|I-c)~TSXw^fmzez3s_q;>#gM23(_2lCbsISM8addHI6RJ9ps@RkAr+7K)UV-cBI zYZrjMFRs836lScQcL2s?u)rn+29|sW1_9YhnoJ29fRvKH_Z+nKY{>?%r8GN_Bqp!PBm>7s%1JJ!YCb% z3YaAkgIQ1}i%3cplfM2<7cHIc(b*oI@6knHpN`XkR5?t-yvP#8uAw~(o|kD1d6?c*v$Iz#gGq!6g{6EWt2vz;db*%x1LHS*_WK2^}CdV}enKnJ6WZ zFkG8(;=4S#Aif3EcDUzzxN$6uC4~1d*zK(pVw%u}AD5%{Vp&%t)a!BYPZiDGVb=!y zu8qg}KWKw(+@Oqe>WkyJ!R*G3qqe~}ZV*AZ<9kQ4gKz9OZXaUn$067A;L9SmejMCK zp2X=iuLvxl%nRghfcUI=wqg%NGA{x|X8T_qiJ*k$lt9c4R2Y?pQQ!a0nqAa(9iMVP z=@QQZ*CEWYi3QB5J{7SlOV)K(uxzr!#dd8k7RyIOV}(Ox-WTxgP_VTz%_?^@8D`&( WGt7b;6%MatCKU=zOkaQ2b?p8QU|?-Tjw0KY#uC-NW&!_jZ-6rs>FSzotuy@BWA5bXKIz%-vsmn2`{WUyZ3V^_?{VQ!Vqm$R&Z&*V}7|29i^Ze4~mH%v>< z{gKd!;LH)X$%cY_n~baEu1F`J+{_h&AYYuLKsHI4RYT{B5q%mG7a?{#1h+%{c1WQ2 zjmt-5p5}`%3cd#f$06Ch=>&|yY|vY|F0$}4?f!)^%=R6jF@OLjfm<+20BEqn0yA0; zUhr~CYw)tT+8wDW)0S%{xzyTFA(a$h)pc$rYH>eoTW~|2^?;La2Ang)jiu5s#;G+- z2+0{-TN42_d_(-`yAiikHMsf7Hx-miqtUBkN&_&eEawup;F@t=XEXW9cr$WSXE(*! zd6QFU>+GgD8?Va^BoS2Oiid}R#RTEVm7y;vw2H;!XJ||*RtuBL7+hOrqyl9P$Lf*V z;34S~7Skx|lN0t~+YlR(_Xn{(1=d|_d5>)_|4g6xooblEF@28M&ic@P`8i@c>kHo- zTIP?~&iYcd*GFt;ecj>wA-1!=>2UrK+gaasIDd$3uK(=r^_|K3yI@?T!!q2rA&@er zhgO64xbIwX6}`ks>bvE?al0e#>DLaz{O3ftm;ONZ&$y~k?6D2@@$=z7z0kM8#Cz}r N_-sLd=6(c0?=MzzrZWHl literal 2772 zcmb`J&5oNe5Xb42_91+PZHjDz`B2nTt5q*O^#KqY*aQh;M99}xeWAWmkG=K{dg-hI z$LY2ZETS9|h8g{TGcbSOfBE$K$Isut4EVe<-t6MtCQ146b5ddW|NMo|chfKqNqx?@ zYqZJNn+hGW6-9@*$xbWI>l81|7jaLClaV+biMu0lZ)xtg`6I7Ov`fmW$ZGl#sVtDs z^AwdyzD1U8el-y)_)&0x&ZLMz;pGxV55>NYK^1C)=smK4wb|Dh6t>jL3k4I~=ni3r zQjZcw?dy_FSwW9tKtZVg?VO-;${S<}4bJHd<)F0|b})7$sNzQpL>z33VlwS~o%VDb zOcS+lL?ED{qrfDH+~D67&~QoN=}~yjG>Ud40;B6BdfPYB6Dp^1J{@o1WC|zK<7C>L z9kHZjlPRg3CZVoN!nRNSlTZ8h`3j}4N9oT->1$B-vmB%h6v{x4GMJ6BeXpiGv96pY z_OQ#s;6K9*70gf%Gn@@GoIFg|>4!Ot87Y{N9%eKfW;7WSmS(qS@t|E0uvWQg3DyIJ zJl$RU_YNXh1659R7*%+1=Wzs#=-T9N^G3*<4V4Jg%eGwcvWkf~6rTNV?jX$aFBmDpX diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_packdepth.bin b/examples/runtime/shaders/essl/fs_shadowmaps_packdepth.bin index fb77de2f2caa600270583e787b1c6b3fa2b190fd..0d70923f9b1a2e554765385100c17a8599f798cc 100644 GIT binary patch literal 433 zcmb`B&rXCe5XSLZUt*5MKed!?DIuOrHr{;zQdwY|03|Go>>A&~v(M?#p&l0R&Y@rX zb!L9w_T~Ay{~W#pUtd>2&<|x{57u?imOFcFd#D;`#*AD(_O{;lU^_I4?cn!0mBj|8 zymtpX;&etDb8^R#Hm)#>0gu2#Kxf_mT32(v9Zdb?8aLp&$=MyW#&$F$?*y<`+w&yF zE!AL(kuEqIDXF74k&NGgl3e(UkX|B&xEr99UP7@mJghRZx21zK8N#iXF!RX2sSvq< u?}4JQc|M(S$m99K#e>JGh@{e5rm@me36<(tZG=p8B;^0JgqZDvkl+VuMRo1~ literal 308 zcmZ`z%MOAt5X5W!iS^cs))p*ch$j=`-47td2Q&dnDnZ5g7k;cq3kk}_J?zd-W@k3s z@5bdzzpbt&Bg?8|eV0W7sZ7!m>eFEfbyTX0tfVReR4aLeJeCDuf*uHlx+*Wtb;JWh z_ZT*C*72dj7#kJ<%}&H15CGtMWgo%I9I06wpbMpGJeh3t>;p8|Uy`;om2J9fd>bEBK#h8L4h)%} zFLQi)*u7srUZN1|RTRxjQ|T9NCK#JqpT-&5!6;jxpGL2{eg-|cA{x}$oGczprL14N z0}_L)z~|7~R0nwO+O0e;s=GIXSqh}5uWpcGE$e2sy~9?cYZ#TDaEx9NxcH@%B6E7X zsLEo`Vk)?#X~q+>2f+yoAI3wXi96%wn~sZs{k_9sp1cL@QnGF5i(l|C@uGW3nls9U clsr#`}#MV6LNJW@=z$s%N01U}OrW4D}2&H8nv7rRT)E6(y!S=jY@X0S(iD8?1|9>s3@# dR>2H502u=$42&&}3{A}}adW^n)N*k#002n#Mm_)l diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_packdepth_vsm.bin b/examples/runtime/shaders/essl/fs_shadowmaps_packdepth_vsm.bin index 2196e80d69797206e320b1c0f5ac74f352cba912..b1c4b1abfcfca38608360ea9ed400afd3d402577 100644 GIT binary patch literal 497 zcmbV|!A^uQ5QgzuUt*5!y4F%C3n89NHr{;zQdwY|03|GosPQd)KA*#*Q`TfLCLWwa zC!O~D|G(Wn++TL@{iiqA$A#y0eUY1ku`M*k&K#Q#%G&B7CFg^^srDV17Kg;NaN3SV z9>SP)_Fx92Q&Q_^dmLzObL|Fj3xWYomiHg4a>};7uI_AYdz2fk*+HXCOBs13fOS%z zGe8z@P=?a84S#`~g)4tzumZsqgDcn4g#-qakR<{Y%3kLKbptAu;$jUx$8alWzpq7%?`v?4PZI*Ozi{rjh#--^isD!$K@_V1A5j{SdFYp|R^h96|jOGL$uZzpQ)#icW5y>sNH*(Wsd@C|{ zopQ|coU$iKDIx3I6PCEJarzICk|5jHzpKxb@EL-IlZ>%_)w z4w+&|sYa7e)DI{ZB4QheBP3sb{v4*ia+?2@qpR{a#LD=ohYT-Gy~Y*zD_RyG@+!=W p;K35jVBiVaGnveM z^B>N~`D<~yX`lC;Xgju0Ve2ObQ}FS6=Dj+CP zjP|PoPWEzS)Q!6k8!l8Bowt}KD9l&Y>tc8SM@tn2IQvg3i~l_!R*Ua{CcJm dts)mEa0e9ptL1^5htBJG%CY=4Niui`u@({ZCzL< zqzpXi8m-VR#tA$D(a>$8>~OFhv&(J9({GJAGI|)DWKKMT*8ew?;83P4oKVxl!S#c^ G0HP0|b3=dt diff --git a/examples/runtime/shaders/essl/fs_shadowmaps_unpackdepth.bin b/examples/runtime/shaders/essl/fs_shadowmaps_unpackdepth.bin index 6e8ca87ba3a544a43e151df1f8d5ede2fe8834b4..7c27a7ba849ba6168922581a1fc9fdaa85fe4a4d 100644 GIT binary patch literal 502 zcmZ8d%TB{E5DdLx_y*)-B9&-u$BwN47ZBpYi4TZOlD3wTILf0fLi`t>$3{hMVPwhP z+1Z_upWj}t{LRB%fLH{VQ{LI$HUnQ=1OXnz^^gx6Tl(Fr?O^5(^fz8zUlnd}zNJl7 zx~b{ts`hrw$f>b$>rF>pizJy^xAJ{M58PmzuC99iM9&Sff2wU&B=ndHm$>$K9y^?F z^Re0&-uESBq_!V^8pGNbcAP`qQ-~-sr-6jNuUGs0xwq>_U;7^SZM`dLV_h3YI*>BkUF$EmNv^W@9(FcDVsl!`%sR@`u4$`~b0q8O7>3XvL+T35HA zmz2d)q&fviG&2fhVvGcd`V>2p(g>xc;>u{D5-wBCI7(OyQFL$@ R;ql+%{mjk1jC>Ii`~Zg|kR1R3 literal 431 zcmY+9-A;rs5QTB?M4!RTWl4~f-(`b(quK0@S3Uq~paKb{wfwHecX!wX7AL)!IVUsc z>+$1sCm&v(46L1T-==NJayh;;MU5L{ept7Cs+eY?^>(ZFh26mPxoQe1tD;me@XUiD z?f8^QsdJi`eN%l(EudvW)m(dTu)Tlv*Zlz2q{JL#m4jea1H>|aOn_RBmlPj5p)fmj z6I7QTo3YpEmTYtFEu@7L&jJ!T)TeRe^G6!n;5wndkM}r)Hc*FB z|KPb{beJ7#S-7-vI@2^+Gl$@L)r$*Yut0emK+hQw5%>RT)A<|KX$ovC#&`GN%r-q~(&qdB zbI#w*`|AzfJw13-3-5Z&t#Zora&hH(bf|9oyl+&A`!{99%#PU5WnES1USkKQD)neA zY+F=A#?C^c>&Ala2(q!$TXY7FtXIaim6I=Uxgh)J+Ev90PN`^!?tc48k+92$YAO(2 zDKgfo1C9f4u~5St>JfwwM9vK>_^7v2zHzF4#ugpT+o3MODBW?NeKMf>YoRG~25xcB z=@Ib~2Tn_e(N+91`SLQ1A4~@V6p@QSh-fXtI7!oZ9VKa;$Yh;H$x6oeX(;0*gn{sV T|HmKk(`SQeX0w*DFUGuYr#yh; literal 407 zcmY+8O-sZu5QgjCjQ$3hV*;gQ(^XiiUX;a)Cr_SA*w!}CG$H*;75}@_g?>29VR(m` z=Q(}6-I%-Q#{g>=+%{=b%FGP!((>Rcm>TQ4ORaQLH)6MBpE&i>jjAr7R7Gi_&(8w- zw9Wn57?<&cbhY|2PD3NLt#T(`Vf%mGFZTynND1kU%0Nq117+lg090nUP-1AcMRvMR zFr8<30&51Ks1ei5v_R3M?Ocvny5)vjNf!AL15~Fx;ygZz{r$r+gnh&rW8vx(dGFc8 t(|M*keGxg#aIp~)(SRy=|1b07H>R`ev?{9f~*pmc^vpF4to)6La zkUk$Wvi4mpCu*6OtF)hdOO)6>*mlt)jVx%URX(oM#*?CDkJ@nt17#VgeIafe%mnsZ zl|I-c)~TSXw^fmzez3s_q;>#gM23(_2lCbsISM8addHI6RJ9ps@RkAr+7K)UV-cBI zYZrjMFRs836lScQcL2s?u)rn+29|sW1_9YhnoJ29fRvKH_Z+nKY{>?%r8GN_Bqp!PBm>7s%1JJ!YCb% z3YaAkgIQ1}i%3cplfM2<7cHIc(b*oI@6knHpN`XkR5?t-yvP#8uAw~(o|kD1d6?c*v$Iz#gGq!6g{6EWt2vz;db*%x1LHS*_WK2^}CdV}enKnJ6WZ zFkG8(;=4S#Aif3EcDUzzxN$6uC4~1d*zK(pVw%u}AD5%{Vp&%t)a!BYPZiDGVb=!y zu8qg}KWKw(+@Oqe>WkyJ!R*G3qqe~}ZV*AZ<9kQ4gKz9OZXaUn$067A;L9SmejMCK zp2X=iuLvxl%nRghfcUI=wqg%NGA{x|X8T_qiJ*k$lt9c4R2Y?pQQ!a0nqAa(9iMVP z=@QQZ*CEWYi3QB5J{7SlOV)K(uxzr!#dd8k7RyIOV}(Ox-WTxgP_VTz%_?^@8D`&( WGt7b;6%MatCKU=zOkaQ2b?p8QU|?-Tjw0KY#uC-NW&!_jZ-6rs>FSzotuy@BWA5bXKIz%-vsmn2`{WUyZ3V^_?{VQ!Vqm$R&Z&*V}7|29i^Ze4~mH%v>< z{gKd!;LH)X$%cY_n~baEu1F`J+{_h&AYYuLKsHI4RYT{B5q%mG7a?{#1h+%{c1WQ2 zjmt-5p5}`%3cd#f$06Ch=>&|yY|vY|F0$}4?f!)^%=R6jF@OLjfm<+20BEqn0yA0; zUhr~CYw)tT+8wDW)0S%{xzyTFA(a$h)pc$rYH>eoTW~|2^?;La2Ang)jiu5s#;G+- z2+0{-TN42_d_(-`yAiikHMsf7Hx-miqtUBkN&_&eEawup;F@t=XEXW9cr$WSXE(*! zd6QFU>+GgD8?Va^BoS2Oiid}R#RTEVm7y;vw2H;!XJ||*RtuBL7+hOrqyl9P$Lf*V z;34S~7Skx|lN0t~+YlR(_Xn{(1=d|_d5>)_|4g6xooblEF@28M&ic@P`8i@c>kHo- zTIP?~&iYcd*GFt;ecj>wA-1!=>2UrK+gaasIDd$3uK(=r^_|K3yI@?T!!q2rA&@er zhgO64xbIwX6}`ks>bvE?al0e#>DLaz{O3ftm;ONZ&$y~k?6D2@@$=z7z0kM8#Cz}r N_-sLd=6(c0?=MzzrZWHl literal 2772 zcmb`J&5oNe5Xb42_91+PZHjDz`B2nTt5q*O^#KqY*aQh;M99}xeWAWmkG=K{dg-hI z$LY2ZETS9|h8g{TGcbSOfBE$K$Isut4EVe<-t6MtCQ146b5ddW|NMo|chfKqNqx?@ zYqZJNn+hGW6-9@*$xbWI>l81|7jaLClaV+biMu0lZ)xtg`6I7Ov`fmW$ZGl#sVtDs z^AwdyzD1U8el-y)_)&0x&ZLMz;pGxV55>NYK^1C)=smK4wb|Dh6t>jL3k4I~=ni3r zQjZcw?dy_FSwW9tKtZVg?VO-;${S<}4bJHd<)F0|b})7$sNzQpL>z33VlwS~o%VDb zOcS+lL?ED{qrfDH+~D67&~QoN=}~yjG>Ud40;B6BdfPYB6Dp^1J{@o1WC|zK<7C>L z9kHZjlPRg3CZVoN!nRNSlTZ8h`3j}4N9oT->1$B-vmB%h6v{x4GMJ6BeXpiGv96pY z_OQ#s;6K9*70gf%Gn@@GoIFg|>4!Ot87Y{N9%eKfW;7WSmS(qS@t|E0uvWQg3DyIJ zJl$RU_YNXh1659R7*%+1=Wzs#=-T9N^G3*<4V4Jg%eGwcvWkf~6rTNV?jX$aFBmDpX diff --git a/examples/runtime/shaders/essl/fs_shadowvolume_color_lighting.bin b/examples/runtime/shaders/essl/fs_shadowvolume_color_lighting.bin index f3fca4e8ba57ecf09b7e14d369cfd7c431f35b36..792770181b88fe320587ae9c1d7af43528151685 100644 GIT binary patch literal 2036 zcmb7ENpIRf7UoZK1Fm;t(VSXE?X4ocj|>bjk~et)L)3rT-_diwSsdFC zA37k}%=`G3_ukC?!}sgO~E;g^LdnHq}6W(1|>%jt|>@BQ^`Ig zbkH8BphpzXFZNlxb2W~RSzT#ywu&mI@*OgD1Up?07cIA&2HzLa_A9dul-OrB2Ii4oSGE7}(uV@NG ziRRBMJDxSDj3NJ^D)%nJPRKf3XO+g9oxp}?4dS>K*tT5=gOgF!1=0H2O^~*YB_&z0 zhPI&j-id?_9o@EraZ|K0!a~ML9~6|0*)D4=Ch4}?0dH)|L6{)ebxerLvx62bOAYvv zrseFgK4gtX=Us7QFif8?f*s8?T#tYJnHgH4?*_Kz2cbU;ykS?OoE7;yexS2Tm9(;6dZ?Y&($RaBH!YXI?!(ohkIxCY4fv z9hflxCxw)YdqYUAF;5x|90C3!OePo*5IY?lVq@`=?R{c^8@`~>2>A-!zzINa%Xd7_ zvs};i9Y3&UGcq+npw=m?7_Kf2jvo4qNR!(_TV{d-PtM<19SqLxKP|&`Z9nu(aF!i9 z4je?^3>`4o1aTwq<1D>BykB6vJIEJ?Mk6kaGx*rT$7kVF3!k2a4*)~$x%yjGm4E!W BSt|el literal 2379 zcma)8NpI6Y6b`6BNqgXcIL~ohQsXUYqEarP3T`NHx7=isTJjRS#BMA8HfP?O&EvF2 zq&>v*_V4@VIoChFo-7~!yc@yibaYaO`Ts1OdC{G`g>*Z%s*|V)%iB1MGgcba zUew_x-*)bA>M)77x7GK&Tt@4-He8iyxxM+8Wvp0sQKw~CvGzyBvQ?bmtYTdMcr@Ba z#a*0j$t`5vkv&`aWFKaEkw(eo_(>z;b~&!IcmrNtTtEy+5AA7GDf^)bN}@?1I$%_Q z511wN16E1GfR)oRV0%o=fFn>eVCj?fFDFe~=Tt`NE@6fDg_!&SEqS~qX%uIKTH}W? z=}7QNmF|GG(7l9X^_^T1!DxKXsAAVb56ya@oINAZvl|F?ZKrqE-rd9Lp$=_0?q$@i z_(rr3k(3IdkTYG=!f0|1%0qGWJJWdrBTvv9NzUmTftw_cDwTg~L{1@comYe^a3;zt zFv3BUo;sfy(KEY+co}M@o!NIPF{J=3A=I;-Zp5jDhk9byf@x)%z?zVAY7)djum;+> zFxt6*nv`yn@Vbb$pYyy}1CUU~xQTFJk@rMm&i9@25m(N>7nPE{;rCxFVQv(fVkn9sVPT|--Xd|5B`ObXaR}JUqwYZ2ZHa3;@wEV7m=dK)Sv4>hF#te8r_r%YQ25A zj&OcCTPtCgYZuKHz>V3dV+T|IHz7}b?W3Yq==N@w3(cf)i}1n@!1NRGtXrRSN^^h* zE{(2zAr%k{e7FgflSYuxu^o-95D%JgG`Y|CEXb^mqa1arlszS%u3$39vLK9?e3Tee z3urv`2C^HAL#K*9UWEcn-VtANdVh(=&Ip}C@m^`&X{P{*ldos>bzN+%zdoTUxGHe3 zEahZS4Kl|kzRyK(|I0J91$hN{yhR}`1+2nz4tHN)+BqO6#*v)r3*WipMw9c+HJ+kN z^+K~-VCN&UbmxGKrrn!)R2VidM)PS9vD-s=-Am zc^9Mk#a`_84Hh+ssINsKRfQ+5xKK}R3Ax{~;<^h1Hue+c-_@GmzQmTx^ zsN^TvcV;P5-swQkm{=H;d4b{Wt{9Sc#dl*B;2osMaK%M!TId^Lm?_$5n}j}4z@qC_ zZq6Ckx5ieyTyt?k8H2q>9!1@GPp1P)EJ7gRd_@Nt6FLa1Y9nV^T##026 zt4SJY50j55usO;bOl&%l2xSqW)TcCZL%@1I;Ko!_C0#2MZOT=6y(yd4O zdh$G-;Q`_wE&Me91dUrB}T6d+e^rx3!iC{Z_> zudr(O@D3<@taXYUZvahQKfal;oWRaX&-z9+CSbG^fbn?TQU1DLUJ(cM$D_PD)8QlyEji}B}LIwH$)Dz5&r XOT`Lzp=5cq(IV@9zacT?T`491*7DK$ diff --git a/examples/runtime/shaders/essl/fs_shadowvolume_svbackblank.bin b/examples/runtime/shaders/essl/fs_shadowvolume_svbackblank.bin index 01cef2a0cf06a85ec02768d051ea19c01a8d935a..a7597ce1cc58ec16ae77f1c854a9db24d2d51a46 100644 GIT binary patch literal 168 zcmZ<@_TXlKgQ-APK~ZXQW^rbIok&~aCSOU^yt6-q102EPxC@M=$Hc?1QPpgP`D@sgv&d;*>P_R`n)H6U4tHdH!g+;6!A(oyK?^cwU?wp^KUj!6|8E?&1%f-b208Q&HKmY&$ diff --git a/examples/runtime/shaders/essl/fs_shadowvolume_svbackcolor.bin b/examples/runtime/shaders/essl/fs_shadowvolume_svbackcolor.bin index 0334ad1c31e7a26e042bcbe2abe336bec0748e40..979f8de2ae38a3b0b3d61d14956bf95a2fed3c86 100644 GIT binary patch literal 333 zcmZvW-3o$05QW!ng6$>dQg6h+N|CMt>AnY$&HP!|b;Z=w=-nGh$iTzEz?pB(Omw~M z$SjR)+c;4|)fF|s?&r&xGF)WcizehGND)#(%+!qc~Jo`(WGt3GgV9YdR>}$ zFvsFhutBwrE>yyrDe(lB0q890Tb}iCRI~g%{enxK;&+gYm%2e;6j1+&*<;Rp!|cN~ lVptHvDlsmIag}&Z-)=z9Lab$r{|hxAP;`2a(iV{iZf delta 103 zcmX@h)WM`!VxB;-P6(EDItm3QRILq5%iGMSOa8pX9#O7TnyEw$m+mXlO5T*UcQ=7KA2t;(ggN(-G^ usWYLBzgp(_*O-UE=zPidr-AmU%Rkf*dIV&Z~mH`Bg(^Sx%G z{cdi3&U0p2of0WXCMv)LJrF=4cu_-MD%Qd=_ChV`0vqsLY91m7yuiGSqefM2#1c_) zLcolUPUmgyjbCP|ILjKkELlM->y9y=pif0x=#a>~O-^ggPda5F@UEx|C8+ uM=ik*0b0BU3a diff --git a/examples/runtime/shaders/essl/fs_shadowvolume_svbacktex2.bin b/examples/runtime/shaders/essl/fs_shadowvolume_svbacktex2.bin index acb5ff10920deaeebe699700fec73cda16f87578..aff16d6927ad27294934385acbcf6893b3b7b752 100644 GIT binary patch literal 855 zcmchT!A`?442COl3ol`Ajl`xVsnc`=aR5!+d4MVHx-L@NOj|dB5buuDNkfy?8{nfq z|NiZN@%DNfo$KW$inhC|bbIGJXseYwv|Cs=-u83$12(SSY{7NZWR3mshdyq6Y5O30 zgoFci;52ls$`p!v{k~l6Z2jyTza!DnyA`z7bunk345$k48(3mO`n$TJVc+!&Te_~E z5B#)kxCE9$3Ywd!X>t`xf?|ZFK{y7H;Mh_Vgz3oEoM3XDsc`BT3zwdEUZzAOWEaP_ z*vBE5Cy2wx9A@D;4iAt|^P#ddQ<=$7XoZL(MX8m}gfZ15K~6%lPgE`iYGW{0+Mt#? uH%g}xGb1F@PMW!g3$wvx76SPPGfE+RMpyi~8F`S?VEFqP@;UorEcymd@y#3n literal 445 zcma)&O%8%E5QXcuUSiy}A=E--g|1A9dk;V=zl}f%BL0O7c}iO%CN79}Gwti^_ofr< zcXRYv&ly6Uk};G*RzN6zV1Qg^c@1fyL<`5z@wKE2Y`|sQ9ApY)L9!wY8dbG{h-8&f z3g+qPwBOd=_{$`g=dy+_iB`~-btjt8H5cQaT{WBxfrJbcaX1lTLTzvur__jR;EZ$b v=%^*Qo~QLM$ZZm0{SUcMLTvN>|2nx$Lad*VVXPwCszNmyGmgl|J;vw-jn`^s diff --git a/examples/runtime/shaders/essl/fs_shadowvolume_svfrontblank.bin b/examples/runtime/shaders/essl/fs_shadowvolume_svfrontblank.bin index a9c6459bf11b2e8685377489eb4d13a0689a8d38..4e03ed16abf2517481df692c7836d53dedd2fb13 100644 GIT binary patch literal 248 zcmZ<@_TXlKgQq}NK~ZXQW^rbIok&~aCSOU^yt6-q102EPxC@M=$Hc?1QPpgP`D@sgv&d;*>P_R`n&@(_0tHdH!g%C^6iFYeXOn1)D$uH8Ys07Kti~|{iB3%xYGz1x6%f-b2 E00xgRWB>pF diff --git a/examples/runtime/shaders/essl/fs_shadowvolume_svfrontcolor.bin b/examples/runtime/shaders/essl/fs_shadowvolume_svfrontcolor.bin index 0334ad1c31e7a26e042bcbe2abe336bec0748e40..979f8de2ae38a3b0b3d61d14956bf95a2fed3c86 100644 GIT binary patch literal 333 zcmZvW-3o$05QW!ng6$>dQg6h+N|CMt>AnY$&HP!|b;Z=w=-nGh$iTzEz?pB(Omw~M z$SjR)+c;4|)fF|s?&r&xGF)WcizehGND)#(%+!qc~Jo`(WGt3GgV9YdR>}$ zFvsFhutBwrE>yyrDe(lB0q890Tb}iCRI~g%{enxK;&+gYm%2e;6j1+&*<;Rp!|cN~ lVptHvDlsmIag}&Z-)=z9Lab$r{|hxAP;`2a(iV{iZf delta 103 zcmX@h)WO#9LEvZmT{cWQu^;**^p9*dn(!E zzTFvSR&Ou2(Rp5PqNwZ3!X2D%p((fS*mSU~y&ZD$1NN@kci>uFlG=Xw<3MX)*daVU zLd*a+Fdd!BB7se{dta}5TRr>Q_xN=3ZVQcdEoJ1B0M2whI>DNYIOr_n{1W5H7GefU zgmWzULsSJ(J|n6FlrzvEoMRcXv*_;@kc4h1wVMO2YOKe%!^#$}t>7tShkKwQCS&jb z*)kg^O;VYfRBx{QZ6L~Hwv}rs?Q&g>}Bi}p>y?fPU+NV+4L&WYxsY!I8NsJkB3GQ;vJ;pGD rzgTGf3vwHU*#ATBqYwxFzdyN*LhPTAeyJi`t6bF@Gpr~e9U;~WsdZ`Z diff --git a/examples/runtime/shaders/essl/fs_shadowvolume_svfronttex2.bin b/examples/runtime/shaders/essl/fs_shadowvolume_svfronttex2.bin index 6dab252339c602afe10911f09bcd99a48ec539e9..84e507d0e3cf8432027ff2cd4081df0f402319cf 100644 GIT binary patch literal 867 zcmchT&1!={6orNErY~`q3QcfkoF8jT7X|6E&<6+;W6Xd$VoYc$efQo`NGa$txyw2C zobS%bKi=+x%e>zOLD!dsJzCd7Q||1k>0nY)+%7t@wh- zQC!jzZ(K@MD8>t++8dL3k^57ZG=J(P^nVMe_-?|`Y>#18V?C}Na#Ps0f*1dHc!bb@ zGm78|(seqHN)%UG2`ae|f+m7VE)~_fT*V?nBhq4?GAg9jBIQyG$z-azOqfubGJ&zU h^8oW)WpOAj3B3r9m)fzLbC?Fjn)(fmiY4HF6 diff --git a/examples/runtime/shaders/essl/fs_shadowvolume_svside.bin b/examples/runtime/shaders/essl/fs_shadowvolume_svside.bin index 3c9c2e64a49a26b1c7e94a308db2d523c9dfacf6..29f1cd60ae81f92ba0b23d4d355d2eb020f4ab47 100644 GIT binary patch literal 701 zcmcgnOHPD95G5|#OO!i^LV%_}h{lBpaqj_04+BhR8kzt@G-fX31zdS7_clGoU)(xx zSM`2X`TgDL>&x5Lv3NdloPMZEIZE9@Tdn1;?V(m$Od0wjHnQ3DAUm@}vV+5DRWKLZ z3@P!bcay7hDW)ap8bS}u=0iDGWdf_Fekk%mG`Cvm!351(uAvpOb3OEgz~Fms!ANG8 zvIh68QO2sfDHo;e8qX33&*C#$Q|a4NmU(aaN{!W@!e6?dhnb+|T-Oz=(OrUlhywG? z6{JCG!4ifUXC$JS5E3OMrkJvb^U4p22R9G~VTjW>B9wEIV#*1PY05E8V#0V76S!P7 X7x39}euNGm;v@X=PaR%{_6RxeOB<5dr6ou*PzQpNvtq5vRGSN(xQ1?Cna`QthevAmEO{+Xtri^{0?ztvn$bf=o{5^PHr<;SRGVDyYtFbMtZqcQAEIMn}D7C3TQv3?sIPx@% zS>gxFs~s>~&=X}vnl!d*6TM=rlyI$s(kivY1A;(Gtji=s^#Kh003NiHHZKJ literal 80 zcmZ<@_Tb*T{cAP@7}x^Ivi!^xh1|rkcK!}wIvG)VWy1X_nEI~lP_+3_hmc6@?L`=BNWbT}~ zGr{S&dOhD4MMzbaO-MN7)k2k>lqO19#e`ldFCdR2+Ty^b?|=C58zx%n~>Gt>L+*l;xQ_XYFns+qLYCj~)mqAL3YML;wH) delta 103 zcmX@h)W5T)rZEG%Nx#Vq# zrp8ue+X_UfMAVfcm30B5)+ezGQ?lxd^1C&pKp*Wwl=HppS~Hh1Z#8HM3k#I;Gi05m zuhFXJ*`v&5t%7pxe+Ef98{5ld7b5IR+jCG$D+)vp)n5WL2Xu0 zdss#bhry8KO>)|KWIO_s2|S%X-@{VfHD8>76Ahm>{)?`y$IjocQ3m~W)8y;MR8|5u zV1`j3xGhTJWIPTsQ&2)MJbWj>o7+yns2LOQ_E< bp>U@?w=h9&&H=H3oa2&zf>ToQ5QUvA-5Yc@-5EttK+TGWp8MCrEsVaw~%8xZx>75{s!T0<>D)gCD`mk5Mu3<>r=^7hML&A-F?-fIdp;I9Sclq23 zL1A482v5ZgIr)BoX7>=T*I2)RV3--m>UzlAEX0NI+9WTtkk!AC;X7o$HKl0~Gd@wo H&z!Sw=r)vn diff --git a/examples/runtime/shaders/essl/fs_shadowvolume_texture.bin b/examples/runtime/shaders/essl/fs_shadowvolume_texture.bin index 210184817ad0930eee6f3ac5752751e3d207d304..6a920aaa68661c6da86e625632d5c3e81265968a 100644 GIT binary patch literal 276 zcmY*TK?=e^46N7q2g$Jo4@JCHy(q=I50JIp*1+zjY`3K%{@6#Ds!$!0LnfKY zjP|PoPWEzS)Q!6k8!l8Bowt}KD9l&Y>tc8SM@tn2IQvg3i~l_!R*Ua{CcJm dts)mEa0e9ptL1^5htBJG%CY=4Niui`u@({ZCzL< zqzpXi8m-VR#tA$D(a>$8>~OFhv&(J9({GJAGI|)DWKKMT*8ew?;83P4oKVxl!S#c^ G0HP0|b3=dt diff --git a/examples/runtime/shaders/essl/fs_shadowvolume_texture_lighting.bin b/examples/runtime/shaders/essl/fs_shadowvolume_texture_lighting.bin index 4bb3e0c8effe33eff1261b6cacc17b6b40276790..cc499e853c9020dcef150a6faf09e40d810f6467 100644 GIT binary patch literal 2191 zcmb7FNsrq$7+R}Q8=p8kzx-~sdMS2RKechnj}OgXMSYj- zd0W2#gfG^+Hm*yyYty8P>j$3moYfQf$2Q*c!=bI&_$NcOyW{<*JZIJ22!Wnt_nhU; zxc5UFmr0dmlc;a{0>843r6W;8DW@g%`!+rl$C325jvLl}X;{AFspz3^LzCOT6=_k8 zo6YOhs;tnt8>r0nq`(c5(&7f%kNO5E3?%hg;&qahDXZx3WU9oHr6w}y zc>{*BOJosVDherhu2eu^hn(UZx+LlLYG0H+-=$!~F}tFu_SRNQlgFZM^t9L|jc~;W zVi^QGV|bU`9}ivpu}Y3Z_EW+4BujX%8`|F*!Rjp`i;1aC5vH$*Uzk2rXKb&iPAI5) z?;`Ru5o5yJ+&E_Ucv%zMv7saj#cZN>DdylbK#Q#BII5oMwH$sxvuLEaCIN#6{d-eu;+m?cz&(Ll^2W%;pr zz}!TaGnyK36oDmYRTgJGxv%wEky57hRA)Ij16y#5PEBgb{2u_%jf=+m}dhE5tPZFZY)uY*w;N2j^CjIZPRtB zA9)rmMI*;?+{m{g2hLg(=>U0cD3{IeF|_vq`Z?6>dJ`_-#{qtP7QPJdh{0^iR&KMB{jC=w24Z&6jdOBgbH`dO*W||KY|~L8w9_c12enc zhm#nIv_j3!&Nq+mn^|tZeLVU7<4f&+Yvu_ zQHQIjh|*HuvFfl~?;al4VU*s-EUWZIIGe|dMO`v|_6nR=Y*r^x5ta{e7H6z9u%Ff8 zB46t3FY7Rgmk-s~yu6F%acx|crn}|+rz~T|o%XWIuwu=<2-IXsMcMw%7Bg10ClgN|#A^TSUtn99w84L@{O&4s7yL)DK&#YTII4e_M#7!;PYs|c0F^(AigFIbIvGmdIlx{X zo+&@iJ&+0Chlrwqo{6}<3D#zpFA-}l} z>_tLk`bxH*IZ>Vu>8pUPP}Bp%6GHY{W||$*@QiJlnd<~&{xc+p{_L`<(=o@yuXIZT-ydW9&!&DrVhGs=;3u>fFv*m-Cy)PK0>#fOl@b8*cqW?2;K=T0SyJW zeHy7+M=CBR)_oixDHwIw3ozUQ%OD%ZRIi8sWE#K#S+tJ>b3H3cWJf2kz0}&7K<`8n zEvsr}>FZnby6mXvnS7L;2Kaf0Jh`rifT+(|0`D4#0-lbyf?w9Ge9(xH*@kx=1-C&k w#rRZrV2TFM2?GCOIu`9hV6G}a72;Nl5B@uZtl?^CpFghhj$J)vzbtF;7ljTCtN;K2 diff --git a/examples/runtime/shaders/essl/fs_sky.bin b/examples/runtime/shaders/essl/fs_sky.bin index 145c87d6c6d551f877f6ecb0c049da3c9e8a2692..8b30a91207f7977e6c859a03f5d143db761fa356 100644 GIT binary patch literal 653 zcmZuuOH#r>5FJ^LmS^bY3_?sGBv2_=T4=fT0I2~6m@>(v@*~0W3SP%!c?CO(8W4K2 zdawKS>zDb<)8*&K;}^l|k*nN~MIu6($t3Mv5P~1pb?&Em^q>;C%#@Bg;<-mijHpTx zhET3l9>%Z^w8%W#5nHv{#-JhuX&$MyPC{t0LN0AMTaXT872&2r85>`93oJA$^H)E1L)A>@Qt$CbACqEtv^PH(Uvu2L%jx5KWIa7C1_td=}eW#Rs0~vnD9{>OV literal 739 zcmZ`%O;Up}6pme@;~CyEQHm|#s#7;Q)x8H`Vw=*8Kp6fCb-aRS@D?7+EBFFr3QilC zN#^~0KQCFmzFhu%J^vD16LM7sDbIK;3X$cL3qtV6bzKH|nLNo%tP81O<*)td!YO+r#J!g8j!U0AM3j^ t#2(JC*X1!=qje*&+qXn#j(^{NHk>+klM16?mGQ8Ba>(7oq0~>yB7d=K-`oHI diff --git a/examples/runtime/shaders/essl/fs_sky2.bin b/examples/runtime/shaders/essl/fs_sky2.bin index 493daedc46216288112fb9d4502632164d3f6358..159f431686b5303c5ce6af29654e65de1075ba82 100644 GIT binary patch literal 26809 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 literal 35386 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 I<;xfU2QqTI!2kdN diff --git a/examples/runtime/shaders/essl/fs_sky2_bg.bin b/examples/runtime/shaders/essl/fs_sky2_bg.bin index 70603032cdd18e97e27d4134e724813c3d810115..0b755dc93b8b70cc70336971bff5a256277bccea 100644 GIT binary patch literal 3715 zcma)8O>f&q5LJr+1(c@fq32?Iqik8(Pc8|&xikn`pa-J`dLq-n`|9zkh#S{`~H2faklx_v<9B7UlUoEwbv{Zw3SW!}H@h zS$*36QQZ8KXSe6e^50ijf91AbyRGwdnJ!kX!w*{p#!rXybX%^gU|vpBY8d;K@e#vH z>!8`k%Zp9&VVPe3R?f>M;@y<_j4jf<2u8#EA;Z(bHBll)n0@rv5u@CK&go;uCw$Dr zgpW=iN0H%6qaeV+D2gRYQ z3YPP%xU8-MI-t(3jkq&3T|*%{hWP~pfE4PC#go`QR$FBw)Dp=v3A- zRvZVxKzNQgW79FNQ%Rvp1PAd6W%YSJvAQ<^mNFwsY<TvoA$_tGf>!!wjhL%{EPRms=okRM_D+0>B9LMZrH_(SrFqRTl6QPBPrPYE9 zX{?f33h>b7VAY|7EhXGN9C&{1Fl(d_MchveLY$#SYdlTwcWeVEB%%k%92q!N{7>)n z);mFFjzD4KLwc@eX!f2KG{IaL50no>_~L9J<{`Ig{GvfLpx{nw>l{Yxct4fh6p+9< zv~W>W>t*(5ISbkgYV4&caC1QQpbx_6ScMpTw1SJ6YZ-^=Mtulq4}5$QBhtnL?NJc{ z=mrG@hX*9KZvV%!oUqoKZDCM!lzMU3G1O<)i+DisXal6+Atn9~1~b8JbenukO03(^E{fJ@zeRcdlE7gQLG+GDf>8Ag63|Es1rYxn~>JgybB)jaKgGWKFFU zwBeXd-r#2U{OvP0CJAMtQQ4CvbtB!mrqnfFm$y#Wy^7T$d&5m(R%8O4?>d>h!VB>Cph|Eh6}B`0HJxQ!qxU5MH{ey5!T(EUz~=?#L@ zRNwNr^~AO&aCQ(sJ>|6}1knfbmc1z#?p`KC^mG#X8l;M}h>VSKL77n2t?YkGBL&b; z*S8@Q6_K1c`5$s(xaSqup^~7pGO_ZqO0=cfdY*Xocsz=$J(m vS*v2CA4ie&jUbh*4;R{(%1s<1Ln6LWF-Nf@w71Ey`ROFK`A~lt4hR1OcH^?J literal 5924 zcmb7IOK%%D5LSx-1=I(6D0(c|OR%!6&63<*Nl4;LgP;X^2wI?5VPkEaZ6&R%mn9|n z@0}UGhO%U*M&MW^=k?9ZH>6(w`Rmv1PggHG@bgvYo6V$J&)YY%YEiGh{G!u=fAG^? zO;-QxC)=jJ!xgjm!-~#M*2`+Knm6lpwYaXs_V*i<`E9ZN3#8sG+rOWH*b`FsHEq4A zmeqU}jC=>Ho5ibUSzoW4b`dtdrHwzTX@eHR`t-+6XIm}z&EiJ9Z*Jb-ifw(Z#CEc- zch_yZoMz9vn?>`kUCzUPE_jIHz^aGf2)Kao{}fZrf%m=2f#0Nw52%E5xk5BVe>xS_CKZIjnoca4k9=oNTyCqXmf{F!{Sv6}8b&@0&!~(oIh-XfsNbh=LAl$BwcQx$x&e$3h#LC91UsIPSo6 zll??ey9gu{`h@lq6oVvRpk%tI-k_zuUD_F}PWwVVae9mDJh+KqC39rN>g_5a7==i@ zC%!*r(WA|tp%uVnUhV#;&2O59Y`g$ z(uye=_e38nq|oI^>QOJ=8o-v6LtSLrgbbDCd01LmIo6}Gf|87OP*iJG4vW%?M%!p~ z3_ruM=7J|<3IX;-LWSlcqePv~P)}UZEHaq_-@HsvcOeD}#+8Ao566pPHXN6hUPB6y zN?jMoG3Z(~H;d$qU7HnZT&yE!4gk6m33e|g5qDf=fj!r@LXe!7fyRd9ux)$5iHa-g z@8|&cyZ=(?ROYf66P+P595I1eat5PFhcJYkw2g|ykxkei5wURN02%@1oW(?YjE#~{ z=09s58_;_~oQ1z4l9(tqcOueJeDEjSpHHBqALgY-$tkS08NyslT_g(wOO{3WxD?y{Q133(Z%j8{&@`Nz`%7D{~SVp z2!EsQQT)xZ^Z3*Lqxf?&fiPcqe6?qcEp!ytpDm@(D^L)ox*UUn0zU#3D6sj4V6(KK zd__#)6?2uYC7I5UbeIHol=?EDHp?<7YWm9zTw~bUrSWCW2etspQ9f9H16Od>p>VB< z5tuAfHPUhf1dUV4=yD!FJ;8B|1(mxuQg{mS8@EFCgg51Sv#iyt-`gpYWD=f<{;sG> zLm#LzJho8SKCs}bwWqu4sSco9i#v&w8Qn>}ks+nzZQIVgTDn;{NxE0KJYbk+)QG1~ zp%@6_M|cv?T-a{ldi(r&CZ96E33=Ea9J>dNuZSdjc6vIf@5{ zjaJie@WV;tc!2O8b^_CLS{u=K&_)CvX~UaoykG~Y^9Os58pDMKw=&-e8tVPLaXZOR z0YKy!{6czsB#Fk1^U6PS%%F73dE}a@-3J_uZ~xl9n;F)7&==249xd-(ZJz_q6W6`u zAF$)4A705Ijuc7QN>Ls54csO$N-QSVqo2cZ{~pI~h^0*x8_EN*zEiE0y$LuvWJm#@ zJPSItW>OjUg^LMhXPgBz4~cX8I?%2*->sY=B5j{JPUs93VG`o+q�}MoLGtDS|H||h5J^CzNqlPX*z8&vqS-i^TZzjX1qg~LzuF9cdPtO-P;`jTu38uK&mVQ z5i8-Kiw4~YnTDI$d)7D(jIl3^%6NG%F0S(6YvDLv@bR|2^Un=o9*1_8y7}h|5KNgV zYZIqNUa^3@vva0$&0+4z9-pD`su%`AJ}hm0T1D8qFuHBQ(e0alxxuEzbvtX96HP#Y-apINvnW54`0$OgvzC@`QsCCF^E|(-K&GkKz0;U3< z#px~K{>82e*jV#=+HBw<0KDSoc21+hI-O_f9e4`R;_h` M3VW#SQ@7js4}V~LX5Df#8e`T0dD)?8)z znJEgniJ5r{8k$_yTnY-gsVSMIxlqL=xdlKY;tj2V5-_%2WmUO?Eyyrq4Ff#`9R)C9 xsAr&wqN)O@Mgzq%y($HLRO|K1!Ftkj;@yf8)1C8k@{54FU=~?()pBt$007=XLU{lH diff --git a/examples/runtime/shaders/essl/fs_sky_color_banding_fix.bin b/examples/runtime/shaders/essl/fs_sky_color_banding_fix.bin index 5c1cb4b16526710678cfbfb9e03a383e76aa9cc5..0f13459cc8886e9b5ec9645a769f3f520382b93e 100644 GIT binary patch literal 873 zcmZuuTaME}5H!o5L7ZW}(9DuG^L{Ae3$*ah0W5FgWJlN@%a1%3afQ7O$Knd~#9@=L zJBehes=K3nC2z;PExMvEhqCLhUL^_q;k_I4er&$@u3QX0G$-Qy z>m+Fb^*z9-E|-3+TePY|G0f8waqrjnE%FV3>Dc&H=xQ`!n{px1`Ox{x1?S^I#5bpY zfj0TZms_wme@65__Mbx)fT@ao7zbR1MG<#EpAaPokdu%^ck9(IzwL_ku_xUGzeIK6 z8%)xlDS|iIK5U3`%R%PceYQi_{{i#oZO%X&%P6`*%P`;u;wUQrP~xXW$PAs(%kZ<^ z{(+DeR2hqI%3X^w&SAtg!Z$plgrJX?mi7?=?*x57{ZO_Ts-PNrW(RoEzRUuYnN)|Lw$w4FrQu8)r>#+7@F;;-U9lLj z;+eDDF=MRKQYyi?0@aC(fvv0KkwUkGIG`QF5RRFEkx!KuciA4Da7;6*4P#VkYK4^4 zSgHjWvQii|LqJnyg<;Y;W~p()XwIpj(FN>7;Ak{caZD@~jx(jLRZeJd%eAvYORkKK Ndr^jDfDe*xP|{J#JI literal 956 zcmZ`&TW*^`6eY-{1avbe(%2>$H?c=2?}Q-T9g4(L>j#I^EU9S7owgrF1bQ z+6&KXq-j;LfoHXOE}_YmF*ND!rG3y_Z5IB!=|*LHf?N1?q1M{uLvsRS2`381Vu(Sj z735MCfXx5t!vGe;(uzo<#anc})v|&rFG*L*ZM=Vnd%!VwaDdB+nBc%p;KU=G*y8XY zq-KohZw@P60TK~FL8Hp8dd;v&I|~>kX7FEjYIksGUu_vv4nmSfzci@Zh*QT&U3h&HMWML1^1@Ku#y63mqGQ>dg2I~1g>b!g s8+o=;b?&~0q@P@j)+B;G8Av`%VzgUyuM-re_a@1A~(KMtI?&c`-dx5aH*CvlUO#p_p&1AjOJaNp)>VTw4J z0zY;afcI@wncCz@lho@Y|HC?JlI}iTJvO%?X`5GQnU$uQ zyGP&=E>x<)y9`4!611DH51 z4#UC}A=*R*jBm2}q)wp@4#j0zFUZ`@%&u%3oRzV$iJ&itcnB&-A%-4S%PzXB&FX8J zl{NI)l<5NHCM~e%{&W$X!K1!yqy(r8tpkj=B!=BynyWJk$K!Xkw zpUlvrY%r+KPDG~;+Y25X^ywgW;@d$C2R^Yd@i|C?ns0AF#m;Qo5Ir0z1yhtON;IX4 z2V77N#2ZwVTWlWI7|d(hI>D1Qn4P-n`JFdI)Tg9BObQjsz)FUJ6|-tEhy9!`vA-W2 zn%eDmU{M54`Q1f$H^RG%@P33Zi*Er2XU?Kw&`>gfrlXv(LSQKZtkD^JsgDBO7+ht% z{|QBOpaqjO5K;>zt)mC)@v=5?gE{rJqB@XLalsh3PJurIXcu6W9aa$b7Mj>Bp$Wx7 z=)=a2%!!{{4`S#^kgt$IK)4_(WQ<5fLZ7D_&YFbLr`Bc?SxN$OAvN{Jlv^3dlo sFiQrlY7RA?0nM!8fr-it8|Au94>hycG7BES&hFV}Vc0W>X+9smFU literal 1101 zcmZ{jOK#gR5Qfzj-KdW<%#un}RiZ*Cfzefhpo{E!0D+Zhn}{R|6y-;X9-=qN5xVHX zI;0-9>RL7oYTo}h^uxEW?|!|^{&@Jj^*%J25xYmZTAPyB-Yd_3@%h+hOMIf;IN9VI%SsHd&=~$&0yv z;-u)rVRNPQBA)wgC6^cq4KM3LXnGG5Er)=y`V~x7oevphoC`TpdM4zc8Ko$>fRf7! zNZ|kQp%=U?6gRMtW-WA<%+X$`ZOOj#qAEVbt03}2u_CZ7cv@C7!a zuYm!C5PS!mVFx6R;t&?f02xYzM-`@sqTT*E2m+gY(a{^xI2T+(R~b7bQEXr1h+*td zI>PiW^$6LJijyRLZ8u)6wm|szhTxh_s|D_qOqLoRUx6Un1tHLg+7hk{wsyi-MfRZi z>drE>y)1zNhLv&H4UT6?O%k>kj#{jJ*o{ND)I2x6T1KPW8+uDoT4#1V$yf)kC^kkM zP8R^_q9(1k77Si`N|MyB#Qt`u0d+YC0-9YXNz7&;;5lYD>2<{Gf>7b o_e4oAeZ)GB*K_IGq`0yx=03K|=@Hppx_>7bcm&w%r|)}z0TVeyc>n+a diff --git a/examples/runtime/shaders/essl/fs_slug.bin b/examples/runtime/shaders/essl/fs_slug.bin index 63be00bcf4a7c50b501ba096fae4003617749edb..9faf8a1ea11042e46d3f13d9cf9e80ee06d6130d 100644 GIT binary patch literal 7638 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 Q#)K36vn&GYQ|p`m0fvf>MF0Q* diff --git a/examples/runtime/shaders/essl/fs_sms_mesh.bin b/examples/runtime/shaders/essl/fs_sms_mesh.bin index 87ef31f52c37103e295f93f65f9e4e8d83403096..726a1dbfe987b60c90dbefb6f3037bdbbdcb439d 100644 GIT binary patch literal 5558 zcmbtYO>f&q5LI(3lymRf8<{%lF29xwp{Eu>E(HptcY?NPn=K^@l5EQk{NMX#mJ~(X zq{)&=klhvE%)Hr|+2MZq_VweB+kd{!@O+rf?~)?Fxjp<kNaeQo36@- zKhrHO+12Auv)Oi+UFG|{+=z9y%J0@&ab1+@VL5MpxP`c_$TwJ=-)-{ia<>+C?LNB- zM5Ax{;^%$3-WJ);`{Nty7H394RK97X_~Jgf&$EZ+tJMv(rA2!^z}uG2Rax#<%XyJL zmUjoID6i53QTa_sS74=45Qxj0>tpg|m)`td7Ud55@5_88)@i8n)#%AkN*L5$1T1dR}Nyvq- zL(Ew%q`EERDkjR8z9qOSnWuG6%S9j&NpewZE8rXPs}jYgqiO(cl28N$F#&60qN(PY%yims=_J(3&;gjNi7Dxm+hD#7K7hkuz zVBXCoq}WR0Ae_P_hzD>PMMYD1B~cK!sbJnsC8ktPV(m|%5^`+z1{YPL;Spw}Vk)6& zQ^CBGijm~d1kfo|^sCa=&J%11B5V{FkGzvaTDG}h-p$3QbWMzBrf`YLi9OjeCb&#! zb3RsW7MORlh&bl~ox;LUvh}l|Vl^VTVw>{DYg56zn+jWzn0QLcYp(zAQ5h3kN-EBI zNN#bVc_$YoJx+Q8PuLi(Xm`8WjL#ID0G#%a+-8G$4;wC|34y1u@hB+XV>2eql#Dp> zwHLP8VBW(PUNs%_8#g{o6O zhwON`+hxw#2L(5cK6No@L8!erKBA3AOW`&nYLefD;xxC=(5s;safAIX7RRT>#ov8MKw!DtYcs}6&y4pmn3 za3CCMUcrOfVF>H_dyp(dUkpz*DM9*x$0^J(szvhn zqcPE@-MP}dheu$KFMvn#NUG0#KC+Oea=_Wcd0CYezpkiCVK}TRQ6g0E=u}b_h6CZ; z)Z^4d44z6V4Tr&LudR0Meq9r3I1tXC-lW|NP9>FwfYZH|jLxqE&Mr%y#lvl0WX^Sp zJDaNhwlDjrqoXShx=l+j_xz6=1-VetJ}STgtRkh19|t-Lp^Ul(+_zCfL03^Q0{3)O rZn4gTN4AVN8b($Ph+G6A|A}I06pm627ibg3xOS`V;g<8~`F!>tumhBH literal 8411 zcmb`M+iu%N5Qf!U70OHOB~{ysxF%En+2;P?_-B6j@XKfff8pojVR?8+ zSNZ9Wbcanv>pyHXdQSJRo5y?h0DX4sd3`I`^YSs@Z`160Y+aOau}E~A=lhi-0=qwN z)~D<7)8pn2@-&$xYo^v*&hpca9n$SCTkrXo?`D>)HC-4Z->ld+-8`~rGX6PcO-9bL z+hu&+ZW8Rc-NC$<9Gk1(*$umjio4ppt)pfh)0fw`$)w3}m*wfP>Lyw#1f*EyM;2A9 zb6G|4R(DuGUbV|sZ#jK|{^e}iY31}4E<{lTlV!||9z|6g`~8N^rnAWeFaE|%$Todp z5j0*Fvne|=7V+r}VydpD3wEleJ7HJVMLxMCt5FCxfgc!Q0(}IG$v&|;{Db#^YYdY# zBbWK*rJ0zyiu#ddQ)kWl_2DTyE;TmS+pJ!u1e?pW39bd%VW1Dpgf^YbtbXKqR`r`> zj?Ep5(#O~6e!otS>-}F3DQuW3@g;6;9>utD@PRkWenO{u=s66HDWlkAe`o9Lu(m^R zfNXs@II|mBj9^8MYF6bW=4V4H7!u}!QDiuKjTRVFPjz8d32z6+n#BtxVy=uJ)fW`e zwPvmLm(|+EW&(Bccs6}I!2o8t>Kh{CLkOsXO5q%?;wcP{pEzoHs|&LLWVq5dKBI3e zV^g$@oi&=IZG&MKRmQm3i>;J(rN^e!n>*l`<}5STIc%i!)?zC;lbR}Rl8WM<%lnHt ze5H#brf)cI6YvHVhXSc`EvhnrsKP?|7Zf#Wd0p)(v9K4g%4~e4nV9U>3*5)jYt~OM zQ`6^q;RdGV+R{s&-$A37af0R!w5^wN>ZPUuy^N1ENfWAix5ewJUFjZl?-wTGskOORJ5Jq#&ur}$PVE)}?Re=1uN|j0!+EE65MmWxKcD2K3lZ%&vWTzlc!49W%~#hQr_RBp zr5#6?vwRX-{dLDnXQ;Hp%7whuSF|3goub--eGOE1Tm`hFmcyaiJ05Zn($)@2uJ=QZ zmzG4uvl*u`O|JcgN1cNsuh54aN6WLtOG4t6)=;U1rP~q@t%r)YpyGjj4JF>fFP@;D zBf1F%LTvH+xu$Rtia-wbRi5w@ilEjZY(f#}d6sz4>aRRO2}Mvs5f-69K-)DTU?}l~ z2#7~bM|9%~gjnMB)XqgKB19{~Pb-32hp=fyIB5l11KLqq5tLShMJo_Mv>T3AM1WQV z^&HVnD-dF7*YAlZN=qW9DMGX&{Inveb4Z(3gp*dF)vukTv?3|3NQ+h=psgJQ3{`hB zKr513j_jrt2x)2ee;#2DGEFA}Op$3sxY2Xg3_J$N;P; zYB{PKRv_eDyMEFs7pkZbswh9IDC!%^Miu2m6=?NKrzol@iYm%N6$ofc2LVG_rV5~n zqK>1wQ3XQIrR(>!Q!Y|bAyQF(Qc=`4luatiNh;79kdBgyqNJiMQh@*>-EgF$0;Hm- z;izs>fsmGTpjz+$-YFNUs1T_rKdESH8`>rnmB@|Q=3Mz>ODiF|?4g!X9%%ldD z^5vX?g8Cfd6N`0uJo}EX=(g+C=4opV@aw~d#Q0L#J&{v<<5`|JHjVh!>4xp{6C9rY zI7E1+C*WK$#`DDDV*>9d&GBP#EyCkqIL^K>=fcxhI7qFJ{ggRDhU4Wji&W+h=CXe+ a-WlCz%dh+N{&Sw?`{vanPW^p69{memn9BzM diff --git a/examples/runtime/shaders/essl/fs_sms_mesh_pd.bin b/examples/runtime/shaders/essl/fs_sms_mesh_pd.bin index 0f847b98ae13fa8488ad4adfef1fdfcfd5929796..acde1b24853acb5a927f96f624209f6a98dd6b4f 100644 GIT binary patch literal 6818 zcmd5>O>g5i5Ow!dc>h69>`mTvTvFmEjGkI7_EMlgdl!^gNz~ewVLOSFBLBT_D6eHE zk+XsVMA{8@haum*;S9+c^2=XeKmNG-=j#C9hr#eBoflWv+ds?AhaUz5{KfZilWwlF zS$X$IwxXu0b@tO>uv+IA#il5iY?053o5hM<&dY2&9oE0N2Hc7jOEeB|mc?bcUa+d| zHouUp);E3f>rJ*;&GU8qJ3CSjkYZVnPuOjGTjY1sXRS-<$>w3ZMDNOwi?UqLro(x5 zU*2q^d3lj-$%tPWA2GDl3M4zfy4<-A-&|7}^!*di;I(P;SJkl{O+ldx3A z4ltGW;vtV}`zE{lhtc$CfS)RssyN1oS-FjF(`ww9oe@sZ8Iu*GuQcep$aWFQ5se+Q zXtT{%5ufm}2OF_ZY*pSx)XO&#^Z^^cjN%E$KQwqWVxK){sH{0xb2=K0#!O5&`g~%1 zk{AWqs|D&PAh)+f#EGj6oR!|rYI=exf)Sc?7!kMvbHjeAz{B>ty&l3iFUvWNmKdEa z@1v`Ao^A8>-`CkPBG5fMPx<*U5m(d*skmg(&xADcG^wekN>Zu?Ifb;$^Uda|3O@ly zDjp9o`FxWfgcmVMZOx<}Nt{S+BPE($aDsXDaN>H7Y52Epsu2%iNpmh}>^JXm;Z!1G zMV@^!-!;%-xWw>S)9~ZfgTMittOD^&OgtFr86#NW3!0-Bz_3KDpdcnpS`wAt6W9*< z*xiBtgod2fj}YcKyGAV$%QAPqKzw@53y8R5$cEBsNc~haaunu zgztBS(^XKqI3xkNiG<-aZ?BPPWh{2& zu}=iH`EGl&&ZDEm2WLBB?Cz^WSVnrn6K-|vVlK3ESiOJ|N~t6bk#WLSpBt>_Nfbs4YQ3|v- zNvrNA0i#bQS=ZepVD!i&92A{RB8)zngruYE?tt^FS0?H1+XGI+UYTUOZx0R_JqkQJ zWjjZn2kDhjN%tLsPX71z)C&a^sxgzCuEyGBILcRJz=XMVHAeFD42LQ{==Zk}ujE;6 zGETvLCQra23CN8k)ahaj`dd~YLhvf_Rbe$|AUCqmr>n7wMJtCOB}5jR8XcBnBsa3K zr^_+Vq8$lU<-Inn#th^}67F<0)+!)`siM+_)tG^NtUujfid4CFN}2b!WDd^keyDno zUTtkCN4sVUwA$W(Ypc_4T6f)zB9K0L3d{Hni~>lnj8boKvI>Co$|&;&8wED3J{Uze z^<2lQP8^P|hacJ9burJQ%M7>F`^(wzd4sM`=u(&753=)(|3O27hXiDK{u9!1A#l~; z5-W|yJprz_J~O;9P(QjPpeF`;shI50?*DV|-w^y}?Ozr4kW%?S+H!}x329=Xjnftn O4f~ge>F{wl9Q+T@>4G8v literal 8632 zcmcJV-*4MC5XZef4emd|y~&H?TKr+l2(p(BMPCLC*xn5_Q4$ZbW!O%fq{#oiyAvsi z6lFz$>=tf9kw=Oj@_WZ)zy0(5^RL_gz7OE@X)t_TrmOph!{6Ed(=USo{Dsfw{c`^h z-)6_Z;w={CrLVsY22b(sWwp6y571`Io{}5Eo|cu6M3xJ$G6V48`F2>~WX@d~1RI&*j@YGn$VX#qHgZZM_&^UMXd|Fc_Ju|8555D=F$|J=*7oI?21ZY_ z<2E0-v9FxsU9x{n56c-A7i+7Sra2aCvvZsaYgqvw7>QkUq*49IvedMT(8lVH1@Y!3 zxZfr5A=&-=5W|8ohR3*`c@W~n!56+P`w5MTt|RCgO$H%Ze`86yPwG{$gEZOiz19f} z0n2TeQRzWMPL~S0gt1^PtGoIfEwD~8)CJ8Fz7F&?4Hrs;ToDlS3qthGS!MpEnY)k% zP#6!Vlh-43K+{#ckkvm_0V+re$8Z@=pmY4jUiGUkXacP6v{-yau~>$*X&G}0$!Jwo z*oCne=4-KHve@Y%ZT0dEIGS-R<35LlrD$Wp$6A!1LV0K}c(I#QJ zFt(vnA4QjU0{nDu1x8iDNY75eBrz0LrJs za_(h0KLg9Cca~8XmbN;Fi*}ZaI?HbQ$+c)(dd8=x_GL|yi+#zp7;Ek3=HH18DI9cgF?5#M7Q9;?8s6pyFKH1_^r$6>|5EGQ6o!X z$Jv6!+Oh0qx#*vzKt1o3C0KmF$_m@z2vF!2mQba}vYW>gTG_1`7j#sxPD&+9k)H&8 zA}j1zT#!~fmVGP*KLbmQ^7~~8M~mV>(&jOR?QaAKbQ??b3dO$sh{F_G*zFmo<3tln z*}O09P+X8yJC?mH)fre~kl!y$I9a@(rR{D6=yMxObP5j3ZW=4JuG=$C$B8DE^JbQI zC@x5<9m`&p(HU4`kl!y$I9a@#rL^6RY)|Vz6_;fCO8TR-bXg)eUu%Bt9sr?dGkI{+B-|td)@~uzF%UM z?QK+h-Uq6#I+gQL%{d=s2jPl@+KOQnx`aB)Gvs_!?>Qf^*t9Ekl8d5);%?^)3*lmo z0{%C=8Cxf}tH(9{?}XxJOp#AA%^{Qr*QW1P%R-#7Yqrgfa7p}QAK=}kfcw)B?@jZs z5gh#~Udx{ac_7`;jJ$Zo(k&~aCSOU^yt6-q102EPxC@M=$Hc?1QPpgP`D@sgv&d;*>P_R`n&@(_0tHdH!g+;6!A(oyK?^cwU?wp^KUj!6|8E?&1%f-b208Ha8JOBUy diff --git a/examples/runtime/shaders/essl/fs_sms_shadow_pd.bin b/examples/runtime/shaders/essl/fs_sms_shadow_pd.bin index fa9466c03452759dbe02e665974574bce184465f..f5bd84d68c8565020b8e16687c0b4c7d3751c272 100644 GIT binary patch literal 536 zcmb`CJ5Izf5QcXtO~(nQba;e3)?P;u71D~1Vh<3RJS`=0lo#1W+=4@L1WLxC*r26k z3XlEIuYW%8_D`41NBgzHTCc8#C`p^X*vGO=pR=q>`-`<1nEJ%lv}vq5rE93tL=9B~ zS*c|olGC72dC`EXQ6xjHGTm12qm602f%6UMQ}xm^Mvd-Nk6S`g%7Y$yTIyID0Up4y z0F|ZxCC{d4*UJ1+m%7EcQL6+hscLGGHv(7-fJiV*$yyor)DTgZGvWGMW;?gQnd8kD zkIl`saosggN>5Ps5$<8}d^L{qZ`qRtH-G5|%L-?x-`ogg(C&a@v#05B#Ml|oF=Ti+ ge&D%`3&8@P3&uSj2%m2}wiT|&{>Nh2-U(TK19v2vegFUf literal 410 zcmZ`!%TB{E5KK9m8(*+TyDi2}NoW;uLaMlN=m$hrnun_-wp=$PMf?RH%MrU$X{5p) zcGo-Jnc4N`^;UnG@4&?*xI3iVT-$1si8_BPihXWxCLZvybEOkzkZlQ-EGrFNo;^aB zYPFYEsy0D~Ru;-MWB8geL7kFYXoPG56ZC;#{NFa(iKIMn<8u$sP#BR}jIo;nV0;m! zM|c={pzj2xa4kxE;#X&XL4#lMw_r}=Xvr7Le8!&U5JxPGD4RnVoeHOn5aNxMb-Fg9 md{MPB&K&+VdVlF@-w($#G4nJovBfInQM~&9aZ>n1DEI-$>2}Qk diff --git a/examples/runtime/shaders/essl/fs_sss_deferred_combine.bin b/examples/runtime/shaders/essl/fs_sss_deferred_combine.bin index 628d63d8400b78e2dbd68a2c501b86802181cbdd..71dd5557d04f87d6e3529d1f1a57747e666f01d3 100644 GIT binary patch literal 2424 zcma)7U2oeq6jcWlZQcEbf{#?{X#AGAwB5soV()t#0ztLqM1W-(k{sJ9`rmgiDT{KN z7-IrM;{D(`=U!fY{pauZ&4(|aB3Q4Zx4V2>v_;+h@@o{qKdd)hzG&7>8@-C~AJ*G0 z-!yGqtiu*KEz50xA9mh#d3Rqdn|&Ad-n@&VZCfs?u4*=d=E{vBy~}3 zXgvEqBd{hCtsL>d|e-*vq5KwNsizO=#0=FZSV!g0(=Yy*BUggivy*&NvVrGKqNN_)afJk zXVc=g0jcP!Ef&3h10Tig;N`*|V}BxJD$6vtX{M}IN=TVmB~`|i(oR!yjiL+6;RvU{ zpx5|(dU4NBL7xbk%n>v^IlSbOVx^H^a(vN6feQivEUq7v$>Ml?NySk2GtsaZDYl+# z88{%DV*hxO#p!%0}%>Z21?`m1&{ddItQO{jlGUlvJ8=qdIgASay$U!E3YM_ z1!ca#?ZUeKL6F+-#On%$LzpjEC%DfJ2evx%-IS(*0{WmKIXICmo7Q189#6(e1-#L^ zl#n2#{4ugG*IhZjoQsl!kS^&IOo$vcQzVxRJ;Qu(gY5EE8@fv}EH5UQvO3GnvHwEu zVFv!c?A*HSJbN}f2reZ~iE+luTX*H%b&-_P(IC)(r4N%9FYDC)xX0cADk-!l{7%a3 z`J5;#B(zw=w}UR5p29TfRX9oA&O=%~eKFIQ^mgb(Mg3%}9!rWPgFB5K86%N7nb?3T zUU)Fhu~~nDhj)zRhVjrRVcw2JL7`#nVs}017zhSx{<2DLCr5<7xzuq!e*9$M7vzf2 zx;oGt#u+~2E&Gi)-LQ73G|+-d*u=V(s#K;~s=1L`Yp%2~(xg1g%4=qjKa6rnglAw* zxT!|Conbb)vA>6F{*l1G*Gu};mNRW7lOmJGa)pE5R~(pvqod6drQM&&nB~^M6yPSc t1`wUTY^Yn10|du;6Lj~cQKg{p$rDuZ74n|vpK>q1qUd}o^N-mq`VU%pVr>8b literal 2924 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 literal 420 zcmZ{f!D_=W42Hd4I=nr@&@q87TTO3id+8{LGvjhh(k*f>s_tnA&VjD}=`3W0?_ z_&<67@%~_+wrhelBlk6T!V6Q)9tpw5npZrNE)?XB^o^zQX@u`onM0xS!a*aC3>qF} zd$iVPuPLodb+X>{WCcU$=aL;pR0-p>^z03;hLko|WnhFVA&TjR0%&`7aMD%;2*#n5 zFH>9(Gi)Fl!w*RdFMk&uJOf@8YA?|fT}6xOt#Q)EaUW`ArfT#1nblxm6C1<$%>brn cu%x>MzHWi@Kagv__afg}ZT*N)|4k|R0WLj(OaK4? diff --git a/examples/runtime/shaders/essl/fs_sss_unlit.bin b/examples/runtime/shaders/essl/fs_sss_unlit.bin index f93941b88c51dc972b2123a07fdd7f5259c20da5..eb7fb408a5d7e9fe2b34d09298fb3c374484710d 100644 GIT binary patch literal 1006 zcmZ`%%Wj-N5L_uY@)IrPGT4|5GcZ6lk4t3bo?~R8F=p3Dyu{)SIP#a~5Aqf1o?$Ua z37lrSx~jT*Zohwfo4@-r?#%c5&2HEAMP8oDwt>2MD4*&M4ppm%z4KalERT;Jlnq`w zWdrtjE^-OytZDmNS9_<@Q~NZqs?GI4WS@Y$fH$w`5blqMF}v;c@v9#64{?Wd=eB%+ zT9*xTonH>%w_?u%6(Nz8D4z>Uyru7CwThxfpk zzCSV3G`esN%V~0#BNDsrM$uBrFt9r10hp2hh(r6_HQwwnG*E^>)MnI0vM$_M9rWZ+ zBMM!CsS%0tNBC@M;0ut+55R7y%QGU_@t^wa@WrSX)v5Tm4brf-EpmyQLP{wl%(Lwo z%PU=XjLdu1-t1x-gM14f#x&8jg_vWs4ePR=G@%8cgg>pXt89_>8X2G?QG?9uK|F2Nb~*Wr#~R5#j~+D53;k2$lI#o!mE0)fQ{#>JF#v7-rCw7KdC|8c7I8A6szj6~nT;aU8iW?(~QHm zVKuwyWx3HiyX&kg^(Eu5f%~DPy+j zp6D%28{92wVRD;VnD$$gy4t$_Os;s-S9C7ib{7yw=>&hU0eO`9-8MLbsV6h-Wvp=6 z!VSdPn3`|kGqK(jw}Qc|h_f_a9Z7>E%5n5q3Rj3_trt6UtxiiY1&X!vfcr6sDck9( z4n*auTRar|H+9uqQsqy@9}ExsA+=;`@MNg)70K|vdC@3^Zvbh~b3~`kVRwlWY*o%5 xYQ6fVclu}a3vt#NGoRJ;UmJxtj_Ivw6>;tv=I*k&~aCSOU^yt6-q102EPxC@M=$Hc?1QPpgP`D@sgv&d*jxZ3! diff --git a/examples/runtime/shaders/essl/fs_stencil_color_lighting.bin b/examples/runtime/shaders/essl/fs_stencil_color_lighting.bin index cd32a2d34f1c891a59d77cc871ae5a7503b70d50..e2f6d166105d26999b64a7cdfcdd58a8261e8792 100644 GIT binary patch literal 1881 zcmbVNOOM(x5KdRy?KZviQ1$GivkMU<;Stg8rP8XsRrFY`A_E32Kml}i;&o|%9d^0wWzrKH%KL7n}z`8YVieM}F?)r^kT;q=Mu?Rx3TIWBLY|0j* z$gbWR27F%Ed~x|;onW4@WzYyfA` zOz=3b;kQMQvJHzGtnZ3oo`lJ!2K~7)jC8~2A`?kWA`VGLDOrXI%O_@SSVI*l5ix9< zMJ$%dCL(GtV!20D-IG_QEuW+5RDs`vrwh1qIW7RTFc+*cTqV)va9XbmEK0cxMyVkv zA!028RO*s#5Q8i%oSg0BP)y8_9g-raVKQeqiv2)(7J;3b!y~iRavwZy*yF}2KRlfY84%ZNdLJO&ySRvbAkQ?MrIP~Qb;w~58HT9BUSDE9!Kzz0Lop51GK zI^IY@VIT;F@gU&S$I2$^=?fXiC*%nL-I3e(_m<306;u}`#|{ymVnvHs5?T(jeI#E= zA2N~NXssFW4Lu@i61nODnO=kE&nELmnPrz}2kS zrIx3x&33u&2-1V3PVP2glf6G2JF->_AEBPD^s0q9CH8^1?ri{(8Z|1Y zR@WU50lP?YisJ(fab3TG#V&yzl5og9p}4B6NM>>eIMS_{gRKP$TXx&}O+m*RNn7;2?RtJ_AZ@&3<-Me4k-_4%>esu6TcU~8C!-MVF3&%MV5$C+1YnHModx;_Z;q$hj zEPCKUoY!ItzFZbrP{!UAbe@DsT1Gw;G+PJrB4jDe9(l~;AgchsFKEbDkNM9eo3RBi zvX`$M2Y>jO)NJ+eBaVY~R;E6kJI;osdmgXg5tpxF6U?t*L*pckSUBmNOo}Qeog(H- zoTb-AEFXdrpqWBQky28$B(*3lSuIaXRtnXUJC>}RsCm_8`#ripJ;SOeXKWI_fQa!J zh}(JUKvg{n_*Ha|4kq=KQ0^N~=~W}H8|yYeBfKAY6Mp#OQndT5NwJb|_<2WiYDANLaKI z5Jj5DIdD#Wv2LP9Utpw0-L4ByScegO873@;c@i&p&Xbsa7IdH*D0c_oOCVUba-w&D zTkyTUYY>~u2qvKiatlHvuE19Bf}m?+x6@L*gR2?<@C-qi1)6RXT%%UNU|K=ZT|^L7 zkZtGCsCJ_gTEiP}i-jWLMpSfGz&1=S*x!q`H_)#P`nZNOMhqdGuooJ|?CDD5^zgcn zzH7ts>!kcXqLrrAU}NdIdRukM_iJQ)VT?tRgLXb0UK&PzzlMSbd|*@ZDB1(y52Sxv zb{KfV$Z`+ccrrjY*xG&5{0n${ibDb<`B<|noHF6yh@Ladg5)oYM(F-tcg>|xp6MJCQNc+@h#@iYgMdSEZm5fwU)>Yn? z)@mBU@*sl|62!7fI@zBzH!^_IUl%mCQj9GX!S$rCw^&9G+og*av?@1*I-c@e)mnfS zuf10;#Jz0cDx`NQTgjVUI)4iDkVR{3oh(7>%N{afx-gPGlbWs rOYG9|5bva}(xn7FBKLp5sEu@%xcS7ns#PT}5&fTshoAW8PRIEN8_t@T diff --git a/examples/runtime/shaders/essl/fs_stencil_color_texture.bin b/examples/runtime/shaders/essl/fs_stencil_color_texture.bin index 10539e00b146e2e0a61107fea81d9018f419e4ba..408d62e9afe58f1e9111daa16530284a91d006d1 100644 GIT binary patch literal 651 zcmZ9J%Wi`(6hvt@mE3=*yaY8uHkg-4yJ=N*TlE8w!y~Z-7#T=Ns{DJeAuXX77HHs} znKAEQ9}n{JWn;jsjQc)GWhvF_&M@GHL2c6I!>bmxGKrrn!)R2VidM)PS9vD-s=-Am zc^9Mk#a`_84Hh+ssINsKRfQ+5xKK}R3Ax{~;<^h1Hue+c-_@GmzQmTx^ zsN^TvcV;P5-swQkm{=H;d4b{Wt{9Sc#dl*B;2osMaK%M!TId^Lm?_$5n}j}4z@qC_ zZq6Ckx5ieyTyt?k8H2q>9!1@GPp1P)EJ7gRd_@Nt6FLa1Y9nV^T##026 zt4SJY50j55usO;bOl&%l2xSqW)TcCZL%@1I;Ko!_C0#2MZOT=6y(yd4O zdh$G-;Q`_wE&Me91dUrB}T6d+e^rx3!iC{Z_> zudr(O@D3<@taXYUZvahQKfal;oWRaX&-z9+CSbG^fbn?TQU1DLUJ(cM$D_PD)8QlyEji}B}LIwH$)Dz5&r XOT`Lzp=5cq(IV@9zacT?T`491*7DK$ diff --git a/examples/runtime/shaders/essl/fs_stencil_texture.bin b/examples/runtime/shaders/essl/fs_stencil_texture.bin index 210184817ad0930eee6f3ac5752751e3d207d304..6a920aaa68661c6da86e625632d5c3e81265968a 100644 GIT binary patch literal 276 zcmY*TK?=e^46N7q2g$Jo4@JCHy(q=I50JIp*1+zjY`3K%{@6#Ds!$!0LnfKY zjP|PoPWEzS)Q!6k8!l8Bowt}KD9l&Y>tc8SM@tn2IQvg3i~l_!R*Ua{CcJm dts)mEa0e9ptL1^5htBJG%CY=4Niui`u@({ZCzL< zqzpXi8m-VR#tA$D(a>$8>~OFhv&(J9({GJAGI|)DWKKMT*8ew?;83P4oKVxl!S#c^ G0HP0|b3=dt diff --git a/examples/runtime/shaders/essl/fs_stencil_texture_lighting.bin b/examples/runtime/shaders/essl/fs_stencil_texture_lighting.bin index 7b9794bb6bd7886b1c22cc3334f05602d1bcb2aa..d0d1d20e4fbc7252c08144dcd58a11753e8bc5ac 100644 GIT binary patch literal 2082 zcmb7FO>fgc5H(eyG+a3F1NOLX6U*7yNvcpTpaK#|s2ovcImsrmh)Xf;5ODHkXKezF?Cu z_On5wGR%Dugu;1;ExicR`QhN`oLX!D zQ~-_Yjp8^N+k-~vZ{j@TVLb9PD%?G@O@@<--eJS(WbHj9{#2D5-j{JOW^+G?xY_vK zU|70pDi}|+UC`)=g019bbmrg~Dr`Vobu2}E0_oZveci(jcgPjDE&Bvi^c)REKQWG0 zLyOshG8^dKd*-Sg@pwQt)$#4Esp8WKRY{dyYP*`1EWw2F@}*c?_JOq#iMmbJih;i1 zob&*KwOE?TMeSx&KM+mR7l_$XLydos4AV!bJqwl&(V=O|uzSLJ{-H8m!>7 zg^;ud5W0m>x@qba5O<`SDk!<|hbhO?&+T=moK+js4|uG16k zZtt$!@4+$3x}#LxKpGdVzWFbvB1ak_#g^W1A?5zWv)0smNXuI5Y!A$v(!4oo-j?R= SN%IQk;$N(VS^eB-82s1yQ&Zp;l_uiXJPpGKmvba_rO(5`yS2@1e7^ zFWV%ChA6UkcE9=Nn{Riy`uX|opKpJ^didG%Ue)|wB+K0wp0_JUyf-yp#6>(WcW?;5 z_}Qy@Jiir5R<*_^VmhtM#EreK`8ZGW!i~JIdAUf&bs87Eyc3zolClB(uI8zj-BmyG z@;aV~y4-o`dHBVT30==_zhqfbT)R-O;?N7ZsMfq5)4V1Dnh2TkoM9kq!^ zXYG*G^->gk&>2_F;zK!Xp5a_Sigm(FKYcmFqTrMxrsk_jGUC&mh8L>&0!_e2a;bU7 zmCU+3SUs#^-!?EiSEPlGjFKp6CWgVzG?u#6C`PwXu4f+joJW%^9G9UB7&%bY&(ZWwG$Q4 z8lD78EEEZMMrCIuY-bBd_BXQa9rS@gKW*WhB8C)B+6#?ha{6SPBYj?wX-r?}5YqF) zHmR_WXwI~H(rIfs$zt+^VT(*CjWNk9(9Y+>Lp!tILO~Ld4bfJ#Rt+QauVL895Rs87 zhiyEI&<(cs&@_MF?pGhZV(|L@q1&aJQ^)+Q^?rc*YBw>)=J5&`?k!hX=+g$($E4KV zhsGM?N@fUzfSyDI-+FW(j9X!mFJVIttQu)=y19a-fl)M`pSi?H1*tA~mRhT62+M;- zBP57rIXdOanqhmEzP=kz6wFU1GFXHt5sbjcv&!aTc8!(g}VibPJV+lqqDJ37~PN};a%rxgeX z%m&^^O&oe~NRI7(Q|e?*DU|`k{7YSE_I2EbL}euY(afNND(t1yD%{M y_nPXy&HnN6cKWO5T|a)5yn_h{F68nZrQD^jr0>avr{-cNT{Q*Cg%hwVW7ZQs8(q=> literal 239 zcmZ<@_TWB$OL__e7~BDpWr;4pYs254Bq7o>GVla|q6;MtC;V8XI1$_lm13d#xkP+!Q@oq(l>CX8%`9(l=Fk7s- IYPq-=07p7Yx&QzG diff --git a/examples/runtime/shaders/essl/fs_terrain_render.bin b/examples/runtime/shaders/essl/fs_terrain_render.bin index 3da8808087cdc3dd2f6fc9389ebe5b7d9ee9a6c5..e37e12c526651f692ab91cb145f708bdaf146215 100644 GIT binary patch literal 475 zcmZ9I-AcnS6vykXB;qT`xlE;&^velVZNLd zBmeU|S*(^f=I-^`Lz{WmebI2sbvv86(AjNYtTb;{TsKNs@5*xr?FX;Mic+@H)S$&i z_PT+sGQ7*lRM^RC*MO`sN%~rDjny#b+EFonhl>gMzqY+7Q|uVAKH@d%$oedSwHWqA zCx+4(yJ0y|{9yWyDpT^#alHWZ0W;Hs6h5o%P%JF3-i$I9_4Y5QWV5!(#v}WMhO) rEKH)OBw|q-WseEEES@K6GSBi8)g?GWxxb;v7dXhXbHX|KCdB&%;d_p0 literal 6684 zcmcIpZExE~63*AE|DYcZTLcJJwW3O*0^FVK6iM9V4oPu`I4FuU41yw8GFyry_#)HJ z`M=*Yv&$tZQg(y(oWLRH<(b);+1cUd?ZrR7PX6-p^a=lb_05wfPxmUz!z32Yd?r*r zdK#!r7%SlwMHa5hLWwZ8#J!i@hVhn2X{P*;6|ckXbt*Pd;uWhNIgCMks;WZ8Ed1_+ z`{OU4-2B=LROS|7l$mm)BoKcWD)!cqvc?Q^asB~Z{%KQy(wBUfd0Ny;5@k^I-&yi2 z16xr;IV#QI9qA+BZ_2eYJ{xgE8Gt5^@wz2@2u$HhZWia#&AnY3sca%#KS{D+ER0s4 zW1~|m)B5^iHNY@;RA+pz{Ds(4!r1O?HR6Pe%ul6$a=o$mEHZ_J#$rC5eeZfJaX(^3 zlH!Ms5K$x~$Bn4NfM7V{P}DgPUDl$@p6K#G6rRJBo2QXi)ZSJtZ`l#ILQt!*@!262 z=Rp-mYL&LylGK(Dsx4b;R(0nUOR+1ew^_3LnB3$PEv#!cVLai^>xV`C;EYF~M<&`u z=EZrMUXidQ?&a+2l6Y5$9=*=HuM6|a zQEgd(r{ym08S$AsXa`%ERIX|yu7Ji@=m;t67P2;CgMaalK=6$aQ13P701KE8N96eNdrEWXnYjKzu2^f)PM9&@!zwn5jS(J`EgXwWvaemcsuYF$uHLg{)@dhLBwn`O^O)$s`5g06 zk_j2&WwsKbI2FzU|DK$XGRYI8`s+;ph?g$~z`~7?vJ%e(35>JY&q$Q^FMg6|-{H@aKL09Q^wcx85-Sm?V!mdv;bkYji#+Z*zQs zHdnN60c8idu=d{2Qvai}0^fUG0FN4_&mot0=Ye02&Eef(GFPm$Zu`@z=f8JB+gf$CP3f({yG?u^v4Rw`+R({EF|HQ@=dtUte|Q3>w=-I!-l(){6PIf9NC@5QB@7xZ)(+I0$=aJXqVAn6M29UmfG4c*X8Kunv({z>sM(cV)XaO_epzyDwG zIOtgRVM@|gPQX6Q3fML+U>_z1Y@L~d=?C@f?Q)2(Mv-@m`jdGPEFFAQuIV(7w`a?- zSeKiP%0%hDDw193ze&otP}ysy>fgA#;Nx;oN?M3~4Ti7Icj!JJ=HvMJJj~ zU*KTEZ_3XU7bD-n2NTxW)wH5kV2p%$;l;lCln|Jv-PNBH=3GlT3C z?iMg@&!sXAyh1fN(hR_iF=~9R9}6$rssbfd6ZAo-31+nX88_N=1#Q;{gAjmgov~6+ z>J$iKo(c;so;?%ahIu`qQly9!<_6f}+5sAEt2=)~2Nh{1a)inzLI-5 z6s|A?eONT^O1pAY9h%pnhdq%RM0mM2z{|i^4mluPUDB+??vRM8&8(X-sVkvop6( uY8uXTzMQ}Ko9TWT1PN2ZYx)bXw~_lc^R{T4_%>zkQsTc7=+wO*J^3Hoym}=7 diff --git a/examples/runtime/shaders/essl/fs_terrain_render_normal.bin b/examples/runtime/shaders/essl/fs_terrain_render_normal.bin index a970f7012c4fada732bcff0bf95489a55a4edcaa..2a36755ae1d29bb5c257877753b388a5dbf260c4 100644 GIT binary patch literal 396 zcmZ8cO-sZu5Uo8)#J?bOOk^#!?yc%YSv+~^QI?Wz({3PNq)q86{&%Nzp<5q;A#Y~h zytgYpZtUIbbA*Va>rguGx$fe4`cAkFWudt%xOPhT=qj2X;uDMWqLQ7o2DGSU&<+}9 zd7qP|ag^=Rfiy^xU}R&xhMDVT#q1qc7xI5&gQ&JRG28me_NXJxSps_*3}r9I%35Ei zIZ^y%Lr;~hct81ifs_F<%fc28Z8MfT&)YYvtVg}U${IA6hBER)0I?oHmB|I=hmINy tz?J+K6safrK=F7Vyr8QPn@d+L8BcJ(WJveP$Tskpq>Pu%dd7S3<&6ZFqwiU7f=R#Zt;fkkDfNa7~DNQzy=K~dB&2#OrZ+)^aLi%dK9 z8}_04oioEBDN=TWwh537&*eL}nKMW8=HlP~NdEca^a=m@?TaT*p6*qahe<4)`An#M z^fXYLFjm4ViY#20g%V+GiF+@*4dX45(oFdwD_)1&>r`x_#4A=kau|d7R8@tFS@`XH z_xqndy7{#isLUnV(9%a=o$mBr=79#$rC5eeHTHaX(^3 zlHx^2h$s@0<3`kBKrkF}DC!)DE^Er)!mcwGywBJ~0zp+>xa~D~(?l!Jk z(Aw2ULE&KsioBx|l6P-afuvG$0E6!d8dxFREV*fUMZ%J}m$R!&;$0zo^f~W-F3cxq zwPgXGmb$Sng^^VOU*NxeZ>-zk| z8~FZxq;@JUj-+8Q@f=4Ds54K+JAyjk;pd~~DpGzS*GUplBaMTJzQ2T9WTmnn8!yUL zt52|~_)bgV!g5)_cDVsm?2knas@I=|>4;%WY-8;x??3IvAN6y21QUt1m{@<7p9_nr zgVZT~Jb1noB&T&OzS0hi#fi}LI4No#bG1vhLD#9#Ij|-l$qhl{oRfIZq$3|R*<=nF zNRc)9Nb0zmA2GRnz+@SRnjH7}2%p{6NiM7g7N)WXWvA=XMA?UA#C|fz+V}d{v zE2kBDn%rXtqH;u})>ck$HFaUB2-2Lb1C>T!N}0;aDsicud_irVC*+B}j1ePoS$ zDJ7)Zq#CTY)pQ6-S(9^o)gr{;O-bD$FV}(HF5uLA9y`4sULG zIEGwBGj~I8@#kXKC1}#&rrm_3E3|j~5aHd>P0a+vv$ zj<63)lD29B_F+}Pwq*hPurOfj${b8T*w5ZBhxlp~dAHbqGB1LqgCCV^y3OP5*>Wt_ zKe}U7Y0smVThsYhK!K|Y( z4?Bxlh)bQw4zpEjD&gN#lHHO5SXUj)jyY_BzWWbMUu6wKVM8|fQypt zLi!Oxl6U-RBz05P?U!0nZO2b`DV`q5h;HZv=}+&($(i6l^p24LEHXeLm;tFOH~9G6JN+u~aK=-Bpd3OYG}W;<89 zZ|cOfg3wcfzSAib?H-*+nhwY+3b4l>rsY_CEs!>Au!Z9f=cqlB{CW62b^V(xEYv%U zk$S4k!rgz)5h_i?=vich*I`g03izrQ9-pq40d2H_lg7=R4sq#rj{>x*4X12okbT14 z0;cV~RHlJfs0K%x0hlpHjj#2x@UpEcu%&8(z6dqJjFvy*MVp?WZG12Y0l3x~EA^yK zi6G{wu+ZY!Gx24Z*Apsbib!E@fGw^apwYIv^EY&`Bh5sPRM|r4{&m_e`c_%DXp3$1wowyX(gKFA^Fz*cDtck&>r>Px$hwaBA zWSjo-&g|8FaEF@u+sc@48#!0va0k^XhS5n=RJ2L{QH5HAiuWPT1^cq|!dMa%4m93C zuup8a#R+J2X_{&5+xd8!ZTmfzdqNC|81uOog?CCnRXoqRIju(9$bFM}TQoiVvg84K QDZOQoM|4NWf)EaI@E5I;F3d9>1KHaN&vx> zOzS%5*CFKZ;1Fqfi=*L7yG&1d-_lZNX^S>}A>1K=j5R&7+N`_eu}(L}ceF{XoNQCI zqmKQ{CNL%@B|=I_1B%*xUC_~w#Z;%Wyxr&C>>FHI5K2ey+4)Ew$YkA}9P){Py^?Y! zq`x4XN#8+`QeznFPO#w2cgX#P2!uhzO6!s&!o%`dXy_2@piClM$vR9m;!y7EWO?q7 za>)|+OSLBSBPMmsL3^9fD!^hWgf_7w`HZUi9WRDhluhx!9iE&ru>vNW7syqUrFA}~ zzP87Ox&eps{jE^v0u1Ws^Nt`j@_}0EBTZKg)B?rb>Fhuwi_E2xNp6N029X;IKa$)9 z`+MWF5}pLjbxRGIGmdS6p9jI%U}^EUpjrY j%_JXfZ+5T>2Hl=cw&C{jm*WpFZ+wlC>q`rI6Vp@1FDfW-j*O>%->Ef?u6x+^54 zOkLZ9VVC{>B;7y!`1q$;{tobS5ro@pC#(I>suya&Q}NH*$sejxhme&b9lzK?9xm4$kF&yT-2TPj(307)Mn~meAyK11t)kLV#NB zwdn*3N->+?z9|k(ixFgks`ehf0{R@bU4_z^(>C)1h-kt<@;!|hB#r_2w5GoB7#3$3 zjK3K$##~tZw1+D%JbpMva7l|OSj^`lok7e+8c~t4U4|=%ui!(>(+EE6zer1!D?(-{ z4FCyDVElmaRv|w`)V_3ia%B7FJ)RVy)T(%YXGQU2Nd6 z<`!Jcz+T4HE^0hJQvj&e7$@I)<>zALX{u6g@l^y$tjcRjz#R=E_QuQQ2KN!^nq+x$ tt*V$Oss0l6zqcd3#ny+!g6K11I@d0LEnr<|_g%ieqvPsYsQ4uegTFe>k+c8+ diff --git a/examples/runtime/shaders/essl/fs_update.bin b/examples/runtime/shaders/essl/fs_update.bin index aa6ac4a5cbc925a42466fcc799bc71117437796f..2746039ef37f5774ee9b0ad8966157ee0bb428d5 100644 GIT binary patch literal 275 zcmY+8&klkx494;3dMGI19odIIT7SZM$N delta 156 zcmbQt^pJ6a68A0!28Oc4qRPy?^obiKxl8jh)AEaQ6>{>+Cnidkm*r=sDC8z)<|$}s za#eFFfW!+F%2Ja}6iRXnfcoMMt%0I2wt}rfNoqw&X;G?kX;P|!MsYll3u5Xhl!2JZ g`T0dD2AUu(={fOkMTzOo`8oMTAZ>8dYPq-=07PXo*#H0l diff --git a/examples/runtime/shaders/essl/fs_update_3d.bin b/examples/runtime/shaders/essl/fs_update_3d.bin index 46fb4a4547c5de03f30dd842f3139ca1b9d5f780..58aec99aa36c0bf1c3bf8157f2c5655c3b0f715f 100644 GIT binary patch literal 386 zcmZ8c!Ait15UqRg5dT5unCMc9T~Adn%A#jKpu{%q29iuklhQ@}cPI7`^%2PM-psr= z$M@GOyncEp2)p7kwn1C9yC@2J1U9!ptqw zkEaQ=Ba%g@2lN&;Zc*IBhzdO7}FLi-lfJy@w77wnS(;cp9VNg+A;gy16dG3~yrQ#(8|Rku{wymokS$f%ng0%Dlk^=xr>((-Pbw6qvkJsrb(3 ODvbP@gdX diff --git a/examples/runtime/shaders/essl/fs_update_cmp.bin b/examples/runtime/shaders/essl/fs_update_cmp.bin index 9072f45444ee93a2f9a3b046be52c3d8439d791a..56595e3dbd79ce873484e140cb8c74a189357782 100644 GIT binary patch literal 299 zcmY*T!D_=W49(b0{fD8W(~c6-?v%BcjYB)Ij z<9h8nYeN2pi@YpZedQr4%ax9^@&U6Hh55f4O|{3*wwcOv(Cx3M0?04Z9gefxiaFGo x=#5M@I!#`s@C7Kizm^BG9*1Dm;^P_Bjmmbq;u^E(w197ba5}2$tYv-=MTmk(=pr2Qa~X^QGw(62Aprrjj^{lA#Ew|#%idUt`xWH zGmKI~oRK%sOqM`H@+1JtJO*V8jjqtnRtZ+WZ#V$bO=~$ibcB{b>EG0->tPOYv>{1DS3|Pyhe` diff --git a/examples/runtime/shaders/essl/fs_update_mip.bin b/examples/runtime/shaders/essl/fs_update_mip.bin index 9fad3797ac17fd53c26029056fc6827b5a5feffd..c174295465d535dd031f58f05f6e986556f77e52 100644 GIT binary patch literal 377 zcmZ9H!Ait15QgI(Bff&nG1aA%RS#12qAYt@Pd>mB+q4@@L*qPaxr& znScJQzc$x+`}V>}3w9HCL5-iH{YG@}g%@)g#POk&TfDj6oQzWJtSTp~!&9 z+4nf}-8SQH?PYsRU2<)w>H`evKNX^{3-TLK*U(9AMaF+Pkml30fZ9X!YKyg)!Y)Dl dGs?#U+(D5)WpEFaVI|UgIZvODS;>DnXMcxQc5VOw delta 189 zcmey#w4X`IE!cxQU(U{k0SK5FxQgRTQY)PEbMlKA7#To_fng%AB=>(HU6xo>nVFY9 z@wFs-XS0SGh@cIqf-Otxo~oE*z2A+Mm2o)hm@l$Z{74M-o{xLPhQ F1^^x0H`@RJ diff --git a/examples/runtime/shaders/essl/fs_upsample.bin b/examples/runtime/shaders/essl/fs_upsample.bin index f92d3fec2430fdf697410cff171e30d3d1af439c..f4f312182ade89fa15841ac01305435f9fa4e9c4 100644 GIT binary patch literal 992 zcmbVK!A^rf5M6D&Z2!T`5h@ZSNDrtNP2;^EK#*?RO@JlK(tyT~@Q)o9Tef(xb+QS` z%zJO%V|TH9or>$H2ZA*r(>gAB!?GoRXO|a*;K9N!FBB^(uG*n{RmF-m9i&HnO$aF^ zOL@gb0XbXoIxk_Ji9|(o7;O1wTLS7ul-31b3z0Z z^n+8>=fxoH!>;q23L#fsM6;w7wX!miCaUxM2%Zht83+NqZPrb^kjds*WJ03ePVg1v z2`?<0eo(;bo$HVg2La058VTGc`i+{0V^rItj@Kc`+86p(wPcpg?U+H}1~9j8;cf>! z*RySy;rGtJw{c|sO+=1k{&crBBu>;gN<6l4qK5Vn&%^V#>*xd13o-kNOEuMWzYl+o eh{> literal 1609 zcmbu9&2EA~5XWg7FZ3OnIfAx?ZzZ<9v@yN=0E8&wCcqK|3T^u0J#|?D$0%0gh6CB1 zkKg=fc4zaCd;0MDEUm2^pgXau*oA=o3gDgwhmd8FjQBsx7&Ys!6}upI__g2A492_m#VPJ+VHE8 zdRZIOM7Acge3DR6N-3jbLn)a-!@~VIH`|j`Mbj-90@E?eQ=f?@an&9{LgK=x^)_Ug zM?S3ALJ2LNuwifVTD+cC5QQtyVQha!m-ASRrw7PJKsFY$VX(0(x>DBW*8|!8Kw|_n z#tLo4-0SWH*-j3+TjB1Gv9R3l`YOi#RXB*u!4l$ubk1T@?Tcp5>4(zzEomC7seM@N zq`p-D58;JmntB3_zYi^%hS8d#+nph}-bP-ErnP9trsCXSdrwPsDq>GZ(PP5A>k$e< dcb0m=8x3h%zeKs)J-JMy;r1#r%O6n`{s6qi==cBt diff --git a/examples/runtime/shaders/essl/fs_vectordisplay_blit.bin b/examples/runtime/shaders/essl/fs_vectordisplay_blit.bin index 1784b70546df545947cec0ba087f0b20ebc7fd15..0d9b8523b96baccadf8aa12bfb7dd0d058e06e2a 100644 GIT binary patch literal 392 zcmZ`!OHRWu5Ouq%%q3=-pbAwLyNDH4#fDW65SheDN3uPZV~2jkij#5$PQaw44IuGk z$<~{BAFnr0H%68L<5PTT2E2G{$lA$m#XY!dZA9RHsk^`%2Ox8nV zNX0^qgDtjO59pYb$zemm!kO!o^+t!~3P$_l&rYwad$<&02c!0sVrHmPafp3@MGnk- zTb|Zm+Gba-gKAHO3yE%=E}JY(n#}h?<>BlqMEwAJ(i4Gp@PJ?O~*_tGK?2G={5)uNhR)i9yw}PfF?Y z+NWhIE=o(txy+JCvppDbgAQyDdK;fsN}NG*k%F_J4+@Z|y0h@0kQo|>8y}~A4_iRr zqSO(ZIL2i)4zy?)Bex%!jf9xnpj02jz5hYCY3M!;)d)F85tc^2?h?gG7-$}MU*7Hx NH!b_~816kOC12Vvh0g#0 diff --git a/examples/runtime/shaders/essl/fs_vectordisplay_blur.bin b/examples/runtime/shaders/essl/fs_vectordisplay_blur.bin index 5051cc2e7afb24f96d80895df6c956433ac4bfd0..a75209de0c98e64c739ef7df74af80394cf69502 100644 GIT binary patch literal 1585 zcmb_c&2F1O5GIi-Mf4^12x*G;e?h3HR#ESL07Px{7-RY;fMblXy|OkJSfw@HgC&uaP!P4Mwa&Nf?c zG!z5~x;z|)07Y9{*20*2iDNfUccyK;+$_?@R`da3AAx5&z|q(Bs!Ja0biMBd@U})T zQIYD>^W7gV0_$trw}BEG0Spf?x*v-Ox_F+)Pg*?sGM=({ zCwb5C_Btn&5Xkce196+S&b(6!knzC`nZ)Ln$cZObLizL?h49sDXx%Xm5%Ur6L@K zf?&ld2`?rZZg$Yk+ZtoLLwDpLBglujf2^IZvh!LEnc{pq^SKc3Oj)Bpeg literal 2024 zcmbuAOHRWu5QYOAP`HGbO$$++IDM#M1w!mOKos>wq@=0RXNp*H9uCD7I03ff$Al(E zDp41eJ(>Ua=b6dV%k#~}$M=^-pG(VLN1NHh4z;U0+1O_UhkxCy(*QgAD#-Kr?MkRDjR0hAPNI<>60EGh3$N@GX zpC1}!rs}Ch7~02SCAxJdT9B#oil6} zTE?=G-9zb!tl=41K?jN~{WG%Ey!8y;PR9x6V@7ll#!dIzlTBFNua0e~WEK05Tf(@0 zO%0~`5R^t5hnX@`wXKddnLfY$Xh~HAsUh>YW;mi&_wha$v^lX3-4z%wNZWn}qD z^WKbR4o?r)tB@KQ+(enA8`djA@FD2XjQVsJY)FMUlaDxJ(#i}bcyPKk*+uAV zkfWf>;%NF~1mlsU*_$pT2WM`OE?S*-_psQDe>am>HOzs~!T4V>E_N`LSSp0nR)Sjj z8uG|&P;xAZ_E2#^W)alz+;^wukYxYUMO@g`Xs1d=^rBNREjVdBC=@-Bue|zPZ`3y@~>#(VFTo^{(WQo`dSwWelqAhFK z7BW^LnHoEh?`jYgf~2j)RyHM!SeGR$m>nGc&tYgJs>y>x7pbgIq-;_TXO`N~ULN@5vNs&Ssi;9}$ivZS7L=F+-9@_jm1s-O(nbn6^ zWIoE$P1;j!VP0W4Y-AiR8N(nU@&aTeMO@Yt5!ui(?x}6L7@?3kAGWDfTJJA)RNq{} z2slgw4l_-JYzxQmIE&4#erzpAv)N-<2lEvA@4)mh@a;~4aOs?v(?eX0h@%@kX(6Xs vUvr9A)4_%xvIiSXX*+AqTrUXRwc`b@$Gvsncq{Ju0pl(T7~Ui#M?#Em3h2{! literal 828 zcma)4!A^rf6kL16gMVP&ao6Aq3-nU;V$yi`0|+UUl0cW>7D3}@d-ru=%a$}o!iAlg zH}i&Fzr9||+vi7u&w|_>;#S4)nNr0*e~Lz`^` zw6V&%jg(F5t(?QY*vh7w@DOHB|KNy~)5;=+Dk=6rne*kqG*E!5YK#&4tBc1d2160> z1k}n0ck?v7V;0{>e!5OOI$8(~TDy+tfu#usO@B$VEoGuin9vf1DB6@sRRcwiY$(Oh zfD3m(smCJ>TFP8deV`$LR4OngzH6rXOv5f*Uv1a>jN?qGiY z;{@;7c^!et5Luf=yz7sxk8Ax^zMcpVkae{%i-m*7*mJ}`an|^u`>V3FIACpf^FjkG wE&C<^K!wloDxPk^5+fbwjG4@AhSnmAu#F=(FXMHSL>J{J6^U~ zaHwh_Ao0>WHVo=PO?FDhDen&V=di68~{e9av#fm zpY1d&zbUEo)))0TOW}|qXReekV&pq0Q9#8+O#=U?4|raDQ^;uY89Pi6aP15uiTdpV zY=f|3SMjx%?*&fX1PHT>m-0r zfE%L3S$8x9K?u3TEfah>N|TE9B#u%XhEydzUJGSOl1*rbw!!)_KvyI6~7XSk~`{n!IAJmaQfB*mh literal 1203 zcma)*&2F495XVWC6FpSw15|T_gwkCHHj%dNrO~Q~-0}dHvp59FtPvQ(rs}(AY;Z7i ztJXq7n*V(KX2#y#|9me$egEp=Irl!av{SUXvIaTaI za2+tjd^C#Uy=rStnG&p-#Pr)z)th#iOjtNl#z_ z_#ZxG@@ZIE30{+1STO(9Wd^_XJ6U8PHoN}d&MY1k7`WrZEl^%e!ErO}KW zr_5K{Ji1)LHwc^wz{RrPxDOqFg8tbq>jN8a#6L?XPE0by9Op4YKF^y-b%?bR3%GF- zZT4fbLnd0&x{Jg{OKzaTeBQ>+S?ST!9u!tlhMcrkTt74yGbjAy5L~8+SwFZe|Yv*E50+)17Gh;}RD=G`XfZ#f)2XDzA0r;q@4xT+m(3@*h&jdXn&A I{q}wD6~s4oTL1t6 diff --git a/examples/runtime/shaders/essl/fs_wf_mesh.bin b/examples/runtime/shaders/essl/fs_wf_mesh.bin index 33754baaae23713825aa96e8d8f3104d887f1430..db305b994c8976947555510dab9de6af286f9511 100644 GIT binary patch literal 2350 zcmbtV%WhjY5LMevs_gm&?CvVHFNQ-7A26~iV07O_7eS!PwrpQO55uw@$w59h|Iss~ zuB6Bbg0|O>EAb46hcjnp&j0-5^qM%2Hj$h zIrB7Lzy!jd&T@ODW z!iWiY_^g|o`sh+aEl18dGe`0vhakeyc^BoxC?-CVr5LkI6mxPeryVHPQzB2oPB`OL zH;&A2dPH%5O07%Y2Iq51G5MH@T&BQq56m+F=EMQ}t)pP!tNJgfhyy*G=mKFUJe0j7 z^9CoVMM{BKY$hk5=0to*Q54rWj`Rb!NZ%W?y{)JENDjEK_c2Q4GlKD+H?<_9XJv^o zxDYMeYD7pv;0TI7DpT)$V$VA?(TAMjzJs=k@B!;|l3{n!IXtb~h0ZGV|T>6stcS9ZBf2WQ#+K2!vu|xIZ7H+(1}F!IqL8BSkP=dX_!q$` z8&uNiH*cW^Mdo+<06z2llK`+QzGO@8$-nlQIxtxF+qZG1uel(4DbR4)_b^?dY-%YsnMtx^}OH> zCn#d=O4-AgM0ZeXDvyxxgNg)5$)lp{Wze_KF^~+#jX6aQkTxH-j_-yPis&ioha+kl z3^YUNG@zmRgh(+uVP9>UbWrh>C86k87+sYZ1*n~%BppG*4$#Y5rB=gT`sy~2xHOs! zqdmbl?2xD^9SqZ89iE>_Le`PCY8?c%a%Z@aSDuIROP0~tqcPB4RE zTKVW%W3a;k^KRYfpH8Zi{T2&$n`dm&k+pM#)ej?_UyTbk#{ky9F=yYd0qJ|AHu~Wi zLaRr9DwmwjR@0+9Z+WQ8L(4DceY@5f3&#C~K7uzryq(ZT@N*AuC-f2g0WgZJsX*T0@e?4>1e_FE*=! zPRDyc>n$P`%x-r!oP!6d+N)$&csqS^v02UwZugvlR}xD;AsNe=F@{aRno{J1I#W_X zbPA`CbO$+liIUbUDA!zTZ%WNsp2A7bC)=m+30NjmN1_Mx#vme*LUC#wAd!-Dr5q2U zG|z=W_(9Oae+4}w8Ks)BoKL{nO6FPxTL{6#C}{hypq<9q9=V`;5OlM#4JRsu)`}Pz zAeH2jj=8rfUVRZ%C=Mz?DNz`iWT-tg%!y7UQ$&e$l*{2cxw}||FvBQio+lxaa+3=z zC?-SDCPp~giO)0P8F^BGQ910XGoTqsp94;M^;!(%Xjt78)ka|+)|Omhp}ozK9yc#Z z$`WT(6K)l93!{}JxnBroxRJw@MtqJ7TOCZrr`>PciXRuQf<931UEmy~@Zh2jo{JDt*jXHndvHka=vIicSe5nG&LKWDI9R?s*ofu)Ho2T#?wtdn zP9f|Z!j8)eFpd7nK~mTzuA3&VbR#ffpM@UyWNh1R2pSk&~aCSOU^yt6-q102EPxC@M=$Hc?1QPpgP`D@sgv&dS>i%?k0#l-*sn%f$c diff --git a/examples/runtime/shaders/essl/fs_wf_wireframe.bin b/examples/runtime/shaders/essl/fs_wf_wireframe.bin index acd2ff16dda412fd0ff6004e7145c013d1162d71..8a828efd85e39ae65ca25fed210bf2309ab9857a 100644 GIT binary patch literal 546 zcma)2%TB{E5Om>!%unpmF2zcl0*8tdQpBAjsv7wxQyK}%&Ar=JvX2G2eog!6^B>QR*f%W{-jQwK6qCgVLmXq?V*(R0i> zUyBczf+rq^4Tqke?^GAI$z%gEp>qHuCW~ZMR38x$xi~G&bfACKBz;1rr^HaQ{7e MPy0G>^MO+G1BADpj{pDw literal 767 zcmZuvO>crg5T*9g&_6N9U2C@}hzHYC6ViK+jUg*4Zo*d(Q8fOhUixSHUwY{5%F5cf zA!K+n^WK{sf{*vd`1kwE!gFUmY{P<=Jl*u}Eejt!KRwH;dD)08hP8;-1=P#Pg*u!^ zQ+u0)?iTeC8xmc-+?Jju&W K7cHG^+xi2~x8`O5 diff --git a/examples/runtime/shaders/essl/vs_albedo_output.bin b/examples/runtime/shaders/essl/vs_albedo_output.bin index 939a7c6885bd461a4c44b4205dedef6f7e8ea44a..ce53b13db53c284b5415c8ffc104af09734b490c 100644 GIT binary patch literal 443 zcmZvYL2AP=5Ji;|D5#g1rCmy}<7|q^KFdI$n-YX-t3gH91V?s~mM(gco~P&NNjhrn zI4;pjy!n6le;!tg8%FQ`>+}1HUDvY2Lfi3(v2nnR*RnBszpU`3haWWNwKLCHl~5`_ zgVy($uEqaBXBV7Xb;R077IWndI+#NmgK^O4JOd@SxHEwZPO1Q>&`7TjIbu~L;(|Tv z>{GIzDO-O={wL#=+i2%cTLX2JT-gD-Bn#OGqCI7#A`O~?iW?Wj{EY*>jg`wbKGo`v o2DhQeEQ-1dCF>6Lh3_DpByl`B9AE#w;&h($ literal 462 zcmZuuu};G<6f~$3lKF`@HVjc?x}d0g$4W>nRb`pRqz~0`WSq1G@fXZ|58uI;@KTc6 zLo!)+m%H=%>2Z0>=zIA2{=H_rkuB=O%GuY+6=Rc*VK`0 zGp36c+qJ>wH7_X5@>piqsG^f;FlP2^_S6k^DGyW?SO^v1BpL$bqN7?_IVD0#Dsh9Z zjk3fhO9B-9Oc&YDL(r*y=wriG)+R(%>V|)C?}PgqA0?q7nQ9AJS~lDPbscjaz3=P4 e6E|EA4%XMfX}jABJ;$}f0UwEI{O8#NfV}{(@mv}J literal 349 zcmZusy9&ZU5WIlZS@;LCrCJ1)bWv+dL9h*{Ipd0#4d>;h`0s8+O%S(QW`=p}w(Gv& zqv2}di9sG2iuGlOy4+Yg_dFqb4K1epDd#NibEn~i$ti0*ltmI_8Z0631(!U$HEp zh^ra&#A=XT1#8859`CWPM2<;ZX*BQzfd|?^lO;2VqbrY_=?14XXlQwyD^6xs zJB6kXg#=aEE(j0l?$!nLmCORWWL zWV$J#5$k*4aiOZ5XAwO^he(&|U23U{vjTF|I!>he4Qro{7{Qr>*8vAlx z$XBe=UCy}<;pBl4?KL*L3|5$|WCA&t1voDKpfFYlLFXlA$3cW}|L<+#5dsf8Ti9-Y zKy-Yvhky~JSv>EifV^|k3T_5h*Qkf#4#~_)VQsSiCz+Wb>}oS55~fH4Tz*7z(wjnCrFty}N> zls{oHA@`m+eCLGC!~HeE=lkdP>w?_WVJ?z1+wk;lU5e+~86h*dCYNT@O|I&Y7mZYQ zv(IxvXkG9}QRa|Gl@BAsU~;>4cmEc~JD@a+4x+BCOvF*eMFDr<+Q18F(%6S6d=al) z&Vvb|a}s(eED$Qn0*Yqxt_RI{#Bfxl`&fuFai;v($&aC5PiZXu-hH?IP=CrWPa}AO z$aGZm?bnHMWpR#am@}hWDF5Ci|XrZ?BSDk9>>;?i8 z9tFA>eoQUPIBKn8K^VQq%M3YSp~|x)(;OT;Z3$`kdi|mCpd%HuEzQNX@(=yhIAmwi eHZnjozXk#+2V_tn=8#|t2}zAPg6axCC?$U{K;(`9 literal 1136 zcmaJ>%T9wp6vf!Yhzq~KWR_r*@EF=fC^mt{#_4R%DJhv|EgcQw~WSicZW%U?fUDruY=h=##j!OEfkPD8e zlN)GBtEwc=b(NtdSuEG6$z~BslY*9cx*FOB7z4bfZ=@o$FcySRP-WX0rRCfo+D%&S zNU_lQ8_E9%3{mrMGuH6HK(6EA(5?&e0#^9&JgqR2p`AcG@u?c#+oF?T3Zp5RqdX-A za$Nh}M!LZ&UxTv*1R^A!(SsJ8x83a-C_~4h4n)hI(Az*);6aMo8MMNwpk>fvm5lfs z0mM040dy;hL)Sbr()c68%!tW7nkkh>f*ortSkp1_r%FQPp0*xq1aT|F?^uty495`* z3cR7`yXc;U)S45k1@nJ*nCvr0B+^k5w@P@E+*j!9Y_I7R^);P+LtOoCTx~9Ds{<8e zOC*DoD=^Ub2L}ED=hqB^L;fp(NZ=dB4n%i{)Q#oS8iuU+>R|WCe5jOxgb&-cegF@9 BYWDyD diff --git a/examples/runtime/shaders/essl/vs_bokeh_screenquad.bin b/examples/runtime/shaders/essl/vs_bokeh_screenquad.bin index ae9a3c437f58a6e86027dbcf77746cedbbcfb5c2..943ef652af7a4492f43af2f3fb99c089f19d71fb 100644 GIT binary patch literal 294 zcmZvW!3u&v5QbOqG#z?_n4?CBiZ`osM zGp36c+qJ>wH7_X5@>piqsG^f;FlP2^_S6k^DGyW?SO^v1BpL$bqN7?_IVD0#Dsh9Z zjk3fhO9B-9Oc&YDL(r*y=wriG)+R(%>V|)C?}PgqA0?q7nQ9AJS~lDPbscjaz3=P4 e6E|EA4%XMfX}jABJ;$}f0UwEI{O8#NfV}{(@mv}J literal 349 zcmZusy9&ZU5WIlZS@;LCrCJ1)bWv+dL9h*{Ipd0#4d>;h`0s8+O%S(QW`=p}w(Gv& zqv2}di9sG2iuGlOy4+Yg_dFqb4K1epDd#NibEn~i$tiuBtschk<(i`a4FAel_mj=qgS!y5)TQg zG+0GzpkWKsv&t`}&C3IQOWkYPR`$f(P&sg|=F=)F(@i2oG4tBI z1lEfW%X^ii5`2bmdCpw&MkpR6GNjSfH6pTkdsBL$aMmQ%ql3QZhL#e5G6Ds}{${%~ zxQbArBaO_nXkwyP`gUzr-_Vc5;pb+IdbBrDpx#G&dZ}&gSuqPiwT_qXQpSD{!l0!K zTBKY#LXUdrp#Iu1>+b)E!|h)R^)g{FDa3NgD&wOkcc@Q^3r|u53sxIZw?)p+8% sDRbsW4iAF9KFTj*!8Rm_YZIV@(UmP~1M)>D(2Qq~5PBUPlXpU#A4+5?0ssI2 literal 1485 zcmah}+fIW(5XD$E!JpViFiKjW7t;9dqlt+xO+#pl?V17&QhG7I_#u9e-{F@yvn=dj zsqF)4X7-#pb7pp*pB}C?_<7%7Kj+%z+Ru5oX`N|W3!|D|1Rm4mRRyosew56@rHXuB zXj+hEDW9yfkS+Lpv0`~Rby?uYNg4&qq27>oAiYZ7c*c{s@c`npAfAVD)|j_3A8w~f zlFr&gJrB|ykLRks!*YMZD~85=sjo449BKpgsnTfW5mg)Ld#JBt{sQ($!BLR8tnmAv z6plirB}R;6)EPsygwI$M@R%8<{;o4+hRd>O1zq}`A%x5S)`s1)js@;*r zaZ0RBFgBbw>X;U=;mO>`rs13{E#PETWY{6BPJ=oJ`TnrXm;R&Nqe2Hd zk47mSj)}a7SSB0S6!{?TGk02 zXqoFGBczZAy{%cH7qV8mqz^RlsVZrcFA}Q6Qr0re9H^TqDsrK2r>NM4x|^c73l()J zPNjI)8-;#dz_0@*04!k^vT(uTF|3y5DlhAdz%cOboHjjmRC2*yl&iV}hezEozrGMd z`#Rq*w62!U@$$}G3~v}ANu$*gvQ;JX$tR)knV?0?Q^*d_%%&FD_@eF*cL(lghG{Yu z={*n)|I(z+hUo@0x()|0ry@lapj__{A8nIWA?7v=xEdCY+HMv+X_ZhBB@qxn&5jQU zF{sh2*2PHKCV}X&PX^pJUI*1jhXDpK*l1Z%0bjhp=$35|Fkpc PVj8vuw2pS?ixBS*kS0%c literal 1662 zcmaJ?OHRWu5Dlp6B3#1D1VNNvf2vp_v8;r|2BFBMp%~Gm3U2yAT!r&+4oovwYh-bDW;AI&Nc_Rppy8-u4}ba$d3dhUes! zEnnB9&Yx34v!bk4^nL1D-~`}x`N23V3#)^O=d@Vn1-Ig{!1LX6SyqeC>X8zbEhwj_ z(dcAsd=gEjZcVE_E0%_LLh5YJ+Rm-G*2N0`9~whyMA;fG2KG-^ThM#zZVL7SV^IyS zC{IZ<)f12yI3z9Ef~+Vji08YXF2O1IY7OmVASNOD_ha}(Zp;i25E-Bw5gP!MM-hnu zKy+PNu9+%_{o`N@m7@SA-{y#e-TnYpymly0qT80~Rn7$bJxzyPYM0m-x$JGEsAOts zBUNqa3c`K)p3T%Lh=S(GOv%)@mm8pR16eNYupX##o~N%7a>haElWU>RF_Bh>A<8_o z>o7PDPqjuP6h0E+(16!)`AWH#itD4(`5h45MI+<_$O6vWf6YM`3efs#VMs zAbDh{L!<+s^3u8-#rt3g$~&m#A3(!R9GeH*bw$jVSRrV;*;uI}u+*!K2t}dfgPt$Q L*?GUeT-W&n{__^i diff --git a/examples/runtime/shaders/essl/vs_bunnylod.bin b/examples/runtime/shaders/essl/vs_bunnylod.bin index 2f6dcd7497da8c3e42be59462fc56b48cfc3d1b1..69e8b981f99c4acc4f9a3b7824e626c43a51c4c7 100644 GIT binary patch literal 408 zcmZvX&1%9x6osb}D2xkV;VzRRl4ur%!M#hNAQX{dNK%B1W) znj+rSaLzaPoV$8i3>nSO@%L}QMwQGl&CE(?&9cCE?}0I|wb^6m^vWxFyt4WYiyU%Q z#&Gjl+;!K{MsRM_0jttCn5a^tg*ik4XbW|g%s|N&_4Y>dJNGd48)n*8oBHm5qNVZJhclP e*p(#6@2GXSaX>KnIDB3xSG*5(4KI=3oU;>zeS2d7 literal 587 zcmZ{hv1-FG5QfzdD5!v zA~>4F|LgAi@3eh-ydikLe}4ZK+*__p10hL5MI$%jeeQ zaFoTdfi6EV5WH5p5@kv+*o}IVMyficozN#)7p^*ijvrL1^m@i*X!c5%SxVblz97UF zR>CB37Tvw^-CeZD#!6;T30cD`pq~_cyr~)t#iJDE@gDZ@08xmMJnjATfvVtc7=WVW z8#^0%tFuIKKXnX-R@2IoQI9=BJVTAcIjUWXN8GLV4i*PP)jW`SKsEzp6L9=em_7)3 Lc0t(Xi&F9r=IOi7 diff --git a/examples/runtime/shaders/essl/vs_callback.bin b/examples/runtime/shaders/essl/vs_callback.bin index c18207970a33101ae1c7ea70b923c6c70b8d58d0..42640c4b27bc9f6d4ecb7d44737d132612531fdb 100644 GIT binary patch literal 397 zcmZvXL5jja5Jg)NgmU2(YMBfoiDn@*?p=u>xDjbWl9859N@5aqWOj2CujNr(Ol6Wx zK&(~s|Lb4BHtWSe@ci5#&#oBeDyA?p8y%fjDIIzpA$p}P`nA(4OZFg7^e3e;#(w7E z%V+u4-MTvoVEilPnPn*OGffH3(X~-0SVX}TeRZUhE_De^Rbrvel$!8g@vu+<8A=`b zCe3NmJWgvcC`gA~RVS7WH$WcV=b@U+xIp=|+SMa;$Br%ksJ&6Ex)FmfXW~a0P=R$x ZhOC;}I=c$6$Cv9@Lsg9!Ys-BDh+hd7ct-#L literal 517 zcmZvZu};G<5QYt^gk%O@;l_p`YSL~|cg9LcU8>45O`2X6=OW`I6vW1x@Gd+BkHUb1 zoW?5gWc|PY`|i%`$A?>H&&TKY&o#TNg`zYo)|j;`O~=Ukv2uS8TUbIA+JQXn<@9P*e;9zg5GyyE x^`;jc!Tq^n(3SF5=18$eh)1Y#I7W3#@raw*c7Vk}m+C6_tNrV{|D$)#*)KpyrcD3< diff --git a/examples/runtime/shaders/essl/vs_cubes.bin b/examples/runtime/shaders/essl/vs_cubes.bin index 043e7c6be0ec4588e3923b55d6f311f39bfee96c..2c2cae9f0e5c26f2b00369ef3155adb39db49e85 100644 GIT binary patch literal 278 zcmWFw_TXj!f+gMWJsBDJOXG9%Q&MxnGE>U~it@8q7#SE?K++5^ftaf_FEcH_C|4mj zvBX3HO{p~(S59JOerbtDPJVJ?NoIbYf~|s~rb1?(LRo6Eu|i^eL4I*2NZgtWs0t)# zqEHr}oS&0lWMGX&uK`T22~aOg8CO|;W(v^$%sdTEu4*m?AV|-N4}h8sv=Pl!3R+-` bG!VAyC>ZJ)Xj+4{!mJ1CLs(JE#l-*s0|HjC literal 333 zcmZvX!3u&v5QbOqv>kedIcf(<>L%UmCInt(GqVZTm2K55dV*e~_v;lJBSoS;4gb%4 z`%Sc6PZ+)D@z_mhdA(0EK&y0t;|le&aAE8CeoP_5+Ih q*=t}0zDI7O?9yH-9eV*}c^rNz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_deferred_debug.bin b/examples/runtime/shaders/essl/vs_deferred_debug.bin index 34b77f950f515f832e60afe3c44745260349e7d1..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_deferred_debug_line.bin b/examples/runtime/shaders/essl/vs_deferred_debug_line.bin index 043e7c6be0ec4588e3923b55d6f311f39bfee96c..2c2cae9f0e5c26f2b00369ef3155adb39db49e85 100644 GIT binary patch literal 278 zcmWFw_TXj!f+gMWJsBDJOXG9%Q&MxnGE>U~it@8q7#SE?K++5^ftaf_FEcH_C|4mj zvBX3HO{p~(S59JOerbtDPJVJ?NoIbYf~|s~rb1?(LRo6Eu|i^eL4I*2NZgtWs0t)# zqEHr}oS&0lWMGX&uK`T22~aOg8CO|;W(v^$%sdTEu4*m?AV|-N4}h8sv=Pl!3R+-` bG!VAyC>ZJ)Xj+4{!mJ1CLs(JE#l-*s0|HjC literal 333 zcmZvX!3u&v5QbOqv>kedIcf(<>L%UmCInt(GqVZTm2K55dV*e~_v;lJBSoS;4gb%4 z`%Sc6PZ+)D@z_mhdA(0EK&y0t;|le&aAE8CeoP_5+Ih q*=t}0zDI7O?9yH-9eV*}c^rNlMWzz?f^!-Rn#Z+!Y@&uR;rHtML< zPJyOEKb{OKgO=%aQ|QEfo(+olw*p(rOA{}^Jqpd7CM0-7q0u*I0uWUOJ+Gx~2s#Eo NuN&~r@_i6u{Q`i^II{o% literal 1758 zcmah~%Wk7E6lK(^m6)IK5=I(?4SAqw_Oq-sQa4eBXv3tg0z?cUk7~Z6`+iTqqhHc% zW8&+^p;<-uan89fbNlD_cL#pS+w1#;!RqhzS)J!o89;wUEn0a-)fVcWxto&zh4v`HMb^Zm z>-T_5j6%CrjvU9F-T_<17o^B|Nj%?uc8P9AOqya1Ri<qODNm5dw%TLL!k0z$#qwEm!G{TA7YgG+FdS zQ%1g>E=F{*qzjF@V@2nA{ni2|3qqg#6df8UWQ34MLKYyX)iELL!p10lY!Nm#`!G7+ z(FsDDSdb=tiMCP2rxhM&Jw?D%sIa>le#kwTx)_0O|3t!^nL&bZ5{tlONZ@!tAT>5P z9F~|^Bpyqp#(hvZPEW1iG}s?@x>OnlhuvQ6hYkRP5daCkuPvisi&_Kct9kJ~Q6{eF zxcX*w3@#n{483g5kWY@SO~q@Y6C}^+HBx+zw7W<1K)`r0!zMvu5o>BfW}VQ?8=ga5AUd;p6@G9>^2 diff --git a/examples/runtime/shaders/essl/vs_deferred_light.bin b/examples/runtime/shaders/essl/vs_deferred_light.bin index 34b77f950f515f832e60afe3c44745260349e7d1..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_denoise_gbuffer.bin b/examples/runtime/shaders/essl/vs_denoise_gbuffer.bin index 75b4c200582b8a7b48877fff080f4f6891ce025e..8890394efca5b1130be15c3c9da81064b1ad1aa8 100644 GIT binary patch literal 965 zcmZuv-AcnS6plJjBjPLMvXwddGv}mu@8v+)%_t$PRU&OOx^`|8AHo;&6?_#>(zH!$ zLkZ0}-}%mWzGV6Ge1%~BeE&uxbW_q)L~*j@@y8+;@1qlhMly{qO1fb=OSh-j2*C&I zT!UNCWl4Fqlf`X}o*{(GjK7LJB`GVWq}L;8vb%UKvsIs!>xXU1EL^$&6S{4Hal#Iw zEUZMVS;0j{o``D`o)JaP=tgY0j0Xcirw00j(G2vmB)~u>Ykjiohdc-s@qR5t9yvpN zUd`tLpMlhrQ={H(8ktdVFzUmUJHaDxlV_HVKQV!&=A*MY3@m@GcGSuKa2ykN;@E*g zz9n>_T>x1sd>0J o4>LtT!L0#P>dW^)pM+?C8{MYE`YG3Hzzb!F-lRdD245JXKiIw{od5s; literal 1673 zcmah}?P}XF6jev)HkYwi5bTdLwqV(EY!mi>KMRBY3B`DgmukdzaBcTv>>>7IdxgEq zt{i<_rEY6NFgnuFx#wKpi*H}g2t0rP{M*dP+ddcda3RXu*$E*t36S@FUNxI?Cs)tg z=BGtoE5xq6>GOTj7S+wGcZ9$Xo)4#l6kXSf?|oO&Yq7oF)1kbIXpz@VTNS&NHvw~i z_sxyyL{m?02w_84-d#0Ky9rj_P_*}=-eUg2@IL}WIy`%rBb-f;V?2BTk5*n^iyu&` z5?2)+r^e?eP{(n*N1YwfHM_I`I4VgG=C4@<(9nnttqM_7fA0PADE6kS_Fzg5wNa|y z=@;br;_m)If+jDn_d&hpOt`p(Q)~eNpfxxOtD06q+g*OH!UV)WYAE_qZw}}7&aqTQ z0v;OvXdPSviK$hVia_Ro+yz4ij9oBtz~u-Y%EwYTx{V)6NiZRYe6Y^c1zjnb3%XKR zfV7N3D_dfuC7y^PmMI=ZVFHb`=}W}2MDfVtOfvEO>5fPcK{6pDab=A685yRpQpA!@ zu%wE`*F9myCC`Y<5N$Tn22Q(Xn%39z2zbLqFsGkoV~-7~CkdEy7+K<>^mP|IHf5s{ zb;yh-IOhy2ipPs|T$RLaNh$ggaO4bsYAl%W2^O8yN4xE~3*kO>-GS?I63iJ3Z0ZiC eT{CkGq)VMXxciCPKWU*!$Et{s3b^gJ=aK&*5EIS- diff --git a/examples/runtime/shaders/essl/vs_denoise_screenquad.bin b/examples/runtime/shaders/essl/vs_denoise_screenquad.bin index ae9a3c437f58a6e86027dbcf77746cedbbcfb5c2..943ef652af7a4492f43af2f3fb99c089f19d71fb 100644 GIT binary patch literal 294 zcmZvW!3u&v5QbOqG#z?_n4?CBiZ`osM zGp36c+qJ>wH7_X5@>piqsG^f;FlP2^_S6k^DGyW?SO^v1BpL$bqN7?_IVD0#Dsh9Z zjk3fhO9B-9Oc&YDL(r*y=wriG)+R(%>V|)C?}PgqA0?q7nQ9AJS~lDPbscjaz3=P4 e6E|EA4%XMfX}jABJ;$}f0UwEI{O8#NfV}{(@mv}J literal 349 zcmZusy9&ZU5WIlZS@;LCrCJ1)bWv+dL9h*{Ipd0#4d>;h`0s8+O%S(QW`=p}w(Gv& zqv2}di9sG2iuGlOy4+Yg_dFqb4K1epDd#NibEn~i$tinUyf@Gz5;PrzM@=-c~U9U=F;GfdS*==m_=^HeVCbv_Enex!ccyu>1Ws YKE!x#wA`UJjUalvaMZR7{h*Zm0Vpup_W%F@ literal 1123 zcmah|%T9wp6vf!YhztFMS%Oi*V`vwRdzVd2x@j7MEw*C{)8IfK#?SLx+_`n@9Xc;6 zja`st&fIg)IUL4Mk5?A_zP^7x&#lWUAw@kV*`{}9Sv?L|*Hx0!dA8!GqmsUA?wygrA9d`ExZI#;!)H!}Q|^;pPo99ci$4L#pQ z_dKM=oU9h?KQxr=Ge;)UQW7^x#E_~S*R9(N3tTg?6)&) z!qQa_bh-_ZN>}w_VDJw*_y>aDa1FM_*MBg9!GzCE$OjLtNdW>BeZmKST3M)-frJm+ GwtfK%lw*Sc diff --git a/examples/runtime/shaders/essl/vs_fsr_screenquad.bin b/examples/runtime/shaders/essl/vs_fsr_screenquad.bin index ae9a3c437f58a6e86027dbcf77746cedbbcfb5c2..943ef652af7a4492f43af2f3fb99c089f19d71fb 100644 GIT binary patch literal 294 zcmZvW!3u&v5QbOqG#z?_n4?CBiZ`osM zGp36c+qJ>wH7_X5@>piqsG^f;FlP2^_S6k^DGyW?SO^v1BpL$bqN7?_IVD0#Dsh9Z zjk3fhO9B-9Oc&YDL(r*y=wriG)+R(%>V|)C?}PgqA0?q7nQ9AJS~lDPbscjaz3=P4 e6E|EA4%XMfX}jABJ;$}f0UwEI{O8#NfV}{(@mv}J literal 349 zcmZusy9&ZU5WIlZS@;LCrCJ1)bWv+dL9h*{Ipd0#4d>;h`0s8+O%S(QW`=p}w(Gv& zqv2}di9sG2iuGlOy4+Yg_dFqb4K1epDd#NibEn~i$tiz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_gdr_instanced_indirect_rendering.bin b/examples/runtime/shaders/essl/vs_gdr_instanced_indirect_rendering.bin index 137083f07f98b31466e25a00323be0973b50766f..01a0d4c56c94f3469e047fb9e9dae87def10de21 100644 GIT binary patch literal 451 zcmZvYJ!->15QW#^YH|ZtQ?86K`s)^VE}YH~NV_byWG1Y&L0-vmf=}XWlW&8jt)L7S^$9G{2r#WbEr^ z$|CA5QZ)M0ov97O@ft@5PEDl@;0KWB*@@G35my)W*dDFkb=SNcn!+W@wmjMPBKxDS h>vxFJDhk5RC+%^Y{5)o*%9meSg2v&5H3xw3v3=TD`AVjIDcxJzX(Y)#(n8s7g5C{!jsyI_8%! z%atUIwx~^aAxKfFBWh}$D-obbq?Z0N4wms|8HX{?a;ZTz+87+XKr0HV(;8*|cpvko z#7xzNsURhSF>lOUg$Wdr>^m<1<}j@*RFdX`Oj%0VBG5(E%36>qIG?=^?!fmb)`We0 zei1c+J^JfaGxODdBW*g$3PCTNnueP#-;8{?+VXJZ^dK-xf1c!fU9X+iI88CM7#rb` mBABHJd*3u>x=?_9F1BXBq&eez!Yw$)7#;0g*NyoP=jG6ub0!F zxCsahe3Z?*?Db<85VD&WXPaP9@}~O^J7IEMsRE!CA3Ye_>Pi@?6&^8RC>4%Pm80af zFd{BIRJx@SAC+yX)JNr8D)UkCLS-oUQ@`Z&uQeF8tgV<-l))F!&b{TO+gqPi7ek~| e1Jrp%PB2+Qx&-@oI9EW|QxPVIn6UzW0OSt|I&zl) literal 494 zcmZvY&1%Ci5QG)*Y4Z|$w0kh|&&~ASW1!GW2tvd^*NU~H`t>$qukJEXa6>#jRHiLHkw6Zz+WeOM#m8cbW3nRDyKIXJ3t5)(v zL?<_^Ex!ALo+q9^@&0baW;qM+WkAs(gDuT-9CQU!h{R00oR>L3z8sRKTLQ}3dldlXgm z(1wC%Q5h(ehNd@Sw~lrj?Hy&~XC1%Qrgo?H=+qgVGHg&N5n^wVXgd9*fagW>ZNrUy z&Rzr7bq%JSx^2KROx-(JJLS;YD^Mq&))uatoVKJ literal 1497 zcma))&2EBF5QV9+8(j1iW~nw3+ux*3wUP`GT%o(AA|FxNOHgr<_j(5>#DxOh3^pk>MSjZNV{_3&WB4Ap$k?og+qI zAPGSJUpm19%p^>Q)S~zut2A7Iy=|<{S)(?rT@2&Gagz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_hdr_lum.bin b/examples/runtime/shaders/essl/vs_hdr_lum.bin index 34b77f950f515f832e60afe3c44745260349e7d1..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_hdr_lumavg.bin b/examples/runtime/shaders/essl/vs_hdr_lumavg.bin index 34b77f950f515f832e60afe3c44745260349e7d1..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_hdr_mesh.bin b/examples/runtime/shaders/essl/vs_hdr_mesh.bin index 4781ddff1b41870d4bfd2468b9fa40de3a0189e2..fa436e4e339d8109da2a155db53e04669919e305 100644 GIT binary patch literal 497 zcmZ{g-D<)x6vv}@b$TJ}3C?9IozxG85O%*yVc=~ET1O;JhPHK`_yT*E?HPB{RvO*R zMM=;9Bfn(z`Vuf&Pu~w;eKstT%x+S>Qt5HIx4S`)v4N9W;3?hohjb{6+S+}FnatN8S4x9i;}Mf8r?9CGKh)pCRFU7`|p0l^0U z>3&0uH*yV1NDWa;-zW@t3$Ut2Ea_C79}^{@Ohd3(DCEAm*)qfE@Q%`^7SFuz0*M3ktLE!u03@SyvcE bhyMX{S(3(Zz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_hdr_tonemap.bin b/examples/runtime/shaders/essl/vs_hdr_tonemap.bin index 698c47bc68051d3679d450e28a97bca925ac908d..61ebf65d4036003ce55e153f32b6421eaa8f805d 100644 GIT binary patch literal 964 zcmaixu};G<5Qa_ZKa9Dij0yNl_aD>3_K?zD{sKUxumI0 zT-EZDyZ=9b|7CH1Hz9aFzka?)WKt)M$X*|^Hp@q6gy6+r$-crhq0}2A~ay`%aNos$&d^Db3TZtScv%%d`@*gj--!5TzRALz+Cx7oqAg zMU^Ug&?HsXE~VV8SZuNLz1>5*rtJKI=I8xXz3N%3zO@=)f<}rJ6sahkDSe}WXPwKm zf`mtyM%#tk!X-p5QY+D8p3J*&JDIT<6sk=+hXu@lyKMSr)i!`uBc+;rXmf0LbNWpn z#kFFa=|*>JeztIB(R9yu@j_;a$8Yxe4iw%|ijbMl+9(DZlOhT&6kaf-@Q+eN;c1G2 e#-!jZuweM!5JTyX{1O(N=D>&ki4f$SQt}Joq%XSw literal 1415 zcmaix%}#?r6os*=8(jDbciCzr1qNc$xO3sMiKbhEEp5jD)8Ifsl?W7g8U3W zGNg-U&dfRYJ9qu~aG~J$`StTXQ7&R9q2B4qOFe&brYQKs?=p4*w)OlqN~?&yO!0VH zDEH@z;&L9*=a_qNp!>rS5^rOI>m1oD<&=d>b>M=57r2*h7>l-xrJA@=M#Ft$U_dge z6G7Jp-ix{+(M^d?mTDZ*9gBiyJ_15fT|IDluD2?~3`VyQxHN>>TzyxeG~4;i<-mg@ zcHkfi)c@fQWnnv(We+3SUUnPqBO+g;0AMma^t==vX{yaq9{ zFls1tl&jD@qTed+zD6L!2(xN;*p`9o5mCq}3eg5p#tkJ%MuSw$-bb(09v&X*x diff --git a/examples/runtime/shaders/essl/vs_hextile.bin b/examples/runtime/shaders/essl/vs_hextile.bin index 14ccf4db76c007fd028b8fab1b4e2e1bd12750a0..151ac3be37cb9228c402ddf338b31b4262b944b0 100644 GIT binary patch literal 447 zcmZvY&uYRz5XRRc2-8RKGRLG8*{HY0yGKFjrN|PJC@V=uVzT}zJ@yUyUcL8eIwsjz z)IEORe82g2-j?%c!SCmH`28dXmCh(m(tb~f{zVp0X={?hqM+?n{9+rb+^ng{Fbm5m zwz>CUrEU!uR{&{vqN?;#io()Rjx&@#njCEsO)%6u+MA26fTtSK-iu?jx=fA{Q4ve^ zfEhUEn3?}3!IFu&uE{+gJ^=ag;wkEh kEn~}j1ndTCVuSUW&;T~6UbH8u3%Sd=LhUx!<`Y2t0V&IdssI20 literal 663 zcmZ`%!A^uQ5Ura{OzJ0inIjlO7U+$5_qd6PmklAfAX~Gg1Pcpm{0slfyI4c^? zuzCXIJL4)hs~Bz!$#*?e)698#3!VBiOP`(D5YsdLnWESy>+yN~IGVRM?}B0OcS^}OoyOAg diff --git a/examples/runtime/shaders/essl/vs_ibl_mesh.bin b/examples/runtime/shaders/essl/vs_ibl_mesh.bin index 802c44afe878b2b372fba42813f035c1e8678525..9780a23fc9fa070f4eba7dea35f919e5d5f19ca1 100644 GIT binary patch literal 509 zcmZut&r8EF6pn77WP&%(@0gA`+A1g%?;eMPT}laIs}f0*(Y4h%{EPPg?d(gFt=sSs zLU`Yg_vOu|uLFYhw%OhF$ZgFFv&hv<=3kT2eD*I0>06jw*L*2TQLHX+2*HDO<;fjs zi*#CR`EJSr3Q;}6nO|~1n|y9j=b1)v)yPGW2MHRLY?ULE!r5lz)wic0=l7q)n?}LGtRe9)=eHkG!BEL zWql|<@qv(dwg4Cc8aSfM*mC?Dp0e@x`UmcTd084}P7zpOFLM!5cuH$CVJHs|A;wH- RX1By_z7d3Yd#hhc$sdg+mxBNR literal 686 zcmZ{i%}c{T5XIM8P*%a4=Q$=qL$WD&2;Mywg};CP(k?lK zc{}rdZ<6Kf^9{lCvj4lkBzF~0vQ-!_Ww>1w+1K=fkg1l*RipHk>x$>15Xok8O9(!A z-X?^IvMl6#Rfe#Z(K-heez+ibniYwNJ$gpYvyCiemU>i)VkgsR*sZ$mlcGXck5;Mt zM31H~5#=0?!t{5Bs_z87fUvslkjr-%N-C2pNQ6wmFzKE`4>pG~$&rXV9+um8YYR`{ zSoWy)z5Btc;C)PhDCUbMHEPBYEIf1*O+BhxX6MQV4(x<0vrf4xuGe)iY+^nJ_03tw z;M+lO&rGeJVQ>cwZp~nilDiFqVYGh$4rZ2Z!c6a|p4xuh!4gIQZVlkkUrNb8JQ3E- diff --git a/examples/runtime/shaders/essl/vs_ibl_skybox.bin b/examples/runtime/shaders/essl/vs_ibl_skybox.bin index 30fb655dcf9dfbeed9548dedaeabdecae2fff3ef..a6b6dd5e51605098964475414def33cdb54418e2 100644 GIT binary patch literal 570 zcmaJ-%}#?r5MFB!W;O8@=C~L{SfJQ!Jb3fiXwpkV2mv%}fNdzyALG0AWqc23+fqq2 zPWH0%{msnu<>``OZHq_$oLo0iq0%g$%4|8Q)cf#^kfDYNZK4*N&skCru!#@rqKW2l z6&H)a6(RVrz7U~JDPL7pKoQp-oLGt@+GdGHJKJBt-g@TnP*9r3Yt_^&S4mt;Rl)<< z2FMc7#DzGTtA*5k@dwfAh#ZM^wn~($Qd>~;+soT1l@(^RN~SooESW(+C}6$i(d6Ka zi6@)Djh1`tC*1_cvJJ75?o3g{^buHhsF@v_=+mv%|M33D4UNv8VZd=}Y;uf%TOG}r zjyn)Jvn|i@xa0bxU>tDg-sL>--LXC5KFV-}?$Xua)rkeN*eFUQwO7(^K;G2&|lf5hpsROr~K?y62Vf;6L!9VgA2b9I8 z59FSE&b{Z9+3V9eg7cj|-kl;`MwLu|1>aY&`G^is))T1SEAU< zY-I~nQ7nrPmzjK5MLHmy3`-xwsn7-a*x0Jo`v$7EVM11$==tCuFz09|a@8xkMyk(^b#-PH(6<`#$3#>5TJ#vI7}8f? z=9HP*Qi*RE2WU%dcbP(~x285>>YMUEUNp{UdCv zGs>y*rVZV!;@Rie>wrB@S8S*yyJc~3xMehW~egdE!6R1wi}(0xzH6 literal 616 zcmaKqK~BRk5Jg?omAS+$6BbdEcvm5HS$36>*dSz?Hl%}^I5JL3L7aeVa6hiV1mfCA zQL?h~{-5!m@!jqElF|3|`F%5EypDiDBjr>q*cJDN^EMWn&2z&|DItObuxb>`SNnI?a(3%_r zR*C+HO$Ih4c4%XA9nccbt7&PAennAzsUrC$fvTHq9-nCcReG3qraEW2hgqCNy5k6m x_XPF-9Vn$9*d^-X&UnuP_w0_`dobDYw4UzA4Y!eY&fn$Z^ABWr(OzDG2c2ZPPu0NLxLY9^$tAdF}L_Fu}>>!E{o`pjQHzt=K zg%NO)@hO8+?6<(#UMD(Vhx7&=Af4&6G*YJ_EqUI^G#;zVUOgp`iRK1Mn ztxj>Xg<1OfooljD51g�Th=hxE}qYFb;tU*(RJ~MrD|YJz2PW_bYgYjgM7FSlwI@ z9oL+Ax7uK&3GluYO=9HVthe< zaVALInhU53Bxs~i7GIKDk({4jlwx3wMY|zPyAe=3l1i?!{LB=E+{Da04Nb0UE(IV+ m&xsF!nh&%WXt;?6!bTkhLp=jcYp_BjD}f48jIHJ3VgLZP_Cj(1 literal 263 zcmWFw_TXj!f_ynU8wQ3iKvrT&Nl|7}X-TR=MrL|OfkIhovav#9d_jJ3W=Up#o;4R1 z1x7#xC8-t3`T0dD2G(3?f22V^db5&!@I literal 629 zcmZuu%Wi`(5Oh&a&Y{1sM@UsGf!t8czU%E#RrdT5yF)! z#CxeCxQO_YLlqtOz{8_VWU=+>KeUH*F0VofnfbKhMJuw{R9B;VPM#CV6;wKjPs>c4 zWs&x}l&d`~(l2YeWX2rmEyW2^E;6tk`bohIfeFK%KgU#>W1`U2@bJxQc!C|nQ4OqV zZ-|;>&U*J+&(L^SZ!ZRb&FJFj(k>EfZ`yHap?@c?(OpKWfd{Z{6av1C!C8x)UAA@L wQ73nF#RhM0+%RjL$=hSK)7i&K81!pHoAG{zZ6P+T9sbsYnAx`V=@+Hs7q|<>4gdfE diff --git a/examples/runtime/shaders/essl/vs_mesh.bin b/examples/runtime/shaders/essl/vs_mesh.bin index 02ae6e01c68b699e15483c5f3beb593f52351f29..968e82ae2ba1850c60e0cd6bb0e0b4f93fc797c4 100644 GIT binary patch literal 965 zcmah{O>fjN5KU>tAwBRHe00hZIkBA&tvDiatc2976>Za!Dv8_OZ0Lgc865egTzC_w zU8jH;MfsR{@68)eu0DM{4-h|oe)x47yxyCk>FQS}L4XVKW^X!sUAI?F{pE6N@6M1u zn=0pC<(Pdq4T5mrH#c_Mv9aDL<`mb@$*vkGxlsLgbsdInb+G$^w{}wvjqTZcmPD-S zNnNta+}mA4`So9b!Uy)SRJH36Vvai!ckw-9%0=P@N3qdtY-_gyzDClAK3*{G2mWZO4RudM1HhCA!QoF@>`OKKoqg2FFY1}rHQ|>y9NIM z!hiVFi5Z=OPOscZxnf3X+~DbgUL)7ZAu~aZD&tN8fXUuFM^0e%8LXHoXe#iOHx$fs zZXg3~ozh5CUl9vkPElmKC`zr$RBM?hqLjIgq7^%e-?rv*-Z1oE{5Paq$k_#L6A+IO zKOVk56=}6Jji=z)k&l`u{R216g+W$WhKM}Myz(TWo%6QtZ->u(o>jz3xX@)LRHjs( qYgvjco!6SVYAOqr6gn>xk!Td3EW1Aqx~@BVU{T)P9n$wO41NQX3I`Pc literal 1505 zcmb7EO;6iE5H%Dym_z@<9&MnO9e*TI#1W}Sq)J>ZH!)!=+Z&vXAs~JN#~%Ajd+E%^ z>m8@D5LT2}^Yz}mnaSOc@8=dgzyI9){bHSO(o!t);*RG}Cr6fbf-dVTvEJ6=m+_o! zQpwBw7((F#&-~Mx-eUmk_u_^`v(ea+OlwSkMZr28S_5Q4q}0Xo*1s zB`?$kIKJm6S0JkXcHKUaND~|rB4h6fU;wsfd){Ji-S#Yt^tPQVaw6M{+iAFr6`;BZ zh$C4Z6hwgTUOO%mf;&0DWrC@cOOxVN?a?q4ChjoSlweI27Kqie?XcQ8s(I<#9|WB4 z0rqYzpydM}i#Y4YTJAP^A!N5d@s*xVY_25QT}d)9$3UHS%QgrOs0T)})_pbsUF>}q TO0Em59`qk1u><;>ZCn2UEmX^` diff --git a/examples/runtime/shaders/essl/vs_oit.bin b/examples/runtime/shaders/essl/vs_oit.bin index 02c16a9b0fb2b5622c19456d1aa597f49167dc58..69dc080e46c11ec9fbe20a50f965ee0bb2b34e51 100644 GIT binary patch literal 384 zcmZvY!3x4K42CO;LVSrFSCO&lJQeRA1;vX<89Jr1t)ko1iTGr`o9U`d#GJzS|M`=4 zF`IN5)pPz3P1ea}qBl|8YB1I^m_aTJ6`iL?y{}>0!WxXo4|%G#`j}u6W&yr~mi|io z3ZJ~cf&hratIjhg*6T1+I>j-1994=%v>sw85Bj7G7eFop11t=r$wI3QtyihT;RZ-m z$ubyFh-n??bC?I(J=F!IetEwH_d*h_ OHZQkR+${y%0oV(vj&0un literal 619 zcmaKpK~BRk5Je4CAel?dvSDF0wRaJFmX$zks>(7nq(*fd1t)Ea5GUhq*ojjcDIzQD z|C#x3CeM!#x5$1!Pv6-Ux^8$Y^TX@{p_x+=9)wk`--CG5aHY5TJ}7XBkT9l}FOA7z zCyQMLZT?C@@JfG3BXybKR@9v=i(oToot@#PlyACL-ciCZ7;^uy98$1-Pmi@uH#SVm zEhr&Nm?!uXL!4?69*qXj2@vX9?O@N^=M{Ut@|PVV-G6g836V5$bNdsM?&S81nw&CC!y+0s VLBl3!hLB?*2^1_LcI_{W(J$6FzsCRo diff --git a/examples/runtime/shaders/essl/vs_oit_blit.bin b/examples/runtime/shaders/essl/vs_oit_blit.bin index 34b77f950f515f832e60afe3c44745260349e7d1..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_particle.bin b/examples/runtime/shaders/essl/vs_particle.bin index 04697d7c1b1f1aedc04bf5e46a1dc52359e66997..8c9647daa94de81f23dcfbc67570091acca443ca 100644 GIT binary patch literal 619 zcmaKpOH0Hs6ouo=AQJbkFStpxly<7C;>wLnL2xq+A#|!_=rpCTX-E8F`s=)D`WP88 zloIa!&bcSa>&w$6!L_~m{+g5XO4KUeFU|;Am@2ubL?&~&D`s;-@WX{nmh0`rT+axh zRjS@}zJr}C@4&i*W3i4SQ?yR2U_Etu+!%(GCbHF4$r2sOQt1>Pz~`V+==4f#WGTJy z56T;;B}kF!LK$^P(aT5!s6`n!k6Py&98znw!I&y#oPJQi)iGjukMo#~4maIQ*3WdC z_TYf;dYqeWc%%w^RHb-wnW#g|qFfgRLocUuWvFq$>wlc{UOMJ+8eLI=JB*yJ41@v;21+nU00MkI`Zz_b5Pw%p!Y INIxkhKlDMhivR!s literal 901 zcmZ`&%};|c6i2rhgLlvG2y-@r!intU#iNOd7qgJ+*w$rG!a4>R|1kaQe3g%O$<~li z-g`fOA5Gt0pYJSO+xy?2k#%#3OP(CZSC%zaRaM9fvDJlJEU<#5`|FWq;e%_AFD7Nd zKMpd14PS3^D3ebgSe%PJmt16#eP$p49xs_>v&b%4QS)rA!4%3^Ce@P=#WJ!F8DEJa z?b<1m0klFdw3KAsLM>{(mHkc^NGJFbQpPiIT>Hxg%^QGBb5s+15tjQsIl>$~fXWg4*2SfzuXcjTURq$#2S`7J=q*UCdis#i0}hxce$q9gI%>B6 zqv?!<23dF}@leI20vs&C12`xG29p6AJQES^A{r9ID9mgqX|oynn5arc{d;0~B3M-*^uAyXrhnWGHdla@C^H50Vq zg>^k4gtkiD>bim|Z&u*UnZ)c*bx^vpFmon3qg3WQ-8P=oMcxRl-~vJ)gaULeA?FYJ zQJ8-Ai;=lTg-E%~D2Da3otYiIcewVbaWJ!jju%?$nju%G#THi-%JbK5Ak8~mD0VL`%dg<%@8G)mGqX6H#5#U|r_T7O(`l#(ym Cvcd@f literal 809 zcmah{O;3YB5M68IVSDf|%n^(d3O$$*k0u_QnDn~Yw%D!#mf%9I#-HKQpXIOd;!MlO z+LpK>1m?}W_hxoxj}Ie;=kx3S=bVj7k?Lif%v8J?o-sBgh+SIIX`!Dx z_~7{-FeZ&D)Vwq?tkr6rLlrMVkRsDXDwBx!z`1@=M(Hf#l`OU@TXoeFsKi1iy6{hc zA%YF{Q6+&$+*4Lzmk}>B^@P@Hxm217SpEKo(>xAyuwmk$$)K`UOGu^4z;XFI2fHnk z=4e@rBMdj+-UjYq>|v``>~;HwQAxejLjqVOVp{(q=2)J|6I`{7E>Z2~fO%GxhpYs( zw=`)=0!utNVJM)|BSV#-fgX72d<1U4U}y=3J3;@?1j1U-ahg3s-oW!+xS?6q9q!kl f*Fe}BXx3?;O810xbZd_9-CjfYB5oxA;GF#e=rsT6 diff --git a/examples/runtime/shaders/essl/vs_pom.bin b/examples/runtime/shaders/essl/vs_pom.bin index b84d800ab377532e808fd7dd4fc49caf6d1a5d8f..a2afef69b2c734c777e3227fefc5bb24b0533f8d 100644 GIT binary patch literal 1000 zcmb7?O-{ow5QPI&LUJ$RrGrA1AE2!w_ADzQu|bs;(zF;QF-n}!7O~<49Ec4I&c)b? z^V1e2tSqYWH}jrf=kE4qXu$dW`uH9grv**;B8mq`hB1(30~NGn(aS93PrYKwvxFvM z-4=%hjoIo^&}W_>LqB|Q-cRI=lr4eBNgyt8EphM6{oM<#w0EJ^+KVy@<)}u{M<@<9 zybvVjVIUY!@ilf#%u)=fhXZMg$+~|4bi1Gk(p8j-L!8~^9#}(yZY5Jvk#|k?FXa2A z4Mn*s(K_TjTiAz;c-n{yFYAz~+o0$aFFW9){Mz0Pn(3e6GSFtw2Rjy^3yv z{FR5r@i28%gZxe8LIg3}MuZepZ%1QqGPbY{!lra-TKI2z>ivTbGoI%J9%^Aa^mq+lu9CONxot7-p4?oFCi?OSW&iEl2KNU>=MW?^n?16hkjRQ z)_W6?od{#Z%sFRf&yMEj^^c(k&)>H{{|27l(6XuvT8MV=#q$Q3@rDgu^ZZfJP4)B@ zqVR(Upj)0jU)9ww3q5OSQLVDIjl6#IJSIfV?;4SjN6^`jZFZj!M(?;_WuBE{=^sHr zK`wYz9tE5dh@phY+WV@iSEHrBW%Z7ixosgP+mrbO^H21lW;vd`M?oQsImaRB)Ip>v z`2#qt+9;SviS>Nxchg`Lrkw)ayrS!SuymD>cX2bmg~lqrA_e0m2}1w3Ppl0o5yb|~ zq2ncl^?US8F3C6o-<(*x+e4J$LDaQ4I*I1S4kreDpl0G`bW6T#&^U}h4UuLfOe2XS zkn}W?AQgmFud-ggrdO(~LrLw4Et!O!a;D$ZDVHKSfVnvgCXnN36p{&?ky+ zCi{edIquXEn9AdhI=)Z4$Cd5AH*Myq%z9L2T@~5&dzHDPGVf8DE0rKn=BLqa-&&6+ z(Z1cGUp5Z`HxKa8aS{gAT*SgDzQAd@B)E*&n(wm!rburlD>s!>B;`~;3z+tgd9xl~ z{0ZLN^5kwXA12ZDzv6EupVh_f1I{%`mu zJo+oarG0*1O|0uEr!-Tc%KI2#!!fkTLbFTG#5FSrdNkp;L~ z&+N|Z?0WS*6#RnQ-)|sBRct8L`5JW-S=tW*AqFiiu3RbSEN&{NVTakSgjy#{P;o*z z+0RhEp%+Y-bU=qxylt3sgVV=^$fhh&D|^Bs^Y!aq|Am}G?GIN4ZpoU*uu*OaPjT3Q zFa@Kqfbm40CHPLxlxz{tLWa9~+Q1jgro5Vm9Zx@u`pE#YJdPegnHxVD!$+?;X{EYQ TcbV>fE!^MY&h)=fUZfQN+)9lN diff --git a/examples/runtime/shaders/essl/vs_rsm_combine.bin b/examples/runtime/shaders/essl/vs_rsm_combine.bin index 34b77f950f515f832e60afe3c44745260349e7d1..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_rsm_gbuffer.bin b/examples/runtime/shaders/essl/vs_rsm_gbuffer.bin index 9075dd8fb5674ffce5c7aaffaf93b8fe31826181..ec88f2d642b7049bea991f3666dcc7bc96111b4b 100644 GIT binary patch literal 403 zcmZvWK~BRk5JgQD32D0E3bVAKL{2Fyi#^Lqpl(VPS&gZT92=D+&>}9!Rk#S_CTXjx zv#_lH=lwskr^g|q`TKn_19nyCWhjiBS@StvhqvT{u_W5;vU3i~GkH*Z`x@3Imb#kY z39Qb#^K792oZf`G;w~(8WrN2D%miAGjalBI&fmj_jk-FsD32FCm20Pf!dkY;dkLCg z3p&htF5nxGX65o}mrRW(=i+rtnD9gU2(wfQwL|+{;&|I&w}$gBV=fmxPJHW=FeV&t cc8BrXm^DI4uSmZ(TS2}|@ArQEEBFCm|EO1Y;s5{u literal 517 zcmZ{gK~BRk5Je5Dgk%<6VU`YvC`rr8V$ZS?Qa7cFTxwERi5&$erA1th1sCBWjN8OX zE8&f;|2^-2&FuN6IV!gte7g)>gt= zW$O|e`8o!XYEu;==ky=DH1EnPqd9FvwNpA9PB(tK*6IyGtyu^=fwOv?c7KNMJYFE# zs1+1KXMC8NQX@sO)a_`B$2Ju(h__w!JNi*s^iTQ? zy~BV9f;wWs+{ZcR9xmUu4>ty$=Rd#eYvXN6^Yq9w{w3Lq*RKo%A3X0$8Yb0am2Qu0 zC+aJVUbP9cq*ci4r%e3N!JC}sZQUbFC4j=X&S{p%`u_KgVVGqS?nM?u#RDI{ANCDR zcEM&G9!k=wV|X~Gkh3_Act$?MfKwO6tngv1T_>jqs86T6-hRA|X-4cM%EF37z=}{L z@Clq5gozaI0i&tNLmA(gSfwVaXoND0d!7_L+XgJ+qhuf=kvWK5iEsxo3lnQ*{xks( zViKV11(H}p1MKDm?}6CJeA^aTF1~O29v>)i2{w&~#un+Yg@AT5m$biHTa)kiA24z4RBZ=PbO{+IM`izFRF9m)Ru`k%mb+6_o+R!4TqJ3ehB& zNRvh*f|U6IEWI+Ap*YuURCy-O%gOq^bHv|O?Sxqg|Z F@ej8^NS^=z literal 1348 zcmZ`($!^;)5LJuhq7?mxIm&6OdXYC6JvE0GXn+6)dLX2GUxvF5m;=IQ z{uaad!{>cYSX?|5$@b{)c&Yg}8Oc=W!A~T&re9|y%_6;iL2+M*ls)Bw!jT=02^2J# zflm^iF~NAeu?s&vvG@QXFBR%RK>{A~bUciOC?memSkQDE_#xfcdCc}ajhY0JFFepa zUc#8)gQvs3BJnO51WhY035~dEil$_Kl!P>$-h<)JFpM@~cbx4Y@>vYd$bPn=vtS10 zBhScW(~AWmOUSez6H$Wxk(rFP?{0O1&)_&_A2N0eQ+GUqk1)Z%-iEW{3tEXhrPKTG zds4Zq{F+dq@-ClcLd^rruhnCu<5kO%%n?;2LnbS-9Oj{nn z1(0TKqRBIv8sGlKrcW61S9=?K-7pXjw8$lnm%sudD(@wsPY|{q@9>UKXk$n_=pIk! QkFcE5XT^&KD!c-)fBX-A-2eap literal 528 zcmaKpu};G<6h#f{fNfi)KE z8anfI16ozCvAWFpA9n3t(W9$!-sxtGRT1CrhTCn0&lGett@d+>%H;fiKa?ea!xdPK z6^Mkta~Mf;@U|wtn&l+-`*Z`hFiW!&?QOdwRjaW#KvAm2@fqZas8|5Q<&cKC%+&ILqWmltMg|5Ju441Au~^*EH&9!Au+xnzc>>l4pdo|pP2$QB{NS$ pldGCb0SMA_;sc=aKz(RtD`KC%+&ILqWmltMg|5JuT1I=OuEx3uA K)?Bq*TnqsGsZ7rR diff --git a/examples/runtime/shaders/essl/vs_shadowmaps_color_lighting.bin b/examples/runtime/shaders/essl/vs_shadowmaps_color_lighting.bin index 1b9879a6f6a0b55be05fd7ea6582941ffa943348..76ca975e695f6a74d76b99d2ab0f2f8b97a8fb72 100644 GIT binary patch literal 683 zcmZ`$%Wi`(5OgCBt#jxv>=D{Df|NrgRP~xmrAU=>wJe~CBfyA<6H@ixy9ON7Dz$vD zc4lX0*V~WvoZz`F4{L|qw=9=Qnr%gT+*I=5+z{eun9L`Lt=_e)t_wc@x4!Pdi2bq83qUtouesTOaj|YeZ?rJJ~jFCS%?RS->j< z9*6=^;Tbq9Wi50)xt3C=7E z*P~w)@brVQ)eGj*PuC_|K(O?^sAugmwi$yW@z1{C0Z?Ed4sxN7ER-5DBfdf~|OD>1kuA=@$C@=6{TVof;m& R9qkaj{P42#%s##;B|l#5%>DoX literal 978 zcmah{%Wi`(5OmudTIbMT*dw$mN`g6|-gBuGsZy`V4J2^{7!gArRsX$f!ows%MI2zq zvoky1uh03I;PaSm=OZ#Mf<%T<{3W9O=#G$)hRCx~UF34xA+!i$vEHZ;b?AyuMUe5F zC%frAw!jyk)dL}1sa$*)DuNAiGAN@Z10JL@Pk8Lp8?cLTCU-&!nfkQk`B9|nj_pF( zvadjf;BLc1xnD||hXeEy2lZ)@iWR!3J11N*Fh>3l*O3gIX~MaLtI^w-(3=z?BwVCm z+4P4(HzNa;WH?+f^|9Q1J9~JCsWa)-4#yK#&BOrKaj>WZM9ea#(yrm9?P%*(#=X=^ zGecpfJ6O$yA$R6XYOxABEb*aE^90S#Oii P#+uFQe0g~Ems0Wv+I2Tq diff --git a/examples/runtime/shaders/essl/vs_shadowmaps_color_lighting_csm.bin b/examples/runtime/shaders/essl/vs_shadowmaps_color_lighting_csm.bin index 2a6e88397df93f9b0fb276aac74b258be0e0b72c..28d96e7d52d33c98115032103d20799fc784800c 100644 GIT binary patch literal 1221 zcmaKqO-{ow5QPI&0^9{x@G^l?<*zDL#1^rsR0*k@s*0>8fKd`xX_B@e7Tkj?a61mb zIDbxvTPurb-Z#(lY|oz_`wFawub=M=R_8^<23YjET$RerQkT7G^ zgA1gQs-X{rVdb~tns*SE|EeP902@PHb8_k>aA#$D0RLS+zQ$lsfQ6l{0|i#aL4a<8 z6TU5W5U$m+09=st-B;CyJ9Oqlxwbys?cWDj2Oo|9mUCq;KSjP-y9?&YvF1=?Nk)8w z)zTdHsvqZYuQk()t7(Vl!N;xOlMxX4$kjj#eOX}nJZ;zdZgbn#JLf% T$U&^*S%rtXSU3Vte(>^R6`Hy&bz8tf z&KEUoiboD2uT)ct<Tg7|m(|>{8Eh>34CDy@gR9}T*gY!M%#wlL z6i+YU>;ldQaP57AS2^|9mHdhkn6XOHav+y_3D=kIYAE|Yd2j$p+-|`sYRL4~9ROGOFm`Dx|tY(C;mB(p(39X!WJo>|m+?#1+9 zP3gBA1-pktJ{18q?~JohlScG$|ExYA$c!8P&Uu1hWCb%m`wN z{UZwRAfWT3kX_VhA08%i5A>+3Y$SpSaWollH0d3g)wquz+^CrymAo@L3v|h2$Cwzu d{Tt@6Gbb<9@oIM7I~}j)=hf`E`ls)Ee*vh;1`hxL diff --git a/examples/runtime/shaders/essl/vs_shadowmaps_color_lighting_linear.bin b/examples/runtime/shaders/essl/vs_shadowmaps_color_lighting_linear.bin index 7af3bbc2e115b3e530d6fd1acbf420ffaeab58a8..fe3963cba517b419d3c2fdd2c5749607f062cba2 100644 GIT binary patch literal 711 zcmZ`$%WA_g5OhNht#aru?9pygW2Y_@Ozyc90)uX7CTjXW-~CT#V5X)q c*{vPG%MZIJr@xP@y}D-_&k*f3WIv2qznr$!Gynhq literal 1023 zcmah{%Wi`(5TtDmt#jxv>=7Cjkzh`!_gpGPs+22o15F$OM#PXu)vxFecTIShB&di3 z?09x&$GiNPj}3etv+aCjjEf))9W#z;ZNvsPW?V%s642x7k8$ai_@icdw5 zv79Bl={>f<7oXn;!(dY8{Iie|Y><;d8LcR=AQgGSVxQcAU4%2S1yTfe8y1TFN{BohpqDtPPl}X(p^Lh6!XyQ4XCtrS(~>$p5k(7Pe%)qIQ=cD&+QqPsRyA2~ dlh4MQ&FXx4*GFx&5N3~!r3pB;I{ZV3@dvh3D?(5&h_02ttp+LcfMo)tkiLkcb3Z z?Gl;z;khc96$@3j@5G_I8QIL@z1oRrorvCv7!~q@R>dUrUTG9SKw=YWrdb@T6RnWc zU9-L-R#mU-Ewxn(Xe2y~YG+aXENWPy=#v9YV#%j#5_>d+DQGfyA)s>uh`pg(kJT*> zQ9Th&B!)O9;#(q$<-IAdl;Tq;IVPkv{i2Z-V|Tx%G;%N-r;3?4Rm{SvnwT)9o`VbY zLP-`sMZlA7#nvA%Ec=zJm_yJMRkkwLn{UsH^ho@-e7FM?$ced}sUi!d@5TdPi51YUVW>aLBHM`JHMys0|b27pJq(U6; zDj%nEkn8EI)ilGi;NwQ{$p{&l<&&YMy2@#ppQdWL+f26c&RNf7RM;;cf!-o&e4^1J f>U^TvA{u<6rW|1~#RarYbs|P5V%Cr^Q560Ft>KOd literal 1777 zcma)6%Wm5+5LAnxX_Z5MVUJRS3X(|qV&q!%5+FcnbFofyHOrQFGTWZLbDT2`IhQ1QTd8M* zoVSRHd|Icas6@Vs-eW#~oBY*6%+&TqlsEM*G;FL)k!Tc&M-gTa_~1CAt}FStt}|H3 z`J#kP_QXM?g{pF~oVpg6AzZ4JtfeZZ?nYF5SUbnZH8wa5eU$l;qY@DpmW(UpTE6pruGz8xMJ1OrzP290wj9uJ8+U?Z|2Q3q^9J|yZu JNBrfw&ObtOH?#l% diff --git a/examples/runtime/shaders/essl/vs_shadowmaps_color_lighting_linear_omni.bin b/examples/runtime/shaders/essl/vs_shadowmaps_color_lighting_linear_omni.bin index 5a0d58569e6e4fad44a31d0aa8d76953b36949cd..69d925db9f54f5e6ed3583ad034835857e129d52 100644 GIT binary patch literal 1285 zcmaJ<%T9w(5Jl64-Y)!wS%Ou<%fy6qYuq$xV$vu7#IGBzu-SQm)E88 zxM4x&oH;XRW>#;nQw874_wUb*a+i4#_k(c7g2OW5ACoIZnFv^!wh$S;&Ac5=XtX!4 zk%=EZl6fK9Y|}-0ltdKXZ>i4@3%WzV7(~oL#2Q3wiI~_e$zt}-lL#W3I?(D{IC2M3 ziR8grY3PoF_hd>xrVLo+x_hi8|;o=gh|i zvRKu~CjorLRy^w&&5B=D+I#?0H#E0kZ9;EZxkuu^<-RSp7i3zgup ztRPkEu^_o*vU8xSEp^N+n(`b&Kc3DHV4#jBeyhH6PfSr1yUfCV3R=}vGuop0`qFB3 zX&GjqR<#gpZdE^N?P0W*Qs`YAs1R++)#d9YS{=SQ%C|dwYn1PF`1UB@)Xy-R<5ZtI Poem=QAmX%;FG7?*p0A5@ literal 1704 zcma)6OK#gR5LJs5Xq82;FiR;x1WBYRfwCCfI^XJq3KAGb=@e7Taha&L%OVzXikvAbmj0^uYQO(O9mLJacni{mgUOa55N z6js}J!UWuN#RoXJ z!_h(PI=IKP9JNcq7mzWYgXg=yT`&huL1qP>bb@N2{|7tx0Z|b4V*A4@Ms525EZ50h z>n6lJYs+ejaHT8ys+48YRu%i#s0n((k=BZ;^6|Q6mf&neaMlXq z7Q2fI*WlUnqmcG-aPaHN%(ZU1>WplfnzcNAzZ;@$#Sq!1(12f`ZU4gk^sx;Ug&x_-dWZlD#6L@OI6XVmD(O1k7H<>P75c#8JrKm24p5?;;K%WQhxnzNI6t z7gb2+FJxZnOvOvR%3TXMaX5%tgQz`-IvybbJBT#V1F>KU7ZE&xWdM%=J9mK5jo5M- z_d1AXMRbuE;h0$95fm$Ov#wBv*HCj@$Qt@(q6{Yfej!A>L~k8Y^wbeWFC9@A9cF?r zae+M24f06J5VuhY z9*PP|wHgbO3noAMy53O7%)BY;n$!K^H~|xN4EbC3l~FlGS?n|m`^jl#Q}t-`=BrDq z)Rkqp2feI?V1298gV7vDV=1}b$$?7Ix?EMhTB6#_S literal 1540 zcma)6%Wm5+5LAN{Xp}>LVUJRR2$D#jj9!ag0t5(|sUYXO_4c6@F9x}) zl7f{i+e8=0#t%Mjm8|)4CGX|l5V6H(#TH_B&k6*>NhF#?;z@)UB>d_)Ov;k~u4D=; zoTGqk`b>c(xhONXp1UJ3LAVebF1g6(?v|AYo-a)`fvv7S0x5zgY85Qg{j(6|A{yy! z+;oC!puYz@_yJK6_TKFeulUxE55RJrJhW*- z%(GlpF2arO=&M#%NLy8$U#rHdgV&`OYvUmF;ZDslQH>|l)uf&|?9EJqX68;z{Zu7g z#!;}jD*QF|?BUJe#8*WV`j|qkPe(kXt$yFLCZz+rj3TWSRp(>7W|rV=L~zy$qKn-{ zgz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_shadowmaps_depth.bin b/examples/runtime/shaders/essl/vs_shadowmaps_depth.bin index 41a6e05bd5c165b29041ee86abc9ae7bfdc11438..9635f92ce4a43a7f8760c6185b174f77e6054114 100644 GIT binary patch literal 195 zcmWFw_TXlK0!9Y@()ir`l+>KC%+&ILqWmltMg|5Ju441Au~^*EH&9!Au+xnzc>>l4pdo|pP2$QB{NS$ pldGCb0SMA_;sc=aKz(RtD`KC%+&ILqWmltMg|5JuT1I=OuEx3uA K)?Bq*TnqsGsZ7rR diff --git a/examples/runtime/shaders/essl/vs_shadowmaps_hblur.bin b/examples/runtime/shaders/essl/vs_shadowmaps_hblur.bin index 37e599477b0c94ee5b2805ee2372af0079852bb8..3862474c2d833b1e3f2d43b4dcbb56691fa7cc36 100644 GIT binary patch literal 1010 zcmaixy>7xV5P;pnWQIz80*^pxls^ffsC!2wDpt#afLz%z3P~DT^(Fdx9lQ1oy7Wxb z#3n&lS$w|lzPrnE@i;(mKEHmxduWi;g2yjUaT$y2D}>;KbDPt>Trjy4JlW1!%H+Oz zyveCl>sTy-o2Tlz4^01vee@8*dBQg;m86JQAu*~)r!S|5CPA`Hqn0JYSg?c2v!PHc zmT{Gk2jY$hPqZl@jPBH)>v)7AO9y>Y&@3)jN~LQz>cG8!+y~sqtoYF2y}GIy^*f_M zXEcNf3dPq%GM)@a_ze>{8=+W6sPDlv#di)wD;>+7ys__rqo* z6XH4U=npkk0;n~%?x%Uy9aVMe)j(VKy4i^dItTk&lDm$aN?*-84WPQ7dQ5x={*A5n z&#I?^?dnpua%}a?t<^zWt^4YpdgfkMw{mQ?=T2*P*mj3!-2h&ex0AsBjxqWLfjK5dr6oqM?)7^0G*)1Je*Ju3DdWhFsdIXE634x~P!#xJ-9$FyTgP34v<&#`2)0ML zavRx4wj#`TskdK}fUskI?fqI&NEin6B?=vMp!zP$Q4-c);p>7ztf$>x_h%-sorh3^XY_ z)9x%p;dF}_p&pt{)i)ItHFqv2Aqtrft+Ig_RsZM_O@uI7g6?{ZwevK)R80t%_n|wL zm#&?_ZLYyYguNs^!>%|`g!ZnzEav-HzX1ygillm8RhVV&Buu_95)7m&ZvYPf3ae+5NjXgDmafgF zA_^Wv!CEiMu%QG=uaWZXT_jULGUZ4{3&|WrGUZ5JLkW^mBjwqU~it@8q7#SE?K++5+ftaf_FEcH_C|4mj zvBX3HO{p~(S59JOerbtDPJVJ?NoIbYf~|sqrb1?(LRo6Eu|i^eL4I*2NZgtWs0t)# zqELn;$W@k~nF2IAGfzX4tC~vz2-0)n1E89KhM`%gpanKV17Wa^f}x&)rZreA!epRM MBy+5}YPq-=0G1L>XaE2J literal 309 zcmZ9GF%N<;5QR&^VCvvsxDgzPL^k5?NMgcDs#G{bDX9fS+;+akp7FBYYsVPc?AtWZGk0~yrM=~hO}X- z!!jFj0L=u~C7z`c0~SmNFv~L*5>pTiOK@EJpfL5)qB04I9~$|)doAq1_cnjpt-Bj_ f+6*8ol4vMum@^B8_0Q4mt;X8sc=8(3C#B>AK8|C( diff --git a/examples/runtime/shaders/essl/vs_shadowmaps_packdepth_linear.bin b/examples/runtime/shaders/essl/vs_shadowmaps_packdepth_linear.bin index 995bc9ffe30cb176953511977c0cce67edae5a14..81c16500239b4dfcd4d559671225bdb5dcbc3798 100644 GIT binary patch literal 257 zcmZ9F&kBM-5QkUjG#z??E_2ihF|w0%ubU8fmBl}`u{vU_k0nN~BR# z;to9rRf%nuY*5A(T~)sifK!-jk_Ov2%_?(dxFwacSe3Q|4?wPyj>7?A)#x2AdaZB& ev@2Y@o)di0LCcu^XK_2GJa_BhvL69F0mKLSWKCZH literal 322 zcmZ8bJr9B~6s(C;9h{t8-Uylyi8>K?-AGJan<@pKp|rsQit*q0LoEhB-|}AW?%myP zyB-ib_wlCbkzvWCibS?UQHO;(_Irf%TbhjQ#f>R&Um5`^CaH!>9Ol58Rwp#5@_<&n zxL}@ibet(}pkk5GCJktrW2_3GQ{H0j~g%L=OIXEu8QuqWdz({TVnIBmAb$d0e y!1rc9*!j{}^t%^8lCiL>X*uUF7$$E=x3%gzw@T;h(`&47<}F>AK370*l#&M{q+|yG diff --git a/examples/runtime/shaders/essl/vs_shadowmaps_texture.bin b/examples/runtime/shaders/essl/vs_shadowmaps_texture.bin index 34b77f950f515f832e60afe3c44745260349e7d1..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_shadowmaps_texture_lighting.bin b/examples/runtime/shaders/essl/vs_shadowmaps_texture_lighting.bin index 88ad4275fe23d35e18f62a7ecca841dcbbd5a185..887d065fb0b71d13724230f53d97383d399f1840 100644 GIT binary patch literal 553 zcmZ{gF;BxV5QPou(fc4Oo`8gQcT8gLR7Nc?p_v<#%pv8-T(SgWd9&i`5dr5O$+X&d^u55h@iCn+;{}&`OaiWkqfv#1UXb4M|$H@6mVd&~wU<(@=%U zy6^b@ZuR^yBlvwjeLqgftd4ROC)r9S`{@lKQv;D(Yr3q|Za}^!gb1xG`BLiywldw8 z&?M^sL{z9M7guKp#!jzUc*fj=uOEOav=+FT>4I7Fd2Z(OLP~_LmYQ+Zx0KYdzi|a9gc4} zwMzj=vuN3NgqUL)Gs1A!GrES#s=ifXmI6De`e&-l`&D(E?pDajJl};M1& diff --git a/examples/runtime/shaders/essl/vs_shadowmaps_unpackdepth.bin b/examples/runtime/shaders/essl/vs_shadowmaps_unpackdepth.bin index 34b77f950f515f832e60afe3c44745260349e7d1..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_shadowmaps_vblur.bin b/examples/runtime/shaders/essl/vs_shadowmaps_vblur.bin index f4261f0a12862690ac7a54f83ef3ef4814b3f3bf..ae2364270d80f715e8511f08c4f7488bc19e2dc6 100644 GIT binary patch literal 1010 zcma)(v2MaJ5J26+2M8#@Z5RfZ7Mj;8Hsz1@+>)5q_(4}Wc zi490#dCB?Sy}Qd~{Bnoje0~4^w9sA2Dv_>V(@iRGZxDhD=b>aPHRft5MYb66oU2vy zcwaK5XQ`Y3H_G)}8<_SE`)nbE%S_C5u1J+mBVtugj$e)qO@iWuK^;qivE*A_79FXl zybwAg&&2N%kr`7+I9uwKF!2OKmI+c)u_E0}wa#aLat06naSFJVS@V&_2ZyS5l%9=- zXQL5JP-!tEii@n%#qXHFnM=(J!e{`~Sj+OZqzB)}EArOKj#@}Is;Av?&ZdAgyYDm` z>65_oyL;4H382o{rl027bX3bt@b$G2hrkB+*b=83%AKcNYJG#~lbuP;x3G5#jqd)xmJnH}e literal 1500 zcmaiyy>5dr6oqMYiTQ)b*~f6a`**?qbJhTi08Iw2au>2#!a& zavwWKe?|PzqrrYjBH|xK+2^gI5Y8j|8gmyN=>8C*#NC*PI3YVyPFb)}J1!V-fxGF3 zv1mJAs0oSA;4Tadl=SLY()EsdSvLlBb3n%nH4f;GMZU;~ku=4o?h~HrwRtx0z>u;# z&B;O(Mz_c(G(eN7`k|tt=gwnqNlfiRQT1*ZW#kQ`$GVZA(BW=ro26+_75vwB3Z*om7zc~1yY{9jbuwm cb}y1WjD#CVb}y1Wj8qv4BrK31`G%W5XDW!bPU~?Z*(e(Ak9$8VrN7}VvQ_FDCCI&<(%sx;SLrI z)W51Cvij)DLR!Dph4GGO97k*%SK0cBb^7i;2Ln>OOZYbj hV-mxj9~&V=MdQQqG~!9ywvOTUzkZ0U7ZiOGiEpeEiP8W7 literal 637 zcmaixu}_3B6o>2OrrzM@{6;X5aFj{n?s(DU)~0&M)zFq;>3LrKx1DXZKv9fL z``%-Ff4f5VxjTJaEYPZ>LhZ_W%ge*^456iq(0NeZwCZ_Gt``U~ty})k=@Rz5+Baaz z#~c`ysuip*@Jvi>+^83>xsnAotUYpBjok#y&^;R(Yggb-@+ZsieS+y60?+?)w})jb zz5~Iygeb-*45LI2S~QkU*M%+j@5upfV4b9s+UxPnR>PG5s+w;6hBk`=F$adrVPfn? z1&8ybEFffG)O144l5c7h^_R9Yvm}k-%K61Eb|d;r{*V|2vfz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_shadowvolume_svback.bin b/examples/runtime/shaders/essl/vs_shadowvolume_svback.bin index b95bea7124d6d0bbc9b0badfa55a20d6f428bdf2..a9dc4761dba148f96deea783efdcabf39de12f34 100644 GIT binary patch literal 383 zcmaivKX1Y?5XB8*a)*9|-e}V{0+lW5)`5Wm35nIRhznOaK9tzuPu1_vC8}Cr$Q&7Nv(eNHxn z1(X(p((+pZYwHbP(e3%)9UI17LG{moXHbEQTaRaV?Z5V2ksVKG&A^^xvx9ztX*SWh I{E<>z0CW_6l>h($ literal 456 zcmah_v2MaJ5H*O&9r%Ra7#B4vf-UOCz`%f1iPdt!g+pAqMB}bJR5kiY8y+c1KHJX?vg$EA+(-E9x_o z57#$ehA7}?Bnvxcmr&dF1dJ|yg~WnP#sa^5aF@0-G=Ht-JP^z9Bi{2UogZhm0|Nx^najz^oY9PYZWk9?&(QL#+H d%R_3TRBL9NYtHzbR_mn`4$ry%fY~Q0#UDabl>q<% diff --git a/examples/runtime/shaders/essl/vs_shadowvolume_svfront.bin b/examples/runtime/shaders/essl/vs_shadowvolume_svfront.bin index 41a6e05bd5c165b29041ee86abc9ae7bfdc11438..9635f92ce4a43a7f8760c6185b174f77e6054114 100644 GIT binary patch literal 195 zcmWFw_TXlK0!9Y@()ir`l+>KC%+&ILqWmltMg|5Ju441Au~^*EH&9!Au+xnzc>>l4pdo|pP2$QB{NS$ pldGCb0SMA_;sc=aKz(RtD`KC%+&ILqWmltMg|5JuT1I=OuEx3uA K)?Bq*TnqsGsZ7rR diff --git a/examples/runtime/shaders/essl/vs_shadowvolume_svside.bin b/examples/runtime/shaders/essl/vs_shadowvolume_svside.bin index ec82418add8290f0eb47b2a43847457a98ea759e..5b21805f137b983816666f08ee45a93b1d9ef48e 100644 GIT binary patch literal 587 zcmah`Jx{|h5Dir)Gw>6*G2tUhp#zeYje&uo5>i*oN}O`kiBaODNl||n6aNZ!E{<9X zLdwa5efRF&yXWQ8!>LE{@&2`*c;~ffu(Y+*kGOia3sVWz+On?D6!%!!$%*IDp*X8W zZc?R}s5Xnzyi6%Qb(K%LvAV#_lsPminZpPvKcI7Id-N}2&X|^+sjaU~A}tAl7@`2M z=*e$EidR!%pXdJoXM5lc0j+8iW6Ct*jQAkaMp|gZnnpARQ^+M2e!$)sP&jgNH|Oq! z8Tdy8VGD5#voH!=b?E53sDb4DXo5@d3o=4#+$v(&YlZ7ESHia225>P7+XREcol~N8 qrA8zj!&h3+A3OI*_8;eIc>jGq?R4dK9XiP{x8lLgu;XmUnD-4%Y`3}q literal 640 zcmah`u};G<5H(dNGw=!A7=wt~(k<%7z`zg*sjFogH$9rfmE)vIQNN3c&tm5iwV{m= zwJghe_wMf9z4`0&HKX(O`Mn;nn?j~0(#ah4Hniq_c*WST3A5WmmS|m}k{66uE;PB+ zm9s^TCVRr%4TwpXjuA~;z#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_shadowvolume_texture_lighting.bin b/examples/runtime/shaders/essl/vs_shadowvolume_texture_lighting.bin index 88ad4275fe23d35e18f62a7ecca841dcbbd5a185..887d065fb0b71d13724230f53d97383d399f1840 100644 GIT binary patch literal 553 zcmZ{gF;BxV5QPou(fc4Oo`8gQcT8gLR7Nc?p_v<#%pv8-T(SgWd9&i`5dr5O$+X&d^u55h@iCn+;{}&`OaiWkqfv#1UXb4M|$H@6mVd&~wU<(@=%U zy6^b@ZuR^yBlvwjeLqgftd4ROC)r9S`{@lKQv;D(Yr3q|Za}^!gb1xG`BLiywldw8 z&?M^sL{z9M7guKp#!jzUc*fj=uOEOav=+FT>4I7Fd2Z(OLP~_LmYQ+Zx0KYdzi|a9gc4} zwMzj=vuN3NgqUL)Gs1A!GrES#s=ifXmI6De`e&-l`&D(E?pDajJl};M1& diff --git a/examples/runtime/shaders/essl/vs_sky.bin b/examples/runtime/shaders/essl/vs_sky.bin index 128364e305ad84953b5a28f822c246ff3aa8bedc..e54cb72895d37480366024c324fe5a618d23e339 100644 GIT binary patch literal 1983 zcmb_c*=pNB6jeh)L0zDKFppB|D6@|S)29^Lhdu-fp$kE%j#AXxlJOSXrN7YM>1Xv9 zdPcHr%XY{^J9ruHx%)kLuHL_W;^F-M_2$os_iUQv#q282?k-2=x8p~ickDp#`7{|% zi`V%m>rL{qI0AqV&eLf!%tqPrqReh@k4`)fADkD^|Gs!P9ppt?^s)~hKebKLQ98&b z*=W2Gv&Ww2PmBDv91X}Iok-HkrMt#vSGqhn%s9b_jmLmc5X$ zKcs(;x;hXpVM4B)Hibf~z%bK(zRZFE3W}W9Vcb2s3qusLBxeK|N?2oDG+2{n<1t#m zXZmFvteY7vRytq%2?kR&9XeatxPc_h#I0=F^l@pd+}!rdbV3r&IrMw|bTABV%E=~P zr}7n|l{B)}#_lU5)l}=)N+lRq9da+U8$?&BnmAg`vx#mffM9QjqB(i#nBU$kwBVq4 zxt=i^z%6qw9X${FJ%@?`Hx78mVD8025G|;^I#wYMc;8w+dR>k9lw|W^8(|F+zz`t@ z>3q}WXyKYjDWmm~Mp`2k6I2PbnM!VTY*gsZ0~zop&RzzhLDF714&2Bqce^FXMy*mo zv_>;T*8f<$>)HRTKtEi8t}CcCw+SM+BS^&$6lxi`=1Rq7=?blGm`W|_pzvyLXSHA+ zVvB1PH;-L2Cj%|kuWHm#(^0v4{+iI$t~rj1h-1u3GOI1ORxphvbGwBnObNq8EH%f{ zX+?!yAvBUU#tKTxm@>jx)_~a81O?)69l-4`Tx(^)ENWv;mC{WR7R5$`ea1K;b2rHu z7+29!GDty8L#+}*TLeUE2V#K2(3C>pjbPF+DFri{YnWB<1ajb1Qm(*hNrhBKONO|r asubi^Hys^z{Uve?I;A-?PcLyKK9wekhw_(Ux`f5fes*C&kC(kAm{NVG=E-S13 zo3eO#-PC_R1^rX;{@>@5N#3?idADl|_P$)c->`kL2w0wN>TOBx+)np-b1bW+7W-_U zZ5K^ZRIlsp8F@hR564&as%}Qad$@v#Z>PJeysw+JCJ&jNjxiNGF(Xk`R!4hAHCmM+-G4KiS6*@Ctm8ZgSoIaB=yOGhy?!!#D zbR~u}ZBfb!ym4t<>1#N(r%DRutT7bq^%g6nbw7d)_*?Mu!if z{1Vh0748qA{w1h6ADjlnayYmIHAjPoLufdF-mmJsl@;LTFz^W2#VTKKnDee~nWK8; zO6sSxD|YR z9Mh>A6-`CMaK?`#hD;8~mr~Kto$-C7+sxtObMivji?J0QObA0Ia46Nhbwh`^l%@yG z;;_+Bju!$6EGG2ES?33%p6-#V=XrcKn+Y}i77snj`J6$&Hz;k$LB-eaSw-++rOIDAy)y)^-|&y9J4@(+Ln_PE$Q9!GJU z_>{m$axi%T_xv;>%gR5QACRg?^313~NRG%nMEIhfJ0fVKmqrpR3@NlMr({5xpdj+l zDSoCMWOWoFm8Fkmv^pvFKZRgcug5SpQXazSEGZkJ>G~e9lPrx`1?zg8>c!03ldf_= z2S8fRXcc<{Rv8tEDxFt{y_VMc^?ZJ!y1Yb-;V|q P`acbj$ml*!r<4ByMEl~) diff --git a/examples/runtime/shaders/essl/vs_sky2.bin b/examples/runtime/shaders/essl/vs_sky2.bin index 67c3d1afea1df59ecc984cfbc3cdefa0397627cb..54afbddbc3c4f6bcb7ea3c5d06ec2a93d71ab67f 100644 GIT binary patch literal 425 zcmZvY&5FV>5XYkkLOl2ib8MF)t$LB*-J`J3%OW9Ym6S9QZR;1l>7Mqow|$14Y!fW5 zIfa?u|AR^27XyOt`}60kOZpWr%qCO44k0}|CPOz#Wp-K~O#ay9$k0m5tvM7>h;j-J z{YX~q<-&U~N|m^nstlA_i&7d5b4Wsv8tQC40m1j?DD9k4q?%#PH3kXAUTEXC)?+Q@ z3H>m%Hgbbar4B-Rqks?NrohKD%(vg*ksLuXibM8C?G#_SLI^$`1m3Jc1Nx3g1^yWE c3JGW4REr=+>u_|wT)oT|{3k+N2i++pzYqX{-~a#s literal 604 zcmZ{hv1-FG5QfzdD5yi8pm1ZH!Pr(d)4gM$kR=46HjblWNye4!rloJ1sY|y$L#1L{ zN^mrZ`|tn1(`o(mc!$jSIsJZ5(5$9H?XqIcvvyUf*Xa#HQ!As}PH~m{2|`Tkia*yn zg9FbGB{bO!0Y;^&1S?W}MK0AF*IdaIH>^5xnfvZ$aF2?uF{iked~X&2YO=9HVthe< zaVALInhU53Bxs~i7GIKDk({4jlwx4b#Z{J{nWB)Jn3<=c$yLpz00ikd@c~d>K+}L) jOf(SY=v7qeC>ZJ)fC)`&um&Upff`WMT65KMaWMb@T%b1& literal 245 zcmWFw_TXj!f_ynU8wQ3)KvrT&Nl|7}X-TR=MrL|OfkIhovav#9d_jJ3W=Up#o;6ol zVo_ygUOGbBNTDpgB()+rKffr&04SfInWB)Jn3<=bp~+RvrGQXqqEM1s0Ms6DXblvG zvGuCT6>LG)7-<;l8R#eg2~8CFib|k7!UcL2l_2T#ocI8!n}E_V!$2}fuEEq;%f-b2 E0P0Oms{jB1 diff --git a/examples/runtime/shaders/essl/vs_sky2_shadow.bin b/examples/runtime/shaders/essl/vs_sky2_shadow.bin index 01d761d7205b0d991082a68ac19bac17e94ce44c..d751192535b168fbe690482dc723963801d6a9e3 100644 GIT binary patch literal 379 zcmZvX&5FW6497=S5VD7Th2X_j7HO%s;@yiN2wp^np{+X0w2?ZkitGdVihDAxmD0r= z{~y03>(%^I@ZA4~_YW~BWJ+;j`aL1~l`OsrY4rYJ*E%^bbNXo=Xq<(;wBm@1P-J>X zd5WpBQ*4MEe;fWcI^g#%!$Sb0u2fjZP^7G;3}@)Ms52~+C_p8Tbkda`0;ei*ilsaq zR7~fHD36&?l8*TvojESt0D0<|3_OOtPV}}ou63tnexpC}+_0|fja)XX>Q?7|t}^Wz O>}+qN{LCx$3m_gW4RM_S literal 483 zcmWFw_TXj!f|b9NRx&fNm&WJjr=;evFfuT(fP@+NOXG7g(=$rKGE>U~it@7%GF(s@ z-;xT1U_Ve}Vo6C+W>RTMszL@(XMsXlYO=9HVtheCBHm5Kffr&nyWM~GcCU;S0OjC#6$t=rf9=hgapK7s5FWL@u>ki6=-{YW(v^Y z%sd4RO|EJ#1!QNG&BpiJBTAN4!SbG0i8YLi}AP`5y~J;N$BWvZ55}mgSQ(( z33ORgZga%CkYjmC$V({ikCJz23L0jdi1<4Px{b{ieKTr2mf&0rDbU^bH{Aog{+UQPFRuoML+?<~Xphsf?rq98~#KG%zy=<54UZ`PI>6j Y39$;-qd)W8z1GYrwY$ct_=8gN1Gjj&GXMYp diff --git a/examples/runtime/shaders/essl/vs_slug.bin b/examples/runtime/shaders/essl/vs_slug.bin index b059564f7326af855a9a508954907dd7aab0ef65..84b2b4eac67722bd50f0d112d98ca3c944ec1f17 100644 GIT binary patch literal 1340 zcma)*&61Nq5XVt-u<+n3%*ldvMLq%{MY#u09z1OMvDYaKB#uRxm_P!td?_Enm+>|H z_do)KSS7W!fq!@Zx~Hf6;p4k!8lKOM9hxf7 z1}YQw>7`+A!(bRH^rrEsO!kVA65=2VR+%PVyE(It1G;CsBS<}h)R&N9iJsk-7^tkX zaG1jJDFt^?FBLV%=)J@@rN%dYx~{tTcIR*(G!1S>|C|9Gi2xx$yYJfq?~ZSx$k!wz zA2or@iXXz#UVJyI$U)PK+c{6KRRNbsqPg>1MuUaR$Bp%U>ah=QwdJoee&4PV`2RCn zpf%alxONj(s@3A2PqVEi;jJikpX6te7lWFSyg6G53s}B~0E)A!fgTV@>Gi1>?Z!dx w4v586o5j`E!KC&|6@az?{(=R*@A)O#(o^s5m=p9hq`Tq?we>{NKXqOE3kOaTI97fXD$72LAs98?GU_;tNm`ND{eNFz9dOXamh4N%y2APl90f_%rb%t9&65E(q zlQ)1rrh=ak7WCFpfsQ@s(kC8LEnrI?wsmGMtr$_oZ0l4Z-Zl@PnR}mgDzQ${#po0X zZbX7M&!*4dNDNLlu1*o0OI#`TEr_FYXh;#Bj{^d(B;Z~R(UBPVZ5FY65{1Vo45O~< z)H=2)y4J~rw;(WA#-@mwXxiQ}>pUbkljLUCUr7E7 z9&SzGwWaY)7&pYT_IzeaMPT<)l$_vJXoq9MXq9Fog<+rtG^|Q1@WEv04JbBqjN8S1 zsQ6dc{PFs8e`&{|zo6%#^=FUBOM(1vE1&^i3vwgyVBDx&7S=ZQ@9UkFj3=Te#R|~=2A&8pkB{-Gv8a&sXx`kSQhu5F$s^)ih qK)jwY+uc3mYLJ_4-$%@4?&ckbrtK}_jVyisenUX?7c>2(>)JoVw}KG> diff --git a/examples/runtime/shaders/essl/vs_sms_mesh.bin b/examples/runtime/shaders/essl/vs_sms_mesh.bin index b86a65ec83bdc75e8dfc7589e900ffd530d2f312..117026e9c0f4dce2445abfdde6cf07cd1bda8329 100644 GIT binary patch literal 663 zcmZ{hO;3YB5QbOn!E6uyg*k%OW`V7=A;xPjCQVFw-4MWb8_G5m=!fyYJIjKg);Vov z-g)Pl+2z}ONHA`9oB0j7E5%mDNxGEDVUerN;EIreE|X!e(q(BWQn^|euf?%TzFZSR z%S^tjd<)yK;Lz*UuED?6Kb6)!pfn9nsw}KjMPVUT2G8KwATy|v$b(Sq)L!a*a6!mg zAxB|`SYaAaG&8-`rBsC%_||Z!#C{#d>JTZF#|Tp?8RKp;vuyf70Ru5O2zQEH`e}7U zBXGvd4r)A^6>woB4=L>NuB4nth0LH@+ietReDXRTq`q7=+ewCRS_pruL@zIwFKC zRf*49rLac4geF}w;Bg_VoM#ce0S5?|ax0XOMMN839YnD*>;Rez`wC zGC*%|sEF2u_(B(L=bS4B)_DKndi;SqT@a`)MFKe&1voDKreLOEpz;#!$I}SQ-Pzm0 z3rsz~SKA+sShX_&SY`2|jR-Nv@~wTr5Xzj{$aI zv4fLmzvnsd&Yn9l{i`Y6;!yCse{oD5+q^LzxSBMe&n$g*BQw_O_cLo^z4t$H8AWzd v)Sa*63N69#hG5tVVv60%g(qKC%+&ILqWmltMg|5Ju441Au~^*EH&9!Au+xnzc>>l4pdo|pP2$QB{NS$ pldGCb0SMA_;sc=aKz(RtD`KC%+&ILqWmltMg|5JuT1I=OuEx3uA K)?Bq*TnqsGsZ7rR diff --git a/examples/runtime/shaders/essl/vs_sms_shadow_pd.bin b/examples/runtime/shaders/essl/vs_sms_shadow_pd.bin index 20b8393bfd4de77f4a99259ca3b716e1e2685cf7..c56c542b2713cde7297bf87659d56c281f4fc6bd 100644 GIT binary patch literal 246 zcmWFw_TXj!f`TbUKNuPKOXG9%Q&MxnGE>U~it@8q7#SE?K++5+ftaf_FEcH_C|4mj zvBX3HO{p~(S59JOerbtDPJVJ?NoIbYf~|sqrb1?(LRo6Eu|i^eL4I*2NZgtWs0t)# zqELn;$W@k~nF2IAGfzX4tC~vz2-0)n1E89KhM`%gpanKV17Wa^f}x&)rZreA!epRM MBy+5}YPq-=0G1L>XaE2J literal 309 zcmZ9GF%N<;5QR&^VCvvsxDgzPL^k5?NMgcDs#G{bDX9fS+;+akp7FBYYsVPc?AtWZGk0~yrM=~hO}X- z!!jFj0L=u~C7z`c0~SmNFv~L*5>pTiOK@EJpfL5)qB04I9~$|)doAq1_cnjpt-Bj_ f+6*8ol4vMum@^B8_0Q4mt;X8sc=8(3C#B>AK8|C( diff --git a/examples/runtime/shaders/essl/vs_sss_gbuffer.bin b/examples/runtime/shaders/essl/vs_sss_gbuffer.bin index ccbabd93d99da7580af4e4f4133424967ec0e3a2..8554e755c052556f135286518ff65ab80ccaeb70 100644 GIT binary patch literal 576 zcmZutO>2Wd5Z#18VSDIb7|3NUX>irs(tD4ALM|c5qT8}X-C)(4l>XuViq5Xu7;z6G zZ{EC**}uNr6MV_~w_TElI?he1vb|PcyV88D7KE(qnB4V~E3#M;LhC}mnKFl5RuN2= z#q9LJkAl)no=sh`%p|hXrhsSQ9_RuZl|&%plljyZ7c)eEAcjaR&|GGMqL|$cp_xJf zLX~P0W6IQ@(+dW@0QE-9UNRc(b4=bConl>GFpqvyz~?f@VSpvqcu5X6q$+_SWP^2RcEs)hU)EC8Azi{x6$aPle)y)wI&<38|6_~Z$fRA6#X6Wrl ahd|+*vaZK}dp=aTwZwQ%Zm9G_Dft6p_OH7D literal 854 zcmaKq!Arw16vm?tgn01i^?{dGu(WA*8s0q)gk8ocb*)=uZAQ(yZsI@eU*XHvwAmKy zDdc95?0DX`={6cz964e(@&neUz%Tm1MiGd!6Yw=+G@ z>=v0U2z_|g?haJ56*O>Mzu4!Vu`&&3y^Gk_xVEWVHTIn>-jxlvd~!!N+>y;?!b6KP bbWn!owQY_k=J~ zGp36c+qJ>wH7_X5@>piqsG^f;FlP2^_S6k^DGyW?SO^v1BpL$bqN7?_IVD0#Dsh9Z zjk3fhO9B-9Oc&YDL(r*y=wriG)+R(%>V|)C?}PgqA0?q7nQ9AJS~lDPbscjaz3=P4 e6E|EA4%XMfX}jABJ;$}f0UwEI{O8#NfV}{(@mv}J literal 349 zcmZusy9&ZU5WIlZS@;LCrCJ1)bWv+dL9h*{Ipd0#4d>;h`0s8+O%S(QW`=p}w(Gv& zqv2}di9sG2iuGlOy4+Yg_dFqb4K1epDd#NibEn~i$tiKC%+&ILqWmltMg|5Ju441Au~^*EH&9!Au+xnzc>>l4pdo|pP2$QB{NS$ pldGCb0SMA_;sc=aKz(RtD`KC%+&ILqWmltMg|5JuT1I=OuEx3uA K)?Bq*TnqsGsZ7rR diff --git a/examples/runtime/shaders/essl/vs_stencil_color_lighting.bin b/examples/runtime/shaders/essl/vs_stencil_color_lighting.bin index a54d807bc451289748fbe2340116b3dcb1f6dd02..7d3889fd7a78c5f56266c2871025e69557a2d7bc 100644 GIT binary patch literal 458 zcmZ{fF>k^!5QSaDbPU~?Z*(e(0%Sn4x-+6yVvQ_FDvZQ2Cd}0pFmAyFphLR0ieT34R@X)qenM#F z%?76$CnGu&qY#&HI-MgwwDOWX;>kFUR876vboqM_z&~&DLojH-HXM}fU_fej3IFC` hOs25s$3_TI(fH$d8gbmVtz)?TzaJv&1x24k;s>e3iO>K5 literal 637 zcmaixu}_3B6o>2OrrzM@{6;X5aFj{n?s(DU)~0&M)zFq;>3LrKx1DXZKv9fL z``%-Ff4f5VxjTJaEYPZ>LhZ_W%ge*^456iq(0NeZwCZ_Gt``U~ty})k=@Rz5+Baaz z#~c`ysuip*@Jvi>+^83>xsnAotUYpBjok#y&^;R(Yggb-@+ZsieS+y60?+?)w})jb zz5~Iygeb-*45LI2S~QkU*M%+j@5upfV4b9s+UxPnR>PG5s+w;6hBk`=F$adrVPfn? z1&8ybEFffG)O144l5c7h^_R9Yvm}k-%K61Eb|d;r{*V|2vfz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_stencil_texture.bin b/examples/runtime/shaders/essl/vs_stencil_texture.bin index 34b77f950f515f832e60afe3c44745260349e7d1..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 345 zcmZvXI}5@<5QI;#It%}SY#Bv@k91LMOF^&=r#a(_mksA7M#cZ`Dn1Tzt7T^SW_Gol zw*(J$W|M|!mx-ZNA6BSO3rqWELx|?X7Jc57a~9X7)3C#AS3spVV^B#!M|4PeEdLyg z_`vCULuAuIEGuQtm}g(W2rAz%bKH_OFW)E^!A~V-5T;-h<`8t{Rl*k*fine1B*U2H s_a2^L3d4}oJ*_@pSoO;TWQSz&`h~sVCm4DkV)udadOu0tmp3WJ9Xs-F-~a#s diff --git a/examples/runtime/shaders/essl/vs_stencil_texture_lighting.bin b/examples/runtime/shaders/essl/vs_stencil_texture_lighting.bin index 88ad4275fe23d35e18f62a7ecca841dcbbd5a185..887d065fb0b71d13724230f53d97383d399f1840 100644 GIT binary patch literal 553 zcmZ{gF;BxV5QPou(fc4Oo`8gQcT8gLR7Nc?p_v<#%pv8-T(SgWd9&i`5dr5O$+X&d^u55h@iCn+;{}&`OaiWkqfv#1UXb4M|$H@6mVd&~wU<(@=%U zy6^b@ZuR^yBlvwjeLqgftd4ROC)r9S`{@lKQv;D(Yr3q|Za}^!gb1xG`BLiywldw8 z&?M^sL{z9M7guKp#!jzUc*fj=uOEOav=+FT>4I7Fd2Z(OLP~_LmYQ+Zx0KYdzi|a9gc4} zwMzj=vuN3NgqUL)Gs1A!GrES#s=ifXmI6De`e&-l`&D(E?pDajJl};M1& diff --git a/examples/runtime/shaders/essl/vs_terrain.bin b/examples/runtime/shaders/essl/vs_terrain.bin index 2b93afba6e93a0026561b1864627c272116562d9..2b783831cc993671d464826f496a659bacabf1f9 100644 GIT binary patch literal 340 zcmWFw_TXj!g7deer!X?`m&WJjr=;eDWu}$~6y;~JFfuT(fTS7Jfh?}lyv(%xqFjaC z#1az)G^N&DT=}IX3T3Iu#tLQe1^LC9C7Jno)?7J>l|XTgoc!cOkbr`%f`O(&W*$Ug zB9cO=ZX=-XlGKXi{QRO618mw2VcLxp5|LGMmE~uq0G*bZr=iJJ&7}YY2zLOjMYanf s3AY9;3+Gvb^`_^<2S7amlt%Ncf)>dACK?C}bQBEr3^c8|YPq-=04E-7ZU6uP literal 403 zcmZvYIS#@w5Jeq{$`l-cX3B&Dv80RWDI+1#MuwO$D2^lJBrM_<+>4&mFhLN7#npJe z|DQKrF6LcE=XUR39o8!%rDK^cQC6YRyN<(HrobGjKhA z=0FK=LYRHv)>6av)S6pBzGg`utjY;38rSW2J*>zw9@0{+-r;!q8Iq(?`1&H!+%I4l LG>KloFPyUn(%OYw diff --git a/examples/runtime/shaders/essl/vs_terrain_height_texture.bin b/examples/runtime/shaders/essl/vs_terrain_height_texture.bin index fa862cc7b30c701597c2fce019666972af648e32..b11f0049625f85cddb9e481cde93cea08fb2bcfa 100644 GIT binary patch literal 483 zcmZutu};G<6f~%l8TtV%Z%j}WrD;1^Yzzzxl|Wr1D>02xoEJGxNQL+dM*fMNui=Fz z5F(x|S=QaX^WFab_JYxTd|tktvt^SQ%v7=0>Un4JX>rEbqKDbCPI9FWxqDEZYph~~ z(4l#!i#MfyL~9@?N(HqvRiSKr12dKQAsXp6Fmn@}W8_M^nCupfoAd#vi;+Af=8Qg zbbN?GJHEps!4#-(?hZ3=R!cBl96%ICe%Qek#M^C1@q42~k?e**v}#ryQK__z_ZvEZ L6)h3`m2>t5*CCq( literal 550 zcmZuuJx{|h5H+Zi8TtcQZcI@XrJ#@uzt~y$E1avi zn21v(JNNGHy?fq2-d_=n&#&u`OEPa_AyZcDIqP;xzRWHNnHiYO>o{jT%k>lMb)y(T z1V4;#JQA%HKQx*_jx`mu?05@FT*;biF3X7iQxIZ-X8lo0l?D-Q6E*NMgF<#=f9v#H z^gKR<*6nUe{w$Rk=|!T~Fj*y{wx&)*RWKE9VX_m7kURyE@DjWQeWT!#z};WL2DA(M z{p$&K{-aa(IWZva;kw4VaQh%r!0;vlmM+5*0zX*zJ={RJ+2GYowC=1yiwaGNS0-!k keupe8AKi3v{b02HYBgY1#JllrjIN1Q$Y>`b={u$52fHh@h5!Hn diff --git a/examples/runtime/shaders/essl/vs_terrain_render.bin b/examples/runtime/shaders/essl/vs_terrain_render.bin index 6919aa1d4f37b8a889d346b1d357684615ed7f2b..8db0fbd46bd543b3d5d059de24209576dcfc0ca6 100644 GIT binary patch literal 1710 zcmb7F!D`z;5LMGqic0Apls%PI;u=|!9fQ*x+8i3_ArSDz7_qVBL`B*)k~Xyy^6!1K zk}NrKLMx0inw@zg-3lpJAG@t*WpU!A}bCKEDJw8pLCe1C{CwI{O2-P zzYpJ7)}dMXsKfJ2tgb}1O5@yuA3r?Pca~+RVxx4)uM-(1@`in5UXK-J6!@;g@>oPl zrW)$Hb@bi1s<-`MGdwzx<(`P z=1RAjhpsdLnJ9_Pj(lyeQne6eq9n9|CW&MK@|XzGnT1k$C-3PFhgST|{SA&XMTMSOA2ju_gu6*2V2V}y`q{pX_32w{#bzOMEdRDVFI2K<-} zss#}9SvVS=RG(xahP)gkd_L&AJ?7Rgr$-!oZoZq99cQ!RI29hc&$tl@$fMT^Msf2A zRWf2{Y@jF1F=QXin`kdnCD58+>;lGoa1;Fn(RH?+Fb`pl7fnY%O)GfYQkYa^GG%)GBbDHUsK~? z4qDS|O&?~hTZJ%kNm*`?jv1%x(`^m>ER-2Ra20XYxnXo!Kr7&-kl omYV+uuZm3*k%NMF0Q* literal 7307 zcmcIpZExE~682}^UnmY+1PG{DQ6*9Z4waoEvD-9AiYwwED9$hlid@;eQY66_nRc50 ze$UJ&_0>A1{9S#}R&#f4(?5I;y@oI(o8~Sso^_aFz=p^U0Gy zZo^m#uPCx`Qx;N$v02=E*JQ<|$UgNh_nQzh%jP z8Q8Gum4n<2-r+s~epYUzwpp|5l@Vy7XscVieP9Y#a%-PkZtm^UNMD$7il(FW;dQz7IQ}%5N7lX+B)KX8bHx-{mCXwt|Ea!{w zTyHHtPgsz+_@To@D;7AX4XeX|AULAW>hxGwHS21?y6Umof>gPA8hJ%+ZPl`t4RI?3 zyqap89TIUK6mcvi(iU5h*y=&CRZGl>?!00pc187bmh9dqw>d=%el2E_-i#B2URXfI4E~*Q4e#l73-rk|d%g8wWFWwh6b$ zN@-rUUX;sLpI}z;qvFD0<}!onawDjy54#3c&tHYVXz2hni>Y{WXvc*qmR;dNg$(9-H`hAAkm0*K{*Mf>qY5}_g-#S0~=Wm z?Ykkc$mV)mxpCl+Er)RsV(2YiX4kL0T!Mv83QWtvuNSXei{C10=KK_D`p(P$(2tqS z#i@9{Tu+cXVTE{EtVJkJgk$6X<6{ygej-%=TBslK;)MWMxD}RFiKl`Xrs7+$sDpzr zouznAOq)!4(DoU>`uK-VdS{bTFGKr%EAOl@7QFI@ylb647G6o)vQ(!|5(dJ*38MgF zkjmR)Gx`WnAT`USeMMmAb#VpD81v+WFvXu@QLY>Ma!6l-{&~W!H_YEB$z#Tzp4P@{ znRn9L9(K^=iu@K3c909B?~GjikIa(802aIRl)ZuYLI;XQiH*!s3J|prvA=XMA*eT7 zl&u)=F+re-mGcTc&Dx^^kvUqV)>h8%)T(V($v#z?4L%0RzZIWnpG{bNNPefDV$zHy zvRoau8zhsTELuhh)Aye6v5F~u3nw=CARyoUCD!Q4T7WPE%S>!&&Qw&pp?(kQ22|oR zbf-(NF+kT9jah;wVaz4Dz*;BnC5c0VO)D<>fLvjVb73&{P%fUGjpn|@Hw-Yy6GdJ=hes6Q(&f|Y}h$_<_7 z@%8CyDmLYID>G5LFN@dO&{JTW;iAo;x^#dg9-9R&0%-r~mSO43Bb%<+tPb{! zSkZ|V^Y3vm;a|$n92XE8(cF$qiuEPZ^)n`^+b+PnMA1IG&Gtg zA0jW+y^_QghM*6N#$3yIj;cfR>RUKaNq$h=2@9ELv}SfEDmnI`m@*;EI|DdNVlWy= zDg)o5{FsGw(=S)%An&6Us`GC$qu-6^oQZw~)ggw`S(8+>N&cupuCa>yA&$j?v&Np{ z3LF>tadg)lI%j1R$)G9K{<+YnKYZNaMt7*ZUQQQ#Zn{#ZU>j)C+1bK6gZBAqra}Y~+5QbXx86EEIj2<~@ zu;W>gQAI904>UFH#-@lfOtYv$p;M1& diff --git a/examples/runtime/shaders/essl/vs_tree.bin b/examples/runtime/shaders/essl/vs_tree.bin index e2406201bba1ca1c445eba86ba488939bef81e13..5ee5907f2d5fc50f0ddf16cd60c34da4a7e2bddd 100644 GIT binary patch literal 614 zcmZ`#K~BRk5HwX!?tw3?#KoyfNz)1;S=>2RLh9ABl7NgH8->JeLA-#M@(b2+N}W=C zuLn@9OqzL@rxV*`m}NRc_a{eHmX6GWKmUi8{yX)rb(<8ueuB3M$#G zAcA=T{%@C4s^#9c4bwK4jj{&rVUd6`;L3anQoPzXr zph4k;lYtXWxy!Asi}c*U>@YAxXAzP*s|t*+3`^(-1w3ef1!8%JdHj-YLvuLaGVyz3-}@*;1{eznz$uZ zbFy}JXJ#k6etMh{{C@KLuL+seJXdj&t!2_ouLzl1h+I3>Ri$1BP>2?iqQs!^E%mWl&a!+M2)ESvPfNi)ANsl$UZX0z+9v? zxOqhDLcXB?PB9mH2~Gx=aGMdzD;YyBWC5N}KPU|Lm!R_!ee*?x<-j0KkV&Ls+(wz>a?Iiru2ljs>A>2yK)|nv>dAMf}Hl9tFW`h;3|FOt-|e{^7fuO4T5^r)6gOW_G(- z^_UwPEax58uY{&l9k-~?YeR=_hp}#Bvyt1RwFY;URghzrmr$!@3R0AGLW@+y{Lg_^ zmxRcqdjL0kWf5x4$?q_z8yLhZr^}ulI}OeevL&Jpnz$ZsGs{ diff --git a/examples/runtime/shaders/essl/vs_vectordisplay_fb.bin b/examples/runtime/shaders/essl/vs_vectordisplay_fb.bin index 3d7212e3ba0af1c7c6de54449f52c7361a59c56a..1e9b2c401c8a53c8cce391ee60abe8d4f64ae5c4 100644 GIT binary patch literal 373 zcmZvXK?;IU5Qd-NYFc!KS!zV6xs&!Tg}|+dTD*8VVQNLR>ZDzv6EupVh_f1I{%`mu zJo+oarG0*1O|0uEr!-Tc%KI2#!!fkTLbFTG#5FSrdNkp;L~ z&+N|Z?0WS*6#RnQ-)|sBRct8L`5JW-S=tW*AqFiiu3RbSEN&{NVTakSgjy#{P;o*z z+0RhEp%+Y-bU=qxylt3sgVV=^$fhh&D|^Bs^Y!aq|Am}G?GIN4ZpoU*uu*OaPjT3Q zFa@Kqfbm40CHPLxlxz{tLWa9~+Q1jgro5Vm9Zx@u`pE#YJdPegnHxVD!$+?;X{EYQ TcbV>fE!^MY&h)=fUZfQN+)9lN diff --git a/examples/runtime/shaders/essl/vs_vt_generic.bin b/examples/runtime/shaders/essl/vs_vt_generic.bin index aa1e9e61a737560bbb7b074c6c34ccb22b6285b8..5f577fc4e780ae71b5855f1976a7dd7da505251e 100644 GIT binary patch literal 348 zcmZvXK?{OF5QVo8g6TiR&`Bdg&D&PzjzQ2RWD&L4P$x`Hi~f6SDONP6;hTAH-t4yP zAyY-8)uPV^xriwUBdy1nR$~UaC}eouq;%@wSdAf1x^ZwN*nK3z3DTPm~5G|0B0rxvk_Mn^2GpR5F?9 y2HXKv9V4-6{MFs=E1cAq99?f;Fx?h)iKb}HOv9L!)$QH#m*+=1<@uH10l=OKTxd`L literal 462 zcmZuuu};G<6m(IgO6DKX8=DSMW4Z;H87oy{sVd7fCVi-mBjcnkh`->2c_|6@kWALy zX+%^GQJp^pLiAx?Sk@U`(84p<&)X!ZUc zl&tLsdbCx}M+AZdUZ3~Yx?-90R=EpSWiSxX#(Y!Zn{}q=jq)o9{c=9gJ#p>0&35E# zu>hm6f_cKfID~)|cvDlX%yNQ2Wd5ZyL`md&BiUob}vX;9NcL3-~oP)H9V+l?`0%jyQBwrT0l?N8{vv+f!- zWDt>gAHFxM=cft5dHH?49g&-gWonbkl}JC9g?b-f5Hi*jA5vtQWzA}AFj%aU@QjhyH%gRLg@2Cb_h~t{<8ol$u4t{q2AhlAap^Y&oTexX z9x%23bh^AV@aLWzHmoOV0P5FRor+?vYq;f1AfCdZ06-1bY_mbEu=x14=@k@WS!&2+nws(qt6p{J=`aGauKqII%45H?PSy z90BLHgSToiq>rnNy$f;GFs0=Ju0qgf`ZRFX8i*m~wKk8y6Qt&B2PtJ47$*M4pbame zOmks~h%})4wvO-&j%8oeK2KkwN{JpHAWq0qr6HJc*nOV^AOl;E$^C=HXh{rG-I6qfgxL7&z9HNvM<8$lr6)cqbj~ z-_~z-moHfgT(l@*nA-Vf=ke{#aBu$n?Yjw{&p%%$FDKtN$%k~4uD35-7 zt7TT)N%h0Pp*837>yfL}9j1h}pX#3bkf3Zcb* zVkVX$-fm+_{gDe1fd}%qtmI1_MjwI~dD_(_yw`)usdfzu)y~{e_)o>Z&5DqRZz5i?5t+RHtQD8ba8#n+?G4CM$cIX3SgI) ztSJ%1;y%4CGPbKW@6%1yluPOSk?rpDA~RPh!a3qHRAHatQaC=*KxcG{Op-s3O?mo5 zHevZcX7jX*|CLQnMI-y8>r6hkKaMHqF;Pkd_9I?g7qc8DiSW4s!x1Q(HgN@Y%28)S zk5DrS0=pj=up7^(?5R*T)j5PWKxnqAnrOXJywCLN^Aom_6SeX= zn?V%%YFd2i8d?#=9h!MERPz}|Xv!f>3k?O=BDQy}M5jXio`{%+*gD@sC%|_}|A()U zRzzo`w1m_WF?4$^HHo?@)Q7GekXglq@+$37p(&x-uDRt7O@9@#f>r(^cE(GgmXcfA z^l!N3G=KgPxA3UBMJ<49T8}u3MaS8YS?-Uu=ukDY#3?u-W;?B~F-s1PnN=S~ocEAf zBu1AW+4QEo{LrWKH9nnl^tEIA^f4qQ6jmFaBAxqm7?K#;Z|`;RE!x!uDj#vea|`M3I_=qO(wt(v@89EDPiTisBK3B_NeUTNe>c-XbgS>U$&+iQb1G&w9YAa)9nN zi|trGp$NSYedPw8@B1!>U*H9y8%5cLbE?@WWZVltE=Ask%cD?xq#C9aSmJrIR=F>u zrwfIt?~-J}J`fpr?=8?w+~U=Z8BFX0vIk&t+re8Bd>}q(HWDIvA`qY5?pkYOG(C|K zkJ1A1rfAbq5;y9mf+%~0g!Z0tL=N`;2spIBVF<+Xu7Zt9__fkhx0=?W($x1pn3na9 Y(IYEHj4B2fzIXbrN-@Y|eKd^8-xu`eX8-^I literal 13263 zcmbVSdvDuD63^edFR_P154374d`Ys;=M+uSv<2FB&YZXT&FxaniZX4^cbfAB8jaBU zHl3F5!{=U7r}JfzRmUoslw~zNQcbpQR#mp!v%~yjRsOb1W(4f-?HS~E*(6qX7_=y> z^B!YX)nw_(Q<5I3KU9?g$wCDK|8bI@t3P{S3Ym%@Iz-gsf%2#&jSOj|wn?Kc(%6v3 zJEZXzX{czZq+S+jW6-W0vjQzD&N;0iBXAv%<@zcn1|3jL`S_pdfM7el`iUKS!W)}@raE$5)dcRkvcl>{n>Lz zcvcplIKn=;T57b78?F=Fco5up2oJ%96)oHrsugOWeo!b7c0>_6av`DnI%{B5G7iMx z{TO-KsH7_2JE(}*qu#gv)m!Sjg7xS%=)Q*fm96TG0Hmw=VrLL!3!3+iLz#rWD` zpv4ORKY$f({&=iflV}UN8L)-k8FL?WJ!}WMtO_n<;i&m zr0zlZ=~C;g$R>?_18-#1c^OT-@Nd}tKV+G>SGaN^~W91Kg`)fN8 z-9dPYMGrW_;SeNT{$;#rX0R}{q{>eBf}xJVdt?ktP$wet+^h$lr3E07 z^%5zZ7XQMEL)&`64Fp5;B+>$Z`GX=D6u0$L{FvN71imW02%lc9s^%X40XH< z=j-KdR%PF(%R|rvS$>bbg*?JrR5t5(6>76?x_6PA#Z07J=$(NuBX(f69=WGTm{QsA z5Ford?}Wfntj$C!;ACwE++lHX!y2&3{eA!b9+8V5YnyV?q_^3$Di^<0ViaJ#OAE)s zw6y?tdR=?eGuU7wan$RpdA=qinq9^T?Q3|gZd%#~@21MqCaW%Q)5TZsR%s!U)|(DJ zss|*~e-@r-^paKl!9v~for$N%7Xs6Gj%HTItsCIUZUb4uICZ_Dh}V?&>d6I_Gg|u? zX&Wqnw(QmR9TEhooha{S0GzZp@VmP13!iR$5b}=qyYa#)Eoz+itcDkqCC0NI?g3n^ zJ>G5KK+V=17s|?Nt<`0K`nyKkCV^0G7LiB6EKlgsn;I-VaQ4u=`ub`3>zjY;2te(j zKxOq%RL^_(8LV|iQLE<<;vkHNqnIYAXgD5@N7$kHgW%MUqw!GJaSTJ86abWqnllW- z(KtLK@^LT>h9P#B2#IkRjE5BJR9!Wv$zsjv2WL?fF=r5*1!o~PeE#5U=tq7Ww47RL zM&4BuDuz&1s|f+WKL6P~=0CcZD+l)qHBawCt*fUnA*qB72SC&f_QNqip$?*MsB3ba z4HPCsvXvYhn6`>WN_T_O2`aofMcxreap!PQwh`F2EL(w$aCO&3$jP`_-JSRFW22NH zY1bi4&NwxOr(=q;0KrLMiJT0nms+qD3pnai`bB1yKy74Rp}Kde5Qm0Jn+e3*1?0`@ z&M^WAtgkznmC!hAhzka>AN4(c-ypa=ntj+wT=yoKX>^qK<&jAB@6)s}wYH+|#9| z@`TdO3XS417sQsnqYg_)84dg~m&CCjk4Sq>zU!W*{0^t!Y1MU%R(FYmI9`Mxz#xSj zqmN6&LD*(htXwIwc2AuQ1z+r063VBPHWJz^>EL}^)(q8`lgX;Wx~mI|6SOFiLnH({ zkRTkKg}gV6)NPJ-LM#c!`Gg8jdpD}-m{L0UC39IK$-3Z0;cb4bic)8Lk=3=c>;qLt z1m+K#w_pZY_i3AfOovEo7FU}On8%VHGLy_MP5E^?pQoK|@Q%}9V48o(S2k)5BP&j0 zIDR_pZX?E4X3|X%K+r*zgyN7U3_**rYIkt)OY86cet++eP=QQd#)6UqfD0P}LC4Gg z?R7s2BLDPZzq979QV-k6QhvZzud;k`n^x0qT4=``kC2SVJjr}c2Gkh~6X-zY`b7?O zr5(g)i9P`BMPAJFNf#KgP-fu}!a;(>(Wx&U@neLiCS}-tZ!`$|+`=1d!u?pXy3-X5 z#Q=F83t}>j2^D*_xd{azmn3c7kO?`!*f1X0QXOx%)x1SR1}ho2OOY zLY9(_^WnPPk4e;$B$N*7;nl94BzPQjB8c&e$(1Mwrts;*1(SEQ?s5t7)zWwt^j5bH zG_Bwkw$?Z?t#Y*{R$&36GpjSH;%g&LFlcMa1(i7LXOqQhjxS1ORXg(lTv%2Ta7o*b z6l~ut?v8AWTY{h^cZ35%?6q7j{B|tp0+1ag>TH>Bg&J#v4`1|!oB!A)q^L;!*hWWZ zywVzvWLJB7hQu)pCQQ2wF;k9Cu`0wOe?+z3FqqX=hXJcIq8!p*5)4tm3?_dCppIdy z#(^M~e$oEG8tJ;o7SkVaq)?=0i*=pW_!1`G12lf`DU%_>yBuJ=sXm^MGs$t^77}*uWyEXC9$FYlQ-_ z*WqDuT00^@xWlX?NsPOWOsBuC>gJo(zL39NW!5}c7ejr$XEb{hvOW~mm3?tjkckqo zp|Yk;y70g?00jC&c`t+j4>J7TG`CD4M;09z{?DMq# z-Ei|p!bke^2Mi|O`vObQXt3sd3Eo+i;=f>(3(NMxtI?H`Y(*UuiG}adIGP`Vm`#7nuK82 zny^zsMfko+i#7 zJOo?p_JDz0^N1~Q-(_0P$!(A>hZfqV5+M}pY+X9Gz{wX8dbF`SJ;PDn_;e6PbT5Y2 z@pSNcIv8Si4|}lvBQ?v{&sNvjcV+qe%6uEap_z6>Q9Abp%H?<2T~-kJYfOivsF0;} z@+zMRaDZ$wI;Gh`x3+nn(iEUu+mC2>SmdIemb&zRio{OoTU*+a)RUAe3EA*OKKCVn zM{C=p*@AZ7%V!Ew)L)Up5J(pW5<1rDUnrJCU)GsqvqgeK`)!i@EfS=hL!zCLnDeI4 z+%OBDKb;IceSs}}uG+h7dwi*{wRNw&!P{^td5W*|Ov)Kb0+ts1#XFgk{q^Y7@AZ;7 zUEm3>`gp+Ao$%^JT0+wjTpep7+vFP}-w=hC$TkIr$jbJG2-k^8rh!}GP;*NXE6&!8DU!zcE&$A_F zC!HHpdckD`x{vs8#~Ded14YDqg-86Iv@h&f5!I9|*vK*iOw6#ZbX=~m&6rTFZ2neh z-*Dx@OaTu3H%7910G!ZwD$9t2X|vQ(T^psei7BN zdXJ?k@|X^h9BN(%QNMr(gA{L>oplToE3HS6&-}j z`e)nUUZG+fl!yiEwnQ2WTV5+~Mc43jqZYNC8k3+#|rPT=Lt^LOR1U*O-0JelEES6e28;K>sejJQ{O8W`XbHh_jfh%A&E zH+-kr3tBjlZwa2aO0+A&s{xg0#$3*3bw;ZufX?VnhRbP}0*C|Ds@Afa3kMM^6qP;g z!GU&|L(=rF%%_+-FcDhJ1x{tzu0V5BBtPQ=Vz&PFIgCh}GuooWgd!bVM4z=p+4RQB zX=Q$IlIQt&9)o zQz0ESb z>%&r(ZAZNA;fk^hK86ja`&bt^Y!kxGCC7$pa7E?iSh)>!cFx00NQFfbaL_sG6q{zL*^oJCsg9BS{Fjw*_ zjivMjwKMdu2>urF8yE;XeA+|tAKVm{$RYWCwCT@&xSA`$z<S5Z>B?vL1YeIVNIDVtXir-aQtCUP4&5+qA4~G9gW(ReUBdKAs0>v#F`2 z!yK0Re&(B9JwM$ts@>1`*O1-SBEwB;RyuuMmiRInFgCIUevQ?vU*sx+#gU+)VP?CvK$S}qia4mLBF;T@>Q+Z%jF`U+9m0bYZ7>#jL zu@@nEH^Zr#!$}a=Go(qFI$(_2v16uWW{4JS4V!e-Dok z`oX{2>*38*DRBt_ijpk4z=lmvyuy8dqi3(`-?3MX1`5#`)yO}ms)>EAqhOaZNZZbb Y-a`_kPCoK1Z9Uj8Xk+~S;|Ip*7rgJaga7~l diff --git a/examples/runtime/shaders/glsl/cs_assao_apply.bin b/examples/runtime/shaders/glsl/cs_assao_apply.bin index 285f63fa7f757e7be3013f5ecf3d0113762fde32..396c4a13785bbe27a8fb9192386d23eb7e4cf72d 100644 GIT binary patch literal 2072 zcmbtV+iKfD5LH`fi}KhX*q0WmQB-Ml@e0#GXlNTK^uc{AVNq<^5y(=IrT9|vh5f0X z*_AJe4N2(6*tulJ(d|?>)U>(im zI4{#;FgW{3SNitv8^b8lWz{xTQ4P~V&hk|z7wj_=4%@j|?%k|#^2*QY>nl&pIr7IiU?ER+=;mjl$R5IsD;heUgve*WK~%#Sw2lC89!$; z*`)O(gQvC5ES=sISN;IQVUsK1-B$UCP1C%zZ1a!Fuv#GHObUT$lR|zgs;jiP zC~r{$0(5ciE|%*6Uxe69&{3L zIFUYlecX=_#1Q&q4?GXUharTPmU6V_p1tb2^kah9WQ(l$nl-~~K-=`dVL6lni@sI8 z*r%?xytQpdm*5yb0msSfs!7>Xx=aQUAy=tW9OMcBQRGHDni@qQ2m`v$L>TlUhaEBw|Hqg=&sd>;0#X}XRoQOd zp11^&9DV7z-g@g}yHhijAIdI>fI3;~{vnNEM*|Gl5@h3p_#;t&cX>ca+)%>B0bxQy zU&M-hLhNfKin!!^en3baSH4$UArXy9?h|ZuACFa4h+|LL64yjRuf=oGXB-0DVUPY0 zCnEaU6w|wOSNnl^K!H(Fcu{Tx?T(s(D8Ni_DFI*hV1@oeSO}@q1?Gi>=jY&1Q;hNw zIvV5l(s<}0)8vR1mi(WW1I-0i5epI9TqXRGk1oeaUd&HQC6@E+$8W-TS`?!7R zZ|yN~i2)(X{6zZ$98%n&W)qbj>)JMUhkZ9TKuDC_##E%L(7r2_dandAjMQH&yu?r9 Vu*dzlm&Bq6!gln!Gw)2(_y>_D2qXXi literal 6312 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 C8a#{u literal 5318 zcmcIo+iu%N5cRYA+7B3@FRNNnB#|l7sz#B+-ST*DpL2~eu2 zTqUxyZ0isGKr`cYT883VDMA~*|k+`)Qt|4mD#TGaG^=!>vf)~l}Wc?5H z|9A3MuSR)14x94&s2k0;l-EZ%#-a4TB`Q@}b)bsgzTqNRK;1ah)CW*K439@GRib8< zxX<$hFmpB^fcYJ&inVf+g-lA-Iz-tOeu0R*;3tUK!TnHqP_exy+MUlc93O=lfFBe4 zS`+2V=Qzyp0456SFmZeo&xym-8`hG(ym>nQCxT_|!}pp%A5KB9XL)69Y}J(9Z>*I@ zYv5A8pbbIeF-7isDFe}&vQZ8(P$HM|1?l)l?m)`0BPE@&c9X46<)c@ZiiclcshH&U zLbAcsUwa+V02JWuRBdR%Vr`CN+eqFPK+A6=(39g}8xi!zbtTQl8(h!jD%i&a zKw1o2PnOJdkhXNo#Cg4a%h6q3!~(VQy3VCY*Sco1t0U*dLx2Bz;ed|3d{=1GwyLM^ z7PZKFyqlAgd5>AXi}f|IHW&%bvSZ@Opk`vxcj)V0#FhRMW8#CF( z6};{%s5TsKV6rzVX=U_ZV+m3eO2Ut?=7P9N8dV;@fr-e z*OumUm3VVw)Q5vc7q$(`+OH#-tUk*twFvjPa~$6MHwF&5UoPq>o6mg9aW;<&)c9So z{8g4}$7LO@WFgb?cKqWm=sKdXX)lqF`MMIt+X37YShhSH_2Hq2E0t%-BiPc#sa&eb zIh0W)i=}E6wUp^9QN`r^T~WwKbXdfhOs=or{b|ubB>7AxQ5ip}sD?AZWUZCQy_F|i z8Tav#Y1-T5@f=baXM!GRr~@Z3uP)EggC}B{L>EbZFO$n`gIOwkVRCsstRL|a$9Tsn zIy3)kBp~b#`sg(6#S0KJNkpQ`^3!LT2?9sU0OoOu4|UL_y+?sR=B3MQJn5!rf<%cK zx%_p59{PUFM9>WynFWl7ZwB;1xESW@GrAi-VS_WqQdXZ;(S?F9aR&6x=KzYnF_)Vq z@)!+AQ~O{LXT%KS+={GeMf>E1;AhmBR;Ccc&k*9*=_xCK%GHQWwk< z<#hGtJN7_;-2pykKp*#ur7)px!*A|}k0<~wJLCA()^vr>&oE1{y97s*aC+Z}*#>$V z*7!#+GicAJXE4XxU_ONK6B7*a>6^c?sQmq8z8{Dk?M$$muVMUyRknLf!cXzV3Co9H z0z0(68PF#Wck@ynw(X`jK)Nz1HaXx20hyr}h-`i!_Y4?kA7p(VFBVuXq6V)R7~7pL rpctk%&dYF2|PJs={da7Vt8{Ka}Gc|4;q})r`q; diff --git a/examples/runtime/shaders/glsl/cs_assao_generate_q0.bin b/examples/runtime/shaders/glsl/cs_assao_generate_q0.bin index 3ac0424533fd72729b376437bf9b9d8a6b1b54b3..6f4558303ff30270bd2ac92b04407a7b27a3632c 100644 GIT binary patch literal 7340 zcma)>%WqrP5ysV^C<=91psOtIrod$^G3Wh&(?!t$X@GR)?hHdv+ue?0s1;p)R;x460e>aS;K{NeMb!_{ti zz5nVDXJ`E3^S9fpkE`X~?T5wn^84k7{rgwj!|r-1qjkd9&rkTzYPZ|&#%Y&dpPj82 z_uIq1U2m@!>#N(bM^>%Z+Z$2)sU32A9er?Sg zM&+@F+Jyhmujv}P{}H# zU3N~z;B8WM{p_L`VRxn&W32WuB@-r_u-;@Jy^cmCw`aMT>VH;eBfnG}*zIOUCYNxTx&l*_>?=MtyZL0OA)-u1YtTufSPV+u;E z=#1=J&~zDu09vs`b5cC3zD}%a>zNU>CR{3H?M<>q)dPuBjxcHOO^8u@=bh%a4o^8V zQ@k}XxE#TNfq*q%rc8{Opur&nN5T-n%?eyAGJ>cPxDsKpDvKfGhH+fLZvmBvW(k~) zx<^$*HESFI3Dm(FeksSF*yd;vyaV`T8zNzi@UkEaNrKGB8=n|fNzcX(x-w!!GEN!E~)_E5z2dT`3N zn{!M>%%DJUuH<)bnDYjspeRVY;GlwmE<>V|4<>mH6y&l?f_9fp@T%r2$xR5N!QnnY zoL0eePsYkQqxDadNLZ}MnNM7J2~j1N>eh2cqw!Vp@}3l%7&PAsiWpO_+&i5TKKDQOb$_t z!sqh_HXyek2OlIkq!e|UHy)NkMHwdH!Gc0#jTuEq{GzUDga&@VGAX!&CY(we!$MC| zkPZDYMw5U*E;`ZqM^ZFLyGmIl&7n(2#vOmlLCx14=7Gw5I=9*&P8IO1I-2kMH#QF zM$7cQlyFKnlI>D(^oe~B2+$}hnh#901s2Rai8QpppEpZ=r<>r&$PGKvNFij?&Xlb+ zr4y|rvd|9~Kz2w>hG`6h?3$DohSe7FRBR-xj8t2CTQA1t7+rfac6 z?Xe1|C`1Qi8ZauqrJMY+@=iro4xl*pw5^+1&Qx^rh4Kr6A)`jMn}*Du+D|$mQUq8! zT)8oP0i9VI$aR#1+W}Vyx;&(=?+PZirCD$Y3ksnfB<>rodQHI??vO^2@;Yq+Ps^4@ zAApHU0-I@bIalqqd&308N`*%a>03yZ$*Cn2W5B z`| z+kIQyobAVfu;*6nl0E2Sc?%3(ze%YvK;Pi-tFJFB{BttJ|>vE z6U~G(-1lUNnqB)o?t+vvnw0*EC5WMqb(H#?Xm_}ArQset@?i8TNW|FFmt~JH)z||c zYi7;2_&Rt$VM??|{#FLgKRsj070$}Fwd_{*9rhpRA66Sl0LlQKdb*8IKkhe>R17JE@8It5J0FC8O$@QW8U zP~t7}I3Umsm2{DzS{7mRqqV};&#b-cho<>2v@9-()YU|tD2dQ(M5+rS?QweMVOHbA zD_UYfA08b&Op*yl4=HpNZ;W$omEpt7?&t3s%gu_N&+>nC8# z98L$|ly!;iZhP3gMZ*MsK$17ZSKL)m%R%^MjeN?Ixx8h*?0y`NA>;kNK{JJn76TL5 z23ai1_GBqKZ=x2!_f_YA+KO~NS8|a)-V5lGk&n*SrxYD8JCz-$!Rp);0it_mMiHRr za!L#wiQlNcEJX-p2Y4+^_bDGAXYeA4+*Ad_UR~rKx!l8+#hP{ob z(dn`J%aF@B0^J_D(fiEXHg+mIeg-+3SZ16+F1ybm$L0b8|NIVeDN2u0k;7hHlpnd= zCzP<9%tB%&^nECrGktIzBgqU&ypkeG1g^bVe5#E>+Z7$n7c7M-qLsJ*+ew{@$x!7k zM-iepVCx&Ct6yCvRb6pK`b2GI%CUdq;Af3;=!sF__(l;4CKN6q<*v8P|J@u?i-G(ics9O zR=&rP&!g9q-Erh=GhWuom6!_=v-r}1w;ug#1?=!;0^b<$B8F=aZ`rx=#>wqZ-sUH! z$Ss{0@odFaoY&05yJr^g9)(HrE+TN1WAkMB`lG&rqOC@$@B0qxxAWi5&(Ho3H^Zpe literal 18154 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 diff --git a/examples/runtime/shaders/glsl/cs_assao_generate_q1.bin b/examples/runtime/shaders/glsl/cs_assao_generate_q1.bin index c009104fb5d1a02c22bcae5e88a5cc5b165811c7..8c4ff668411a482c0dad299007d3ee3fc0a8c034 100644 GIT binary patch literal 9434 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 diff --git a/examples/runtime/shaders/glsl/cs_assao_generate_q2.bin b/examples/runtime/shaders/glsl/cs_assao_generate_q2.bin index 08841215e5c8152fd57d0f6fb63784eca9b84ae6..ab6e9a7462badfc9437381f30ff8eeed83e04a3b 100644 GIT binary patch literal 10605 zcmchdOK%&=5yzE95CqCGKu$UE5`f&5xc!{&fj5UB3v3qHAP47W7y>QRG69NoDAIZ? z_ABQzZ*VJtGb7OfBla?oHU=`p8S4y@oBc1UEh55$CDHO z%jb8yi_QFU`_*qwPWUgMKiyn>Ud(TAKFu!Y-_Jj7KfYe?HkWf5%@h7SJmH^<&1Svn zr~P+)aWSwGIAkq^7>ADqRKblu|+IS~*i!QO5L? z|2tPxZ7LP5QrgwdsZe|Iun9*%t3R%Z=bvoo>Y zB44}Un3MK?Zl-}}6@t9AF*t^UX6vn5Y_Fn;Ra6S2ywNU-RpK?}>dGqTBD>a=vKHgK zYyGC`q|#a&Vx_bS&WPOPO;_U~9IaTQ*(sJ~TMMn)dS+Bw6E0QN+M8&N${P}+9AVPl zn<@nDop+jVjX!12O!3x)%GCiMFi@e*rzwRJQ)&EAPHR7&FSgfi= zk#XHPCSbQXm5A07I2&~9RSndvaX3g^U0K7IwEaRiTMPKR!audG0$~l{GIx_K?HJ$i~*Q8mYS0N9J5KOlEfK!84UA}`W z#sv!ZQ#1~RulkUc0 zI(oaYW6`zN8^EHC@ZBI8D)1iyY)u$2+k>){JcJz%Ch;P0xEAW{ z%2KaXs98r!0x3WkdIzFEzXAG#esg`T7!8`^F3Dsck2=!EAFN*oF)(M8RAS{=?IZAiFMr z`Ne}(4IAZd8ZdimKj{QX5n$8)0T!Ga1)gTG}Gp?uiR_5iV2973J)97w~#8ut|b)YE?o~@ zG$B8$f(LqsztP zn`JMcm{tT-BI|JqvmrV(P(yx3YBJ{m{`SzK^}s{oDxw9&?^Wevi9{tej^ww76zJQB z$%OOkZngNZ-dyJsYh|i7*W^_TR z4S3~hdGW(?{cg7WarK#71##Su-%s!EN8jX$<1C3Mcwd%xtLuDkV8%&QGrIUN8qb!? z@p681^Y4$dRT`|%Mvat*+sR~-#AI6vfzCz*Za2HtWnR=sET<%k8I`$TBQxK=x!MtqB8yf)cAsLI3*j;by*l ziMX@TB3Y~+R^m(z&r7VRk$QVoe~8tR}J;RjWNIj7W&nP_QW+ z!4@7%j%1xz4!PN_3FvaCWyblRh_z%C$Vm^)ZnCGtCff_4VjeQ#-PYF5QY{;OG?gY# zoR+q=H?>V332v6kRKwJ9qMo1Dv-bezfP7?^>}P^c9@5S+L=3(VHGMo=d0HTyRKH(u z$1({%>869XkCuiT- z-AD{sl@p8YP49+=E7>(FeUf^3`ys)SolQpHrhoV$5h?l7{+rnYlUzzNxm;*P)%~p9 zVkI0wiN=_E$1cb6hR(f(b8U1DC zcSW?XXWJC*C~lE2O;)wRO;+U4$;K&NT|}Fql+`knTNX0%U~NM9@Y>tPpH)eb8TB+^ z$&ZOo3bYAedrvVJ(x=I7^4JM)$vIs9P@LpXNPi;NBdkYaXzNYTZ-rYzxy1>@Ef9EuIVS0ae`v47nTPRIv<{B=4Xp!l!>DX<1A2{jT zKGptHAW{Sj%Y?aT>M>Tnuwz^$>vJuu;5^jDi8l;72zLoaZHT8^|zcYbl;VXgXy7u@p+ zt3i!>52G}tz0c(^0AK|oz|)PdXLp&E#|3JnV9@A(JG%MLCN;9Ol2T1OF*xQyx|V)5 zn}ROobihTsKr;ifpRg|;dMw1(^$Wy9vM&}7srKUKO8Z&sg_>V19x5)xdrpqeIY$Wn zKs@Q1=%WP7dXrm7&S$(Ok!bE-HUIu@qzzy4*!`IcMJm=43zgC+rmXqiL6 zX(G8s66)HlcdPfQDM=fbUm{%aZiJJ3chMkg{%OabaC9GiN_M151o}og_zr=M}JmkDMd>pkQCC9&;$1Axo1U` zb6Cz2^yNkFAcCFAE|pF)_la9P+?mT!pWuW7xjAn;OX09|S-|n5IL+nKBCqJ> zA?jYUOXim-C@w}CrzM!xsd*S@2*{dF>k9(Rjp>U6TqkdV&L_OZd+QWnWDW#aY>idA z3h2*7-7#9;p*|H`TAR#ZRpW0GBn0_e$ko$iC zKwFB0gs4e!U&0HSl+e6lI^+teZEQR-R%G(HhwNTW67&|d8zQ~hbF|AO!769Jt|le$ zCVRx7Czau;LK(4nUYP`NP#JqZ2xDUBZ@$?_4?hgsE>^pF|MZuR;?pJ7>+O2eUnS(b zOFPbeeZB(b8QkCHncR_a-lJR$*@Dq(*&1P~-eHwbUX&SdwNaUyJa@hTl5Lhu2lSB0PA{ z3~5Q9K_G{O(W11%lI1TG#-7vhQUr_dx-a{_XfN_|9nI>K;oZ;d_OAxmy_H|0$>;E* zqFchR4dk63Z*-W%ucmly+rAgY44N{2^2D2D-sA8yAzs;q;`NpM90?xd6_DlS7q6QX t?-Kc)O!wm%7VsjNN%Ata;$0NNxzk`~`bi3#rS#vo7p1?P{&ISH@;@^sy@>z- literal 18154 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 diff --git a/examples/runtime/shaders/glsl/cs_assao_generate_q3base.bin b/examples/runtime/shaders/glsl/cs_assao_generate_q3base.bin index cbf25a284c2b5910634585d53df700b3ded89b63..1dc3befc63493ec448e433262cd551af2fb0786d 100644 GIT binary patch literal 7504 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 literal 18152 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 lG*6$;pCG{N#&-)%7(Qj%v-X{uiRK`=bB= diff --git a/examples/runtime/shaders/glsl/cs_assao_load_counter_clear.bin b/examples/runtime/shaders/glsl/cs_assao_load_counter_clear.bin index 386fdd5c26664e2c49038560d11684bf3483e68e..f3d4055ec51c1caaa3fcdb0a72e4afb53abeffb7 100644 GIT binary patch delta 136 zcmdm`^omi!IoN}n0S>MMSviT7`K2Y3ZwOdRaY5J`Ntt;mnR)37wh9J13dJQUCdQNd z1k|m$s<{+^pfoeDM4>o7CqFU8IlnZoB(*3y)|#tUA>Poynv1I}KQl!kH!(9$LldeV SD6ThIQBZ`v6sU@eiva)!5+u<8 literal 4410 zcmcIo%Wms75Y1X$^$!SiQK>ar$I_-XE{fiuk4=FhExHK;Lb2&og(Mn!IL;03zjq!a zB}$DNo?ilh&rjd9P zm1^3m6t~~3zm@4$d<;%%w;?YYTsYxM2%b^r8e7*`3|-@aYhqoKk!vz=-3Ux2>tmia zmhHL6mWasnO2~6$IL8D zr#u{oU3q=fjb<0h^AQelApK9dDpc7_RMFcvR0Ipije|`+f$Cwn9JN-t+BM;m*13Sp z<$fj1d#I^eGjRy@xKX4)<}HC1S0XZ;Pp~B)<#yQKqm*$to3c|5FhC-g@``lylAB1G%%sFK)^4)bsdV&msc87=mC8_VFC-aE{n=|l z17Lu+Q`yjih1x7*+ezLRfaNz5@MIZmCjxJrD`_^~;d&m|keqzQWW#g=u^6_VB$??T zw#>^!dA)s0(Q{oy0`>B`&c#UAx@I!ek@CW!KYm^)U?wl!3T@h6_4u~PBJ+5dlahIl zS-Qpg8kh}6LNi$g>uq2}a_5PeEQ9qnFd{kO&14y@zkw0Ty>858h#S(nub^z0ZeX-` zDzP&B;IO5qzUMioyxs<;=($EBwQMKR#5_0{c}+*k>uq3)p37Ti2VE8XWzx!1re5yh z*02rQvEfg3R(WTkj}Q(SEoSBEFMt}YA1nROXc3%$_pKutufd>uZH3;e+?yMsew#G9 zuuD+VzLjZy{5!o@hh)T^;^6Y%87SoG`EZuye&<`x%6(RW#y?ii@6%chTv~ZdtF)*e zZoeCXwi3g(L7u+qwh8NI55F?3#1jIR&+pcec&V~R=`w#6PwnBLDp5=L4Pt+%+psQ1F7dhP;0p{wuHS{jlp}FzfO8T zKa<(rOR3`JP6?YXuC3)QoH(2ZC$5|{8r9+u?xkK!z4bqK%HT=)V5JjAs}^L*w<292 znd5dV9NOC(xrUNUOvy}Rh*WJPpc_fO)%0_ z3n2zsqVAv`Q56_rprz^#bW%-t8Ih!{f6KGvHaip)!PsnqTPJL82Z0@gzW3QPjZx-2 zEp}NUsKTKtOhqtoW}#2~h4$P6xAgBl+5hAz{*VW4@#AUH)AbZqFhR2xuB z^(-hbd??nlyN_F4|^9jKQ%dvRy zZ}n=GhvTpV??Aibc?RQAm?3dvLSJj5 z`1p*&j80&Juni`RNAV0AOub<(>G{p8<3FG%t53ew1blKy^m>|=)`nJ1srihx(r68u zlxMV2&~QvC_g>174yJ6C0}PO;NqI&({E$15G8#y!&RDz2PN(A0t4oE$FRxUrVShv+)+!@wifSaurh>PB)Mi z!`2feGaaNY!!luBXWwGr5w&E!}|%nOHp|9QcHfxLJtv}rrl)3-$} zvK}Aj#AME67H_ex2G#~6p_z<>bvCdCv6qax4ghe|n4H{I_dek#QOfy3>|q zYayMvA?nYQ#wP4FC~99ZE_a{!t=L38?idG`|JHyZ%k8FS>3Zc_j?;CVgT`0+_7`4= zBbSQpc+QjJVgBPWXvI|6!jt?dt4f;xFd<6?mTuq9d~(R+Qe>%oBDQpK!nY#0CIu^b zz7?IK7ChNWkq6gTdCs4}VH2lZ-rZgOWzh+h*@{b6#Lt4&63~lZ3}9RWCHE0|T-yZ?3@uCv+>>dzme{yh--hk0azy3ARB`(89#UDiOSMR6(>D|N_0@H#k$Cn9Fbi`D z=MYnh8orzX%}|#=vNi2UgO}To!WKW?WBM8KCuBB-f79BcEJvfv9Vn~OD1ifIJsKr+ zpz!?`a45fAUal_jIysvLZx)_j-@zL*j3(;qtY8|ba;dJnE3;gHc)Ic6-35za3J0n| O$h3wZe5rl$F8&3$=wHkL diff --git a/examples/runtime/shaders/glsl/cs_assao_non_smart_blur.bin b/examples/runtime/shaders/glsl/cs_assao_non_smart_blur.bin index 0666574e6c83cb0d723eb57f8c82a9a3a3226b66..162f78a3c14904cd5bb36f988c1adc9a64746dd4 100644 GIT binary patch literal 1151 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 diff --git a/examples/runtime/shaders/glsl/cs_assao_postprocess_importance_map_a.bin b/examples/runtime/shaders/glsl/cs_assao_postprocess_importance_map_a.bin index f50ba4ba4a923254661760bf4962dc41dc677644..99ecdf22adca292dec51ec8ff1e0d94cd90f4216 100644 GIT binary patch literal 906 zcmbVJO;6)65H)Z?*#iguz#Q#v8l@koT~&Kpq@}Cn#NJS4nbs|q9J_Lyk`(dZnK*3& zLW_Wr71=ZM-n=*Yb#wKN?BbZ57JMz7$nxWJLhxXmWJ>%1^?c`erDh|~w;&j}$~ zRJQO`+quv@S6j(T_zB|}USz5_nJs2|43wEf(F+Eztiehe!<{kqJPD-^P^Y5|#0hO+1} z0t~eTDzv6r=J~&SVdzTp-`d^@JvAG2T+KjAGc@wF|HUMbhRa2n5Ea9SxFbNV2V@$Y0)X z*xiwoXp6R^4NFmjM`Lf1NnW#Zw(`{| z;Q{-~N>Q)Nf?bTpKPG(2p1qBjO~{J|J5IRbgJ;mWM#eQ_`>xTRYiwNOo@>14I$@Y9 zsa6@U4co?IOGJ_;WJwcf&Jl)0M?)fCh1g*+hQ&w2Vk@i-T_XiXpE`J*7B%weG$pGJ zCYrbqQIH|(4(bubz?cFJRd=A1YR>DJ<#qGEl=+q1Rz86xj^pwhFWdI4*dC^NUqh)8FMA_~P617&xH3m(Nv4su4oUPtVbdvmD*8f2N zeXe7$uq&^Ny4Gw*d3A(C97z9rCUQ~K2de1o8!CbURE>j8eE`+La5!ouGBKU!N zS`nqkXBcLD02735F=0H2=cL6{8&;B@-aH=v6Q5)a*!PM+z|NUkFJx_OWL1>f?^q*^ z(x6RwLK}pJV+!4SDI@=A%1$}J0Eya^C#0hZWUV~*R-Q0EfETN&w~^_bHcxYS^-G9>^aKsBuGlkpJtzeP)}n!*d&Hk| z4)k`U#tZ$In~;r1V+M?Mz6YKyKBe%SAtBQW1P!?$=VI!$E+f?U2Wv_g@B<6n=wS$- zBdp0O3UC#rUD;3#WQ#(3<&gz8R|LoOF9tvFc*2{t%^Fkn!Ld{R6}Vz>dzkJ*v3rb%;(OCEx*Y$Q1vOxgLM$RQLlf&+zZ;A672% A?f?J) diff --git a/examples/runtime/shaders/glsl/cs_assao_postprocess_importance_map_b.bin b/examples/runtime/shaders/glsl/cs_assao_postprocess_importance_map_b.bin index c3625a6c84bfda7edc49623ec4bfb2d39b00fd9f..50452771a06578431d28cb57a1060f7f31e5c4c0 100644 GIT binary patch literal 1271 zcmbVLO>5gg5LH7DMLqP;KQNcVZXydwwqpg8Lz_SwXiw?Q7_qk2?!roIq?Kbi_;>a1 zb#^61F>Xr9qQh!F-n@A`b94Xgz0;mE=UtU-Si!RL?4#r0hv!3?h-{+@&GIGx!8Xnt z$9#BxzjYkRYE@|>)so4i6nmcR;2L5No>}S>%N{Ku1(8o(w?$ZpJQevG9gzp6PDjIl z!lGKOcmZW16-#eam1|ynu{QV71w56=^|5<4pSlM~!pT*SZMbNmas&@N=quq*5mTsg zu~J0_4~5WN<+28mu{Dow5m~ch&GppnVzzuaf=;Aac!kwESIM%C7oUCQ?RjLJ(cloyM?e5m! z)t&*Ql-jIDA)``LY8+xIVoSZ0PvOD_lfWNS3g>;N@!a1(G;Dgr%h-@_CuU|tFb8w{ zz!konhGb&eOfF-8cj_`A##NuV!l9v@Ds5Pgh~_(875uwOQK2J+v2X0Ii~p>KhnAn;<<2>b}&sMpL433+KU z;1dih^ST&`1>f-w8@}wjXP5{17#lm(T@1jjHkgp5#5KW?VQ4k+AVhgk>u5YSmkTpK&)YgY6>RoHtD;{J55&Lcxz);) L>p&0g!F8QKkL7FV literal 5566 zcmcIo+iv4F5Y4mu+;;*+0jg14M^b=ojiA_Dw*k7qVzZlE!SwnHDH)3 zt`@0KE!)OoOGM(vXK~{h&LM_`dqYC5L+r2!!=k-mkrmd3)<}WTUlUv>xk5g@rern2 zL=z`M3TlbEgSLobU_^l}Rd=A1Y9>^~GS&QE7TM?GvEl?4k9=A>i_hDKpnV9v!Sld0 zhAKr~Es9EV#Nil*5ivN&p~t-O;M>5?@U}>g%;3T`sNp7W=rYY49yD)w2zJp09Xq-` z)ef|!dJq&Cu0geHZaS#_y6)uH*n%2{)FV)?4^jatst){M>@#YxvUs%M(3zw4c64_e zgY6E=g2VImVPJ+-E-M2_P-pp8k_k;a^TgVA*CJ7C^;{#+WFK2t@XOhnwS))BZ)E)s z^#6DAtzNzIa2)pKbx}8(ttqdMaEJrx-={K@x!O@hXWvi}T0q@6*wi~v9So00tz;@E zir*JS${=$-^_lq{Qe`c>!Azu;v<^{nWxuf)z1XiTCWr2a%7F^)9cXtt&*1qe%#gV; zp|3Sj+CIl&MmsP;*bWn(kK!40n0mol(!-0#<3HdetH*xQ1Uz=i^n6~Z)<#xMsr!v> zrO_I6DGz9a&~Qwl`&P=3?@ie&2N)nxm-2vg^dq+;Wwa+Hp0VvBtxlz*SC@(&UtXyM z<#s}n!PH-S9nk<7;OtawuwbD!$Fc1tw*}Dh8wvE_IM`kUy>MMgv+y3*v0XVixr(U` zyBkQ0(bkhBGaaNY`(>iM&c3DSeO*KXS$Vt8#mKI8&0teU$_t17_I{y&J$dO?*rv6r zr*Df|Wc|FElae`)S-Qo#8dw{Qgl2FYth0d;sXI^1;5b-k10zx=ycrw^>uz9#>V9s_ zU=x?qysMzvu)BfL-m9dQ(HlowEcG4xoboywn49-frKa!+qfZcc?7p7OWC>{SS!4RPsB4VTV-QK|^W;}q+Qz>)toLpx`p&n#@)#YTD_$8!G%XnH$L>gDglZ+d%!4j>R z)z-`t#(VIhHXbaCWXdv;a*sS2i z%6KOkIFoAEK!CTpdEhi2Bs0cEn(|au)t3j6a|8#A&!$NRuaXSYQr0B@dILbM!zoVk z(eT2D|2@2qbv1rc%>*M1S;9UCnEW0F$D^1<-wPLuQxs$4Mz-E!J=`M z4o|Qrq?+XvhUQXXFPTUf`w=kMMVh+8#;+S5#uo&bkCccqz6`)h z6kMQ+>wmGQ+Ipd;nP_wvbsg35=@DJbTcl_-Jo)Kv^6enVrprUPItV^GnVQAjGJx2eq``93*Le_ zY@gxk?EH-O)5;@*$1X1!^!PxiB1FMDwJOSf$HG3L)-_uc RN}ZD~tdD diff --git a/examples/runtime/shaders/glsl/cs_assao_prepare_depth_mip.bin b/examples/runtime/shaders/glsl/cs_assao_prepare_depth_mip.bin index 0c4333db2405eb5a90aeda9d19ccfd4c676ca8d1..d1db6d2279e3ad00e2e679b94f63a676101fb552 100644 GIT binary patch literal 3147 zcmbW3OK+P%5XWf_RYiMiKfoTB#39S_h%L8=s*&1Am3l~TQG_-&c91YwJnYz2zI$gD z$1DVtRaUlOAM=~pKg=vYZhn0<4(-JFP=#xei&b&**)ZS-?R^#I(X2dqXBhB<_T`gd zBx09UB~7xKNWvoCN8uy+M#dwejO<>F>|w;QNSsbhvr6MdmaoVrnt9~e>#Z}nn|7zr z`_xoCmT{H>iH*p8oX+EPS$A?LSXktln@3`vrOA%OE3u6D6)D0^9BqrWm_=97x_r3F zs(co)KC+{dq4OrP(?{ki89Hww^FFexlA-e^vfD@YR5EnhEJj;G;7&2B8I;@VtBWH&g zAg7oTM#~qL4IN)V?RDmGx#7kc)Cp(E8CE1MXAbXm##zVNpr@^_C(c@)8f_fC=K$Jv zpF@kGqc1YL`nDiCx=Bb!w-!W45(ycUgzHHHg?3mHVCYDKjA2Otq9cif3`znJ9Z4i) zP!d;95;!4-B>{$xB*+++1Ry$+NXVch0MU^|LOPNxl1!9`GWMq`yY&q|J_wD|l7w!6 z6@yLdyRXEXlDYt68ElF$_G)Ix-2g0BQ10>HywivR`A16etcP~iNG|U#-M?H4^}i{g zici;@fY0NHl8=x1lu$ZL#A;2&eL*oS3&xIX0uT=ht&IiHW;n&{F_X=4CY(+9c;fr) za_n&5g4)b%Ue7W<88hy3?v5{miSOckJ1BW@gxtr%-q{p6m)~@CIK5VZ4_0;D6qW(x zl;8y;r1V_IdO>K2TZS39z>x^?p;L;pqxu$h_I!(@oe=A=4o_Y_28=Z;!D9d)9-XKy za-mEfJ$0CfIXi1_YL=yCoK{gY`gA-*<6 zYGWBDO*qo14AgA26(||H(y$EGY-kKM_H&oT`TEyX#8+aKSrW{fjO5apcU(T$<%2UE zd>ZJ)$WuSbmLlU8;aFrw79Ny6XUK-r!RJBK!WSNQ^4=Qdv*j?d* z$12=9)C#l=^;u9vxB*qJd0j#6=Cw1vb(2sXq0A9%*IS+gl~_l77>}4tuvDxXaHMRJ z^k#B<<3Vm=Q>%{E1t+_r#e(}stJmT@ z8+^;_e+d7755DB9W*+6R-d@mX%&2@x@PPJ$8B=TM#&yc*2?DC3PHDplFf%p)!KBlDy}bx;{lk>0jam-P(K zdto}vjETHffy&osKTNj+6U0`Sc-|{cyTVipR+K)!cq;$4C21Y9LlwY~9WgbZh`f|Z zsS2q&V@qlj2bIfbxFKkiDN^5Z=~z2m*31C|6jd&tp-vuh9WLD+E~&`7EWK*0 zUB-tu6Ne=XjLzd6+ zDE%4}SX%G$n}l`buDXh#kK_&Nv=SRzX|BBDut=OdL-(#La>q zh$MPs<=%y{zu@*c%jCXhOMk}C`7*!17DYPalMbZgy^)SPknFvY><%P+`0lwnrvu3y zvQ--9yo0FRPZvDzqUL2E<1RK{^)c=u;QKztSo4Dj19s*|vjR6c{K^l)B708>#dF+D zSq!x-%k_7_GF+eGGlr*^JXz%TBP~P%+YB-uormew8+w;y>Rg9U{4`eSjaXifSYzgK zYvu_vc)i0!Cra#xiAB8AF=4YHzc`1699WCUdmD*6Ke|XB;3dbc=EeDV{RsbBJB%x3 zRhq_6D@emRv#_^T#Ix+fy`NYF3&Rl$!Wefha-*rSve_N#-re((cD4?s|K33CKQNc0d}r1Y{pBJ0Oi*0rB`$90};2Bb(?S+1ke+yB`@YF z)X9{E>?h{p&(V=QR~iQfZYhX1H&w*LsG@ZzAN#^Yy4=P6%QBp zQcHD0fwVcqu}ijx+u%pk1vML@avQSPPxI4<1v$k1B-6+x2VmeuOF+C^1SdPI`j;ZB zBY`fGfYVWJwbBZQG3>s@zUm`bpY!1@l*`!Y`dpr!*SSbJ4td?Wr?e8?k%evE;ik&k4jCCLU3qd(ByZ`_I diff --git a/examples/runtime/shaders/glsl/cs_assao_prepare_depths.bin b/examples/runtime/shaders/glsl/cs_assao_prepare_depths.bin index e9ae47f3f00c55072a620758d8294762105cd8e1..71382b65a95300c02c0ea40a1b945d2b7731bacb 100644 GIT binary patch literal 1184 zcmb_aO;5r=5M7A}Q{%}$FvnIa(n3Jfc#^1`@n%S~z*08Z?vi$kEr$Q@Y~`a0COt6O z)9k+YcHX?_;oBwIRD)b(;esYKP8-*R;K8~|!zo+n`A}uagpo614%Yab5J3x-X~vBZF9b`<%gR{C)KFlr=GRyAj*%gL zPu8wa<{u+N{GO~+pRA3BFBP9cOu4ij>&pTxJ_DNyVGEX~?{g~cNQAFKjj0&OC2rQ3 zKj=5}!i5aiRjXLd$99I9%n6 jhw>PelgroD#$=sJyWX&vzEcVAyha0Cf4yE?Ys(_ve&TJH literal 5534 zcmcIoO>g5i5Y5>=_fDV}x$9?8`f!|G^jbX?9)a=sjJD4B!VY{p2&R*-6Vn)F zF0x{)3h5z^hhZ4O!I=kBHeF6$ChZItDjAuc9+yXSokHLPndzkOR!!;pFe%Jor}fQqUEKbX%LHCV2mT5#y>q4jQlf5*Xg z4`spW;&AGlDV3|00VJr>tdk_7WoI6)ZTA+5TC3q2f+j<3VZ*OyYxWYHB!86kKhXc* z$y>b|<>5GN%Il(TG&@jUAK?%O(*K^wRAyyQ6`g%UMX-Rnaj>a-P#p}%qZTreQR%Ie zN*H9$)-z__LuFpcda@BoAzOzixw2mwM=$mZG2td8TMd;ur(%(NAdJ)Oub<(>FLem@$Y*i>y&-32~61=rq?r7S{qq4rTQIfrO_JH zDNksF&~QwldnaY!4W?|A0}PO;PI*E)ddc;q3Qp*gzi#&spl#v5G6&SxE`&$ z3aSnL4UG0iC9RBpaI~eRzT-Kkyv_!u=%Gd;wQMKR#5_0{c}hph>ug|(9?F}=8$99;ez1BI*}HhZ3}BiC}At>YXtexE=5CJK4v zQt_?GMOxe~em(}RIEFR;g-ExF%>7GN@U`5Qk2k8yBLGaqv#LrjU;Mb4u@&aa9^Ngc z>?w~+sj}pm+3Lorc#s58iu^&A^PXV;HNlIXVEAf1o!RdR4qp=-EX_^&Cd#GEZnh$l zw+g#}hL>X=LaeuylKHu9UhraLE>#pzf z(tge#IwSB~=CQ+7g!q9S5W|lHT}I|5DiR4VfEV9Gs-I@8wes9q`2s6Y>^NIab}C-8 zRK%HwJH@lWXY2Cn5((qPdr0`lM6E<}mF*x)2|rz3UBYJJW7BxYDL7M`+yDWu;HFWg z;I*8@8|H~5@e)}Sw~r$85FIQtwvJQyz9xn7CF-*k^!kNTIjTh~))#N6P<>qo0oD@F znGdpz9w8kmr5hW1xyE>7Fc|#auwc^}n*$*WvKk8lzif0sqOl;rWPZ#9H#=%Oz@!DD zbuU%k5*|JTsdPqZ*!p183kJf#A5_$V2I)qjtp?HHC#q3s(I8qd5^dd}y};9R_AdYe BIjsNy diff --git a/examples/runtime/shaders/glsl/cs_assao_prepare_depths_and_normals.bin b/examples/runtime/shaders/glsl/cs_assao_prepare_depths_and_normals.bin index e7b44fb3eca6f155d2e4c37bd8944c8529f6a91f..bc61c5490211e59fefe804f036d8136d697b449e 100644 GIT binary patch literal 7111 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 diff --git a/examples/runtime/shaders/glsl/cs_assao_prepare_depths_and_normals_half.bin b/examples/runtime/shaders/glsl/cs_assao_prepare_depths_and_normals_half.bin index e040cd87413bca7c2a1b4b7b505e8cc5d0fc1805..a1bbe9a449ee77dbc3d8c0dd26f7f8634d373123 100644 GIT binary patch literal 4306 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 O{2@_Sgh*EF(l}Bl zOvZ&+^SFXrxb~pcsSi49>;x_dHKepuVy^QHRy^s!R{S}*nG9)*+z71@@_ z89c~?{@jHv#Y-*>*GkqPGM4gi1VwCEo^s<4cRB^jmXhbqXUo=4YACQ*3;(Vbpske_ zGsu`wj!R!DV2L?6OiD-cqIg;`<)kuxkb27GSgkNWYjHg4R<#Euh7mfAi3l@wb~apF z4cjMY!)u2j?)NYf(ExuVc83kL4H_WGLeDqQusvf#jEv4(3wU6_@wiBnx!V%G#0);9?_*Hw|15e79Snxz>t@@_3Mcmq$+jyZjq{qm+CASRC+| literal 5118 zcmcIoO>g5i5Y5>=_74!~Me4d)TM~-4#-i9J-Q56Pph$vVf`DLb+EF2ihCUo+7x~5g z6P+27l5Ej(grYeFBxmN$LktNALqbo7bi*PHiw47@PFNFKAq7VNO>h-wCGu%CC94T0 znz#^BkR|F4>Ji1jhypEDcc7DMD$0nZW&I&n>9u+)JObmhDQ%tcxg7*{5c-p^6Vn)F zF0x{)3h5z^hhZ4O!I_6X^B0qsNjJlVN=9aI;TqKNkT-Oh<_!bQ8wSBKx}al2x24*E zTB;{Of#DvM-E-YQ4eNT8U)>edFr*%Va($E~prY!)59U)w4VJ5?4jejrXuX@=-*K?r zLs@V--=79%O6BTg012uz>m^yzvNI3YwtI_2t<`dkK$9W1u;JIUHG2t9l0V4$AL#$@ z3>gTDzoxP6`g%UMX-Rnaj>b6pgI_iM=fL`m!DZHl$v*}l}2mO zq&%SwLc=kI?!A-TGMglz<2iuCEH?AvbHs0bo9#@Z?T*cIe;|-+6 zu=OO#Ob2PpuuPQK*|!uu)I}svCvVfa7}>P0nH=g!dEwCSKQ9z8ke6fPi0je1 ztDxF&yn)f)s-%_C5018U)OS4Rl-Jq76g|{Pq?YX@nwSR%BTwl_d7TYR(L;H&c&+kO zf0xHT*$Ro`$cYnikb`Uue>y~Q}&{RL3H^=+>H?k$4zpRRQz<1`p_r!7@0 znK*Mp)aRqdCTt&+w6C~GwvXakuA?4zii694YoL&a&AR5 z&z|zQlqyS}nXPV|ij5?IQsf(1&W;2JuL+(n%zgG|nM;}7Y{gREDy#(!FOi~W?w|#^ z&=SMX9(^;VUHlPeQsnU$`MFBiJJt$ve_lVI*EY$%@B7uN@B6&4AJzNL2>h0LY=0FY zeqejV@QSX*WL~0{BH;z_;x(lDY05e)&%Ko|umY0D*HK9K=il~Yi&m^J-V+0>tpIC@Px}X1E*~KsDW%&BI;z2V zV=x$e_0O3#XVZ?H^_sR3%fwf=fM$W6fcb*3itbW7>4&J@W^wDpeLxEgF# z3*8X46bsqcsf1Zb!1LFox+P1Y3L5yod;+V6f{f&hj{$I@^K)I^2z^nkK?$sRaTabH za^&Ku6BI1L%w~7V6G+Byia@PT-4QCZrdqC6Kkr3>J`l8p*lmI!uo#X9a%s`VDWKVC zsB2N9Fbx87*vlGShr5lVfQhQj%wov2e}+VCL{Y&eGu$M+;&9t1LoO$I!a4XVxt036 ztmgN0(4CRROaL<*k6eB;B2j?99_LP%0*WLY=_6j)^v+r#0iI03hu_r39TJwNu(v+W zk>PeDa}D!C(LyaYr551y)FF&PlFuZmQJ5%9+~NrvXPigbG@VQ*Jjv1#c`cd$Pcr+r zWXt*uOas?$4pZh%^3~)z+=9whf+$46?Pm<1&ozSyPSOOm?NaT8SY^^b)lJ6CwYsW} zJQvlyG|#&YMG_F3!5|)6;FcMqKmsSYr3W=OI0P@~;5=p6YM7@t6ghgO$njsQbkjDq zBMk#H9O>4{Bb@0Ror6*AoH43kox5J4&dH+AIXq@~t6Wy4k)W5mQ(iwBIN(qGV~#Sp z-Z5%d4lM|Gt~;nLoCes(A;RjRx(?P6nN3afq%4L z)0x=|SJXdog5Kb)9<|NMAz^3y^TWs+ws40@eOn#UC@MsqHo zqS#~KSs|*r$k?ghdl|(8_Sjj7QJ=i%VZ#YWICy%EYoJ{N)^-hAuAz1fw_L-PYoB4N zsGO&9rP;15wnQXaby>9X6z2d#g1sRDmmzjoh+*O0u+R!Kp*2!q^uG$OldM8MjizK( z!9)`W0t(VZ-9cMKF)*Y+P1POfq&kbMkj<*qyCR=m=gX24Sk&v%)LC?@ANu+s@H*c+ zsxhh}&dPaS3XV7&!!RNO=P2-)H|RWe>$;T<=8%sHi&dgZD0@1}pNV1&7WYt>1dL z-y*QxLRs+jbn~^ZUa4GG29ThhWm`!`H0;b1N!zVPqSk7-hM>tlwlLwRvsH5m4w7$W z{SWm2ck)`VMtRr{oASD-E6p~Pms>c*f%I=vF%wy}ql(VHp(1EN**MtLJ5U`Ak4G&< zDn=E*%kz{$=4{+$>Kv+yT9}tfoR-4cM9G!?&LZ?;zp;oM%t7Tqh4$`CciPY3`6$eQ zxiO)yB~e;F$6>EruVJYe1$>a9l=OnAgo=E~8d(Px|mRH(FR!Pa6 zv056bfk}Bl8-#{!3f;F-27GVIMmfL$iA>4^($OKeBW1WJCGN3$l2)hE)+Cqd1-4$Jb&KZgHnLxcoN;3b~t3R#7${xrUQ$oD`t( zc`?0+OVM(vqj_A!v+~>NuWise!mvRnjn{cy@nZU_%kB^@n+|&(TNX(r@+@65UAtr! zPeuRoyeQ%|E2Androt+18PDdaC>n>mv@Wi)c?~`^i!a$c9{v4xJQXF^cSjr%p9^^TZuPt3!PnEsxa<&GH8yTwg?zK>E+m7B@IJ zgAN3;=R?Mo?HMx}ffX1P2)IZOqKf;j; zJ4jjK7V=J1qkCRPrrlr;fD>@S@mK3ENaTS~%=6dn#sQFxwzTnemn~4b^2w)T~^#&blQJ9&1>{1ic4&uWPG}Qkl27eoKMP1ub>!(KD*ijEpjk>U-maeEq@AJhJ zrw<~$v?p$6tF!^Pf&Ouj`ms^0%UbRKs166l(|i=CQJFl52=`YwDy$LQJvT>iZ#?y2 zB|{_QmNbi#jMEN}DcQKXx&#lrP4xLRjozpEU7TKJ3&>Kz@7-6Iux#<8R(i;j3Wo-r zWWsoyraTp8d2=6U9IQYOpl^*h6W4~(}>T&A=7^((`G4~*j~ zzL8CNncp=vhII7LkzvTBEt=Yr#VnC=m2J{^O+FFskWr+464^k+vq_duOmi-aq$Y7B z0{GM9*}N#19*rbOw19*IxBKWO&xNR z<+oYB(0|GWw@IIRRc3Wsy~`b>nyDChC!w3K)@&Thx z*L72--;3KH^Ldrl)<|(jB~rT`lIa9?$9#+v9gcGfZ%KDxaqn;}sP`$`g%uu-^&Bm6 zI26!&#H#BAU!W0CeYe#HK`EOohb{>?QpULzs$I1RyPQQ z;GEd@zZXnhxG$8^nWct0WYE#n^xw?A)+cziX&p+RuoP4(wc@bwR^Syp&nq*%R)Z0ek2y#l$5qdf0Np5e}YC?doY)kL|j8JFdQV^;@p~j;qTs zR8TCEu+-VE8`)AK!Me+WwWD(O5aJz#cw9o7Fdt$5L73lw8EAzmF#2DCt2iw&pITG0 zDlnyq10I2NqIOU#Q3Uz~)T!Em)>P+V>9cvc{x#3$qij`hA`ALmnmP;4^nTcs%o`qL-tge=OBZxB z>DH+lQl09fq>$kjm7eq3P#xBFZ+`2hpejS^5h&L?Q35Nf4*9`*mr;Y|*{VT@&K#|u z`?sG1u-!sg@bzr_)m5)lu0{lqpqi(xAQKw4#tEeDRx?p+)w%kh$)Rjv!cWgu&Bc2( z`JJf$A^rb7d97EiJZy(`d2OjH&9;=6TR7lA`nQRgi?rNRMQh(s5j3G}9Bk@6tdr$L-(cB&)+tWdaU+!Q^#lkQ%lrbZ>?9_`#61a=-x+nUIf2M~B>=kp6*?xX0>AHaeBIURf%7 ze0rr~l-o*4233FQbwmRoz}l(O(4d9d9G7h^c~bx>zmh<{97kJ=ASW&>sU}|YT9zv( zCtES4VSfWjF?2miGSxxSa#$vcYwcS?AL=3!s1et6E+S3qs+V0IDK2dK?e#){199oA zP={?)Pkt>*k>&GlObTY*X6Y-|*1*!BBvdcQ(OMfAnaqBoUXG)+HZU?7;nmA=wDtx@ zDs$YZmt9^?l4z=S^3NTinTBzjQ`2a%8INO7$V zOz1;#(|DTYb9pnVf@LgLBlv02aEp!Qykk(+FE|`DgZn!@g(z zbsuiMub9{CH!+(%82o_#5)I`VUWB?pGg zkPJEiWG{w{E88hE5g{uuDiUy!9+WEXyE4y9Xp~$;pW;Z+rzV?ZSsr0SK$YRQq$^OZ z6l?gQOSj)m7X2}u7NX=uVA`xJaY_9cD2T%ynYK;4l|gUTrZR!-K8W1m2NZ3EVPIkp(E ze#?=?fW=r|HVkG#3}N-Yo|@ROiiY*lfyP>oUoau(gfTF`bSM#+Qy;Fwma@Y9chdw*(6MY zBEA;^o(gclHAZmH-yXpo{mg+K5H<_kNatakaypl2ABxKBH{gNaKrWvp!Mh~83zO?~ z2~kS;mHzq->@#>3mmczb#i2nbo-!UL2~R{(jK72_M=mgRVLQiDxOcyTpATu5rBHGD z;Uk37ZZ9Zgzjxk+e-7Tk%_-2o1uO)>v-y3Q>i%76X&hj%CK^ShHj+-G@nSN}8LRYiIG;kUmzIl&*E z-@A#wl|?`Hg&X@vm9LAYAAaYC|Nd03r;ESe)c5P_e(@i-A~0(<`FeX-Hch_1Dk#&5 zefOu6lPcfU_l;lGS9z6f%cmlH^uG4&(i@EICL>Q62^U_uzBoO-Uza!a=FalI6oIam= zc&=;taUUEgp-|*ykxd~=KK$D%`@X6#^XkX-M{EIg`tiHf<8E;ww4}PM>k33^3?kC5 z9=&hA_EdDZLIq(zRNi?0pGmaX^Xc^<*9^-$hPy+CpY}vWwJr7^M>wQ$FSn8tM_rg`si|m$0Tsq9Q)ecKX1CLWGMfZ&tK}9EV2Z@=A(iy#!0$HX&edYzLAV}R~ zOcL8j+bBq*$m&ohk?v)}a0Q|`0xjSD?Y}pTf0sY{FbKL*YAQ0rbg?Agh5K2GCkARb zPGOKFhukq{`mv0koiy?rPbKqH9d|qM@_uZ<9eCmSLcJ#gr$gqc6Owlv09}zv^vtrMnry~1@A#^wRqJkN0nmS_2xsAav zFf)D==fL1MJBMuG9fB4tThdMEczFo`iP(fn`jC6b?|pp!_g-$}dM0?LzW5w3|4%GE z`_-1R_>2N<*Oi1fS=#P;9JdIJT_eT>I&hDPb)apa(^@gGu=LVZ*KEW_M{#5VV~tfhjKWaIfa&5qFpI^E zySo~0)YKjOxfvICb9T_Ib`Zs~xbJ5WUo&E{#4sethM;j|2|FrTg3y^+;*`*dJ*K-h z>Cve<&4<-r>a(lr*fhdVMlsps@SfLXCRZ)(iVc#v@PW9 z^DL}!CQD-}f*EZ`CF6b^ZGuTKZP7S7+oo~iRmmBYo)4ONNiH#UEJq*g5mS?i9HS3t zQD>yRFT=~^GtlI7ZQL-ju32A~se_Uhy)XMW`PaeEO}#0A{fGZO05AjW1QBDo z-eZr-y_TIM7&AC{Bio{8cak%)!3~+wA^Zt|iFK5y#DvxYHL=YuO$Y86+_``99zK*+ Q;os!A;m49sr>7_X0jD6$HUIzs literal 10655 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 Li9RKh6JGoeXYrcx diff --git a/examples/runtime/shaders/glsl/cs_atmo_skyview.bin b/examples/runtime/shaders/glsl/cs_atmo_skyview.bin index 9b057adad4a950c58ac92d9c39ec7cd069ee678e..286d9301c0b5f6479472748bbe91e432b1d4cc83 100644 GIT binary patch literal 5781 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 NF^V{_$mO>2=2xZ(pxpof diff --git a/examples/runtime/shaders/glsl/cs_drawindirect.bin b/examples/runtime/shaders/glsl/cs_drawindirect.bin index 5b9f75d2326f499b8402c4f0790d7de68dc80499..f02326d40112539103d0c0d823fa5abf0b3e9c98 100755 GIT binary patch literal 2340 zcmb7FO>f#j5T!X)w8#E{y;QP+5U;()UeO+!Mrw0vrM9OivJ4nx$=H%V5}?X2?VstJ zT?2OGkaUxfWq0Pid9yRSpMQLP)2qi>?`;(<^6>t9n1}1)>{YLaUyOIN)p8TW=_1af zdHE?{U4}(;-2U^r*Gs}}R+UDQ&BG)p;$0MM*he-IBi2~jVu`m_cC=!$IGy(UHN=c~ z(iJxB5i81ta4eJE=W!WjX|iRrYPpPZcob!r&ZA59^;=cyN&k1BVcbP?@z~_%cG`bn z0hgkS4S}6t)6z9bi>j)*ng%tIE$l8L>qwMG;i5~`Ral1CX^W>NN$($MBxtHMUS|1P zOK%?Iw7u1JlyJYx;sslWacY=#4&$^$t~{IrX2vQBz9iW!Os>;AoN*av>GjokV@_4R zm94{T+a~*X+cXh2Ox7SV0$2|iKFyKBZ~1J@mXi-BBY^J(3d&?d#v80IK~kJR6Ml0; z)?Dx$F)+dguBJBJGazTo(BWIe6S(#iVPXCOb2(+E5~$0HN^6;9Arj*gt(rp$tlujw zn!ah~!mOojhae1cA24fdTT%^22uJwR@`Pu3mcwngPCyfi^fVYRx)~(}*2O3lqvKg> z2yfy$9(R5F2|7uU7dWcG?+8XxuI5?My~`~s1?4R5$4a;*_THV_&IH?grJS8J&Kn@Q zE>!?3^8@A{(@xDjesnk7VA;O~C^ZoZ!NRpZNL#R205J(>- zb{L984a8^V52ZdD0T|l~L{sX8ZBCQcpn~eVm#tkwY9uqLn z(lSn~NUuDo8>o3v(M_)d2~H5cqWkPX8?Bqe8%MPESypRCe@=&6^Iz< S7Q)qk&053WsnkF8`@O%Yx@e#P literal 5965 zcmcIo+iu%N5cRYA0exMdC_u`xEQxdqL=B22X;VK0H4?WkhC!?-%3;Ne!HZ2f@V|F1 zyGu%1$`Oh>u(P`}bLQ-s;qvnC^B>=xn4j0*pPc;g5EW&dXTtX;gH@8tN)+L}!=pgD z;;Sg4sxC4y9Z${!ITz1^hbWwp7Y(+YaK!;nw{`Wjt0#6{y&YFyyZU>s{*LQRV5*?J zPh_RpHXXJ^Bxpt=Xk5kF!w~Oai05!fH_XQ{|6rKk2{WNJQV{f41=n#_A)i)LvZ`RB zi3=VDX`=R^J)#)sQ=q15542KEW#x;sYJM;B^i%#=Is_I>MznPiO!Z)<2cA3lI#7*K z6*4RD^D=S}$H6d+2*5e;T;a|K&x3A;cX@JT1{%qfmoaY`FmD*l`sjj=hHgvM zfNH8Qf&#-WD81*#Kpob#mtWHrR57F;fpUF_DnLcmfgj9Af*P#IA3Jd9?4b2#a(fei z?H0;{)9LnfrlwS`P6m*mPP4rvAuU_;1Z=z2NYq*_S06Mv#1=OE?QGRvycfyuWc?5H z|9A3QuU2_D4%_nDs4LC3l;R`s;7$9zM&#$KyDmt>K;@J!{brQD2c+# zS>$;lAak}H33VT;iaIirl}yU0bBL0w_(cThC0>hw9L$Z%f(q?DV|O~wV0;v&C+wKe z*G!ZypW`t79!wC{V8Zw)o->2V8)ivg-aH=vGlyh##gGZO;#BZ@mRH(FR;Fa`v056| zz@&UZ8-#{q3f=codd|U=t#W_?5}A}QNJlrho|OK9lz7JKO?En!j$SSm4ZpooG0JU) zB!j9ydmYgL7+~#GHgsU2Hpj7TCGQHr@+%2=avW?c0&kovsW#r?S}s?IoNUEpLw^IY z7`mP$nd%_69F~dlTKkrw4|Nd<)X8f)7b8vUs>!a7lot;D{p*DS4&!Y84gmLQ+;T3#0e4l9$9ycDU7GY4P1@G+yh zT!I-!&Rr6GNb-eDF0%*7P{B8y%lBjW_(6VIoxTSymsOOODxeNpcE+!am(gdSX7kwq z7C(}`H7Ux25jWaixbuE7EEUUK|;zQb<3h)|=$#^zhX;A}-c*+deX!d?G<`Q8`*i0a? zs0Ud5ry$?aTkcZlK?Ly%#Y2rb0poYhZm=lTX2wl)+t&SebyOT;mEfmduUzu zS$&FS1>v*65m!$4)V^`n?r_GN;5)zO!gq|D_3ii(s#dGF|F>~fUgv+|fk$^Neax#{ w6P#lpA3ndrW!$~4vtUjn9dlX_;JN?`{0r^#4F6941rQ3UX#fBK diff --git a/examples/runtime/shaders/glsl/cs_drawindirect_count.bin b/examples/runtime/shaders/glsl/cs_drawindirect_count.bin index 6e2956fc6510759cb058bf1d6739c05a509321b4..81cd553a11b041246c74bed39154cc82decf4f6d 100644 GIT binary patch literal 2526 zcmb7F!EW0)5cT#}Z;$-|UKWrX$0bF|65;mHv_P9v7uelX5D1Db2Lfyfu%*OFk>#d)r@F>QG-lgop(GF4?WSysx?0__t9H38Ht^Usc{MN2%-3&iV<*G!Lxyov%++I) zi_6*Yfn`D~9~%ODg3YFGNqSUm$K@JyM3IVoMEpp!De{FctIv6ppI1GeUP^ZVK%;#$ z@<`*Uo(=a?-Bw-YdSqqQpnQ*P_JnBy!nP`x^=55r?doRM-|}e(?l*P0VC%fBg0MR@ zBF#jCgU2kmUS(fa^;Nz)uWlf!rmU;;&y!s^GY4#JrRZ#3_Q{=Vq9T~AK@w!J9x;4| zV}sxG*@Zo)6iz_~-*-@O$WEAWSYv{uIDw{8cSCnv@EkKR!UnFPHQY0xW-RE!Cx*Ph_TsL=tHK++Bbp#hOTQp;q+ zele;%q6ViTMwX~0(nozqOh9~IB~XKP0+n!~*6}z?E8JuX2?-VPRHsTNaoBm2*sS+D z-vy@D!Qn(H3?V3-y%BwR(IFx>bcC4Fe8?v*33%gHT-A=c#nZDt!-wH;@Dny=pq>B# literal 6120 zcmcIo+iu%N5cRYA0exMdC_u`xEQxdqR5gkwX;VK04HCC6hC!?-%3(#31}`?{z@ORw z>0EY~l(eKH6g6ObcW36z*)zlC<;|zxzd12K|9pFL^4&v}7jc#f-p$wk%Kr6hG9ei&VlC&cRqL?v@^WPk|Q(Na22Yz&l|dodBcEt!(i4$7j!gq z8>$9WQ+*K>816vnJ=X@RU)N54bz4xyka`5l^)4y_6;%g*FdqqOusnNg!J)H*)|<)g zO#rrAC<{)fyVIGPQn^|gK!R$M9wZ5A*_tO{+pR{T)@r!=ph+KF*zni0ReSMXB)^yS zKhXc*$!onD<>5GN%4?&pG}}?0k8p?s>3>b4O_Y`$RkZdE6+r`X<6u*FpjsFnk6J`Y z6qe2+%Mt;Z)8$C0`%sxzk(sPyQbesolw8HnB0w+kqX@{s+^8(5(B3n4r}GTPM`3!x zjtPCuMCtN54%6?z1Yr#(jE~|uGnl+#mh|P#Qp*;M+o~Qv zEwacw-p@(Ntj8=p#o8K}4N5{aIS$s^z=&kd6E!&w*4n^`WQ13f<6!L#j8NuwqbB>f z4z1e?%7*R+Mth?YE5jEKTUzQ{u5-$3ZD5M-Ya~)jcM?t1g@chV=}3944NTE}dDD26 zDXt<8*C}}M862c(|i*fq!7eF1X-{;xi2aDkR!M2WMtOkW{ zwQaIxlvr~^)ca1O3EKrF?W;g0_n+m*XyqSpr#N`{ZwwT&xLeghx(sd0ak`9i(D;}9 z?zJqU`5=+otSX(NT*6m_kyxNZdUrW-;ah=RW@)k&i)yusa(E#rN|}byTUpAh^ffPj z;o|MuZf@Zbq7!=RipM-Iqg`yK#i$0G+fQ@m<$my)6`YB4{2x_m@JTMs-I)6`z-w?P z{Wn>aDs+1KU9 zeuS!3>J!83xGb)-Kk>k$+oC>+)%_37F^~@*lHoFL-`)`C3Ce%Cir=6$3Lo-{6G_LM o)&saMfCB$Q`#cZg6&)qw@)E8XI*fT+?OOts#+*GE^*lKF7t&JTNdN!< diff --git a/examples/runtime/shaders/glsl/cs_fsr_bilinear_16.bin b/examples/runtime/shaders/glsl/cs_fsr_bilinear_16.bin index 4f38b5a9386e14089b993124866674c4d929ca93..9ae940a4d8fc6735cff2cbfabb954133573a508f 100644 GIT binary patch literal 1766 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 OR>jT(W%<|EpZ*_;5VI)& diff --git a/examples/runtime/shaders/glsl/cs_fsr_bilinear_32.bin b/examples/runtime/shaders/glsl/cs_fsr_bilinear_32.bin index 0cbd5e7306b99956ef1ef52ef70bcf4372e06b52..7c15f6d0f1f4f65d3a609b57192f1d2ad401d76b 100644 GIT binary patch literal 1766 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 M$9LrA&x0@i4?`9ij{pDw diff --git a/examples/runtime/shaders/glsl/cs_fsr_easu_16.bin b/examples/runtime/shaders/glsl/cs_fsr_easu_16.bin index a8452252929a11ca77b733b85c5540356aba8c10..66125f90af2cd1c1d6183389be04cb40c8509fd7 100644 GIT binary patch literal 46863 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 z z=fHh^{loknse2XhlmR^ohbOD91n^E$0KbqN0?%fIyxL39|8WK+;9;WCBgc~i^vd{2Oo zFa^HFP))t43tQlBU^&M$7fT3L3)pjzl*$;4xwM9bXf=m|=)@kHum`lcQLzboU}d%k z?7l3s0abQ;Kq2gb>>5H8j_jei(;j@UXD2xUZEx)1lzPt|sD`P!KQUM%PLb?kRJafK z@GbsWS!*f)$#!rZf7T`ZEw6OJpHc)iaMWD@+N9Y4SB$8{e<3=-zYYA+=0-(376lf_ z%8WnunhN|WN5g|cC`op^c8tG$Bk9&H0UDgl2lz5knh#E?_we^`qoAE5{Mm?gCNBv_ zJqQV{IvIDzAlfj9%|i;B4ui-~Db2;wQx}7vlw=TO)+N6^K-|_K7NQe_u|Bp@lV~a(Z`6!Cwl+DOh=Vh_Me-KwX*}EX#E<1xkSy>q5bpb!jmLCo1O#wh(;# zi^S%FbHq7&v9L7-f1%SVvngQvy)XsJ(MX{Xrr@t|g8kSO?AtE4=LX;G-!%oCBA4cd zQ|dia@N@m3>X9k15$oV)Zip8rQ)=*zJuq#E%SIekx$(O`>;ZMj9xPdQu?J5+D(!*H zwLLgdX%7q0$<#1}J)q5vibG5dtjzX+ER4b)C`ZGELf8Y@?b@+D;4mv_>Z{oUjvdTv$06(ib;%wq=XS9N zN`We+J&;+KmifVnN_$v{PVB*Aw3r{z=0?Ra?17cp9*~Sv*n@}kC}*(;vTF!YI9fa6 zAb`8>5H8j_d&+{JP5?JOgak9`NE1Wh{XuXmc`~*y(vyXbB8q4=C(ETe1=BOuk>(EB>oJ zL?Y(S{15?0uxtlA>;ZMj9;(11l-=6H5;t7t2PZ1+VIexP2ahf`mu+|v*J6HPWwwVh z!bo>9$uC?ja@w1?x^A!THHIHlg3AE<_@dSnl5#3_pT0fBV1uY)6OAB_Kn zX(*;X+7Y}=p|dbH^TsW`8DSu7qb%8%OmkAYv1lzw&TMn7`sNw56)_K?jX=7E#Sut1 z!H6gXHT(nNcj=6?HcbMqDbEU8<+q9no%n5pg~77%+lULZF8OU07=~SJ{dS4_E`Ga-4TCQx`xC$Q=rBGj zyEBh_eAp_p-wL2KAobdaM|nM}F(kVp4?P z-p<2TR`6aPHr>bbuxXbxU%vRpQKDbqx5~qIa^_(lkTZ6Os$wcYs-5qr!K%# zHWz3scP|s0^9p1ksd+{Db|xDM8DdGT`dOu_;)HmZ zf(;5=!Lh*XczjX&lKWuy?Si6C!$yT2LRnI*GLRzLV2o}iM~i#ytFv*d^EAm;Y&ko( zX>3Jt4`=KHVxCl+wg$M#8NRi$@t%B}ZAVodka-X1Mpb3F-r}4hqi9i8uLj>{+fh}i zfA?^1R8^YVP0r1z>deU7Y&)vzJdk@hv#NG}Bb|>%lropG@omU#*fP zV4OH4iN=<$vt8Un7LS%uc7jZjltjc95Oc81Zj%IC*pY;9z-LLec0?-}p~PX5l$}Jo=NgFfu`v!FAjyx5df@IT98$yTQVwr4#NoL^#&>}!iNJGu_D~GN%f%*E9=B) zT$8nUorv4jdCFzRr*py2c3g$Sg^f zvs@dTnC>?tgp@rD0+Vnw|AThJ?L$cJJcP6IM+)vb{{q`omgmlbJtUyuulOuuVxJLJ z79B@V3706~BPUsvxO=QbW1XeaV0VW7Df0TzG-fSW=P%3pQEoSQuaTrGjckx$8%S!x zdS%%jtrcx;pE-I28`Ritd(>j%$xU!2+Vn_Ap_e@(+jDzF-8?<3?2*o>Jn2!RkUwmQ z#>B^>Esl5zOu4PZaP4s#8T&e6)fuoouQM^eOKV74#9C6Iox;=V)rNROJC8(fQH zgB%_>yknUB1KVayn5lXMw&(Te30a(%d4*^71w3w^8Qd~M7H*bYvF&u&-=^2dw@(=1 zE7_Y~*9RwKH(9sDs@Gt9cCVq^+UwO7nDBaHl)c_20pR#-dcZTM&h*ONuM`E_^AwG- zTU+DnyZ{Y8b*ku~b2n=5$?)J~05R%%iG<#{p^=9%ffGh<54vLQH90~rmz8*0%FyfzstjhK(yQ8%z^$Uy$mr9H`v#5$%-#u2YqZX2b_vwC|KCfC!-RF8u5YrsQ4jFo_9vjtMqDC!viG(L%g*s{tS^2J)l(#mnk4pC>__4I&Zezwm%l`KpCxGbpi zyT~YC$nQV17@-cmNRn~9ky5V4V{*ZeG8B$aIdSm$7p(-3bBfFA5iUyjid}tjF}SqP zuyEm1c#M02i_Z{VLM+TDvZXC;P%d0N(ZXo)aXl~bi+Pz#uC#FRvwKThQR3+)wHx4A zH|tkUGS?GH?XB%(uYjOmn-8%gHgxfo2`kgH2+q%A<#)2f`n96gHaVa-lg%l{*RZR> zO7vo|OgLZ3C^;rmYOvV4O~$*n4$?SJlG?&7 zht0eC4JyOm*Vn*^E$BN-k`AOL$5D-&kl6hi-v);9FJuMMCD}339kvEnq}jS7ZAC{~ ze;CqMJVF}c?(%6iE7{w3M9`TH(&ywmNJ|fn5evIWs}-ZzAdPR{U`&L;5(=?(K7vK{ z#NJ^W)PUw!)>FO@DjjH6*6R-BR5B{I08Kd=XtF1ugRBI)AUgpX>$3uAv>rgK7(nw6 z2U^8Lpqo2^_6?>zm&SK}s8Tt3ccw2!7{Kxm2Uf*HVC~~kH?#GSXnX9z z?H1Tm@;zYvt1%eQBVgHzfJGtQmB;mq>UD1S9@74KzNP`!#)Z2D>CK}(LJDhAU0!;x0;5b5qt7xw+&T^F_pUFE{3i*hlJ8;c-ygwv9%0N@gfR-)o8u+pl#RUy zw7o2h8GZX%ZbTjzp!0{hQC9;U8BN90zt|JdK~@6IRu&sMT4LjXixOzG9zd%YK=Tg= zTE#=4hdZ6w6FGK)9=1TAlJ5acJp>~P`_9Z(jA8>cJ^%sZ*MwT7S?>Wo#{C&gn^}7d zpjnv~UY0t%%-WQ*pk>ceI6r+sFjm+>Rsvm+op>}7W(to+>jAWi0W|+`pjA8sdb|^8 z&(qlj8lN45O4Y1=O1=j)^$?6G>;uhKjA9G4Qapu$o|+?ndJpL90(851!vf)UpSqE> zn}N2R;00*P$v~6cuLaOSRsvm+od9iF#hwj~Z;>xRs~AA@4+mPsL!hsB0_|y7yFg#J zK%bKD0ZlywBMSRKvlXM*0{v+W;M8 zCC~-g3D8v>3?BeofG*=;y6!;p`e7UluXNq_%zP5q>b7w(h&^7QPkTT|9E=L>108WN zHn-lR8RhLJonvB~H~cRkSG*T#Z5~a%G7@5ORpzJKjj@F$@{E$+BDJLVm@QMyoqh&= z#lV2Fi$##vO9=9M1KlMU7>q%9ScZyaph@9Hr7)ojZCngpDB5Gq5bY(1_QcB$2?47V z#E>N#hjkC64IG%2=EEnqFK+&?T{^=njP!|fsiuV z7Xn%0Cjw1R4tyQZw)58It5q`ep06&EOfYSHb%|uMGWjY3g>j2#;3`6tuwuYwq_47zcepVg8_n~M9I9_mXE_6NJ=aPP&#hOZrdHC1(Kp{#uCXUsfcpA z&!f(>%(vFs_r0rFwCJ2PCP1uW)n4DauYIYiT}S69|LafYzyJF`|Hq&H&#%MTd^8zn zopxjE>Uz>!WV69Em!pebE&DB-4Hvhwan{^xJi6#T&;GUb>u}KGR(#+!qBA*K)@;+Z zZraYmrtP3p+6O*=u;Rz|EY=F{umLQA`Jq-8-ami6pnSyM8%iKJah($0m%CF>Ab zr5wk>4SD{>$fcx7>ikNJfBYH!<=w(A|r|mG`?upvfA^l ze{H!OjwaV@a!BDS)OIL0qDANYCyH9D?uTl2c>mh8mMx+7RtAD z4XPyM7=gQvhYO&R)gd2#*E0^V+2qcFqsBR1{i*TuPZzlMGu%QyoBq$1`pNEcIKTwA zH{*!OfKMm+T*$SbH4=xGm9+z#lt~MPt4phNX|EJM;Q9dZzqs()Ue@v`ht|C*(Ur|S z%S#Cd9Zdh-_3&mmUKDsS88_?%4Jd&_L0y2FkZ^s}`S5x;Smgc5lu#M!fa=0OvJSa%IUKnW~TrX zhBcTtUQ5oF!4!qXq^p&u^54qYthH=g1gK>@nVcU_7Wx`r6_HFIt4$*|Ff3QthM-ZV zsCmS)otLt-mIDS%WLT~+9d~jCEITDEsm5w0ok-=Yf^rxs#B5LHS==tq}l3 zkc?Eh;K0H+>q%=(?ixVMuS_66)`PW15XHrlN^y&uNY|VjrJN}jiUUZDq5a7wQxPOr z%FV=llX1(`Wl_Wia`>9aB}x;z>PKit=8K{q=L-{*@a0jVX6txQMvG!(ISzR;vt*g& zQEV!J<$^My`mr8tGJpxm)D!h%J=kOb6Ou8!`mr8tI)DkvbT{fph@12Iltbl0aRAeG zYbCLaB#vBhte?np=9>&)rY;L4ww8`0{-F|wC|B8$`6dIHsmu6|M^}^Cjm%7LFMb^j z@6Ir4c)oQTUwAcK4zKMMo`eWVbaFKQ^{;@6&QE8PU!s#}{4#Z(gh^gd=*eq0lgr_C zk~gS+D7CyOdG=q%~X73Ms z^I_2B_F~$b^={@rwF#5@zJu4zi-QyV|Dt)ZRFm^w?Kd@Doc0DEPkPr^t!49xj3|2b z238De&-LgsO~*sQyhqI-aVtA`(Mq7xrMy?y&Dv~}M!{vy zhgL88DdJHGL%!D}U)ac%k5dfoNWerpM?gubgV!WsqGdwDgZ}*dbu((rGWO@W$jUZX z(lS9y>QLrrB?1$P9MudFY|BJ#DIx(8q*p{ZvP7^m6Lq8l1Vm6o5#dM?aYP+n4Mmsv zY*1$lOs=lvpg&s7O>p7I)o6Hq`P~w$5|~R+bJ7*9Yka`1DTWy2;P7e`;Eu*~!M*9t zKN?&ZZ2lFW`6pq1mH!w2@PK|OLP|>b{dhi{X#wZ;hA*AWdk&7SdpFY;O_f8-x||-X zzc)s_0kzAQ^>O{i=7$isILESOor7{Lf66G~R-tV3pj;^18B=04ql71XE0i4`TMK1J zC^4xmqEx!RAct99P3tRmBv$cE-g85(S3x^Ud~T<;C}>A{&+W9#sdh@j)8Q<3#=UZe zO_`g~60W#6r3IycDYeAnf_wQ>Oa={@Oe;X`+ZmI!owNzLK_Mp7`Vd)1$T~%2O1~d^ z%eHlZ(o5_2$r$FQNBYsf_w`R)4LGz8m^`WE3R-B&v`I}@&_Z3NO{!Z)EBQ~frcN#; z@$co2C8nlWI$3hnT-I21I(0841vW4>5xy2kT}gq-)&VI0bx`TI!19p><{t#j2QIj> z)A?&%aRr=$g23CE58gK5?c4!xv)t4^cfpk*&tL1xEZ`J61l|e2I|jVtf_F4{$AWVK zC#&fGsL0M_Vn49NW^B^et1X(QS5~WFv^2dkOa;3n=(X-9#(JvLGTGz>S5I|PVL+W5 z?Lkj*k@YPA{Wjjf;75l}-=c^OY~Tn=J3w&*MxnHG2SqGlBScU-0g4+L3Zn9RjORc2*#fi3q7e5n6#nW+J2tC8-Qa+iEnfWGl84;RQvR z$X8h>MN9S|+Ew;Q(UJv-c9jJpT2+)mYZ9iYSV-OgfhsYTH+5K0lo@h$3E||*8H>|O z1M`omKD9ZR(2bM0%M7-Lf zL>beo=&Dkblk_UWsubmzUW)Q)Y+|gSD1(xMD_xX{Tx(xglnH@Dr>H0siVmE@qO4G8 z9>t@As3;SPj*!BltWaoT#VBD>{`1jfZbyHndl^jT`EuKtlIKtMTKnzh{^NGzX>(ut z7}7C2U<6%jA^s7S^ zAw*Wt09C9&0Ff0mKou(xKx73CP{j&o181UR?C1soJ>yY(v^0}4qKK4smT36#4MPB5 z6G5b;vsmL3z_&yYDdjBMI0VXokwze^ppi#LdV#Eh zUY1O0civ0Qmi0=2t0k|l)!j4fJv*Z&s7PUpWMft%*)uK@Y(Pkn4J?ukUX5hWxJWPy zAw_1fNH&T!l09RPWH@pDVYZ^uOO^lT8~Tg!F0BqpMPt%cRbE$k&~vS~2xJgqzN*5@ zaG+Nc1TODN1~LR8tg7yWK$Tq(xU>V|s`-S@X9p*p3$+}{dM!;#s}}j~n3iQ<(DPrs zF1y^r$R|E|?-~c|n*@v%Ud6`3$}lQ|#4sd0_vwxyIi{OWE*6m0EE@A~yFg;vKu@C_ zx}6gfjUfTcWtM|QO!(x)1YMHAS$EZ%DLu(NNfMZz){^ZKF}FH+L#j{^21NRlC~_-e zW(RLb5q-^Bt5FT~vbOw$9&bpG!uF0DLV-AVL+&c1DA0n|Yv0IHa-klwq)eBglLU#@ ziph~f>bLc$QHzMRt6XBJ$izq=zU(f0sWY-(ELVNb(3XjjIegh&{8DEeV#=K`5RYh4 z^+YYcvgT?5mXFmUEFTvyZHiiIUG$`-Ql*8ZQ3DaVYw6s#I1HKr=t$?jB3o_uV>)mvyaN->b5lkp}%l=Dj=peaK*iYh`{))NRf?h{f#eTHzf zSA?{9ClGG*`w-S9KVXTjl1=O~W4z*}mF6|OWWZ~YTF#1M5e}@wQk7e0wLCBpOSeMe|t?x4Rxz6x;2W`t8Y zz6x;2T7*+Mz9JkazA&5jy4&*j0+I}03yPQOrn-G#g=~C?Cs$#Li5K4sM?tr;F((uWoFnmR1 z(Noz1S>QBf8ns%)vfw#JQvxHy034Nu%<9Y1P8)`si!6GYTp$Zvu4GZ`O)Lu@5iOMk zc^1pkDU_v?i!6Eqo|1(D5r3oi9K%3&lu^7c>8k&+&_vWa~gUJb1D^0rkE*)64Z_WAg1cT%7j#XR4jwKz@@YBs>r9y zCu=L^Jdn>+P-i5ezt8)ouMNa7B3Y2>ViwCF2O*NO0F+5pTIaB#c|MR1fIg|LJF8OmJGOX<@MLG zRj{X`Kgq>ZU?&~|E?k8D#qV{wm}2aBHQ>VaSndmGL$AR_ljt(EN#8t8`bNs#=6sXj zV(Rtge3Rf}O84e`<8h&|$4cu6V^#Ceh#4X+|DNZFbGld6#FC9O7;QIc2>MUwj2)iJ z*wg^i`{!xs|9U9&tI5eI4V{*{`FJgqv2{ikHASIet-M86s#j#6B<&+v*DcMYaJa;ZxCJd~Guizr7M)(2M1#h@^owX9xun z;j76!S>GK*Si5rr6lEBfjqK4h%V{LRW3tvNGBQO>)?P(M8fr3qKk$H5gY$7SN6$g+ zGX(dw-`pAP&s~>h)|!=JXVgZK3A1 z1yeHgwKSCCCx5Eb;7KF-kLn$*D`so~L=U=l{;emIEy^yEGV6EOlWT;TomuVTnXG3r z;{V)Og?Q#{2iwQxmwU@P9`~y2^QzOr`FlFgk#B^j)cpepulvJLc-_0Dg{Qjk-!HuB zI0NBLH<%Wliq3z#@V1lng|}U%E4)r}j(RQ_S^-^IJmp^9s$(`_OW3Tnt z9iMma9|mAXs{APb>p$T5T{<=0n||@}`wEL=479=Fz4WGkeBC~0^e=t*A6~c5njFZ; z;g7D{dUFRoU*>#6;rk3Vr; z=lFV@spHpXK6k(E?^D~%={n_GCOGWD+})bG3^P)(@cd7+@1PHxf7ggESs0Z7R4*g&~<^cGTD17WfG~y z)r3ImiW0|rN`W4JfjHi|ggAIY$ckfMs8}gZJ7pghhaPcf>v)gqDRI1W332c!krl_j zQLs{+PN6vbf-N~qKL9QFTf{ovIbR&@Yb8+lj!&6HI)b8Lc=~j|Q>*R9_p3BBGF>88 z{C9-PSgU}D{9ee}Mv%i-2ZjHF(MrDU++ttoiyVLf!^WFY-4{HbBHUxQ#ZlZ?eLka4Y z4_#hTLY9O@T1GD{A_@I_mw|*5JW4{ZqKJfeDKue5W|$735(#wxMG~3^{yEzN2_?*w zgkF&m3Gt$7k%Z|`E0Iu#S|p))Zy=D+3&_(+_^w@9G8ERG$Ip6ggkqut(cE;+)^GBd zA{m9Ah~!0{(k;%7qOdEL$HpC%Y_Id;r#WpRm>T812v}yGq7YjlO>uwb*v3>Y@2$d> z(j>xZg*3(8nXP9|A8KAN@kNPVu8H0$l0|pv$?f}H(u>>Q=rXVRgU*xoGu>}dK-n&{ zDtqr4-KWE=#?xURk1_1B6!v`!koRTy&u`+rn#~>p?p_6r?**IoYmW3R}h8 zZalxz=emREEx6s0g`+47k@h(T6jmFKuM(eYUXjnuV8ZjcQQYpnwwB^6e4h4(_POqF z*yrknxpMB9AtijSyA!j)zxKHvPbYn@xl^83WNtqpu+ryx$izMuRw~aeFZf)K(!xAP zpK7&P<#Wv|^0^tFc|JFa+pY6fS=|$6h0oL8V4q8W_Ltipb_|qb{zPUk>t;QCDhr>- zR4T|X{b1^k_!L39c@d@l%%-q{om8(PVzohe3f>vBdN z%ZTTW^GkE!zSCix3%}ozOWgZqVPvs=h8N12B+CItYXguuA5+tN{ zNN}n+yqdiHOM-+3k-(GXhG?uLw&kj1@b)N8O&yyV) zD%ys!h6aEqaq57T*tZY+>cq}=vp(`9?{{znS3JsccVEg5&9ZU5-wAwjGJ5|Z zt(ZdQok92?n9%p<=|sF4nnY1P%pRD~Meb=o-T!v~X^SoeqQE_ASvKXK)#4~l`*07% za?&~bN$2o$G%8Zopw9{>ZR(0~} zjI;zcBYgrdBlURQspb)fl5<7ub0(RQB1n{xN_3W~$n~3)MHp=;BSoh; zBYl6QGE%$6spA`Vi^&4VEs2aYZb?eAA-AlSMHp=)Bdt@CDy_^&neF%)sYb);jI;zc zBYgrdBlT>`&q$vjm60V=S;HT_B`MBgADde zLI!$G6i;Ws%XsaKOcvNeOmx4#Megar`gJWL`eQ2!+3}v4^Sx&l&3lNY$fa@*O>}W~ zmnmvaixY|iG!HpwFW@}AXW-wPR-TB?IuQ|EQyvM<#$F+I_Ff-3hGesM9ifbojN>DC z142t?JkK{Yy*LRdv}8U-LNXOE`gXexnb2_7b2@ZB!-O0{fw8opzAKV~Dj7{QQPs{4 z{x-Qj7+>m_$@FKgOd+8+_bL47RVYacMW7$@lJE1iGQ9k)k~tv3xI>X(YfM1Ue)00R zkOYNMkzoHzF1SL1jl`2&v?70=EQ}(i;qvd!q8092d72P~(ZnMm&y$5{30#qgCPZR1 z@kq>w(vpZKL}E1YNKBWfNVFzD&Ws}Rr9MY-{ybse5wtgIs8911QivL$Fj~a^@Og+9 zpfE}>h35{3LM!n?-t3f;X$uZpmGjv~)C+mBnfVyyls;vq zTqP2}=%A^(P2e}B50g<-Eh;=zCaqhzIk$EVCsZQ{Mf4>qM4gVMH$hdVm%C?Wz~4kz znX>N2ln%XkhU9+@SD|}ndss{Hb+HtChFd~S^vmKp+thjrN21efI0`rB#B*Lt0iT7xOGG=JDJx~`N;~3T4jej`rEK3rJT}30_ieh#u2j9tdkkGx*4&FgAOnCvD*TC z5uV!X7*k)lO|@4loO8M5a8qma`g6)wsvOa=eeaE{q@e3@i3QOEq);&fVLC9`R~j)d zidu*wT@3`4HHidA3g~Vjiqtm{ROWmL&!a!iVxKDC+K(ZqZD*IT%qPlS*TDb?EFlI7 zsA+6qsU=F`K2Qfn5Wff1h+2o*I3Lu3{t^WNH6mG4Tiw+jr}6mRDC<@p%FgHx4(@5D zcYQ@xD|l@h6PAq510`oLyau{hPN8el`RHUUw`#3{E|yj3+O$488Plz4Rne{Gy$rPA z&H!E2NjK8C%FBICTcr}U-DH{S8DbMTdk}kkM0es7EADJAY-y}UsU$Lr-PrEgZZH}03cx$`N~Xt0qi zI`iT65ce~qTV;%lp;YaEcb(}7J%bs9@3)|`!S#0>lYBDVKc?BG!cU=&$9!K%X z2`0+$iheO=B}eK93phqE8(5CqvdCPF7^6d^t{X|#4a zH67_x0Ey6vee+4lG@;ehtW#7_RPdb&0(;jfBjpicOd`C{?f&2MLWk=H=Fz0oxR6(`oFQ)d0cx=YdP6Ry56GuMbDnqchT(GGrL2fe8ck> zd}E|O*#2ejKC4eBcln_H%igD~w*3+3cRu2*y+I=~s5Pq1ilAk1g-}w67)B2GR^(8N zQ5%+HDYm%3x5oJNiLJ3*k~!}AZar5P5`>>{v~H35lg$Rxw8+*;i&)N-o6w~ax zN3Fc~ZyJ01ZM51C9xiL{@9jUvPOG);Y3-3mz)Xg5Sz zdJcXF&ws7#)_5hdyNw*#?dec<=L*dQAiHzMm)%|nWoHL!+3{SBN^mQ?byhGH zRy{@))B8DoMy+CbbV^0_azo;*S+`gwouFS#rZsEWt2_I#Quxh%R(0TJ7PYhXOf};m zre;>fsF{hES084>p&Kx&X$F6x@w(YE?^R{-sKH*8W;e9gp+?+__0sS#E8>?Eu1(n(tM@=9DdMvH45^99AlqMjAEt;Ag_%jy9D zi>rEm7WWg2>qJ6&2!H}!7|*!(<$FjVw2xHB9V6J7wg}2-$*w;}uyL&r96hRc`;BJn z$$p!juQ&CX5{Dl}Y35V!*>KzchyA=B0eH>PKc)NnCwr}@PkA>QbK{hPMfaF3)nm3Y z+hbaD(fGJne;Erp?8Nr9)p1XwIQ^zdRN}@Z&cRJRJ`(0!A1q% zP|ZsZ83x+}FFBI~2GdBTLvpwvjhp~18Z4k;$TU4Ja2jgH=^=n_$joJZgy);yq7#Nm zdeP>Wt~yH2!sQxG#MRNm=i(YtroqmF)t3{h;wV=cLQT+}b+0cd*&1VA?M&_~eRoQi z%MDU<_h9MR&b%F82&!Gx8mz)J9R;y<=izcQ(ku(Oc3g#NDtU-$mPHXYRBn9r3!=Gf zj-)mB0{dYTHw~#pbZq&12)KTbvmx#BVo{WD)Qro|2zZp((BJX2Os|8#nox7k_63bm zN2Rf6g1E68dtAp0gi({PAlYaRWhQ@4hzL?jPL1OySOP~Bpl-m;v2frX-@9?-vAU_L zOQ@SjOfxQZMBPN;q)Y4PWmSbqBDmVQ41QFdBx-(o;^q7Ocaq&5L_vVHrj1%eqktES z`sx=pzB{NwB#8p+OeCdeq6jMQo1zI_kSlspr*qjNI(g#sAu*nxGajBAHi?9enM?8f z4oTzLtT}CQ)WXfr;(p9;u7xS=u5@#Go$ui6 zX1c%Jm)8KDtqf_YJwG_S8s@!v^S0i;#VwV?tI-eoTwBi3MP8(`XlKLAGC&K_av+l6 zmVFEC@jtDG>1P9#;3tvfVl*vhCE2x|VGEJI4E3Q3@J)=#^x&XRn;lGU7a5{4db&UtLMu=wKr>w$ zcDf7Ev}%M_pk07w9@a~sv8G4U`vNuDJSlaEB&|z|gk>g@w7@A67VLC5qs^dGfo=oH z9HCFY>>enZUcFz(t))Z~aD%k$HmuB%1BzXBQ=qIIgQm4pPzW}2q-KuhTb)+h-~;ekAhd5AgOw>A?zjB!fBRd|qnByb%)#5(S~n+YCl zs~>vHm61a6K@X?F;z?T&#;U+5!C+kpV^tiKV2Cc*q-RysGX~yAFVqDXm2^pCh%UgW zq)Qq@bh)J$EXy;Pbm?s;yMP}+UPXcA6%Ar?EqqD-xn&k_R+@QDqRevd3tdVw zEkIk@1t_!v?ElvPTFgqQCkar>GL9O9& z{9qpRKAql8InCqn!94JcSjgko$>>rW>S!{~wop<$o^l6x;bFUa0NDYSWCBrPf^se^X7Af~rR!ECe^-XUM5K;>+P1q8R1$bMsXen zT>dw(D8CE*6}B zr_OsNCUFk!5`97HjrC;SVLo7Rtd#>IZHJ9w@E4pL{P0zjTdexhre2C=KwI44(EZ_Nu!_(1~{b?I_6vp=qfV-@gx)9HHBcYhA9r?%%V&{Mlfe3_v zG#UYWn_v+xJKe$A_TBT|(J_vW`REWwxcl=SoAA__V<!aOk1cz<|v%ZxTFWeHi9MtM`YhXZY%3FMi3N3Dj)3Fl-@X%Yv1`>O4 zr%R{ccSS|-B4dS-Fmb-Nt?20wXV+V9_;QDGj>)t@cwsf|$ z>1bJ38{Cc%tL~K29Ai3Zjxm)q$8Cfo-?f=e<;}U#w8pz`NT2zFx=-0Jll%L`oiS zvbGpY$vSPVXzSv(OWU>;t|*6fYU`?>*R-14|b@*zlqU>t6iyX)^X;+YT&U^kBn_9;|zjY1E&SoXuZwk**y(f{@uxyYz1%9GkrWj;-#%k-1L0^lu>?o4Wvxt?j^(nNGX( zZy_9;xd4u>OmOD*eP2v>ih+o8cA(GFpv1HtiCu!Wzv#1G+bezclZ&7%d%B0hZE-(} zfdbrXeb&SMpwD`^%ESTgL@af>=e1S#leTuS`0{Nu@=@KeQ_x?cYzKX8(1a_me`T72| z{=xbA%W3`NDb?bYoP{Ux&kU;odvsd=CBin1Kc3dFovY*1`h+<<#xtd!b>Exq$lv#3 z1@-&g-g_@TVH@hRU*al zi>)scg!hW@J|bKyLViBbSe>LePD^pDq`=<*>{v;GzbPq>_e2W(jR-}GW12q%wm3{n zaj2xg-vI1TNrAs9DGrqs_!|+56o-KnQ>0;ext$)bY!S~!gOWXcQ-q<)CNEx0&+60T z`t-0qePfDV2BdmM0gXu&reN3!U6pB?#@2Z*%UAGTCGv|3eXCB3547UIgA$Ar`2hBp z1DF7NE$D(>$eHnpeZ-l>ab!wymPiIe9;^^&I;hB*b+(#0I*T=oOvRi(-6_uM0FiW8 zL1)p7)}cddSI}8<6sq!wigc!fsyc(IW7G9?7S2#rIIDxTbT&41IkQa08Yye@ND#KI z^RQ1JD9#e8c+T#~JflB7L!W_vunP#{aR>k42qxOWKNOU9#MXP$oxY(9Z>V#{+>_U* z6lBhY6trB*)L%||Dv!H#wiIWXVCx-O%APAn6w91fBd%0otj_$qSw2kqoRUEjsSDiKq3`dGx5w(Z-yLHQC)4fnbV|4Gcl&r2 zQg~wrz`<@`rjz)@C_)jBv-NNW{TQ!l<0p`0_e&hRn505&cUCA?WQk_u!KP?7TJj=g zWD9+zqA^VKFK!LZiOgX;Hyh-5pFq(>N-aF4vaA600lPnWRQLz8sm2i=B^ z{@{X_0UA;zf&R&PP(r7?ubao|fVZaHbihxO4mb`+wl*b-c}50nHa2WA6LHbVn@py! z>ZKA>IJ6OpY-R|5Port3oIPqO%gG&daZ&bgHepe2iIqFIhMR6;xp&{iMQ?*XwOA6^(;dbAV4eQ+)UhekK-2R?!wDUQu)$ADUj(7XVVLLwOv^zw*!`=R2*pAO( z1c3!Vxh+m6F?)g|)^@Q1AI+7`q(!Z7Ky;RMtCpRbc)mS~L>vqb-n zIi{umyd-m}*UvIbtXk52iZ5@PMlG z3lFNwuXBDqrndE)s@zy_Gi&fC*c>{W5)X~8arrM0`7b?^fG4Ulfx>2$-EP**YFmSB zyGv;N^33^SG8^VUy6?~6IaeBf`AAdIj8P%3Yt1+KGB&P9z(_Sh8}ai>0x1zG<5WbrP8|8l^VtfXqI!+Vv?=fi)nAx zyP0Eg6py53?$3KXZKSU@{j2!tUTyhT@sn1btx+?qmy!mp?ER9I)^Gg3zrHvn3t?dk ze-@+3`1^0Mn4Imfhg&(WznRQF9?vGXQ@WCU{dLy4t!KgcdpQr5PMCqyD(7p1fe@`} Z6Y*}gfBQg``;DM1v)u>E@~^Ew{XcI7Pi6oB diff --git a/examples/runtime/shaders/glsl/cs_fsr_easu_32.bin b/examples/runtime/shaders/glsl/cs_fsr_easu_32.bin index d778ba8d5ec1d4082fe424c27b33798dfa5cb84d..75d9388a752a7ce536296111c2b4c5c7de857bb2 100644 GIT binary patch literal 46863 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 z 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 diff --git a/examples/runtime/shaders/glsl/cs_fsr_rcas_16.bin b/examples/runtime/shaders/glsl/cs_fsr_rcas_16.bin index 94b4cde53e254f747e3bbb12c673f0075e501f86..ea5124368ada77ccc481b48036445a8e228927fa 100644 GIT binary patch literal 7769 zcmb7|-EZ4A6ve&nWytm?41*r!Hcll{Uqrf>t?L$Gz#iIR4?|(NsgoIV?7*=*C&T{t zopVXb5+#4sXc0-&Jv_V=?@!c^Z-4oE;C{~rUv0+slhx$z;n|mi0si6l&DG+5vwk<- zt~aac;EMtO;rH!#gTZ|AxZJGc`SN-)A3w~VrsHk&eN<%UQRC7hE~Tw2PrNdWW{bYvqY zJzXy5kJ0RIayy0OZ=3aQ2$yxApQhJYlg zu1byWrrUcJkLr-*{l(MpQf}KoOhx0etZsEfN3UK* z+2%Y7u0PuAZfr9qh?K3KaZ zIVRC+wSnFZNtC)w`j4%>T$nz*pE>s@9L=se0G6`{dkwhbR&Kr3CGK%92f1mSuVOY505iShz zv!waj}|MG@22Ry1v&27dZ{R)AT|l-A1FpJS;;A8lwEKK9)!?_0 zY6Q6XV&t!r>(cxpsx~%Rj`^9&rMe-=ULW%c*eU_;nrEmGmoZFuyE#02lJ+I z=Ft=i7S0Bm+Jefy>g`a5oTB^+Pmv8)1CwVgbT}w{@o-s2FpV~Yt6eZQ2MjKJuxi&U zl_oUR2+lCgzGs+VaOH!uFgRr%JbZAg*cOx>x1FX;eKVN0UGP!cifL{Hi)|Nt%(hCr z?R^lH32DGdr70@c4x)1211H9@^z}njW~!|!^Wq^2)q>SBL^I=hQ~^<$zLuf_k(xen z-lvFZZz(cpFGQ6}SVcWVahfnVgea;jZ~IJ$QrttqKhb$1ueKtH(Gj9N7Lv&Q=>0T^ zqJHlnO5+})tXiZNo>Ptm2Uu73fGdqhtjZ3e3XTM#ZHdZBNG>ViwYc7D2@BDF2~53J=Zi4|$tRwChFCGzJZTzc-y;qf*)bK<^WQ&M8 zF?^}sPXviSOhjlL22)F;pNKk5_y`>K5fTwWe6>Ctgq$4MR_at<7*3SvCnC5d!nK$DO|ngTrF9TejlGqGJk0hly(1ig(AV5%%_6cW}Elus&S<}v`7Dl5UB zG=&c3H5*ZB$ZSMe^K1$oR?Y^R0zs3uxWt?~E+J8*1IHj-LI)w#jFJNH_oU4FE|_#c zu!S1k1yD0exYP&+fQ5+A;nHFre9uJ~tXo`iw#lVaY|HCX4K-)m1s}C7uSU&a+IGQ5 zZ0n@P>0TmoLYky8x=k9M_mKv1tYdqK$eC)Z%DmJ>#2aM4s*-9QsFH}BzLsJpFHSo} zocH=vQi5y6gG5BaSmHbpnLiFPB%-$4_0J?C#RDR0UCEwD1RW81EJT$1(fdh6WbNG% zk;a(}Y!9Vsk$PBO7Cc;6ki`|QG#;@kJ0jAN5V0kJ>SiS@&SZ5t35PS0uteM=p`3)g z@}Tpo*5V%DyRbyG5)C2>3;kZOben8TKAq>J!(Q?k`53sr@=Lsj2kJ@B2UTs-!vJb& z>>;1Qcbh{Hqeh2(M!plCXufwZsExcBoG8&xKAk&4AeRAG&}8w(rZxu9WC_8hHU`jS z34z3R1ufp#6bc#(DmI0JvRN8qv>}^yA=?7m6bKfHGmof1u#gQDqe3=A(3wY5N6?u^ zQy^H%e!AX~F{h3{%m()$_#p<$axP@7{_{56UCaMF>p#|s-=qkM@yCa5!`^{*8EJ%xE@ujShal?t=*+A zao(@k-d)nh-o2o%GM2cSe8?Z|gyhRo`O5vd6#2v;V?=w7P)go80yr^c^mA%51CP%2sj(l`v$=8w)Z1HLJ61A4c79}kC_DE!| aPrDJ7HRkMK)zvO6`K*K^-+yOkgZ}|4sc6Ii literal 63907 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 diff --git a/examples/runtime/shaders/glsl/cs_fsr_rcas_32.bin b/examples/runtime/shaders/glsl/cs_fsr_rcas_32.bin index 886ae30b7f51c16ef331b93283bccd63358cda8a..c5d848463e1c7c1a6f5072783caf41b6738ffd5b 100644 GIT binary patch literal 7769 zcmb7|-EZ4A6ve&nWytm?41*r!Hcll{Uqrf>t?L$Gz#iIR4?|(NsgoIV?7*=*C&T{t zopVXb5+#4sXc0-&Jv_V=?@!c^Z-4oE;C{~rUv0+slhx$z;n|mi0si6l&DG+5vwk<- zt~aac;EMtO;rH!#gTZ|AxZJGc`SN-)A3w~VrsHk&eN<%UQRC7hE~Tw2PrNdWW{bG*)+)g3++h)BR!e!m(r|EST`2qi_-^0$QNs;n}}u5q>xGGod5qdFvcfAKWDl-o8CQ_;9AE8He0@rT*^W;UIF{As&hO|IAR?R@+zGj+B2 zgg+e3)$5DxIg_J@9F)ENYVj~#txt~DHhP~pvXu^p(F^AZxBanP{r&T5xw&WW(W_Tc zwmFZ2>yP%j8{5o|ElrHV;N&dkNL{m}ahzsZiPrUWJDtCouCM=!n-h5+jV1hr3x};y zia{rVM$Rmss4+s~l0FS{RHNH*ksl3067AUc^joH1+rl+up$v{)CJA#USZBrUg4#tDc}GyYC^UtF+L=dFN6?us)2^U1 zkET#Cb2iWv2&#fncUZ#wKW0wP<&=kp4`QmZB(bjE zB^PN`x^#IfBaDO-@;r)@3zbJNkpxwhOhTMqB+P_ z{4p3~Z{JqRV%p3W>mO$8hj+_2#89kKWy&JcdAdRBZR+#RCf; zRvB}#wVlEdW?LJ>jHTZ3$ z8Ub#;82Rhux-`Fts*O#SV}7P`scs0e*T=j9wn~7z<{4^I-s>33`&{BJM3pUG2LQ-; z&!K*ZDqF)&)aZw(Qc}teYwYml%~wp`;h@@lFGQ7+LUy9W9*7!UF!ju(pG05Yjh1PY zrhq6WOX{eAC??~Qg<#oXp2@PhsUzrYASx8hT~t+e9Of0QE3{IH`4Ev~m(!a}rP0#(qu zz{Fb@UW==)maq`D5>1GL1lR>xlcsi$}y)8~>_d?^UHHH9Qd!*&?D& z3}34E6G7q+6A>DR!PL^|C!$UhJ_3h*ghWITU#$-ZAtwj6l{%Fdh7%?Fi3n~9Ihf0U zH>$Mckft^s&?MxLrT`Ck2gSI?Ol((B047ZxL2n}jm?}#fg@knk<&(;oxeNfN%1W>& zO`$`1%|=ujG8<9WJexv?m9v4SK+vQuE-|N$OGp&yz%dAy&_M__qolz5Jt?!k3nm>9 zY@tSX0o05VE;WJyU?C!OxU`rD-*XWL>lT-sZF1=p+w!_pL(SQC!AEV&t5GwUwq5WM z+d8Rnx|fKYkS1x2Zj*-ReWXDg>)0M5a;Dm*T}Gg)0u!r@FLED`reC?_GW zJm|ctwYbOkE-VqPM1zRJLcbR*-6q?TPv<%5u$O#BJ_hcu{1WfsfqK&OK~&xk?({jn(y5UY9lWOCrb2_Pv?#h$YsD4G+Df{sf__NSwgU>jR7=S zLLjkSL5nvwg@VR{icO)QY?j6tZOCR_$hN>X1%gH5%p)ogEMx=4sF2MNbmr025p?F! z6bP2GpRRXg%&FrKvjP6-9NPiz1<^qOFI~#sxf$%?gF2HGJ~Eda^6D}#<5=2M6sr544jggYN=xX(Ng7p1UI0#H9ylbu1D1>R&Ad}Yj>$j zocAlXcbBxWcQ2@`j3urnAM!^#A^EaYzH)yq`5+#UFH;FgI~GA9)kuyl`FKBiKZ$&{ zZt~k1afflp`wS0Rwa67LFRIyfWv_6h$q}luBOe`E^0g!cTYOr*M6KnqMF~s3JrbGg Z({4m%jX675b+rpiJ}cqK_utvs;D7ISXu<#h literal 37415 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 diff --git a/examples/runtime/shaders/glsl/cs_gdr_downscale_hi_z.bin b/examples/runtime/shaders/glsl/cs_gdr_downscale_hi_z.bin index 282a12a39b80d1d3787fbc8bdc9ff274c4b4a057..24829133f4158c2c1a9641f4fc83fe259a9f7433 100644 GIT binary patch literal 834 zcmbV}%WJ|w5XNJBOX<1SIqtS0m{jaRdaBS0g+ledtjVein_bC66N~?QC%cv!6#5tv z*vHIozWMfP`f}wRqUT*#OzL%2zR#v|CoX!PhabkxrROQ$n5rboBwVoquUQR`5Df!3 zI%-ajcI^=bsYkwFX}K_Y1{;wKpwnyQAMs0RG*y%WK3-7xV&sCSMym#7 z#+M=za@#P3alTCb-9{g(^GDA%*9QYyUk@OegeN$C62Q(GKGvwO{o9j1BS%O zVqnn&Dz)wa$}OOp$7#yp%cXh#X`bCHbK_P2Jw8lIl3 zndsm!HyaEo4Qt%CO@5URcg}+-#Fy`feVi?-f7TEv`k~4GW@XUx3{o&@1Z_e6(|9yLQ_T5hAMXECvM>B7wbW*Z>vE^nY z5}$oxxh$(ZV;ASMA4D=|FWycrLh_=)o)fNc@bo*^sBw+hp=)&D8aJ--z%@Q_4H>2q z#a1O{!?y0RB_g5@n5ccrIl_==G$i6Cq#qVzSUegQ_rluH3Mnx9-v(D{RwAEHQ?lA% zqKOL;1vNz7K?9-~7*k+F)g9=hx=G5IZOZ!hTyL)RW5Eeb%mUgv6Bo@OYzC3wBzeFW9Pa5`!sm0Xnk zUTei5bG8haeGip+CELj=QHAUsqU6ecW&*v~PfU1Fp`(P3Y)aO>Y1-a zBeEGE=A>lKW0t;RT@7puRzf?O2J38KL~73yJDCRSY+yucg}0MwuYyqo8k1BdI_=61gGdrnCE97xL0~YvTEm6G!mT<;BlK4-ZEV)x;_zFj|d_U3i zBYf92EHLGH?SUs&>+7K2*>pfRU^Dm~=q{*^$3*5%B2~gadQs>fDC}`rq6vX_(0yi~N`d|is(1diEe(}!!2b^h?^#A|> diff --git a/examples/runtime/shaders/glsl/cs_gdr_occlude_props.bin b/examples/runtime/shaders/glsl/cs_gdr_occlude_props.bin index 5a8de54c758358a00882aca20f7dcb649e118295..ae574f0a82f754ddd0d1f86e83285ba4d50b9894 100644 GIT binary patch literal 3560 zcmbVO(QfKS5T#X~sIL0ZAJ|9xhPZfbz%;3Z51)P|o|Aa< zsmTAifaF37KU5;go~rWCzdk3s*ew2TEy}q5BZ|^$o#feF{8au;ew3@H54~O*Zu6?N z(mV=Nv4*jz*^g}O4_HIAg~)A5b|kS`l3n-v&vE24;g145Yj^V`TL8N6{AYBl65ZAp}cWtEYHN+6iFF(rSz$Y7fBSB@%l96J}t9mA8*2uTa_it zyjZCc9I@c~pk0Nf&kPfcLRN16xU5CCh>pZ9k{I1OTs@_6!S7fHTd2QzvS6z)$t+v9 zXP)ONbsTu9Tgj4HkE!@I&F3Ks{tPaaVB7tjQ?naJb+(QYacbL^rmEfKM7BeWhTsgZ z*hhB8p^8Wb$kbzEGJ*kE;q1$**z`c2E}2`+oO-)sS7(+;t#P?b^RQ$hkUl3Pr#?|l zIfa92d#VbwYG+gu<2nBjok>I$a{d#55yJaLOYnhgHPH8ODCMF(AH z*p&Ic>MFOWtSybV*TAHq!Gtr5_8*`iMh&mk(+vx*nVJlO@Nxh{Z|FMqS$9M{Goz1D zA%)do89AK|2xTKAdC)1jW65H8ayAC73E{hxBt>d#1r!eL{Hw6GEYjoclHmysKeGL< z<7{oa`MObbYx^P!BSau0kzX3q?=`dG?+Cfd-FF-PA-q83W0N7U0bI00NF^OzQrQ?- zohdlrPN_jriX9O1NWQiM!oaO7s-AwP$8J2l!2^Yd4>g{tcZvr}g$K$`JbXx751^2n zt!gc?3X^_?Z`4%|zZ9K8bW$O%D+J#ihZH6knLuusfopKE1 zqj4aLAPrSfk{!W?h)S>gnq}VUGJbj4?rW51Ws+5~k-i@0MDc`sdhUE+@Nr-t0Z6FD zOmK-*zJShzTb>ghvA1$ z!;_r0gNunlYb(9Kcj|;tOyMzMhxYUT)=?hk!G&Bl{H%>tu}2d znx-#XsY-d0J95HMO6oKHu;LluE>9!}YzvK^)UiQL>5)=(E=>5D~K|CVQq>ugmx3>FOgymS$q>jzIi zjNIOro+^wo57T0q6_G=tRE;raH^Q$tQy%L6E=7U`aoDNkGd1X6aZk+`&)SbcEP6)hJ0_-NHy zMh^zRb?4 zhUcR&N5YPYx|V_R_BjsIKY$5h4JMwCiqkWga>0_)hZj%n-*cE&S3HpcxZ+gE`7|rF zjHNOpbH-|FBnQUj1Kbca+7zkpxg0s2E*s{60g8;v2dLvi?tn|b!zJ}ty~tLja_g0; z;>X8lDki$EkStL7ms&>@02x>-RSH_L$jx!lHk7vskn}4GQwk0jkR(IrlPOabBqiN6v0rQ5vUOJ#F+nZArgF*Bl&%`=^2mPC^!N7*8+7>P zTcLK_%AUL}N|NRCu1|JmZL@rfwH2@wC<@i!I9O`|6O!pCYH%E^wSWo95U&Qu!P*O$ zpv-Zj2D`Wp&)X6z1&0fmKeC(aj)7Jyo>56X(ap-B2D%tZ$ z&f**#KhN)8ghkY-6yai-M7eh*ilB_@Kc~~AqK^qz(X#wJ?j_+mt4gORXZX0#7Zbus z?=H?=d{PK!S(>cHq?*s89Pcef8K%?dDlEfS=?gjeMdo;0c5{oH#zAP$)rhk^Tus9y zd8LpqvnnkOFn2hsN;f`UXIFV#Mz+}BD3X)braxz1|>nT+>X3uNVcd7BZm03h$=I z2{8`2@<-OU8@dl3&612 zx5Fc!1_}i9uqV~4VVr&fJ@^L56nkP3ryo9I2AuGx!9K|( z{}6_CBODIk5I+#2#S4d07{hWn#-C^6C;T}*HN`be;^mvHfZP$NLfw1m^+8_k!K+SK zjE^2DeExo->;|+MoMvz;^z-V8Zia(3p_vg*2dzWKh`q5#;0RlbsfI2LAdQ}yQ46J} zEjmrmMGX*=C(f{I&$rOFzz`C1IUM`|UHsC!Su;ZuPt`BuKIq&LEjk z*kJb~0j5L?^jPW-6u$b98`VqCIcphnVe$GxXd>V&$7c*8150?q2=K`Y6TJ#0->kOf zvv@%aP7p;X8!*jKzr7Hi`2Ksr!!-|Gq?wl6ie!vl&VH%1Pzr$2k*x7d#nF^E+N9E6 z?P;%U+E{@vW^}rX3p9D0`S@Q0(I45&v0MPq+B5~If_Uj7RgX29S*|bcW z1{T(Qe*q&@WBkKQrb?3!Yg9kUP(Wq7*?(f>GOQAF%YMHSUFFwuqg5i5Ow$HqUfbRfW661YDlE4*l-h|$pWoUEztH97=moet^h?UWGNpT9kO$ky%(i6N1XZ#eU2hP?apw{HjL`7rpt@Ha&qN6G#!O?J`#!#9Hg{n7KodcS-2 zqhuRp;U@nj+usI0-7#WEu zSqz7UWDQHno+jj_IOJPb*&~sK!8T3e7qKpOyD*~#hdf9&;U8JJjW$6Z9&UMJ_&OBy z6j73QVD49o;hXSXr_0*3vi6ikdDvy{V~_{G7kR_hW4LjTwhX`+a^_x_B?>{GU*K6L z=j|*LV@BH3E;AJS(u|4PHVd9ep&0B9?t-1DPaA6G%(|%Uin^^#NkUn4$ln`+Fz+Cx zG1=*ds*JV#Seh)jON*o_3MW8mrvWQ%DMgMINwiC|2f^;Q3SiNk?J5FdIQ$b(3hIQ* z!-s$GrR~lr&4!O@v=t9QlvpE^lyKdbSCrWFX0@zMUPcQ}T}CN+0`+82?4R#WQ6+^K zi+$|>8mH?ZUM7!Jgn5)E%a4<1P09Nr@QTn_XyKo#VDi3-?iu#uwXlm(!<46JF$`V^ zr>N6<>a%D8YtXWvR~}d?CO0>NiV~%({YT;8%U5$i>T`}W*K?$tfGYsm;JNY^`u#@O z{Ko8rzdS;Kgsl;?zw$5atb;6z!pt&0V<_4Q>qJ<^&pM7UJknHHQPJT`OEgE^IOuSt zMh^&Y-mzx{p;ycD2|X4h4ZyR}HGNvl@k;#%-mZL#kuvx<@sHt@V1-+YP& zLWQu7h13u|y-w3u_>RPePx*a~#L$Zn9-!Ni)Y~ITY3s<060ePDj}~?6ho=at zRtfO2sAQ^C!Y(!3E6blE%so22LaYYh9hs-mB_kEfb?wkaCLt$6rD4q$^p^Nyn^Z z1dMbiIxv@ynxlu*g0Fjo;`6BN$tVKu!Q5UYTCI``aq2|V#FEci@E;El@Zd23^h4_7 z0MI2%Pw8Ku?vs=9T884iCxetr)IV_rv*>GjoIlnnAfZC>hNju5*z4f5M4 zKm3*cjdbq1v`wCo7iTPSQo!2Dy%0jKT8+NjHRh_hH>b<2U6lVV3L_C$PoJ;txSo#; nQo)?tr5qG7N`DCDy%T9JFD{w}HffSaNfB0~<#F&f91i{mSoq~< literal 6825 zcmeHMO>g5i5Y1Wr2R#kYiv^cFMen_(Tt6rPVMSxR}Xewy&YFyyZRkhf5+7Y zN)_bmI4pFv+eWoqNU$A2uys_;9));=A)YNmnqfYL`GaA8BdiK7sRZEPD!7c2g6gR` zWvdG2GHJr&AYG_As8c8f`W&cBH3u3?U4?}Yt77|8macBoO>Q$-Fdp&JAvn_yu72)BGmD6%lg*J& z-i@bs0otaxEi^o94_!6n?P_E|3d&W|NiyeYW1c|TrW%Q*RoChxCqvcZf?r>)T8p>0 z_?@i(p!|Qmc+FSMJhsDndrhS)&RWdN7LIX9{g1I&iKOV+MWb$b6EvU{4vD%4)llK# zsJV#6ys&3!8Utod79&vap&~0qHCTpmE*edgUEwVR z(*rXm>RJ}c$LBCizXubEtuXQVpgP?OQ!ZFix_|N1{#~1Cb>LVQ;J^vU`6Mm0jjghz z>K&`8ksMSh_i#hd*rv$6lhU&XQ`XEO22xa|+(R9|P0q`%B@#!6+gay zry`=;2+0Pu|I+IK0Z@QZsnXDZ#l1PK+M4nv0g`@2fgBtLTazFcE_YHbyv8*gSDT$o zn<)+b0+M9t{bb6Nf}~}bCeCZrEk_TjhzV-st&~fVm2}l$mq*TvO}~3yIA99@8;xW#x~2hSd)OIK~bm%hrt>JOh{EfQG>%^jRGd5ig-0R4Av}Qf~sCO zYOsrI^So(8rJ-NIWUpD0%*cZyEe-Y!=bZBz1(gD_ry3U9^I@6^t5c=@jl95TCKZi8eoH%&*$BFd2C zAF}&*VJ;?C96qIGVdupHzcm=aj2x2t^Ra{96@-g4iJxFrE|(&MMHX)6VH{tkNnTuq zMfgt6KLaykTk zqfw#n9Lsqb$EX$5!!o*`Sox@pFZIyTpe+xgr4{KZj^7jT;`&n8YdR3Xsy-7fl|y3 zMY(tZ$D)xENsk($Gp)z2qu;_Ae)bt-ntG1P?nA`;JT-wPDo+g|(_$AB3;QqF3v@J5 zb#Z}9g9Ti`nEzbRb|C$;Fv}v5*~G&VY}$x7upkSeh7m8nuoXYYV5^l=Q4V~Kza-hS zAx}KT(vz1pi>7dL4*VQOxY!pJ;Xn6 zOf-<;7?TjF%6UOd;HLklJP@~}Hqwgb0g2R)XyHd>N=<6cXrV8yVi5`Zyr5%9Xli@* z>y3jDp17{0Dfhi@-PA99(l+$~839DN)~{^u>>`UGz((sg#go8?AmjnqkK*n@abH!7 zw+F>T6cl8aVLkwRPxb#SZ}G6hD_K?zNFRHCHJ})?;#z46b%SS}8yy{?2Oi@edDyFF zKY@pn6Vh_)wQ4^&$L`6PHeB9jwY9nh-67O5c!1x%UUrV3EjP@S46FEbuV!TJDlvH3HR82>?K$`*|zSCGilwz(hu-`s(8+o+uII! a=5Kxfp#L8&IM8q$2Yl>5?x|)&Dft3J4ye8W literal 4620 zcmcIoO>g5i5Y5>=^&b%EMcNptEU7&-SQO2oAD03}y6wd<2*svT6_RM^!%=pzKfJdN zXGltxD0zjVMr@FrnKzG*BZ|zs-+%ey#(w_!^5*8NvnZ=n7A%f})iIMv&C31BqZUtm z_K}sMZpwmf?t-s*a?d`k&SD>;7d9@O)QAV3e&-q)*N6>Wqk(H|T;q{zJa7$}O2w;F zmehuA+hdDFc)Mo2^)=^6g+#LfV&+@wXV_;i}0RR<$Y zH4tHtA?gkq5mkXP1{$jFKqu8asbiMc?N6o5ALUEsAs7$VICaK1rV*M(w64P3G9bgg>9Ho=bF<{2=Rpp#Q&< zH+pr-!*_U0k!XXZ%|1lG}DC&t-bk+?nf&rw$QAIt0>R`AWwGx@w*WQzq z8H3ElVa@b=s4g2}JI5reL~j#CSN1*Q%8Px+I6BxDl>-&ZJ0y49&!D{sGh%K`sB0pM zkIyp9cmflIwV2Re#51&*G+~nT`sCI2A9^UO&)yILpWQMVFJx_OXeCPa9c!c^4Q$FQ z+9+t)rj+|AW#rAK?34oxkjSRIA|1ZuCQ`;TDb*fpCfTc0+RJIVV3ko;N#>MVopM4*Y&O6rMsxQ@rwLnqf_l3}`lNDQ-{ zD4DJxvdqhbd7X8O(Q{RV0`>CR%2koJbaiK_Bj$xofBd{)z)W5|6`HiY)uYoQiA?Qb zPE6+9X7Lp3Dqu2b33X=~th0a>lHE^qXBn)sfEAJzUU!zkx(irA+1HKk3~@aicP%Ix zrVCivJC#TodT_|nQ{VBNV_s(gWAt1hp<1Sru%jOw6?siZ%pRi_6Dztch8~E&{Olu*F?3Fz=$D=6Wu0p5}*ri{%8B_IK z8n-(*UKnuZWpbZnyh=X^-mMsjU_AtXTlp ned9rM-%|cfmmdTS8uNwQ)X;x3;5(#oNp`J-g1?}_i`mV;1TO!G diff --git a/examples/runtime/shaders/glsl/cs_init_instances.bin b/examples/runtime/shaders/glsl/cs_init_instances.bin index 74a495a0e8cf12a51bd3181cdc4bed80763bfcb3..31f8982e8f0acf98a04136636d681e424571049a 100644 GIT binary patch literal 6246 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 literal 5494 zcmcIoOK;pZ5cXL;=T4v(Dc&Y}p(tt_MQx;M4n+ee?ZsFK@-Ej=p~pgx^*Vw7duN6( zt;E$@C~Ck9k~8zo$B#ow)Xk^gzdO@^t5;`d-|u+cWL3%H$agk*mA0&2ZC%kyQjdLO zHE+ARWWgK%ZIWKFXJ^M(A$d{bzzIiO@brvpq+BC5bd3hCv2u+^uJOP%WSA;xwt3nr zw)-AiB9iPEEZKXKbA%z$WJu(SkbYQG+zZp89a3QQD}%eNY>|)Al&mtCXyQOb zL5iq7XhakPV+vGM?SWRRMcT%!X!pO>RdHKAHZFlB{(`2?l0Y>=)rdUjnSza4;so8<@;s}R0kp5lH3tqNIR?%8Fv z2o1*+x{p#u?qo`%9AJP%I^_xJ=plC`Wjv7*&sa6dUZv8}E0&6yFJGw)<+ehSL9V~> zno$54V69YP=)uC;%wuaL?+YO0mlBB1JXj-wn7CL;IdOw)*{&`**%nh6ju(&+L#-!C zCM!r-re&hM*1DzWsVX9YdU?-vS~$V+d9Ds6A|#M`0}S+s{a zDVg<{rMFmH0SkkaPGF^m!sX^I)w7j7VB|*_j7xFJOeyj~m$;;<_|$TTo#* zUchKKDhXx8#u1jD`j&l8d94LZ(Nl#)YN<-1j@&pHc}hphYb{`kp2}Nho2o9v&7@0q z8GpQmw}uO+8yi0JJT(4}yS-H+?(D>K-;W};jz@vzAw7{>1LP&4$;kOFnh?>uc)#*|nkp zS7SPT2FAN3yk8te4?Tl<)8#o|8{{GE&_0a}*H_6_X&~?nDv5V!oQ8}wWZG6mwz{dh zvgP#<7vCW)4%65_osjuMX^3NjzRDlU18nBz)hf-CCi}{hJ-cE-w_v@Yr}5BN8uH*0 zdg1JhNMRSOeGZyw~Bmzl4)C5X=n-As~bd&(7Ju%M2u& diff --git a/examples/runtime/shaders/glsl/cs_terrain_lod.bin b/examples/runtime/shaders/glsl/cs_terrain_lod.bin index 1188dcf986a74b936c6900ef7a740160cb1eeb3b..28012442038367e0ad9ab80004829f1876aea0ac 100644 GIT binary patch literal 10231 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 FKLJ{|G4cQa diff --git a/examples/runtime/shaders/glsl/cs_update.bin b/examples/runtime/shaders/glsl/cs_update.bin index 867ff4b26f31978abf59b6f1d50c0064fb70db5e..0db9c2fc6effec9fb53ea797507b79baded5a2a3 100644 GIT binary patch literal 607 zcmZWm!EVAZ3@sdX$bQ1dWK;+`=q7bLOdxGLb3~{rkX4b=L~2vkGV$-T8!Fhas-%8? zv0q*mtB?EO9E0GlPMs>`a1aFeVI;#K&{=D1$F<#MI<3@ErVYHpG!EekYHy(IXKAOBc#!E9dEEk*?PliK_h42@1L-%J3D0!szrTUW%kPCJ}L8U_AH=3{aq?2tbHL{!>7UDS)1oCb!8c)69u_2L=FQ`q5k>j!=ik4(YW`loxVrlOAo3!S8H>W1vq@!KvV667X~biX zePy{Qt2|?Ox3eF3JZI0&L97Dw!oi7?T5-YCYh6R*8nV7?*mI4HYcz0;daeOesd%wZ z4Y{J;BI~+T#Xv`c|(^GZx|477zF3&f{qQ{mTCiP zs9ppGh9^*F&vgSeuIpKTbyrZ$5PJm5^+A+?s#FJlF!vcYST3JBaLUvRy zZ}e)FhvTp_mAw!XXZ%f1iq-$jUQSwDt`a!2nX@sHQ%HYGF7XwGgRTmF`l? zltJcf?KAxzD)UM-lTDl!qH~C%EBl3U<;8wx937e$l?4^rJ0N#F&tNQi+n=3W)|? zfAX5p04l)RsbuKDLT#q8Z6)stK=Nw|Xfh496@fNRmDC$=aV?Lli%zy;lHq&ovR|7*42}~j+hq?{o(V10V8?wR%p_8sz85?u!5A+z+zOf`~SycNN_H+dc(S;0$D!?jlCy)+dslU)PM z+*GdOlo!bt!E1KU?q2zH(E57lSTAYKWk`DGe?Z!V&BuagXipweIgMVkS2Vi0 zIb{w$dIu_EaXq{J@g-cx3fLkEcUxaaKn@JS%ejNE9<~-m34u6qw<-US%4M8>%nl%J s2|xIJe0N(P;Z6;R@S%of`drFfxNVVq1ffrU7a92KS0Mcr`s`f&3*$cnfB*mh diff --git a/examples/runtime/shaders/glsl/cs_update_instances.bin b/examples/runtime/shaders/glsl/cs_update_instances.bin index 2483b52e25eae844b3d51e3b7d59bb03985be62c..c379572d62c01873600ac03d230cf0bd9dff2798 100644 GIT binary patch literal 1901 zcma)7-*1~R5YD!TP3)iWBQzN^U?3>%9@eyfwd}TtixwK8Cee`jgl@jDC{M)*|M%*LwoLH(1u|b8VK` z+T=jV>o@T0bTgn{!n#m{|D#^KfhV9ocQdFyjR18i_`IqYx(SctG7dm{tGUhUBFCM8 zRPwf{e+XIgq8Y=a;Qp%OIay>}*iO5XX`H|~K;PWweIMVH>1A0>v+_!;VEk|*uD-h) zNVlJabg1Hoq1(}=SK|Yc`mwLm;Tx2K1Z?V3XAh#BfIVUYdt!4TG0wv|9_hDJGB2x4 zo^#p!sjh^y_u|lryLFToW{0q7phEh6M`gTMPt1L!8kGJEPh5++$cxPcb99rnRY@m! zG9A)~b0_T=k~kB0v)ySz2t3Vd=u~YR%4otmb-6|zG`7jJJ$Xh>5pzT|A9Or$!Y?%v zsn4)cM;rl!O~@A@lpGg?QA$s!BShKqN&-EWpmZ#0)rp>}*8Uk$9^{1BN8<0m(r(7i zK^M=Z4nR&67H;AvDo9gBP7dS2vtNibw_6h?mNz&a>s%3%Hev29if z$;GlbSRYio^-~Mug|Sf@Frk=OiE)qxOKKBX8(brh7f}c=3vnZF?G%!kZKHY|Xlyi^NL}ELka%G-5Cr`qbQr=$tatASdNC*o+;d2 zZui~x(ouz~fC;nBj0{xuI%f)Z5@zeTvtG*vGV7TGiayAJYHQuG@pzJgC#r9p0lBNz n_M;%MP2E5*7Wh%j7>$!~m<(AEhXVow1`*W7Nr8VR%j*3Djv5_; literal 6032 zcmcIoQE!|^5cc!+2lRENzCe6+&OrK5H?5L1O(Qi@l%{>LP6!`+HWmk0;Ow&_|Mz|~ zyTAeqms3?goY|e3Z)U!kU6y_G=kMQ~G=ERuo}7GlCyO%4GZFZU**eXmN))TDqn^UZ z6<OwqO9EJrF00#Av3ZFp&a_Ia4%+0GtJL%RIKjw!F5`HD?{>)fNsrQ2#cS8<|xjRkZdE7oi4JjYCa6f@+EIc+^s+ za#cB3d7cV*&f>Yy@1d&L$!4&Q(o!0mD65KJL`YiVM-j3@^P;k#qP;z(&ifgjkHYkY z9TR=60_Ej%9A+?r31S;eJRcRO*I=rI6{Uxhr|sW!m{wOjQvtZ*RH*qZuWA`fRY=V{ zwx&jL(6~In4MAg@BK3hw-xc#*18b)$fdPx!92ad%xk-ScUsIq4$HBHFsKiwzb>c0qWw|=6WGki; zj5m-Xqpl}YraMSUrfFio*1l!ysV-uI48Kk1l4aAndeG;Q{bJJ}t`|0#@XM#d+O1JN zby`#;tLMH?c4pmX`4nqwU?tEL>cMfa)&?e|W ztn*@{zD#!ET_W#4;nZ+3+YJSuGmf2B-gV4rnO9T;h;1>f(IpVzn!ZDHlWev@jxb4m1$4- zY_@rNb08sj8meedwucCDIYPG^KyojhSd@93< z%5cjEW^5!3QIkubfea8QR9l&?qW zfmGS#S@(afghlf!Zp2T7kC7ILkXEr?)&7oQym)B|d zF3qo^^nG>*-&Cddzn<-vXZwf8x{5}*0Ag0}>p?PkZ*~H3sKELnYk>Bsu`-v_f)NS1Bq$)q>f6>?^^})q8*XijkW!&jP`5HfHmq=Z81XMGC#`fI}EbKYG_iMsQ6vf(&pF|im-82aQf zS;A{bb$nzj#t+eTmQ=f#mR2gW>*~hoh1)C?ToIr)=pVWrLVwv|o(umBdo#)2F?EaGP!wm@Eo s%Tu!GG;5d5{l(0_1&^&Ictx`Zj#(mNh??HM#U4U3Qkn~{4ySwaFI(OAlmGw# diff --git a/examples/runtime/shaders/glsl/fs_albedo_output.bin b/examples/runtime/shaders/glsl/fs_albedo_output.bin index 08b7513d738a01675be4bcc21e0fd695c2108f04..086cf8823d197ce16c24de495b55b7091f85189b 100644 GIT binary patch literal 191 zcmZ<@_TaWWG4Bxr5HK>Zm&PaO=j0bLF@ks?FbjyeO7k+)@{4j6%2Ja}6rf71xwvu? zEAvZBG;;Ej6H7Al^Av0q3^WyhA`o>+>1h@5ZbgadE{P?H(MGXA4Q2V6DGIrXnRyzT bT-96(K!B>qAQor_+Zm&PaO=j0bLF@ks?kO0J`d6{YXMY#%PsmUe^P!-l(W%-#Y s3b~1yc?ueuT-96(3h6oVZbgadE{P?H(FU;!wg{!Da)u~!wOm{b0BhJK(f|Me diff --git a/examples/runtime/shaders/glsl/fs_assao_deferred_combine.bin b/examples/runtime/shaders/glsl/fs_assao_deferred_combine.bin index 9ba9ef0052e8c9ac27e5039ca30fd81725a94294..bf9a82e8f044f273e9f82d5ae13707869deb7dff 100644 GIT binary patch literal 1049 zcmah{O>5gg5LMGai+bokD05t;j@S>aR*TzQT0)M69!n5wTMhzATO`@F6Y{_M^E#__ zV#N`3*n@Uw=FOY;bp7+@gZ*^%CBQfjK5p`*trule{4lMlyR)+(z=QFw!%St{;7#BT z#``XBY+IY^_;lXo#vZSK-v&XrY05R0!M0c?a035}-_D;4I#d6yik5$e!>H+$pE;c~ zb{>Xh<7RQ#=6$hSTHCJZJgm&#ZhBJLrRhuCz*nFV;ESiVxLfb?>(<s6P58X`KEL)-&=+1B`y|_V$RwMg^MuXI czZ;QJ@Pv@zm$?{>b@Jp)plROx$1n{30cf!aF8}}l literal 965 zcma)4TT8<*6pnMC)Cd28oX2E#rI+1gx)){mDEKHNWNSAIZ8O^L&i=b6UAx+Cpdpmx zOV9Z($?)_2PCg8t3646sN%%wtGA36xq=HYxcE8M14TVLWNH9hnWAu7 zk#V@#6CIeIjXt2M=$U@Vp=laz=gDk4T^(JvanZ4RIw0KXIz6jvF_!T#thNkWC2bl` z7FgyEKA{G@r`r2O8$Pc-~6IcKM diff --git a/examples/runtime/shaders/glsl/fs_assao_gbuffer.bin b/examples/runtime/shaders/glsl/fs_assao_gbuffer.bin index 8a103f0a8324aad840c1b99ec4b7f973b0594a19..2e4a9afe298845c34542dd43d460804d700e56e0 100644 GIT binary patch literal 369 zcmZ<@_TZkl!R!bF5HK=u6vrp#B&DY01KA)11l~Z3t28e&Ex#yNp*S(OASboR$VCCB z(3*=YGf$x`HQ899EItpYCNamFD<`oszqCXnCqFr{Br`ux!B)XQQvoOfQfH!&l%7@* z?^cwU?vhxN7;O}54K=|CXhKP9MRIPLRM6TLs2=%Cwf4)VLHYz7AOaFeMxCiss=1@bdY_dY0Xv3 H#l-*smW*-s literal 246 zcmZ<@_TZkl!R!bF5HK=u6vrp#B&DY01KA)11Q&p~EU~CEGcR4CEH&9!p)5WxzbH2` z$C?XC*a#?Gl3J0RpI?+>V9iyUmzf4sq)?ogTac4lWaOd%GZ?5VKQl!kH!(9$K|_

$C$sfj{TdRj%iTTx=VbAC>Kku?`rS$<}ULT+Mao`xn@HJ1Vqpeh0C z2WiwO$S>DO&PmKI&;Z(1Qd*R%G4ZL&WFAH-Hyw}yV+{j615GH?5XgkF4fIS*!O+;k d$imXh#K_p#*wVtp*xVGP1fXfvQk5n#mL#FQic~G$h7()2Qp(6z Udc6szT%pH6eB&1~{>M4{2P%whm;e9( diff --git a/examples/runtime/shaders/glsl/fs_bokeh_copy.bin b/examples/runtime/shaders/glsl/fs_bokeh_copy.bin index 8822fac328205f84e13cb5e02ff37a4c15b308e8..b98b5490eb14d5184f5c111680eddb8747ca8bdb 100644 GIT binary patch delta 155 zcmbQwc$#s70?RT628M~YGWA@Uc?xBz$wmrg@g=Dh$@%$3DF)VDIf<3|r6n3U`N@eT znfZANwh9KC3P2H%QWJ%w^t6h2x1z*!=lq=fB5N+Lvi!^xh1|rY`_v?x`hI6fJqNe5~l57j;5JV57Xk*C;M6! zJ1VJ;09sNijt_4)~{8|K)a c|2wgD!gVOTz+H%ClNSN)_Ms^%q($2R8($4aKxES@fqrTL&OFH0&*y$N^D}oCpU9|W50u|) w`sM1rjT{m0sOS3oX*uvu+EaotGPlm#FuuD}z!i)Rgp|{n zGvBn^_tzV7_w=A)thDQjCn6V8yVBH)aa-{?Z=_6j&&!Rsm8OxV%=SVSP({TtPo?z& zlR^0B*4!y1BrD;RCKjA{owkV(a>qiFN1bSDnu{c=Gf~1LFda})sSd=4eap8pIt(=E zaT3`MiYP0oPCf`=40+sfu@Y_TMy7OvTF*P_;Vj!_i|je)KSefhUlkQuOR<^JcKsT- z%fn5$6Y5k=2mw6D) zv@Dd5;!LBsqN88e>o|)7V}|1nkGElg8F-FwnVuhb8{hrKWvf$E<=+i$oOG0|A2JjN ZGVE$x&`=!ElsK_1FK@81apX@zv@bkQtyKU3 literal 537 zcmZ{h&rXCe5XRAqNlko&%^XXD4GZfD^`hB$_W>Ffx`d>qr2JitPwLA!t*~Ktwe&EZ znf|_y>Gu8YR2;ZdO3MnUPd*7){sx>ezE0+It7_Eekxk4o zJOP?$J0nn$PLjdWns3`D6dP>+gki%uIbM+CbMn&h{{rLT123v_1bWoLTrjJ~%$+ic zV*)z&#Axgu)-3b`2w51o@Wl8px7GvDbl1@Ne=v<#a9S}9+2+B07I7K+4p&INHEH2q M7JVKk{6&cO13w0$K>z>% diff --git a/examples/runtime/shaders/glsl/fs_bokeh_dof_debug.bin b/examples/runtime/shaders/glsl/fs_bokeh_dof_debug.bin index 074914f8866b0833c5213dbc95d6c2089caabd47..9acff226ebb699e791a2a923f35410e96de41403 100644 GIT binary patch literal 1281 zcmcIj+iuf95H%MGWW+C^eO#l|%wA`g6nFqtyz_`E%efUxPBwC!VyEJ}_&vss-LwcE zGhSKt+|QZWt8ZUlg*P8BBa&y)%YC-Zt9-qC`Z|i}ki6Js^H7E=dJ=W#s97wx^^cS0 z_wy)<_nTrBsx{l?>utHLF(V;A#WGFs!jh`2VQuqQ3{LRIyA}2M=9t; zC?OO`;S3mOyh1Z!kSg69K^e3XopshorAOocB9kPU_Bd8$$ZGV~(Nadw4M2{D!KzlDO8gxSTEP_OBz&o%+ueX5K zTceZ&MGiDF_I|7YS_y^HSfGQTB%*QXJlJC_m=>zzk!VH}pxf|%AGy|Pj} xL@$rSPMZl0fv~h^$I_l1OFLjWoE^*I>{t%nHa}Rn?s|8tN*8Ec=wERh{Q){QHAnye literal 859 zcmaJZ2I4wU1*`&xRA}{ z&F;K6Z)g1eb|dbeM+8@gTrd4B$b+=Fyd?yGTvvr3ibUk(g2=x@rcqXYHOO6ukX4Xx zFN@LZsRc8aRyEXu5H@VHvC zJDU$|%k^Yv+MeT@gGW_!4^dJ?{}nMEZgJ1z{q4LL2F9b=96vF8&EpBK?I-T+n29c$_Bq0&LkN;OdRd(IPooCk9?c37fe I+-n;70pTI<$p8QV diff --git a/examples/runtime/shaders/glsl/fs_bokeh_dof_downsample.bin b/examples/runtime/shaders/glsl/fs_bokeh_dof_downsample.bin index 52a1ec84857691a6c9b58f5eb1c42b5a31d78012..677b6e174e950945803380e110b827fd562f4a3b 100644 GIT binary patch delta 223 zcmdnTyp(x@D@!yZ1H;6mpn9&%JcY8$C$sfj{TdRj%iTTx=VbAC>Kku?`rS$<}ULT+Mao`xn@HJ1Vqpeh0C z2Wiv*+E7wjl&Vo2pA6Eeqfj>S7r(xaLUK-GZh?k|hM}H;g1$m&d_iJSVs3G?ajagY frh={lR2-^%av-CWfPxl^vZ~1qjPfkCTwDwQwPHqd literal 446 zcmZuu!A`?43=MDq1??A*j|u9!b>mjx0-Ct*h^8oNL#fm>RhpJ|h=0dfx0Ov;RucKe z?>#50_1mqvdwwJsSLCJ2N76b%Ro6vQu}d9>5u&gw-eeF0TG@C3Y}DsmGCESwB-oTaV$@0>f{;(){` zsyug@d+xbQZ@zwdZQovBjc{I!#=H4G&kkR*MfLpIXoMfmtKIx}TBhsm^EaaremJjd zyKmVsD|*A1+xfy4wj{sWHF`P1o11)P%Qf3)3(fifvvWlqH2q( zmGUENqRz(Sd_zGb+s~`)xUjZd^4YjZ@9nPg3cENvkC(;puQ zIo{aYe96{nzVZC=SvS7x8>(rdy_Poqs454b;bZmYtk6@#CFAGrsI zfkK5Eiu7*lkO7EqS9^1PF**yM!B;Njr23+7Sko)S9XQzlFTAkM6z zmEQ&rKERTZkUDiGxf+-pNm`p|Bb_}Z1%#2i z)EQ~*E|dv030+*Uxi+!yxO#MdiM19@nk!M^;GSJMvg$|4g3i!~ zB*08f*wIR|_S}_O`m3g=6+Ly~Nzyob)WUVEdX9t1IhF~Ei-r_NCup=tY7t8z5LZJ8Qdp!_?Z`(w@Qm`)(jV!*28QR)!;wFOfyvv z)xu&(QC`dsO{4p)hpSsm!SS9X(4nFe$Bhs3ejQNowx)_mhb3=U!iiD~YCpFYjM68_ zTW1~iMWMRm9nG$3UQA!^VW|O__Q|5a&cwD6=sW;J`_T@XFxl-a!qFEw19e@+|M?=l z)uZV>X);}kT7boMek9HWyCnJ*eRFW*2*8B9rKG&=+S=;pw#opJNOWD$jK~Fb1byoe z3#pGt^Hs-@h(qduj+mri&<$D~^X8_LCiVj9t0YN6Y)-D@DC}0>=~E_lPXQL1qU%E1 r4M>XMHlS(>hW}LHNnKY{fEEE1=hTpZ?RQC41k85?lk$5Sk4Jw1T&dI_ literal 2546 zcmZ`*+iu%N5M_e`Z58wvig{exGA)w2kdTuXyFnk4mpbT6U@RDE?Gm6wgQ6~WkZ;H@ z_w0?kq+LRQ#F?GhnKNf*^x^iexAhBD@-uxZ}_~7|v$5(Y#H_}d<{`f5j4n^}+ZXf6%RtX(=D^9DrZq}3KXumD* z>t-W0Q*t-Is!+GT(C7%h#Oa+=?TXD~C7R@hOgPKYp)S|7DatLeaP)0NIu=B7EhFLa z5+e6T@A_d9-B)$dQdQTFe{R=2k;k3rpQ73eo;qP$w?%cUqPQ)e1)mO7eC7nj*WI<) zwxUrd7f!Kq(o9N$QA!G3o}2e6wVOwv%VS`P1ndjqM>6fc5y{QRdQHsWF!s|L(Y)iIK}RpV%0JRJ<+b*vUS}OW6Yx=oq5!Yo{u4&6O&wJ zX*`W4V~S@vkW$AC-6nU@a~J|nc`8n#Jj=5&EwU&{(=ZI>WoI-^7qcvy%|dB9kCH5n zvst+8<#^?Bifq*9?opKvc}b_C1C6X zz8wJX*;$Uwbt2_GYTC>9O0f;lYy4buNKzOc5`8C8?Zm5R7?WI9FiEH^kC-je8Fe~n zdv{;DYIkQOsl40}*abL0Q&fR_NfC{@!%dlZwNcH4n03mMdR@ORw9KNih)&3IRihVm zBN$Vse}Z0iLthV{ZltK8<8aGh@jpX_d6N^Z(+z-yY8kmsKFiI4nIh8!R<6g-x)kQ< z8#j_HKWxNm;<;dQ1mlmIEYhP!jig?S$f(UwGd>hotPFbwGNHf96=vPeluvkBc2~X6tBeHLB-NQwbLs!*|G@V6an%*Rk#4aes*naXC z-31|Cl4W!6rgM*m-f>+E%s#Ut{4K%k!Z@c*c|yVM`z4uK4{L`oRtXSt0e79#ld&|K zpeGn`1A5(QGffHKhU2d+5B6f=qT7bm^X;*XFl4(i;4^Yi2=KYLg#e>>S_h>%(qaI6 z`x9Kp6_+|Xjy<44@S7}AquM5$$gL~uDgQ$0CGS*6Ns*U%qN;YkUZ`TJJ02?jp(!4& Pr6bsNUY4Wpqfzi5H4W#4 diff --git a/examples/runtime/shaders/glsl/fs_bokeh_dof_single_pass.bin b/examples/runtime/shaders/glsl/fs_bokeh_dof_single_pass.bin index e6450a949aaa9967bb34123da12caccd4462d7f9..d72ee1d856f62b8dd5ef7a1d32ed35e20d8035da 100644 GIT binary patch literal 2169 zcmbtV!EWO=5Oo(Vy3nG(Q1D14j!ID^CBoUgv{>}eQ`=h+2#PIlgxaAY%dwqB{=IJ~ z*^&&SC{QLy$eH2Ho8g<$=Rbb^;C}pcKf(HL@_v_Zin>^D-~BL|;1?^{V)H}!ei+*+hV<0m9_kZb)c@RJUW1=o+-X$FL_fQ=FZg%F$-43 z(d`<(a`U38+%x;gM93g%p+0_D9`et1@#SaA89rWIwP5R_dgfv9HDFj>o;owQ8%Kiu z)F+rcM910KO2TTs0&vcAx^u^PdkL7DU0wd>7Q8Fybcl4yL?puK5Qgk#6ySBr?%-ic zu`hLpQE-){2wpsHDY6X5I%T0-*2TQxTV%Iz4d;VG`Jkt_iC*_1yJeiJ$&*<5=-OVy z7Z1^Eh#bf$mXXbDCWO*SoEeemSR1LQEX^XBBtpcgfF1~S=rg2U7HMTNND$maGQ&-+ zGAX2vl~LY!l!M7YHF^?+OjwSq?U8m!Zd72;;j0BczMgM&FFJIpV?TZH@g0FY5_f#6D z|z*bU2cPbQ=Gu4&flgi8>}hjQ>192-E+W9F$xaSy>ugetH;_TtQ~LPM|wPog8ND z6KIH8bAIA6TaaWw4|7EDSixW#RX0pxqV!zpc~YYK|L&1|UAsx$f-F$u6bxBc2P$`p zkxe6m_69F>ZBPsgdBn)|_S>~{&C|9iH|?u=igo>WOLU{Xm6&Kf7HZKJfdPV1k3i-7 zmIlEsl25F)2IEzzEH&r(ICPc7tt$=tzEx?SASEJF7q~6m_+y5fNJ8r5Yd=J@;4KIy{{Wdc9P9u9 literal 2951 zcmbVOOK;mo5LN>eEoAi4A5hG3Y0DHJl10HzE_Q<+TA-+dUIK$)sFg#2(h3yy4D#PQ zJNqP~9$MM3y)!$nZ|0lz`{&=T#4qn22Kf1YFx=()iXZ;sW&7s4!2rMUbESkI_>tF6 z`r|I&6iu<(zWHe|z;FEgu+2+Ri$>ZhQsQ$GGJ$>G@?$AP zvxx48yLGh`%}Qz};BvXBpnSg3sGL5=>5Efsi`Ay)P4Waf!OJSj^nSP()dE&UwFVXp zzYIa8iAg@nB=h(lMeYP|yA=Q|Yf-eY6yNF#o=6M-j5Y?mkLgQzBE7SEE{mGy zskPGQp4Hh|)k183T`%%USM+yL?|43S!dA3Jo!>b@@oD?W*DY_Jt256trzo9tE~VIy z6sWg(jBPSSwyO>HGLID|=75Q^vPR5-F}w=+D-NSE^C1WVxCJFfEZbeflc(Rs0+=3{ zk&o&KqA&`=V-N(=-?ai$!xD_(7Tu2ke*~!Wkv#@7SCcp9)sIE0i?L3GuaAQ?Hzi89 zJ@8PC5@xSZXpK1PFgs}^Tc!JgLO<7oQBx;-%A-^wGk~e-YCrR~$Y*$qEt{fjHPG8? z%@(3Xz?nxY0>#ieJRbtM0VcV}(s)A1P3JxAqL=U-AhL8TPQrOM&qgrI!X!;?7bfX! znuXIT_VOC;!X!)MY#Q8mYJ8xR8cr}--@Jt+Oy~3YT^hg_tjx?40{Bc^rFo2rI7U~C zPyA8rkWVpDLt^P9K3<8Yl(B4zMYY@hQLXcs7y{r+dY07ouH_T2+afvUF;U4_J891Y zHPU)O%C(ii&_p{lb^_lH0q@wEF`CK715``wX{X)?8YzTc;fE_p&!!v-J!}A9f!AAp z@eX5hT*nFfrnU=x@U%5r+GhZDgvLtG%auY2K?QC$w;#vsmWdS-Jmn>Gnd~ zmHXe9t|5T-m}oBBBWCQa%Ouv2^*4Y-N!P4B5EYCphIioaXpavUJZXfCaYFcxKoY@! z2C=mX?!)dlD*XB4l}CA^7mztg^!-`5#rFyqA#tPIH@$yM1{1V2ZIfAamLEQlCO`mV zFjVbCx}ivlgx+=B-1uUuCsC#0y@AaBeFLlNh+}RAW6%#4Ixsm#IPGTy$($z$k7j*G z#?mm7Z#qJUH|%ZwT7V^mc@psvuxrW(uZJblu=7eH65egqB-$9Z2uTI`Unu^kB1wut z#>|wZ?&BJ8yriXW(w&9}Y>Cdx2@wGlZ^VIS#kyAyWXhs&GNmsG`?r6pps#iQzA0WG QWoqcmI=>%&9S#To09=4l%m4rY diff --git a/examples/runtime/shaders/glsl/fs_bokeh_forward.bin b/examples/runtime/shaders/glsl/fs_bokeh_forward.bin index 1e506c3ad8cc99d162ba5f64db5a269d9f75fd61..be871f95732713972319c303b616469e7353e01a 100644 GIT binary patch literal 1533 zcmZux%Wj)M6s4&uRaE_lS&kD2F%K}7)m5vg%Sv5V5h6B;kie4yc1^1OQGcV~(p|UR z_S_jT#trfUpSkDUb05Ra=Z|lG|M~mN!}HR6yGtvx$;(e!omI`nh3Dai=XH~25HeF4_0QYAxN`SL<&JL-tOw0 zH@(~WiOX<|M=MnV*OY_af&;iD5gbmyZUDPuB8jM21Luy`u}dZcRCR4z#|7S9@O^2r zmZD>;66-m?`Sh$MFf|l7luTw+kR3M-rT*=hjZp%~|ucZYevAY)nh;pbETy zna#%HsfHwk%r*8&1YKWp?`ug3=wR@&9J-T)LkXz@=nMiJ4MJIoCHR}0%>iRNuF)j9 zl9U1=-SZ(d97#Q1*QROsSs>hWPctf9C!?(8ERGyHoS(aJ%qd6FbkHs2yR_zm!;D>7 zWML5r)|8^7b4vFgrRypE5-7Wy#de?9O>QSuWe4u&q-cmr#VE-EIwC+vrz1moGNk<; zFF}>H*Z~l&%}6=Y_=nnK|1HJDzZBG_QD^!c5VzD`+UDc%T-)3>Os_0-ur!);J{1X_ z$R&F;-*|S{@bOl<&)xJ^_5-y`Edv?aM=#<;Eku-{ZXu}|D29iDaL1w0%TS0|h^0yp z8^toh+}0&NiLSBWp(UsmjSYiv&gg1F<;vZj2v@}!Jm-w98G9gYSFW7isog znPyR(d{enfw`XULgBQ<-H;%JYd9_+UvR!;1uw4Va9+6{-<03Bavn-GNo+Ts}and5M zM^Ee319D%(Akh&$a+QG$^`;utB9p)wPxHMy^NSC!hpZ3%@R2^ zXGOX}MN6c@nElN@GUK}1$J|!#Y7fHTl@hw^ z(S8652`Dt6>J&&?p{E2i9Y!)TAhi}SBY@d3N(%^Vgi8Xr1c39V$k40yB^z5m>Fvu( zi{IICK<#ihf>Noj2>lhMmwo!+kiL%B(FfXnNIxg^b4q{NL8o5nvhz0YtIjfmWzZ*q zJ#7bF_$Nsr#tG8OkUk`tDy)2>-ls-dA;7v?@8WzL*E5@{lJRWw1a{d9YZc8Zu diff --git a/examples/runtime/shaders/glsl/fs_bokeh_forward_grid.bin b/examples/runtime/shaders/glsl/fs_bokeh_forward_grid.bin index e306061d4370fd5e939cf16223c26cfcbe4f6f53..4e65dee13614ae8ae4e0dcb7909193118b3e739e 100644 GIT binary patch literal 798 zcmZ8f%Wm5+5L9wx(SO(@8QTIMde9M!90~+I2I#Q}1jdg*fFuTr?8*-MdHt5&ddVTz zE=d`VO%M>VJ3Bi&tNS0{zx@68@h8G_6@A^7ja{wl2h*A6_4+!B@Zx#L581ZW#&!+t z*2@IWfIsD9K}gkx)UNE;!_wMrC5kbqU{|(SYwBYp!N?IN3sRfC-S)J$OVd}jg#~a1 z7zvC|&zqsV@67WzTiXs>?QFGz##Ak35KhEodf4&+>^1XLn$ibar`9D zw8}-QC08h!F}MLrtG1_piHK=MO9vFakA-yaZ~j3P1*T_{vkb1rZ;6 z@K}rs5a_-TnGkcOQBInna}!wBrg@<&i$YM>6b)4gs>jVuk%hbdew&J>UZ9)$vgTy$ Z=|7O((@Eg_OgIIZW{x=U7vwh~(SL7d+=KuC literal 1039 zcmah|!A^rf5JkOV{D(O%T34X7G%-Dy7>_0%O+(g}HYC6{w6>+j&+|`Aym|HN+XdRi zM%@tD?Cg8Z3lG-&iDj)sQ6~9}R`Iw? zt0~*d6grxm7p7?9(!vLtTV~wA%wCo)&DHLL_5`UcTAVg~qW6=s2@Octg0QwrJUwXiqBX#BTTM#as#Y;DCGdKpPj4@sLT&{^JhtwW( zI=U##6NYGBdUP0X(#U0LFUSFFN}l s6#E_;*7cR?!BMLT;i+~82=Dck;dH}iX>?nN*^T<0Q24%2ueNP{1B8(=DgXcg diff --git a/examples/runtime/shaders/glsl/fs_bokeh_linear_depth.bin b/examples/runtime/shaders/glsl/fs_bokeh_linear_depth.bin index 542d60e73b20f8fdce1f299656176501788e9931..df928ac8f6b0512172e231a5c36c44ba244df759 100644 GIT binary patch delta 153 zcmbQpyqIZ%G0STP28M|N=Ji~ec?xBz$wmrg@g=Dh$@%$3DF)VDIf<3|r6n3U`N@eT znfZANwh9KC3P2H%QWJ%w^t6h2x1z*!=lq=fB5N+Lvi!^xh1|r9U5JjUKCE_p0EL-qd-BsNv;@*{rgkWPWG)+m<+A99LQ>jmI7)Y1{_uSQH z-BO+Tl;G4!Gi5Q?TqgB4A-Fh=gn1%1CsHHj;%xEBxGsXohfEwC$e0oNK`HGGU7AM0 zQE6F{2|VL=qw)TY5-#IVXlDskwo5Y=cp!NYfo0Px1vrL^8!$3P6C1gBdH!Jr)+=|o z@8>Z1J`~UcEM!tGP+?V$?q^NApWAjB`e<1tJ0BJYV`ner7byOL%Rg}b0e;9mzid(5Tj1C~#`vYI;bz#{sIWc!q2L zPP%!0Pa_R4_&KB@R+qFw>>-V&Ncwa+I4;glj6-p!HYHt)ElnoX`6g3a^J0G$+I zy6->qT#A&gLfRVC2@;u)b1x6ixuib+`s3T|@4x;T;qzuRKIC-zWIXml+0&+FYv z9LxJe9P_(%UF=rnuD%|>>e=a#PP1>g0uVC4ud4krc4i#c<&)F+^iUnH$B(=9XM_=l zV*9Wu_v#1HQE;}m;iButN>cHfk5B2Xe?&`*9&xPJOR+81I}wEAKgOb=MN_NyA(z*- zvEd_E)UYk;MAX{{P?jguV4pw5x8eh_VM%3Ovgu-svrg4?TGEBE;iA(s5Q6~x){pxV z6a`EX6V7}{W3PmY;!wO768|W*7U%^yhu`;g5TFYKmQ^i+w)gZr>4u)3!%$DwDlv;o z*+NrbHB;9wWpK=CkDUoqHepJOa5gEvManP8<(QKoG{WaiRn($fuF5!{5rTOHfSKQI zA?8C`LNs$so^uv8`s0$1R7%0FVQJ~ju#!n}9`=((izO_+WYhh2Lr;sMUx4F(8XKukVS`ZN(bvB0(8)u#qMuTa}7(fPq-qyA0FYFE|3nk&kR%9}c zPMGU~L=TBfqgtAvqAsOOFaN3)2Qb1v6D>U==2a&}&@h}%->Q7reWTns68p%ZZwi}>7li^wBcIlHV` ztg+E7KaEJFft6{m4pJSx61v10E!i!Q5lVYon=pd*&r~lx-kNAm?PivKPV_ku^h&`T zCj*fS4Ss`Me0o2h3h4T>RN#p&m*$Hv8JV`(STVKdvgAcmQq{D{c9mTX*jwrP+1Ojf zfN+)z1lQh*mpvshZ_wUZt4W#p?M;z-_EtFNUmZhex@2#~E1uF7&$V}U+1`rZcNCR8 zzrB^RJJQ-)@v5g%Ztp&7I$&>=oVPdPwp643d4zWQ@qqGD)p|#k|B%fnr|#d*EPptK=4?M z*J(wUsv(Q1S*r^*^IMD}^({7cErtTf2qqoytDfRjN9n5LSPbDoy(zSw6ExwswuH*g z8H+U+Bf3wuXuR?yxNu>z4b(%$pnH@+mkV6p6y#S&g*5;b5k4DebE@tMUi%40E5 zbID>@{{Oa^QLWcvlrmGmg##73WERt3ycS#ZEwRF-T~1GsYWB z_ZNG?O9n~np?VTQad&WD8a1Tz&iDcd4Xq;FGVLGaL_5$+hOY0pxf{{9*ZhQ^2}xpd qZnNk?;BsKY#ZfxdKeQb8v59Zhn?w}62c@e5Z((9bMt_dSqyGSswIH1U diff --git a/examples/runtime/shaders/glsl/fs_bunnylod.bin b/examples/runtime/shaders/glsl/fs_bunnylod.bin index d468f9fb8890bcc5df6fe840f72f1c2acea2f8f6..ec5b99c02ff70b12052c83a19240de1bc082cf2c 100644 GIT binary patch literal 334 zcmY*UK~BRk5DZuM6MM8FiX11g6Iq;)BJMmOGD%xSald z)XwZ5(4x~#ShV~mFUXxOh2)-g$vdmOkl!9leC>Vp=kcGkB n&tlMe9zzzc`1|2e%9FfUOP0J!E14^iN>#~Hc?V722#LM{8=7B= literal 469 zcmaKoK~BRk5Jkh*y~Hd%C0M~OtEwxch&>00tfoYfoVc>8GzntIO}Gi?;3zB@yD@TE zU`y6${Qmr}DW9KK?;l^^Sva3JSvF`lwS5D_VZVW)+FN5?v1LhHQTuG2si|w*8amzf zz>&Q&@G1qT?nrobzoka3VFz_tk9?7$|4U(+!14l5SMZCm`V_~hgjPg%dIa8E*J;zv z2hM3Y0FT~cnnzeitrYV(p(pO(4@Vy5YLiaCcu6d`nDs?zD^(eH(vkM<0FF${HF sSspgXrI0yXJs7-y<0ypN%akRq%0YQETqYD^^AN7j@NbC}@QtzT2V_l!-~a#s diff --git a/examples/runtime/shaders/glsl/fs_callback.bin b/examples/runtime/shaders/glsl/fs_callback.bin index d468f9fb8890bcc5df6fe840f72f1c2acea2f8f6..ec5b99c02ff70b12052c83a19240de1bc082cf2c 100644 GIT binary patch literal 334 zcmY*UK~BRk5DZuM6MM8FiX11g6Iq;)BJMmOGD%xSald z)XwZ5(4x~#ShV~mFUXxOh2)-g$vdmOkl!9leC>Vp=kcGkB n&tlMe9zzzc`1|2e%9FfUOP0J!E14^iN>#~Hc?V722#LM{8=7B= literal 469 zcmaKoK~BRk5Jkh*y~Hd%C0M~OtEwxch&>00tfoYfoVc>8GzntIO}Gi?;3zB@yD@TE zU`y6${Qmr}DW9KK?;l^^Sva3JSvF`lwS5D_VZVW)+FN5?v1LhHQTuG2si|w*8amzf zz>&Q&@G1qT?nrobzoka3VFz_tk9?7$|4U(+!14l5SMZCm`V_~hgjPg%dIa8E*J;zv z2hM3Y0FT~cnnzeitrYV(p(pO(4@Vy5YLiaCcu6d`nDs?zD^(eH(vkM<0FF${HF sSspgXrI0yXJs7-y<0ypN%akRq%0YQETqYD^^AN7j@NbC}@QtzT2V_l!-~a#s diff --git a/examples/runtime/shaders/glsl/fs_cubes.bin b/examples/runtime/shaders/glsl/fs_cubes.bin index db3e5077874d49000da393452f7edb528b2b82a3..46bf65fe89bc159bd2dcd7023324ced2d84d2125 100644 GIT binary patch literal 133 zcmZ<@_TXO9{oa!S42pmxS59JOerbtDPJVJ?NoIbYf~|sqrUFnzp)57oL?J0Xts>s7 zC^6kRKPSJ)nkzF8B3>4s3=%M~=He>L&rDIsP0Y;G(B!J-QUC%}O+XV7s%yEp7yyak BD2M<6 literal 87 zcmZ<@_TXO9{oa!S3|xR@Sz=LTW?s5NS!%M0LRoxreolUofi+iIerAe7ZenJhf`%qn aHJ5@ydQQAsQDV9?NM6AfNo6e;7XtuWs~M62 diff --git a/examples/runtime/shaders/glsl/fs_deferred_clear_uav.bin b/examples/runtime/shaders/glsl/fs_deferred_clear_uav.bin index cf4e366be319b5db0bde835049de2495c79bd170..3c86f5472feac285addf679beffa1f40abe64d99 100644 GIT binary patch literal 174 zcmXYnK?=e!5JkHl?;x{GAe2&E2(@mM;=TtcX&d7}nt_m3i+B<*Ybd_OhyQp@d)x8; ze9AVyX~F50=O`QxIud)Vu~68PAIaNvN`=Ap`Y3VsbmuVPGf*__-HJ46YsxE9=g2-{ y1+XxUIBD`i!W%HLHErZz#6MF=iy2B`UDpI{FU(=gU#nD@^g$GPA!P+0fb0j29W-J9 literal 3336 zcmcInU2oGc6zy~1Hy}%UNuU~Ck_SW?2sSnzK%forGEJ7-xLHsVSB}$Wn)b7K=lUZb zZJc%$q7RdOeeSu($Byk?Tz`4SUc7%dQoldXN28+^BRpq} zN1pP1Mdu+dmMIag5pDr`O_466G}i*|GY$Yfr_NjVC@6Znyha0Rwkp3xl0lwfB{;OdlaS}4=%)v{L#J84a7Mns4*QC)DBU9oi`-GX^d#)=Q& zle*#8jlgpr9OJg&Brle%pswU`Wtz;u0LFobys7i(bSs>(^uP)>Uc(w}>xQM%x}l+U zL&G1E3obTtTd56cEp;y`DBPf`=Ug>ZyL}zhS9J|F3gzCA)4rqvSf%Tr5Bg*Hv<1SP ztvhrQ?8?!b$?c6CyM<+u-IL9(Z@Ox^Iu*czGRu2K<|=Hh1E+^fxviPh)@rqe;K?qv zFyW`GHFF8}ir=dG5Ay%J_}Z`5dH5FF<+VvSo^3dp!P7qq!JZMeDv%i%=8l zjUzYp0INme;j9Hs>0G!o#!`6&<6ySfbEdgcYDU{VlAp zy?qT==NYsQ;tY_T6ZW+hsy?5?IKu%>Ft*`@_CY%RhEq>iTe^Sp>aui|tsZ)*1$gKc z((#;$dQ6RKNzKJoTcbT_O78JSQo}JN;k}Z9yR&5L9B_a|P02mhsY`C4WVoYbnI{Xz zGkrCdc$Lug6>Qt7V;T5KE1I?=>K4=~y|02O@65qk%tXLAEj3l`$@2mt$`bfPc(J4|r qH%{>dC-Iql`W{#JaC<3|Yr!~m4bNET=vR7Wm13{EmXtaZt~Vml^lBZ_-nY6Bj< zRynSOstH9e2!m!W34NFZ+qN^39O7IrSJ8NZN6ryGC;XeX83TM;M0R>0B5epPT#fr@ z3PUn;2w!nF%MJX{32ZOq%(1yg0hrK%;;U~4k@If@K!?xx#|Qb53X(2e*~<0i=Z7q^ WBi{|U?FW$`1|P{Ld~$w8$a)8ojFNW% literal 699 zcma)&!A^uQ5QghsH24l?j$jB`OP34kMYHkl12hFHk^m)zgdV;Jec_qh z#r7>cbS(nC-vwX?fTR84O+h*_fzPtuw_x256o==rk0Ts{{RDLgDqZ7N)~hPl{Ov_+ zxxssVdr^S7u^3fyqxz0iDwSQS8vKMA#qeTK4=;-4I+<%( zysAoR@EBB?;aZjrq39c7n2Adw21>B)dYzMfotas>Fzc_?{? z3rI4dWTi$T7cGHsd%gLhyEtxhHjO8O&=rm!a^^bRrvMmqr1;^?06P5J!LZ}5(&_hH i^m3Ruwq>^GPbUajYV4qLmCpsg(N4n=L2V8ZT-)mSpmmbp%S}xp}#))}C{Oza5gJe^KYeh`3 UdC6x=`AKoNzq)MOKdr1Z3k zc({32_v%sh~|kwRH~NoqxMetuDkfi)LbS$<}ULT+Mao`xn@HJ1Vqpy~q} X3RGTFT9m3$4AKZTOb2Ah#F_j6h6XT+ delta 69 zcmcb@xPozlvTOqb14CJ2QDtUcxs7 zC^6kRKPSJ)nkzF8B3>4s3=%M~=He>L&rDIsP0Y;G(B!J-QUC%}O+XV7s%yEp7yyak BD2M<6 literal 87 zcmZ<@_TXO9{oa!S3|xR@Sz=LTW?s5NS!%M0LRoxreolUofi+iIerAe7ZenJhf`%qn aHJ5@ydQQAsQDV9?NM6AfNo6e;7XtuWs~M62 diff --git a/examples/runtime/shaders/glsl/fs_deferred_debug_ta.bin b/examples/runtime/shaders/glsl/fs_deferred_debug_ta.bin index 6263077c3ac1bc7005b4d86a51e70287f4cb790d..668767b625f712183d9b0962bf14c2e4b88bfcdd 100644 GIT binary patch literal 274 zcmY+8O$x$5424HGLcD`y*@8%^?y7<)#k~h8W1Y%C+emCnMZBlSF;o8^S-re`dGT&L zq|tJ&M13`=lU!d6_j^joh~S)5rd?A`?3|~0cZ<5T8F7JUU7T{m;bz6GFZj(zpGafU z8NSdFfV`l(@^VUbWvRpk20n^|U2cEO+9YOu?4CwoOXr8!xFRVL9|B=CWDi(qTY5fR g0Y(3J0+o1Gv+=%-#*Q@gen{hYtx4gFK#20I5Ql7I*#m9b&O>RZh`u5!D=0ON@qJ2Z zcP(5+C;J>;GaQt52eBRKi>jo%$q{a9Y}+&rDemZKFB%87@1<03p>ZoAsqq2v_F-c< b;Gvt!`aDqfV#vVf+=p$M5h&BU3RSWUp^9I)WJQ`3a_00-3SImQ{)--<5PDdarC9khXIt=BEQXxP z2wKM{e8ci}mWW^uC+q*7niN}yJovE9>kbukVdg3Q;LW*jKB=KaZk zMmbZ>j|s)dO!B&{Wlj35c0*lW(B~OtP13uq6+_EI*fBtxo|r&0l$oLVLb|PjvQYy> zmTcthkm-B4`gYt1lU4EA^=TF_1WV^kG80CBL;5G~E=Wn*eWzBBsqTxb>0qWWt@oso nMhO7g{)jkk?J9EdNEvkz^S!AHm-?afY_obNbqyN$a2)ajeKQ~; diff --git a/examples/runtime/shaders/glsl/fs_deferred_light.bin b/examples/runtime/shaders/glsl/fs_deferred_light.bin index 020ee7a847d56fef4775244fa582d451fc7cb037..19950477019adb5d8ac6b207aafb0b5bcf26ba6d 100644 GIT binary patch literal 1024 zcmZuv!ET#C5T$LRR@+Ozpqk?nQGx;ESTwz~irQP{9-|1YfnX$HEm&-z>ZM=a*~J** zf-M=(d-G=A+kN=;{XPHq<+Fy*wRT+xxoEClY1)-6XdmhzOOu`W$*T>E(z<$$5Pm1n zCfWWdin!d2(7P%qc$u?IQhWB>Dv08}*o~FHZ#0e6Mf!|PIK-g~+vK?kiYWBY<%;F| zEH3SDFeuJrN_vEHCR|WX#+sUN>E?0qG|xDjQVfz7azh&qfry)s^D?r0lChT8f@VBq zBIO0#gQWvjCT1Q=mVD(IFMUD|JdGe{X+d@Jn*csaGO+Cxw$h0-+<1Nw17U_2faa{B zmT4IfaX}|;`a5=M2iKV9=cxP)=*ejp<3^sR>$(9-QySEytl(X#W6H;w%CH literal 1900 zcmZuxU5}bT6s679Huj~zpqWS5DC;0<&93{>X4Aek_HnZzsOXX)SVTda{?z`L-h1bR zK~WQ7=FXXO&YU|>zrKIWK0iKK@ab5cLvW0v^5%_Y-QbAzVIQPfz6}!#hTsRE_xoTK z?TXiW~OEGuzL@ReadL)x~ORzFGW8(dqH39C`D$?AJ*4p(h_G!~_)M^@2cg_&i_N+U($%sa-iO;=66M}Erc|`gk(_#p z&@LrC^OyDtt*lWYX@bD}?lFs3z&lQv?R5Wi8LAtyWfJcKey?7O?GD5T9uBByHe0ui=S(KD@a-0E~@x6E?~4(l@xf0v*`19S-Gglo8ay;?FDy60;SeQzsMfe5J^j5`6_WG9-@N5_SP28e{0vtm(R5JvJ)G zsFf5Xlpj>Gps^$`bvdQ8UzOk!c8yv0AQ90G#A9vhV2+c z^LJj@tE|w@OnVA$>NxC9an)A@?pivyxZl);#Woz?)wt7R;9RdY;hY*tk>$Wo+*->#(yuf^?GFPq>hJVM7&Jazgw1PvfYLiv&m~U?h&wh z^ToA534ser++5(_;|xy-j{CL+0*ny!Hc9Z5hnufilI1e{yR2k(xY(;SwFO(;ax!*m zPv1QmsgUjomqdg#JG8m^GNg=AF$B1I5Cei@U?@J|F<$H_D0jrWI_8>2U(hI#V=m1S(Mh*TZHgC zf!4|9XHmrEdW1eyLBY$MWs=&n-&a8t@5FYj{C%fsq%P7YWWqiUJ=i2qO;AMP>Qt^+ zzRTj$`F>ZHtc5{#hJcvTAEBHH50ss;rpCOs^k6^EGfvJFgQSIA(}8^;;wI$0jI0&O zSj%fcGafRL@&azb(g7jUZ=fL3Q$n06t1Ga9kH#=|mbXz%fzl zi(*h4-&aF}2Z8G?u|e5Gru0Rnh}jsRep{>#d77O86n7SN8Pj7<#?*#xHdA^dr=FTy z16~Ywak%fO;V-YogY{@OZHK*7uBYBF@94U2fRdM9b?lHd zv{L1qi)|(1-Ry=3HO7D}E)ucrrQj0J<^O2VKF&~UTBdiUK8tH>X)hO^@7N1}xw!VP nhKyAFr<;T4bE^_FoBk5Kg4+RZXW?#uyIJ^vFuGllXF{}pfo?FO literal 1978 zcmZuxO>f#j5Ou3GspzG@pxUFIg5&iEP!S?kt)li;(PI=@4miY;v8gd&Q}w@hX1^Uw za`4X1&c65N&EEh1@uB>5cWc4#(z@Kohb%o_ys@kcj9Bk?aZy&AB)1?0|M0uo#jA8% zzv#%veVk|Om-<(^TO_M&zk92a<{Pzv=Hp*BMORBfsq|Rs%?Xm^}b4_7Pb^)s4jBcrah5s;=7(hMtG(38dzwQ z4I!OXHej5e7I;F&!azX)08@Nu(f|lhLN?NE5Qkc|3=UV!ZBP|eyg4B-vBglSt=24f zI%5$qYnkjd(p{+yRdP55-O`HR0`xDx;r!spt>-lKcOL}pS^keU{x9%t8` z`v*9OCK^c|5o5to$TH0CY5`@IIm{_o)P@TQ7~@Y>+pDrx+E7oKlzNUsZX{my-r&7Q z2ak`s+%VaO2A;*8Ap!MP!-W=HScL`cfup z4i<&Ug2TO4Ll@o6>MAHckQ36u=xVRgfGMK97dSwAWNR*5ZvK|)V^chZU346YQ(2I* zagoR(x54=UkNBvu7E>o6+D+0Bn~5#s0V^z55q}$)N#KRxPax=bH^&x1zpr~rfDjzs zI*;$GWc{to%SsHuwmcF$dD=-s^|_lrb;5b_&d6;ITL|^IO58&V9R*O`MZiqPlEK5> hMo?CYfS~w+ZNRw#O~Q!%;ic!FJ^a*j^lvb*{sW2zMdh(5T$LRM)cBOP|a~kDZzlTEw{b2idw0M$~i_6T0VkTf?W$18#~H>@9csN zNexKs&b*y@@6F!c{rVt2egA6Ub7@>QQ7PMtH->Sc0>;NCDpjoBf_CWlb(CfsxgH`C!{0q%r`lWQgewuhra79?m09qBNqQd(lWzh=fWeID7-whM4h`@f

!XGHVkds?^2kR$%s^1i7Mi>Ht7Ezqepw4gAD{($fn9jKNfpT%yQZ> zyj5LKhxaxN%~?-346(c3ki3X)E1LgM5}kHGu=J7T+|?{!Ua5Qc0f7f>LX-}@zEK+d zZojkoBHGnEDUfz=tWp<-Ht5VBLDQEB3qE&VY{ZVxxF)2(0K<6u-q(;6c-KftTjDx6 z-Bd_2GO4@HuU$gYkG1m#E`VHsqVzLN>nKub%i*P=hDvYMEG@nh=_y;B^E71S| literal 13500 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 literal 406 zcmZutO^d=X5RH3Lvj0Kmm@Fk|)l+x9xX9kU8)6$vq3x8kR^7$_?qs#7=p+oo8{S8< zT>ZS`aQ?}t-dMlZG3Mx4kNHbAsI|#AHo+UTrcG>(9LQOUoci=b%z~}zl2t} z2Vpj~5EQ7{IZN*1Y9HLkl*$u6fF$6?dLUhbJ+mZ1HlB!3g#mO;N>Y;DYNV#K{}aHg YQA!^@&Gpimbm707qIa*0_=$6N2J5$TnE(I) diff --git a/examples/runtime/shaders/glsl/fs_denoise_copy.bin b/examples/runtime/shaders/glsl/fs_denoise_copy.bin index 8822fac328205f84e13cb5e02ff37a4c15b308e8..b98b5490eb14d5184f5c111680eddb8747ca8bdb 100644 GIT binary patch delta 155 zcmbQwc$#s70?RT628M~YGWA@Uc?xBz$wmrg@g=Dh$@%$3DF)VDIf<3|r6n3U`N@eT znfZANwh9KC3P2H%QWJ%w^t6h2x1z*!=lq=fB5N+Lvi!^xh1|rY`_v?x`hI6fJqNe5~l57U2oGc6b%y(QxJav`OzL(`v=iFY2+6oodaBBgParX>aKzjLqMrfY#& zQB!~1bI&99nST`^SS+}eJ@XJK3J?RKE8otHyn zJ91ArBe3Gpe=O^v;%hWxF_!kMb1=-B<2wj+Qh)`<{W!ukyA#6 zj7@HG&J(Rfo^qvyPNj}Wmd8>l&PB#yKT(-x3}NtF9_u8{VFf7j7+#;?#mNUE;)A3o zN4;t{)rE#hyYSkN`T^!Y`tiic1Dt^m0(@{#l+vcVFkw$_36((T2G7|3+@d`!BWb5b zGVtp!fbm6uaROlE{@zueA_e#6s=@oI{lzY}m)M`3EbxAzxXCk|{8RU2GM+dU9@2s4 zcwE1AFkEC3EStBGa+ewkfgZMfMUQERJe)$#AV|M}KbXkC3&@j#gmNDmMQ?d5j7&7= zM#w~FhD#|$ni&j51oBKOrRGT{gwR4r#a&z?@?s$ac!&{17CLzeNAkwyp3(wkpnt}2 zH;h(kmMD=X98!yy2?*Tyk!5L;OPxz@q|AM=@d(xKa@O{z1B{3k3R=2Apo_lu`41V) S!#@uwFu?Hnr)T>VhQS}7_#%V= literal 1552 zcmZ`(U2EGg6!i*&lCi%q?xU0@s%6JbOxnF{l)dk96l3y5z_Eklq)tbFXaCNQWJ$KW zMua5Ny*l@t`=Q6*zrGaTzTbOTSKjq8*{5Z?J6wJBJbbXO4@q8>yEOAYdFq4p_Sy4J zX?fn}8#=8P0iBX+RWFL7T>A6DG2gCnL0Kkb@&3s0sWlza-9B5D!B4W_^TDauE@_u; zb7Fk(cR;kxinO9bp2#_N>X#l!3Pd2wIjOt$cD37sXcDM9M0N+9 zb(tVMIDfAtd=tYKUHG zl^s?extQ$1;VG8A;<=&v5ZnIdRBX9&Bgt}ye=4n2mZeKmjo^C0z0WgLT|Tg!FIrySS@fG~ hA@#fHHsTq+rrhnJ%Bc(6Fmg{^R+JqZ&|U`v?;mJ$m_h&m diff --git a/examples/runtime/shaders/glsl/fs_denoise_gbuffer.bin b/examples/runtime/shaders/glsl/fs_denoise_gbuffer.bin index 04774fa4e18042fcb7c487f17c4fe24c85e6a203..8bd59fab6ab7f4b2f9a3bc1cc08ac85affc0e105 100644 GIT binary patch literal 1676 zcmZ`(QEr<+5OrIrs>mhwb4eY#>@Kj#%2%tX|LtEDA!3sV37ZrX2U7JAy;!f%tMtt- z7@Vdg!Z6IddGlswufBXf`~BcwvkaQX%;&1QrES?(CD zk{z>-`9^kzu9xJYag0|j|DGhRD>UN{gV$9 zwBj<5!d^OwjY`7ENTEU*`TlB#9>yuqU3ukG!N*c3C(W`j(QuklJNMJnb5N}y9#xRx zDd-SO5J5LH_M@>s21RaHj@A+`;~5?-N6 z>7K?z37BLvQXA4))4*V03k0a5q7Z1Ct4)XY9LIC&kabbcrGME4tD_<+W8KvIJqOm@ zQ4VvHVHze_8$&X=82Y$;&ca2W#>7-RxB1R3`JnUJduvJ2QhZRbIEh`uR6>nB3F-d{ z>4%V^E6R>axjPiizOc>N<{h`KQL%y6xMLNZA)yu^i$7}kx} z4#_FRO^JJe^Tjlmr&}$q2^`zb$K}ni%j0^AKu7j3HX_Ab=tPEblEx;%hA!FvK*J*_ zpO$u;w+iY(c#_vduGr~?+DdPjIrwwTAcD40m$@^d-)wsb z;v*0rKvX_ylTh7n>4MUP;9zIuptPeLMCg$tr329vvU6;5M>u>8T^fKo{wPXHK?^o< zUXnq8*#N^SC4XmoEBpw z)dR_xcJ@o;upFaw4xUC>A%_(>P})YCv%0CsRNMKiscO;rUJnAS2lFvyI4oL6OzvO+ z-vkJT01~kW2!#170CGLroH@q;tKNCRDx19Ta)(5^!j_;KF`df=(^1{4QK2K(qSh+v z%Px;f-9(PplzR|1-Jg@>b1syRSeng!c7rv*HIa%Dd|zj1dNpMIpDx)iLQ^NxWiBb>8I>Ni_vMb zL2H9(P_%|y$P%dzr;c9(_A+Re0y!PFnu#WK)bpUzUDUa1r7K&BtCEcBU`CC`H;XS> vBRVaZ1aN=^Zw5hOU&XX3Z4n;C-?^d_`a=eRI9A5IM|olXa>(M>WMcgTpID*3 diff --git a/examples/runtime/shaders/glsl/fs_denoise_spatial_3x3.bin b/examples/runtime/shaders/glsl/fs_denoise_spatial_3x3.bin index cff6381c0c3bafc1ae93bb9e8ab63db2b1f77b20..04b372982413d4690cea6ab389dc75ff6512a48a 100644 GIT binary patch literal 1903 zcma)6OK+P%5T=p(5K;d^wWnxFYyt~r*K*oRtEl%@>LIcav9W`MSqrd(6Xl=x(3xE@ z;Lxfo%VOv8&CEA5d;8=2x%~9y#(?wI_^=DNQ66oIvyX-WKRD;RaG%7FKjSJ+&)ygY z{NTJV!i7v_j#n-DP=uMxH&NP(z-Sq7%ZFC-`<-E!yDV9OB`KoKHjQ)kjnrVXL6t@w z)+zW_wT~A*X-c?rz4s1xr=F$2q77rMEnJmdBN-}Dh&nAJR>_XoKPk=3Vc}yE-M%_@>tTFdU$O0ei zDY)6y;fY)lW<%I9f_c=1@1wC#!im$vRvZjLuTmM6VD5oAIN6m3sl_}1amy8(+ZDv^ zH2cI}Ak07Q4_*9qv@41v%6`Sk`k^fDuop31&@IL} z5;D_YH^ft47(HZyjZmzRnefzwUtL*>*k|>R6oa8^`LUW>$P`FZ6AGKG0-XhlY7Uv; z9a)>5z}ZvT!B?GK9ZhgdNa!dcP#34k4x!r&@s_LzrO+r<7!3Qx1!=CFTe>E+!_)Uf z2?Ro(u+%nBRNw(A4mT$ATDg!}nPj`TuX#DLhXB9}1NSM`g5R|BM8KL{LFS4l3L(^< z;)>z`@WAR#g?;E5Lt(Jgjj`~odap4io`!se15D#;OX)beFDUNtxHEqB%43F>U0D{n zhBv69Q+uio_qoRfpSXcHnM_=N!U8Ygt`PCqfxh&X_@I_vKl*nryaES+yChrrNEazQ z&~zzFC^PU!gtqgq-(+mD%3$!x0wx^W8L4tlfk1-8uq0L39= z_2y|JdozG7Xj89OS7nYZ1J4e$o&){gf9%yj!835JwuU0#xQiq5U#w%NUrf{Z0|Ytl As{jB1 literal 2076 zcmah~T~FIE6wQz(rlS3Y={_NceymAhY%1`=g!Vq9J)p`mttrvcq{>H|fcQcCm%G=F z)!qRaT0&JxpMIH-Z{znE|B|sS;+9{o#WsaKOb_w6^YoSM;{#r zzxX*$`7#dUget0{lt*#05upuX(MoQ!XB+u*>^M7-ltHwHom~2`WHg%xZ?>?hRBX1PO#JUqQR`1>j{P}Bc0Sm}!3s7ah=93+*8#v&7>f+V za+z=PP-OC#4A##X_ve^XTy5%>MBy{a=&rTM(=-r~?n(Li1Cch_)s9~@RyqIDSdn!6 zk^;EN3^a58wF>xv%H5K3{2PVr3a;C-LfwiP#;`EU6Ny4Gb7Z4tgF7k87dQidGIe1L z9{wYIB@Vwth!%hfANH$yd>Pu$c;~_M7n1^U8wWcnG&HL4-_lZ*cIBKduys1|m5$xC zr_=w)`pss2VA*Di4&@&D5k)l%qSp(427O`0wc`o`X^E#ss4X4}RBw8KVr+*nbqSHg znE@6=8I&dWNQ}9Dx`LU08V+4}#XGgCYHE&B}$-Q_yRAEw=@s zkcUIl3$To%EQoSxA~kG>AzDzMLNz+L9wJxu{={6FKvQ>3P!9o~%nCj2s#BrTE_Qi< zUG`zC*Xcsz3|Qz|ZUSVo*jj>Y%*12Ln3>0M?>u(6;Z&1`pYdWVP**vgUW^WgvsA-r z?pB=E5<4oQF6OrJ9xRV#h!-xfRh$7cR}&((4XzWTu2emjj61?Ho{rRoQ|&s!%c8;O z1z+H-Zw{3o7MSbKBB{Nw!uHN&H;9(#8`Q3bWL&{^1DQ=6%yju>iYNVZ7^{D0$4d={Qv*} diff --git a/examples/runtime/shaders/glsl/fs_denoise_spatial_5x5.bin b/examples/runtime/shaders/glsl/fs_denoise_spatial_5x5.bin index 293835fdbdd4c149654892b16278c54bae21da6a..e8975be65fbb761954ab71a2f3adbfc58d02f4f4 100644 GIT binary patch literal 1971 zcma)7TWg#^6t;zuVCY{c^AyHp*Xnp@(^6;&eQ%);VG*{2(oDa(RA>2oKv@70!R1|pNTpYq<58l5$>z8P9i7+L1tL9q-GBj`HnHQPe}0Y(SC}(Qco{Ir~9sV~a_av^vcb<~!Cg zUfHBc;m)*{|FGIr7OI+L1QZxKhGkr>IM3I{LQSI+Ka@1(tEfzPM!pb3BS1k>o7`_V zRd}06+wYh>*f{cJO?FX|QB8eT2^=98+9qg%+47Lbv_WRpccm>Faf^h^4M3iPnqHlr z$Q5BaxSgXhi<ju_C@Z2hh%C&^Xpf~d8*LR*1 znq*LM<}(C!A-`^jBfii(u)G<*g=OaZ;=-=4HBp>r@y0TNh%e>qY-*w>iFHm$tfLA{ z83mGR3|YW>v|e;h8=XU%=%lxRiGZY+z!Vp!i4IM75#lY`5K19ek(i^A%S+N;nI>~W zIXpv6q=XQlOs7T=iOm5fjxYk&CDAZfJS&sz5Dz&oEqW*ixG;2qx!^bLtr-}#YlvLn zM8O4wK9?g84dA)jpeyv#P?+_FeM_r%LlavAKEnp4akZy(9^Drd_rSc@e)ZbG2sORZ zH1ZktSVaRp5XZAU%kw?QbS=kmOxt0u<$9*?$8*D-4Hv;lEDrhOxHDmsoWR@_+4D!b zN@2;uI7wTB)7gbgM E0-3A<$N&HU literal 2144 zcmah~TTk0C6wZ()rlS3Y={zB)w>2q+O{Kgrp}h}j4^?HE)RbsxQsvSnAbv9cVaIkH zCr#L*s*TU(JD<<3cfWp~MPF{NEqp#&XBpl5{BX~69-MrzEd1c}DWf|Uvu$$n*|PA1 z&uK!vD2QTVQ5q#QjN&Z|j0la^e3w2M$=j)A?O9y-;Rg2Hb743Rw<6%I!Sik+eiKyw#*NK*u9q?z+(`x6qx5_ z+bm!y|IPi)Q%c=A>LgdAx)n*GQ=w5_8~UT^Lm%An#D)<# z_#^OTa_AL8GytUd*k9V?WkfvPJ4?r1jdR4U6?U8}Xw1TYO$%w-PUmEWu9NZP(v_KP z8#v0~J+-UU)2nyfr~h`pXogosPq#bla_V4DV`20`T(M0LeS z0T8eXdW51|7hx(BK@#T<2YAj+`6eDmQ?d+k4&1j+`B#^&hcWWgxg&z|1yq01q)|e^h*cSN$SA zhzpB_Vr9emIjFO^mfe7m$b*6Q1@NLU^}~#7Nd?vs-2gp_4Uoe+Vps3qg zI8yV}hc(WHEvq6-+t|escF~0`uhWLcIWo{yx&&XuQx<&Hn>s@+o|eU zRQ6D;f}vbmWz-=qoEo2Jygo50r Bc6tB+ diff --git a/examples/runtime/shaders/glsl/fs_denoise_temporal.bin b/examples/runtime/shaders/glsl/fs_denoise_temporal.bin index 0e656bd2321ba9c31e5424117b43b6a6146ce8d5..7657f6eabcf78b994c48cc87153c092862485f0d 100644 GIT binary patch literal 1866 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 literal 6607 zcmb_hOK%%D5LR<&3k5~by%apI6j{-ds~7AB1yUHjwLo(Vf`w|!sQ}6At{#>YS^{a0>9r%II_xto= zkuNseS3h(*@B^Rkw&_i_&T^E{LO*WPhkSWhW&7>>aHhLW56g9Sv)Y}!H~`!(A9nxv zkzar6bPkLBw7UN+4$B)U4(V=ryvefsc68a@->>ene1kKIU@S{Bn(4<_eezS=#pYqX z%;j&w(5{{e_*aYAja1LljxM{0Y;`L(i`Bh|dfhKwfuxlnd;PKBrST;U-L135PUNY? z2b$l=RQZQEP22;m{1c3uj?GvicAEz^XcODMT=v975 z5pVg-YWd8b&xc#2kpj;#F(ed>$cj*yKc7Ni62}2T!F{hViRAf8LcXfz12c7w5+0FF zwJgt24qDwo3bU410Cwd<0a8z|C%!Vg`jvX zLty;0g`lu3L!k4wg`jvUL!iI5g`f~9L!iI4g&-F$L6D2IgwS3`5Rkc~bp^>wl8h@V zFbqCff+a6{QdX2;7_2M7uGx^hW=T~nj?|_M>dLZ=SzVU0XEUQm=M_jMb?7{+xFlDJ z$Lon4*Wp#Ch^N`|iXta<=$x&~IRIYXJ+BLL+6K?>z6y`$bvdiU3wF-|eTJ;GEl=5U zUWZ=2`--zyJmsoU9bUkeo3qRoyJ>*2`Bh?vbryXWR`g7#uz^;)Ea}m)7dmT6gGtzL zJT^%%Y`r1?CnX*eyPIZAl3ME1E#`Gq7hR|cucdRjM;}vSgb#Kk~?N`lJ~)i zR})2-sNjAR+<+@mIll|ptMI^g9LE#%#V72pB5GYC`{Ll^=o3spU(5&2k3E#?2lqZ$ z-b0Wx2xHLD{(>#=Ql=zC?&9yQ>!V;#Z;kTpzxgiOERJv|gX?z$H_idxUFla3_C`^B z0e><6`&t?3)|BF50^hO2VwZ2s5+;ysUIBf55yivNTfJk_N54#Cr=Zxn3nM(7Ky_jM zJP-gtnn5Qi)o%wZ1TVV^v)XO8bJ>R?3NHD2j|#Up!C$5(gh;%^D$II>#I{%u1g|P^ z|G*SZCPJI*BX%VHtw$wj#U7jl?Udw#Jp)U-j6{(yR0Z0)(Sv{b_qfDzjvQ1$i*SihraqEA-B zA6F*T6gEc*WrCk6*`dHEq1x@x60F`)q`gDHw+k05Q|tgqk5@1Q1&}TZqaX=`kpDOr z5T)o8Fh@Q`=y8!S>PTkAm9)TTCRiGZOiR!*DPU-br|m&G*4snBs`B<|VUWI%!O7H7!^i}E?Qa%5Fqo#iHs>OF^Fw0|9>qOMhSV04Uf5ZKiw@L1v3fG|)Kk6r6q#&Phd>gaWZn2(}^{^+Dwb-DSXA1z+HF?XdTHciT;P8X&+GI$UwnR#gD`0W1K_@PyPf|4*;R^P diff --git a/examples/runtime/shaders/glsl/fs_downsample.bin b/examples/runtime/shaders/glsl/fs_downsample.bin index b08001d7adc96b5b08b8e7c8bea1ebf84f131bbc..61c4754be32deefce5f440f32b38e86b83515226 100644 GIT binary patch literal 1272 zcmbW1QBQ*~5XW)Rm+m{5K7t}?%UDKGUo?yF`v47Yu#hmiFj$zz&*oS2+Tv_AW?>Bv zaQFY+UGG}viJjhu1Iw?&tgi{dRCT{sRru&#Ez$vXL=zdtV>2enm^i+Y3i z*>ZvnEIE31>1JDIHG9U2PY^09DQ9>u<1K}#S0q7YdJt{nmSUMUg{bfYCLRWhj{LgL zJ3g<|^^+(?4KenjSm8}tRIZ2K5r(Bga>js^udY!{(D`Oo2OvD1FvnJ_2PqVjjh|^fgU1PxznzqhdH6Gubil)kc?EbF3rRGc%oi4$_C$XNjC!>2B-iVI|#2^heI1@HbHv##MULOmF_lI>z(-9K0CDU{n#s^Z?!@%u2te|$if|yw674!x(&srLjV8( diff --git a/examples/runtime/shaders/glsl/fs_fsr_copy_linear_to_gamma.bin b/examples/runtime/shaders/glsl/fs_fsr_copy_linear_to_gamma.bin index a924c762d03abf90f8e3e0ce684af66333a3dff2..98f98fb2648330af7426ea7da9f1966f909d2d7e 100644 GIT binary patch delta 214 zcmZ9EJr06E5QT}cnj;vCDR&b?5MhxJDiaT3Ll#7`2{HzkKaF?519%$`W$9w+o9@l` zz4z=j8*%=zEbAFB6{rf^Jae&4blzt~_0fr-lmj)Im6S=XsKOW>j;5JV57Xk*C;M6! zJ1VJ;09sNijt_4)~{8|K)a c|2wgD!gVOTz+H%ClNSN)_Ms^%q($2R8($4aKxES@fqrTL&OFH0&*y$N^D}oCpU9|W50u|) w`sM1rjT{m0sOS3oX*uvu+EaotGPl5HeF4_0QYAxN`SL<&JL-tOw0 zH@(~WiOX<|M=MnV*OY_af&;iD5gbmyZUDPuB8jM21Luy`u}dZcRCR4z#|7S9@O^2r zmZD>;66-m?`Sh$MFf|l7luTw+kR3M-rT*=hjZp%~|ucZYevAY)nh;pbETy zna#%HsfHwk%r*8&1YKWp?`ug3=wR@&9J-T)LkXz@=nMiJ4MJIoCHR}0%>iRNuF)j9 zl9U1=-SZ(d97#Q1*QROsSs>hWPctf9C!?(8ERGyHoS(aJ%qd6FbkHs2yR_zm!;D>7 zWML5r)|8^7b4vFgrRypE5-7Wy#de?9O>QSuWe4u&q-cmr#VE-EIwC+vrz1moGNk<; zFF}>H*Z~l&%}6=Y_=nnK|1HJDzZBG_QD^!c5VzD`+UDc%T-)3>Os_0-ur!);J{1X_ z$R&F;-*|S{@bOl<&)xJ^_5-y`Edv?aM=#<;Eku-{ZXu}|D29iDaL1w0%TS0|h^0yp z8^toh+}0&NiLSBWp(UsmjSYiv&gg1F<;vZj2v@}!Jm-w98G9gYSFW7isog znPyR(d{enfw`XULgBQ<-H;%JYd9_+UvR!;1uw4Va9+6{-<03Bavn-GNo+Ts}and5M zM^Ee319D%(Akh&$a+QG$^`;utB9p)wPxHMy^NSC!hpZ3%@R2^ zXGOX}MN6c@nElN@GUK}1$J|!#Y7fHTl@hw^ z(S8652`Dt6>J&&?p{E2i9Y!)TAhi}SBY@d3N(%^Vgi8Xr1c39V$k40yB^z5m>Fvu( zi{IICK<#ihf>Noj2>lhMmwo!+kiL%B(FfXnNIxg^b4q{NL8o5nvhz0YtIjfmWzZ*q zJ#7bF_$Nsr#tG8OkUk`tDy)2>-ls-dA;7v?@8WzL*E5@{lJRWw1a{d9YZc8Zu diff --git a/examples/runtime/shaders/glsl/fs_fsr_forward_grid.bin b/examples/runtime/shaders/glsl/fs_fsr_forward_grid.bin index e306061d4370fd5e939cf16223c26cfcbe4f6f53..4e65dee13614ae8ae4e0dcb7909193118b3e739e 100644 GIT binary patch literal 798 zcmZ8f%Wm5+5L9wx(SO(@8QTIMde9M!90~+I2I#Q}1jdg*fFuTr?8*-MdHt5&ddVTz zE=d`VO%M>VJ3Bi&tNS0{zx@68@h8G_6@A^7ja{wl2h*A6_4+!B@Zx#L581ZW#&!+t z*2@IWfIsD9K}gkx)UNE;!_wMrC5kbqU{|(SYwBYp!N?IN3sRfC-S)J$OVd}jg#~a1 z7zvC|&zqsV@67WzTiXs>?QFGz##Ak35KhEodf4&+>^1XLn$ibar`9D zw8}-QC08h!F}MLrtG1_piHK=MO9vFakA-yaZ~j3P1*T_{vkb1rZ;6 z@K}rs5a_-TnGkcOQBInna}!wBrg@<&i$YM>6b)4gs>jVuk%hbdew&J>UZ9)$vgTy$ Z=|7O((@Eg_OgIIZW{x=U7vwh~(SL7d+=KuC literal 1039 zcmah|!A^rf5JkOV{D(O%T34X7G%-Dy7>_0%O+(g}HYC6{w6>+j&+|`Aym|HN+XdRi zM%@tD?Cg8Z3lG-&iDj)sQ6~9}R`Iw? zt0~*d6grxm7p7?9(!vLtTV~wA%wCo)&DHLL_5`UcTAVg~qW6=s2@Octg0QwrJUwXiqBX#BTTM#as#Y;DCGdKpPj4@sLT&{^JhtwW( zI=U##6NYGBdUP0X(#U0LFUSFFN}l s6#E_;*7cR?!BMLT;i+~82=Dck;dH}iX>?nN*^T<0Q24%2ueNP{1B8(=DgXcg diff --git a/examples/runtime/shaders/glsl/fs_gdr_instanced_indirect_rendering.bin b/examples/runtime/shaders/glsl/fs_gdr_instanced_indirect_rendering.bin index 499e7578379595f30b6f370d2c8b9f0c009642d5..a7c22da485a147e3f95be1fce01992347cfa086a 100644 GIT binary patch literal 393 zcmZXQ!D<5`5Qa@J0s96$%_X2vmL$!gu-#KjNY6c%u$VP2f~#QN?QTonDsR)5>A0pe zA%n;`^ZU)O>$lDA&vA7}FeYT$mX$Nk-vA-FFyw>~+FGrgZ=l;(D>zBsAC}vkQe{K{ zZ9y4_Nmn)^?7bG|^(Ci946Y5#xJm@=EEF*3fR)7A)v7PoUewQVBBDB{B{V`?#_2Z& zj8@wK<>C=<#+04oc|JAKE8MQeLbzWvYhZ!t66a`#2 rhty1@$oQwllhhxT@G{wmg~K>9?U#>3|MBZCjrPOW{pd8O2TI8=(S>Zd literal 407 zcmah_L2AP=5L9w0C_l()PC{#8 diff --git a/examples/runtime/shaders/glsl/fs_hdr_blur.bin b/examples/runtime/shaders/glsl/fs_hdr_blur.bin index c29db7f80bb5dfed0ea78e3e9fbe146cdb644ea0..d65292008096391013bf25cd6afde960111d7186 100644 GIT binary patch literal 912 zcmb`E(MrQG6oxC_#h1usr!sQRNt%S>l`_2d0YYx@^MdNmhhC_R6@=Zx=5bZsJv{x=h1%uIoJ)Kh7l=eME_%kSv-=B5JhK zA{ecD{ECNvBcQ)pZzuw^B@K#{)<#GbDTy{}Fr7Fr&;P-}oev-p7&2BU13e?}O35E^ CxE=uj diff --git a/examples/runtime/shaders/glsl/fs_hdr_bright.bin b/examples/runtime/shaders/glsl/fs_hdr_bright.bin index 3508900c64a8d2bf0f9bf663909f5fc39778f9ad..48e8ebeabad91849cd6a15c66b2e145941330b38 100644 GIT binary patch literal 1814 zcmb7E%Wj)M6s1vBrF7FTsAdVSP3QfP+iqG#U3AxF6(Qo_$dd6`7#y6cf7K7{9gJfG zjwLQE;M_B3?o0RP*N=Dh!`IIq*lX{)jO~2BNsFuZo(C`3+cGZfD$SDh)ho|~7wmcy z7ismg%-sJT@@wduUE2Hz{(Iwjez{uAZJwb`lC76%PQRnW>FGvHmY`Q2|p0$uA4 z9e|hVFa>S811``>Cshi-1v>4dN&&b)XPs0j0O#o=gd=h=!?Y2M86$bhGK`^b{q=BO`RY>90$&$Zi{`WeZx_b zAIcgRvSJttX^}rNG5@!}etaxGfBjGdMg)IJug2guXa28d(7*dVfcP%iHiHdWtz*ymfM zO}H>Ldzb+t?+;~$$w*V;Sg*wSKY*tN@XiE~jT-~ex&c>R2k4z!JvlO}K=cjK{cFfn<;CAijp@565F?@D%4&3*+mY3bQG}cRS7& z5+6AO8fc)wa8Pal8uWt(=AfYl8V(2b3_!zv(9j$-(mshcwfH5S$RYn=YI$hpsAd^sj8EpkwBkcCp#>Vwy49@7Poacn*zO__wb6p!lc zHyY@ZWS6w+L3!>}%bH(RX3=$t>AK03)XiX9JOWAYcTIJSWAEyQ`hon2ie7J3)+U>W dO_>2giML?6PHxL|DRo%Q=>mF6M{qdXq02Ct&PDIb*B5TqkM#CuXRoFB6<&E4bBeQzTE0 zMyF3>@1892oAKc;otz?s=!Xzp1W`W(brDkbL&z>dseTC6MQGg*p}PoU`XNjgVQoKz z?IN7(hj1r|`7-1c%ShJ0BstbBR0&2-CVWhSj3v*NkkWc%yl`G=DM*hPA6ub?CgO@q zW6`OMa!T4}jaw2{b1t=W!h0jMvJUNrbUI@7Fk?7>vny5{ZYfC`;TOJ=)?@rV-ZMcC zHz@}CMf?cS@&n;HKQCs8sAUMkpoXMu8Gs8Xq#SIMZNbJMF{P(2#H;;7Yo~kb$Lj|dcDt^i;tFt4>o(BHu>?Js6=gju;hd7 z@1L z^OovsRDU{^j#C4T8ce6MaVpoSd^*)1r-m9eoK6kKsgXvFrc?PiHP)!{bZR(GO*CpU zof?f(DHg^#VW~Hr8xLGn5J(_|AQOPBM1z^0FMZ;ehN_d|x!NJHz#6c4Gh9k@Fgk@U}^N+0U1 QP`@L%zF&>o`eWPHKiwc@2LJ#7 diff --git a/examples/runtime/shaders/glsl/fs_hdr_lumavg.bin b/examples/runtime/shaders/glsl/fs_hdr_lumavg.bin index 4f9ffd9069fecf9c8295313f01962acb75e3c8f5..55dbcf09acffc9ba9905ce62e20bb720bb1c7a28 100644 GIT binary patch literal 2195 zcmb7_L64g-5QXWUR`k+eQ27YkZHfmBMrnI#wd%c>O4SO{EJR2oUJ;UJRrSC38L|zQ zvq-j3lm{OVdpt9~`~K~<9WC+{9Vyk$1kc?o%hPq7siik zJlJoWT6G(?D>sjA)zMdWMwkDe9;#Kso^5~f^nU64&6eRdv4gf=Db+nhOTR6j)V>c| zwJQ5YZP_Olg$#Ezny_E%`dHj`<$9P2JPxXPV4Jep2BH7QXBY!lWE^k8w%>PEaGucZ z^keMZc}CIw;`kIUCl1olfm;rF>^29o9C#$$EMnV&XKogWZ9%!4g|ICW$7rUug>VdK zW?Q6=;gq&T<`~X=Vo|rM>{-Ew)C!&la&>WJH>^57QV?kM8;XQjAoJfdP7;4YBx_Je zgM_+7j%XfFO`%>!k!4d>%Ndww1`Ig^Q*OYJGjL+8jziAC!dM@NoPkqwfsiwBW-bu& z5yJaLL$xfB0h{2e`0tyhjv-DE%QcvgSq^|Jk-TK zR9UeB%QkFZn2Cg$=wn6<%tVEm@G+6P@YEgA)d!6kpy;Yd zDZ*|_*mw57JrYqLHQ}J55*0O2W#^#KM@7jxlOLY8P!vj5p}{Jf3@=gHb1pk$RcZ+} zyo9ot@B%X-M@^`76Gix6SJ_T@fu4}#CsYcGB79a^QFwu)kRvHnT8bikR@qZ{fvAvU zDpab9BL8I_Ceg7?$+p5ySJv>$xB)t|+Yespg43OK(-89c4Qa5K=0B!c1R|M z?I78-ge=L!nKy5SZ*=?P?vwfR`FDovBD>twL%;CzW_j@;%kaW=xvmF4-fZrDFeKZT zk6D&)7VWHG&B@kJ6*&Y>4)%33Uv_>KBFO<`lIQIrgh;Zj7Z~1jlOxNv^-stDm;HK@ zcg?Qf47BT~&CvD>@}2O4pe1F#f1Hi=?W%da>AQY~_}jjHAoHeO&?5ht6I?M}Eu_NG zl(XG?`jWqxoH*Gtr$Fi1W!Cl0Kx(iWeIELO2Fx&d1VFY;7q6e`UPY6 z4u(n?TswnIl&UH%9XAMaj6F+R8XB1DBJIf|gi2^1?GuW!8Z0xFVpL zkWeWs#R|@~jonCPzD*J9D<`AO`CmQE@7K3BG@Kn)vVHD?w*V<R#%EnC%LeyCZ5#@l_qDor} z91S8OjCiS95H_jL;3ANL5Bzf*%D}T(mBok$7_saS#Q+S!W4X8Rf+(M(!Yv4_20$no zz)cU~k+FXaJxD9Y!HNC9qN-sN9qHRD*#U z=9ka5^*Pl3L#S9oO$dsPh8JTQJ_iHxE)``s1aijYA{oZv z_&%}?iL9=(fdn(2Cc(vP@<#kArkd%}N!>v9^iHCwUH^%WKaS>}zMmUsR10yDo7eGY za!)+)4+-4bfe4SaCe89W2?KI6N8M~w-VAHPd#c?u8DANqzcYN(MB}JvZS=wjUR_K% zSP+CkgXb|<+3gP`mYrYjBG09kHjs+?iVZ@iy4s;~IRBWy1Vp%cW2~Fe_(C8wb~GNi z2Dmed8q?nrF<`0LED8BKI~n$HcwL2bUoEn{5Jk0A;>e3nMkLw!Rxey1q(08_6(KV(klSNzm0OJ)MNq>B>l+&#d%ZJ52c5J_2vBv= zjG1+!giq=h=o60~cSZZY_tvrfA3VvL20!M6!__>Sl=`~P2%_sLm6 zrZYVG&x|Q|;LPujkPibqK+1*BH}`pxtmJ842$7drA@YJ3rO1jU&!0ugbF})Rl>7h_ Co`F9A literal 620 zcmZ8d-A=+V6s`m>obO=HWv4ixV+jfB4GHny2UyA|%aV2_Wt$zwclUJJMzQHd&*}Gb zzO(!KeAG`LZv@YTJe<=?*loQRT=(s0ujWe$zV7&MNPX>AUR zO;DG`Q5ywku1-=ICk3PE^;_|31)cCFXmoJ^#fuVX82kj_RAZ>r30>0V1{=dWy1+Xu zBed~)w#6o;-W2c*ELw!{>ad{$qvC2%VIG@B-$-8ED6+`5&Sx~O+XwGmxX zI!2vAiEH4pxClzSpg2`8$wFrlUMDm8UaZrV6Fy4Ks{xpJRtZ{VqL5VToKeLsP=o_6 z4qv@+9NF2xjiWY1fLEhqXW6^;F+DEEo`bL_HuREPg4-1x|KJ6dZ0+_u2bLuLrgNF@ Q49~Y(YJ>1G*>4b#KN?E5>i_@% diff --git a/examples/runtime/shaders/glsl/fs_hdr_tonemap.bin b/examples/runtime/shaders/glsl/fs_hdr_tonemap.bin index 19f97a9e97fde08f2af969013c9458c13121aeda..d616d8e48085468333a1704369cf151f20bfc710 100644 GIT binary patch literal 2452 zcmb_d&2Aev5O#|mYV{>}+;!v)hvbkP2)(pL&_i#1070?kz<{JRWXYCO^htZ{HE+;M zzu`)|Rw^d}(zSur&TwYF`T2%#e*g7{zyAK`!x^6M&d#^fO}m;eXLsLzb9RP*Jfr*R zX1@EmU9@YJbi(h8@VD)95SxO{ z#?QdodUCMvW*P#)LJgbU(|dDa=DRyrRYmZKPsiK<%B3Nf@uN2lu<>eo6bz+473yZu z&Nhe@BMh$FO$D^RvP~ctIC?>J%Gu%NC?_5p+jvf#B3WlCdz?8^QntY-whVJ;a|+gZ z71ZOB&>m$URgR-NaxpovfxJ%=qfnN>o?Ho>h>4xE!TOkRGQ^P8w}P_C5yD!}Ig>~v z4k_b!bT5R?7NM!J=Jk-amO*hw84p7ECh^{jwK)To&mMUZXJ-$4;yO`>@`>i4a4`-4(fX(ZSMAk3 zubN$rl&h-+c#2u_)a;&(7CujmmKK<7_fQZ^6p^yeAw?~)s-u)AXPd+(vSFWpZC)8^ zI%NvUCkzoq&&-4YiQ34V=a-g`6KCrRcunHMRNALk$VES24?CiHs_T+Xr&skr128D2 z3@@d&)l^-UGDS6+A`P?}!ZG}Ix~jyv)KcP%z6A~0A3k#IB^@01obindHgF(`;zT^f zpiLf|OKR9BLb;-|F-A;7X+JdJnPkj&KuHs? zYI2H}Y)UF5{WUNae1a7HOIFx>(5gT?5d*`HlL6D7fhti5o>FuXW`%^np!{bDP3W+2DhxS<(NU=S=V&?UPCwpGXca=~)?w$x$N=Y9xrX)Dx2Z$0(23J{`5Nj3@zB&qs~`jdL>wf~@( zzVWWTP9SO}2nbC)_Vb&WH)Afpe0ulu*Pq`#eBShqR@Jhe4X1sP%Ve({O!s^xI~ zp`O$WT4@&F+QrYSX}5G_m)=iS!L}bqz25y`u^G=s?0$GH**#%h*Y)CtpGSd52Oe?I zBM*AiL61I1vkQjgELV#mn8Y2GevliUv=GW2L*yPp0U~zL>3Xwe z$85Ns%Q(g!7PubZkjA7uA;&2bvVfg9aL*6P^Wgdken`dvcDTGUblMu}8i#M{C5tH+ zF;BIS+GM)Vc&bcp@=TB^3a(XdlD-elGHM_;dk|8{ESDvn%Y_j}N-}va#UX_49s(Do zQpzF-QHs(6l!hy=#Xg7INj+FPT3L{m44|<{`B`k^vs{rA3KOe+=KdhNF1@~Xd4QAK z9JQhDtW)5zOXIQUVA0xQ=PAY3ZrY%@?RsW6S?Q%v0|eISF2^^zV<)O2xV0d-0MB<# zx=z>`i?1i>8MZ4cjR>6HoCG_iisUe0boiecH(HK zV)-?D+h~g*^OVPu0=0(Cc^tbNecq5Cg7MkfdL5Q2m7_h-;n?&CIBjN# z#%Tv*35E+>%XaS?J1!QZt4d%-GS*mo9i&pJxi)B^Q;`~#3st~GUzLSXLPNbaK1;g= z*zF(eEwfT)87Z{LGcIfgLixsIPaS{MJlLld5#XuhnoEO5LcAuIk~+A%AMt2*h0$0E zI{;gg>bpPhXn^hx6cir#QcERo+O#A%KcA{|jvU@M2)n zGZRuNQRwF|lc{6&0$|EBLwS`c@@G*~p4v;GVb-+u1fg?VwrZw%sYhw^~Td zwF{DaFf*|T(UYv3j>E9ROP4`)t+vSRN0EPHMfidXN;+Z8>jxGOuI}6fY{1c1_GLk% j8~Z~8^s(7o;)tt|>u6G4E(Rm}?;Ni2d(NZpQPlej4qx90 diff --git a/examples/runtime/shaders/glsl/fs_hextile.bin b/examples/runtime/shaders/glsl/fs_hextile.bin index ee1b998d415ec52f2ed5f0b4f37fbbd2c2723a64..d9a64e739bb3e01d5d7ec103a9b856eb8a037954 100644 GIT binary patch literal 6671 zcmcgx+iu)85Ow>~V*3R}U-YO=9F-VZhEB>rJvwkiY1E^|3&| zrsoVLQQnokO`1k9uo5|(8_x`9=%>H^`putzfA_}`o-dESezmwDv5Ub#xDhsn@5^UDY#uIGdfltT1G& z*Ne;5)!F83_448De0jZkwW-fn&zBsi9#?8!VT6>fdiMK^?c(Wr`TI|+^VJ$GUa!th zs*B~>%X&V0H>>b~&Qy!mYb@n^T^IJ%y{cA?@+v>UdF7+>sZGX46SeW6=oM_P=ksR! zcK%SZ%aQOO0<`qudQadsB0 zI<9o1y$ect9a`_4j>&lo=gjAHp!oJ)WgFKzt+e+hwbuAHTAyt2dzxYpn!Gq)t=9Dd zYE2L%60DccH@gH_wcJ#Tz2>1uw~#vPoy}9rNhwu zJXFl-?8Q=HEG+H=N7`whOdyzy57s!NWAOXyoQY+S@wgCHk4h*K74IaR_{L|Uv5IDN z(o*A$3n8TFTAj30z;$g0a;~490=6UpK`|%|kpvm53)iCPz8$LVVgTf$vwsTQfogW(ZqpR(f}9^2+&3tCa7(H$hcZAEkemtb zU`OB%R=^$fB)DVF%W>*3)GFnp60=j_PPDcIH~0v+6Dq7OZ)=4?0XGJV+xksM5@qB- zNcuogF9C*T1)n?3lk|@ zQMLB#r7lxVY+Iy$iz3#kh=WN*9Ox`QS)sC?;V*fjkTWs1!E2M8wyko(qFQCCKeDlx z?&#J3EIpzk{21xdvix`H>4T-aY7rfg()BC9td}RHXQ}I4@}qj@{)mTpOfzY8Blo-N zo#+_toe2#x1?obF;?5wBu|vm|)w)4*fnv|7pro(pnh(>a1_T<%wq=KA*@1X;LS5_8 zZ!C8@Hr}-;69J3`dnL(a7OU|^up>$Bwi+~3PUpjBI@v<-K#85rA+nLFc&u6AU^)@r1)Mz)UVo7xfSPL`dB)mA=vc7xy7HIC6i_()6wlor{eZGm)25}eX#6Y_(b z0)=WD4TQIet-~Awvn=mEpR5*T?f-38?@86P*>>EJ;3mL_#GYSF2Xro1Z?f;%Dicb{ zx7ai^#W?KH89E6}3^Gj1XxBNnbf0V;62;DG!0nY{MRxi7Ooly;vDq>r`Eo6w-lL!&j~dBtX4MC3z+Oo@4P@4INi3Tf;IEWv~Y+1yHRC;^QOMcpHYs1LHGaN+;} z(mCm3*@2YTM(~BK0kIg#Yz5(iH;^A~n{Y1!KjV6;Q5q?k!2zT| zjFn3jO!BTs2I)qdA7@P)oKqqB;kYlG*mHDt)ClL=jY1CAnz>RUDciOYI!bwXcQY-e z3zQC{+Oe!H>a|7ZzO?jE4~V>@|F?2cgF?k8xDk_O<+Ii5907ug05o#h^a!75REj0N{#NB^AnlJJa?tDt z`5ifZAlA9)%{%5B{Z`!}`*d!@mKx<9`F}N5@TqkH-xFomKYhUs*8Coy9t9 lc^<_|?ql(dqL<&=pgoc^2j!s*pasj7#FYH^v-h*v(Lbvvg9QKp literal 7628 zcmbtZ-EP}96wZ3HA$x>j059d%(Ikocbn$&TzU94XCM<2gEIeBQi?fmvyJ=Zgb_=y?7k4+auJ}Qb z%kT6y{Fs_NQm9oa}7>>qe{0?fGMZ;2t++#vl+4pY>q8U^$LZh@DXc{ zVV3|URmgcPvUCGZe8ysu;U&&-Z=z~XHC$7;eEM1VP`)QDL4HV!%{OiQJt0D;m}^9V zuu}KM&ndo}{`U6zX4Vw6t_39uTG|{>qsOHEW0hF(Qz{9NL%yKKUQa-sZJ!aKzt;dK zh6TtQpoLCzlb2IXiE@e%-lyVb#Ol3&rrrp-S1K~(=`S?+uhOE{d0mqK50Nu(avrka z{X;tRJfwk&S zNy9XhyFoFPG@K04P)iNfnWQ1x#5B}W_H^E-p-jWQ7c|to84X z)I(~hr5fseYKVuVh=#U#kcMQyG!zDVX{d`pL(VLwA*45~hSrc5G4wh@4Z-994V^>B zGWdO%hP}?u(NIen(ozj|F-SwHJ6futw-GdyYN-2a*iU0u4Rucq!9|aTy{!6b$RXlG ziI!(hZP$Brj)r429iX$cuBxmkjlC23O?9Nc3kPVo$qD~bShW+@a85tyAJy_X|Gm|V zB9a`NKQ4n||Ayt)NWn2EIQ~-iQ`cVN6)oKDlEj}|NGxExcml$*bWGftC7dmb3fEtF z4GniwU`M#i(twIdnva!+Eod@UMK#5_$!neJ-jw(lMo-E*Ez8kpH1_9Vyx~$j2p*nS z;yKYC<}zR*mDJ$r^K-DMeV#mgnC*ZC+yp)k3rim#<2fvJK8yuCAHssq!rxns+_j9hr@YJM+EdQJU1$3=#!HfhB1KT zo?{kx(e%m~d`q=9xQ8T*`37%1fRe3Z@E>3%yR`KT;KoaJw|oo$8v=KNwGRFR%ihI> zVi9_0A0=pZ5?U}Qzv@hhMX$K|#7+b-ayK(r;7Hs>-e!N@&D!;>`}NQE_Q${O+Z&ZY z3V#0Wmg4?EieYsHY~-$F?5^b8%loPsCZybSjN5d8a6#d~5Jrg=Ke)5Sq?4a>!R1q;Ca5MxcIEBu>9_Eg%4|!u^8h5i*Q_}7jQ=^o-M2YvM-6|G5 z#shM{xCM_z&C3OWjznE{E@}v+)Z!AgIFWUOGg$_}>X5c&CvXI{JgzkyHo}8W=H@l9 z7Ey`vqg3K!GUU@gCR;2qOCDAM6M)X$a;0K{93+XX_3Z55C|DA{^6X35rM)${F0Z0e zny53&-hLVeBa;Y5k!8(0__8YFBF9C%J(00DjNrhSNg`cjf8+#0y`lMZ_nH9=P)!+J z%70H5aZkc{5Cu}aPsjzuk#pe)am_#A7x(0>9Xyf?B#$;1_6)XEd8JPY!7a)sF8U{e zS_YS{Njm8}2RjFl`p$!Ulvk@M&b?ASq<4F6d{6$tfiPA6O{vgqI4Q7V!X1VxIVEY- zE;d+H4)qQ8fs6M@Y$~Ga5H`}eA902Eg`=?XJ@;c1=?teLu|Y-k<8sJ~$*oA5cd;21 zk_r#_$6`amH-wFJ9J5W zruUJLKFYB>TGL@*8a@lYMdj_WyMmMP788m0&fRZ@uJ~CEO9gDT{z6ufMuf;_Ut~B3 X*vK?yPOSgAl0wJY12BF#Jw5pkp>+XV diff --git a/examples/runtime/shaders/glsl/fs_ibl_mesh.bin b/examples/runtime/shaders/glsl/fs_ibl_mesh.bin index 6a1300ddaf12b87ab315262c33494b631b7ee61d..975642ce304ef457b51fa87378533cc1e5683e1c 100644 GIT binary patch literal 2844 zcmb7G%Z}SN6jj?zt7P3ZyQ61ZMWjSZf-$QAK?8J^EDJ->%xD4wwl(l;WC!`e{!iCE zm!zJf$smLc+q%4m=e`d8;qzZ_K7IY~cMt0q@7H7gSnP_;{^z%zhZojw`}|PW?~k{o z_mf92thep6kGoy>_+Q`i{Nr}@Q0+GCRNlp`f%`|u<)St1i_PP@+z}>gkzO(5poQC(7&+p~|8#l4+zf5r*vLrGX>xod|G;7Q4fo%RE9&!`cZN& zs6^x4=pH%lgeavdQG_6dL#E@co78WLL(Fm=n$qHXSDCqPJdl5`_+G91C|zdDL=XHT-jUT9@xl7e(5E_lGBu zYQR&!#*^}ZfpF0|o=ClWj4u;R?G!b^eUGV|HwQmt>H>8c&0b+DO+U5qIc<}{#WGd+ zGQpJk3E|1tbLw`w^!1tQl#;~l%1NFu3j>)^kus`)(a-~R(4-DD($E@c5BxZ(O62d62WxySEB0xigKM;rG zuH@}ykK26yk_Onz3i@NLDX&MxvP0<}0QHVJ_%2%%oN#(gxLbu-%@7G*{3ev!6aGo9+P9 z7VoI#Cd?v8UMy9Mfd2)SfL3XmsW_8Lp{!vRAvhP^@K2l7HPC9req^?C0`u91F*4g3 ThWRpSenPO&>V^N!_r3oCxf8^5 literal 3356 zcmbtW&u$}tL?alZK_avJOYx!KN z3xBn!rt?YNka^*ZK5-47U~o3R6w_*aBcix_-xbE8roNhtJ%lcPhO|)|+j-tC}&@460s1YK2|-oXO{bDVwW369rQ#c2p>jdkQ5}C-CA=g5A-efZ9GRUt< zetadO2vrbg%zS~%I2QM~7s7NtY)!{&5m5jnk23mSq|AlkAC)fZgQzEqdKb&j$54kV z-sv&3O(Ku&oU;g>0X7Big~RFt?&+3 z)WOpVysdw1IDSDXq7i#M*moe~-ICG1YbPMm6w+$SVJtohRg{)H^j5L3rFiQzIdpqP z=NQBRNGpl7`4-H~OTh!>F~I8|!`p;-L?MUGh^e-qZ#yo|AYBE!_C&JZY}2?-c+_`ReT`! zN^?WG*OSrbrn>$#o6H(VVz$)!T>yO}L{uh<)l3o+Voej;MIVuDu3|LyR3I;tzFk-F Sp*-LMkt>$NY4@Sq?feCZzsxEC diff --git a/examples/runtime/shaders/glsl/fs_ibl_skybox.bin b/examples/runtime/shaders/glsl/fs_ibl_skybox.bin index 2d4d547340033fc0e8c605f982b8908276d6726a..e229760218272b20bc0f2030568455b1b08511a4 100644 GIT binary patch literal 1853 zcma)6+m6#P5Dg$92>TJ{%~?vYoy3V%^#QH40*N;s(JD%}=_*p%ROu}(+JEDN_y}g~ zBu?3~)JoOFGjryg8GCNOe|h(7@i}r}y>i}c(^Xbyi}lMZ$AJgd)jHke&CPb2f30ih zg@X^QxBa%=`~BK+-0iZMSM`GI^81i8t?vGCNe;4K1ttY*SQAG9k<(uw#->ALdPZTW1e9Rat?zyQ_*BS!BhMdhSn`z|vqT zj~Rq6fpu0E$DC?(Z`^r=Bn_D`pT(TeUQ~GJ@5y9BVxM{1*?_jd5XKb;U?|^aTjz8r zbp*zkwK*^VQ-Cj4jjpOa&8BOL@qTkSdLvDg3STh2!dNCj%%eoGfQ!fj2kpCW0UtG+ zyj0&;^u_>;IzRXgDE4;Q*%9Dy&O;47j%PfQ5Ih!HL-7ZE z0#G1gi9$rI&IKSO_Zj&}Xx^;EX%{?lO_LO*a`eYYl4@vsvxiN2yC$B_MECda*)ih_OO{C8iu7oKeBOXW{VBAlqIPie@kkZsd;=d#xItq}) tBcI55GxuY|@5%V|ECP!(6P3s)NmLXn5k)X+nF>$=jwg_f1$}f~=MT+}rh@MZ_l~nk>s>yd!6thQVUtYq`o>+)^J!I=(iVaC@Jj^u-PSTK7e!V}H(<#B zvyHxQ+)b5FpiJ{QFwgztLhIzQDyljWH|;uvRk^^xl0X{tKa63HQKdz`&lpAO$?bd! zjF}*#d%lJ77zW(;Jdpg#gJKCK#BheliDIqRbw-&mlM2S#GoHzh%@bKX5pQ;TX>Zc*^+;S6@Sq3!<0(#cFp^Pge<9zt>`IkxhrAvjE0&qcZCX_6N&{mns2FjU zF6}NAI@u)sb}9cl2P8Ov#X7K92YC1>!+Sm*&`ns6lfsW@mjpb8&i`=NQ-y|!SjL-B+?_O-)|$*(3rGTnzTyJisY_NXSeb?m&I?d Lae-kUT-W&rrqS@n diff --git a/examples/runtime/shaders/glsl/fs_instancing.bin b/examples/runtime/shaders/glsl/fs_instancing.bin index db3e5077874d49000da393452f7edb528b2b82a3..46bf65fe89bc159bd2dcd7023324ced2d84d2125 100644 GIT binary patch literal 133 zcmZ<@_TXO9{oa!S42pmxS59JOerbtDPJVJ?NoIbYf~|sqrUFnzp)57oL?J0Xts>s7 zC^6kRKPSJ)nkzF8B3>4s3=%M~=He>L&rDIsP0Y;G(B!J-QUC%}O+XV7s%yEp7yyak BD2M<6 literal 87 zcmZ<@_TXO9{oa!S3|xR@Sz=LTW?s5NS!%M0LRoxreolUofi+iIerAe7ZenJhf`%qn aHJ5@ydQQAsQDV9?NM6AfNo6e;7XtuWs~M62 diff --git a/examples/runtime/shaders/glsl/fs_layered.bin b/examples/runtime/shaders/glsl/fs_layered.bin index da2b4ebae87a9a47297657e70d5e88a48446c556..cb1e4a0fde31d01de3db3d3ea0b43a59fca96a50 100644 GIT binary patch literal 321 zcmaiw!3u&f9Ea`t?PDwT;&ss=YmZPWz&JY#q&iy=)~QEpYG z+Su3=@6*fx8Uyr7p0O6PAvW9q^*$wCGzys&cNnj@!debQbDwxFb&$Fqr_*>8P!=#2 lhTM;6u;xE6ZO6oY^2cZIHvJOU&(D$RM{IpEEQULP^#UkKQ-%Nl literal 237 zcmZ<@_TUb@7~ahQ2DgA@Sz=LTW?s5NS!%M0LRoxreolUofi)LQI4vhXu>>fdTA2zI z%+E|w$W6@5Q_#@ls^(IFXe!Aq0IH5Rv<3>m*m~s(whD%NK!cFPDk`ghq8czu^gw(q zh1|>vpjc|Mu?A4Rj)H-np(%va)B%}qtN{}-(E*tV5(T+NQxjx%dQQAsQDV9?$kjlz NVb)u7)pBt$000BXM0)@L diff --git a/examples/runtime/shaders/glsl/fs_layered_blit.bin b/examples/runtime/shaders/glsl/fs_layered_blit.bin index 28af15dea3ff83a29a63f9d9a9c14f0bfa70cbb2..cba874e22b12f6fe7c8531b0389f18a34c684d2c 100644 GIT binary patch literal 286 zcmY+8O$x$5428!o(>q9(Efgv0Zd4GZxD-4<8S5wmZ6oOqE#h50iZcqfKC*gw`SOy} z!KdkFC9FK*H>vLRQL!p2Zz6;pE2z?1cRR|7o%1zcZqbzHN?c&2ihHhkzTYyd9*4aA zMOvLLafFuux$3E@gPbx|8!B;)afsHzPxgGfc4@-u_IWJ9l+K@H>&j$Ae2FciC3C?- knKB6B0ciDqXQ4J;H>`u9RpdyEU_^?>)n;87N_YZ@H*-!{YXATM literal 299 zcmY*U+X{j}5Z!!S{~_j4A*8Igtsn~NG3Wzi(M<%`mGOcWeRBWM7G(9yk2IIBhb)G&9 zYAB^HGKK!-geW_hj$F>u;gb1^I;=L5pGb+71r?&NJ{y i*i6`Kduoz}0m|g}BjJ>}s!!O zU!P}P^{}p=KLvA&xNn;$wy2wBUS!`gMkgjvc}JcpiRLuT`-F;dw3*G@ddn)*o~)kQ zZBF)O^vr=n$>P5|!J)Wx5LS}|a`5qhG7`0MQhQ0rN0#ULhEkz$R2}cwEtAASKvIZz z1w8?m5RVWZ!K3q9gLMLRu*@gzrYAUFBT$I|v^SK4Qr2qe!4Shsiqka;JX4@|fD%zU zYrK{ri*wCMNJK>?ui678MXe3`*sHElIi19DMms7^dDL230YRdO+cS8t$Kxk5_WJ7*|TpJ@Tc%wiA zdi2IwYDQ?){|I0>I!W=BLqIL4VNQ`4{}Leh_B+G7<0;%1b(f|$%ykhbA$BaiU+;Gq zI^Zrz_18=iacDm60=tVFQ!*X)BDOMw4d`Y&T@7LnlL_0^56*D0h%Ia#ndY=l^pmnK zFP1iZGpLf133MswnM&#SXB>DzZL=thOKK1bF PRro+K=`+s0XW8gC0Rclp literal 1355 zcmah}-ENyO6sD853-%J{ZYHG`V16=1?aj1m_j>?@(lkN}5G5%gnfe&L?33-XOtK3CqSr}9uYs}EQ7LeH0vp4V5qQ{AqiUoBJU%VoFe zcG1FjrWH=N-L9!Nlj&`@pUn03>bUTq+WHY|G_2;uon8F^O;xub0{@o}w5s6HY>};u z7dTwKv;~B;YB2)5cuyVmQlbU$eUOUibl3lM^cKsO*MdKw9>4L z)G}pGNhXIQR*^}8mO~)lqjfT4pj@s@o^e627GZNt;O>_43j#DUQG&s|V<30fa)J~l z9kH)lGsdj?5*r93pMgSr&JV6ZcZ(dDFp?_3xkwhgehoThvF!G5aZdlnNi|MRI5aeh z7|19&8-%Hd#IQ$l&a#w@(>VL8>^WSzxNw{o+)aW#YuP6A9C_y2F@+k*i?&fUozh>b z)BjiVQNGWOJ*rcfaIZJz{jOSnqpyG*PK2@Tj&y#u>kGb2IseZoM{^*?T7iD-SA+n_ zpY619^4v<;)d`&i=87Acit(^HuxasDnOdDcgpi?hx<%BGv~#BUxzg;#F2W7c3IX@@A$eODxKQl!kH!(9$K|_c05PR66Dl(z1BBgOv+U9`}C*xKefJq!tkoY$q zfAjdqzI(X8_WeFus4+JC43AH0?PpBJF7tr5L>7viV=oyZB?;3)< zbenBN3FS$U;E9yRNX?D5N=a>v!q+%TNXQ#$gaO91P)aeWxE9(lYnNA4<4e5tbrcQX zNIK{XQ5}O7m{1vpSZldtJYiI7Cb=?}aW%(^&^VqCh2u8HXlc2!oF<%G#gy*r1f?)6 Sj{kck8y`t(P>S9WntTJ`8HPCk literal 362 zcmZWk%Wi`(5G1`+a(-ftc1x%U%?ah!pxm2VRUwNKgajDT1SeEgzO4V2HIRqYJ=i-t zGpn8GeLel#oI;0c;ymu-L>Ibwm{??MMPI9$V_s!w)8rLxTcQrXE`}zyojw=(yGt-j0W*+S>Z)QzBzF?H>BN9Rfzb zD4={_B?_EG>^NB+tWt&RZLIVYmr$H@hyW4Ma{h!n_f3MP!y~=<5ke6aUMf|I%9RvZ jBBd0mjI$(DBG2_Lmmx@wia2B8A5p|*lxV>;-;|Oc;iPrc literal 407 zcmaJ-I}d^|5U!5pKbRXKAy^unP!|nxcX1;GkdOc+<*o6*d&O55y)^0dyL^wHe>xgs zvD*-=IWg*>Nrt`1g=Az#)WOnF_lur!*oAV;$`raJ;?OB>B!rBaN82*H2w6ZK7FC`| zegIAS|Je0tC$bodFe|~d=#7FhSV2=%Xc*ueK0Ry!U7J=WXkls|ww}jQ6kUUB8r&Ji zE9#hU{pr1gD97v?+S|Y!#+Ylv8ZYdvN%uwLPX8+mGPLDb&Y;}WJn&_hPRmxr=jSlk Hol^1uH&lD4 diff --git a/examples/runtime/shaders/glsl/fs_oit_wb_separate.bin b/examples/runtime/shaders/glsl/fs_oit_wb_separate.bin index 133929de6ef436f0976aa98688ec03ddd3665142..9209fc469f1c526987ba44adf20bfefb74f9afb6 100644 GIT binary patch literal 432 zcmZvYO-{ow5QSSdNahl=bf5&=nXw&3>`=uXcBqO>XsbwRT$QxtM~DM(Cho?hsf3Vt z8{6Y==J|PgcYF4I|5=P!x&n$ZR$=)!}UasMvXPp}GgD--c9fVF61=%B=$ zn~y%}9?qd^!fGv5s!Tp8GdZGjXpOU;2(5PnS0M9rxOeC>$2Dy;BGO34X4Yx%=a7MHUTr$9OK7<(k0OA~Pt^fc4 literal 420 zcmZ`!!H$A36vVx3Qh#EO?dq}x*Aww(jQ91n*^q`sLIRW^!s^EOW&WG52oX)_p`FgW z=}cE&>+xlC_AFW>>viu3I?=_;$lT02(^0A75N8ppF!)5}=X&R{eHL$Zk>0r0<*`b~ zzerV_feZG}fNi2xi89UU4d3yI=`a@Ht$6CSCU0cF{fRSjUW-u6f@Z9?iw|N%^zFF?e%r- bKXP@W55i$cI1UN*lhAMHn0EI9C&sKRujhC3 diff --git a/examples/runtime/shaders/glsl/fs_oit_wb_separate_blit.bin b/examples/runtime/shaders/glsl/fs_oit_wb_separate_blit.bin index 74a7c5184eb23d34554fac3f4e8a82f3dfe90c43..89f51b414ee6411d6137d7807341ee0af742c4fd 100644 GIT binary patch delta 243 zcmZ9EO^$*<5QQPSszaDsb|(xrKTX3B$AyVEFfK_CqUi+a2|)&(cn6Ipp2|Df7+3S{ zs^0hBeRLb0KgTQEvM%en0###IbnqaYGq92XyqJII;AWt2KNO#adoP5{;uGx0{g literal 407 zcmaKoF$=;l5QU>-{10+t3lh_yQ`JQ&?k;X6)LIH{Q(}!(@xOa1RU?Q;AeVRC_a2FM z+mRZt76fZZMyI$*+qEi`=43$Z!E)5#qwaBNq`u}=1}04e7`vM&r4Kx$=PExcUBXG0 zb&+bZ0SEnm9E8-U`~aoQEAV`Jr(g|c(3CYA#yE#}4@*GT=B!h+@Enhco5!~+E<-pB z!P@H$Io^xky{C{Am>tz$_~0AQ+6i#RIY)ht7xsSV*&_wJ*r0uWcCqeR5l32P-DiJ> J80=8hd#3;Z diff --git a/examples/runtime/shaders/glsl/fs_particle.bin b/examples/runtime/shaders/glsl/fs_particle.bin index 1ff1ccda60668cb3073e1df998ad553dfdfdb806..ea4e9d0b429fb7081938894ee6919f7004f35730 100644 GIT binary patch literal 455 zcmY+A%}&EG5QJU0Aam#Jqm4?m{!3z2oGMk^IijjE{Ua!etB|%Sh=<`Z;OW?q6w1i* zVRq(Q*^~Rb%jc`FPl6hdi|uUVD_^{vofCow^)VoXZp&;Hs)Fs7bHk3A2R$88nw71q z*=|-Zn{f!$VnlO)2-}+HVeacJl*oADt3ZIo+&^O9Z z|0CFM7xN-(c)N>3B%zZu4y25wbUHOjY-44I45GB3N~gf7)L9EjD!ZBLtIDOIv{E`v zVrMl@#qj4TE#7t^>tZmmF-c;zgC5>w-zh8-7g<#i=|Nfqw qMhzO9u;+zuxQu|^uzXpr>nDCvYYxbQ2=G3w?gbjy5hMCeDftH3M0hs< literal 366 zcmY*U&uhXk6pr&E*?s4COhye!RTvacf_UF?NC~Se8K&uCZBxhouB4L?*|))?VAg!7go;sBBRI3d^m4o zV-Caa+iaWB)|mpVHWe^VzbRZs8e1b*t}+CMzvy5IO2|7b^e04_H33*uWm2dFqwuvFKz~TjP#dOj`0@=aT!VTyg3#ab mg`RU%kV10YPi~2kxx-eBQ10`!*X7FXoyQ16%8dR{O8xZl*VVKFfoFdAaD+dxk~dg)AEaQ70ObRO%y=#)?8dUiIw@K zB^o*T$%!SI`FRSq3I>`AKoN+dr1Z3kc({34+8vi!^xh1|rc3GsT*#EI%_vAvZBIPeDVItC~weAw4JF mttc_wIX@@ANUx%@O2HPa62!Ddmo5iN8tNHXbJcQjF#rI}DIezm diff --git a/examples/runtime/shaders/glsl/fs_picking_shaded.bin b/examples/runtime/shaders/glsl/fs_picking_shaded.bin index e08782a9668a7822d82d102bcaa71e6e6e2471fa..79d49704540a0045f6ca3ec830968edb4f8afaca 100644 GIT binary patch literal 744 zcmZ`%OHPD95G5|#OY{;(hIBXdFT|B`;@$%goL@+o>B)!;U_6FPkL79HSltZ?8Z8nM z>b-jPs*2U)!}a^e{a4`P^C}2Xb;RvRj&cEImi4HPr?m%IX+K=oMiI*RjwFDt*^#*oKpX zD0iG)ZOR50RBK>uOcMe>c9kJXNQ~WUNfQ!{1zwa22KImOpaP7B}bp3!AFlOiNS>sV; zDb9w^vwxjfDUv9UQ>q!!4BT)cZ6^@66Tz@}=~fbBZU=Y%qY-^>wx?O|xf#2@X&dv+ zftp<_P(udV3#V;m=U1_R0ZbBO%9L+9N@d(VLJ>{1$RwjeYM~^bF7oqFNIE!70ryEd bf8k$nKf(Q<@G!x{pYR1>*iVk$5DLBlYwW*E literal 830 zcmZva!ES;;5Qa&5qc1VXUBwM9(2^K?X=-}!0~n&#kN|6lLA2>(^w=lur8BcES!*>R zFwA`O|NpXjd%geqe)$RbH@ypju4vC?vxjcCNugVBOl8`55qjkW%Z+L4qPi(}}D*koA0l1$Pfiu%z;`6OJmWM&r!Z96>ln#CQ>_ zI0C-R<|>v9!M)ls5|5Fn9w`IBhbQXn@Pb7DrNRsZiUSZ@#V{EWl8WQwT*~Om7sX-~ zUD--KNh$8FiyrJoC(XG?-KNYN$y9&BDKaV0as=f2>OGkmQ2wq=UGRlqEyCrf;b}?v zNr^^olwdH{z`k0q+G77qpM~nr1Ui@#2r=gM$j9)&*IdFBY+&wF;-N9Bl#-(+8!PX{ z2sBkp;SZ0q zi|h38DSfV=NYWMlQs!mV3O^{#-^yy674#Pu%Dv&W|zsqU72`KC%9E#j9feeH@lc}Wke zvaHtr(#ex!xv$;4TqSi@7VMt+9)mg)0n$YZ{Ms5&#OJm7FD_`i>Y{T4^(CLBQF+TM@rK&?wIMPR?UJfLGS9)o_ zOV12|PeqAz6w+OnN{9Y!9n;$;FO!hdS9h(+h3C|A0DW?R!Mjs zyQTVYZT;po#8VjaJXC4&r4L+FX%tSB8o>~#z0Qpvu>%n*rzE{SvUGCd5HObdzO5~@W>4BF9ce&JC z+6d|Q>mVLUX#*)lcTDi1(YPV4#3EEcBjmZZV$dmyT!qJct51 zjCByN8ABc(d%*AJM=P>h9J2+E@6}WCkf-dmtiB{wxi8keY1*gvyG`HO>rR7Jo$%uk85=? zMQs2JTp!;wwS7=cfzLo4#zE1hRiJ=*Lck|I@chbqne@guckPC~>Qyt1UW% zY&xmaHfg$)3)Q7?*F91Q6_O1)qk`VhW$1sHw4J5IAYLJw9=i+TlpmP@76my@*zV7& zCNRLYE^Bl>IflIX=hV2G-Tt?MW=!IuN=3THH^RXsCug4or;iuPoxWyH-vks!%soXn kF0MCp_A5{RROnlG5G=UA;L#!s{dpAd5X!nN?~ZfzKcnmp%K!iX literal 2748 zcma)8OK#gh40VgHluK|a#h>UC#|fOQ8U$Sx1=_u!#Ihq)vRqkqYzH|+4%AH-Jy%I; zW<<#{P$P(Ca^~^zkweYH_b+F^|GfY0;pbD&T8Cx4`<$nF(fiP&Km44r@oQdWQCeH8 zrT6iwd=|z{xXQC{Q4wVy&Hf)&ueXhgeX?A@Hh%J9OF^FUyqLLDOLzkEtiyQ`Ef8ki zmIKRO(oh%BEIK5KRU>zy)}&>tft$-7%}Xy9O;o?24cSGfdmIwLGKU9?pT;5F;D= zv)mLh_KnSr!?hpC#2ggh+>mzERtNbR%tKX^mH;~68J!&L^*p1~5Z+YzaM$?ov?;>P zHuUg(5Fcfo#c3I_o!g1*m3Fi|jrMU7R;V6#SM6{3xXWsvqU&+Hkl7eWFmL2u$O63R zoUl=4zyKGUjhgf^EnJ1Q(|*|t9yghcPo31RkP0y&o$KNquo9v(1xKNnAZS7vnb9d) zL-T8wh#>x_G4y^ML0~7#5|Z#5_qtPlxP`#yr+#0b9ZI`XEW5+nZz-=%g2v#s!Dzg- z`Y{BdgILZZOjk`EMp*$mGA9x?$_cnGxvEj*U5$2H6g5dqSRN$DX_~o0ga96kIQm&b zyy-{t&^ZVKF`o!U1*N=90tQJ=DO%jg0|B95ou8!?v04+RXI@Kr_dz29z4pKW46%(;JEBUu)o0my{-d})|+MZ{sE8WCk_Ar diff --git a/examples/runtime/shaders/glsl/fs_raymarching.bin b/examples/runtime/shaders/glsl/fs_raymarching.bin index 56645f08fb3aab96e68a49d0d2b32f2d170a88f0..0cb5d8416238d5354330f721db95e7bd9138de8c 100644 GIT binary patch literal 5912 zcmcgwOLN;c5LPnjMV;xfXB4YyifFi6dSMIvWp#9Lb?jBN>isrC3a2t)WD^qx&yk#V@26 z2mE~33Tj9gxfdP4ThJ2)CBPZE4v*)%FcimZfV1a(UQA0oClOTUv*ks33B^RUR*<<# zinmLoVLH#h&bk7XzS0&!qNq&h7Siy0Z3iryYN1$(AYWovr87&S1KF z6As-i+zL5_as=DzfRPykC!i@KoOBii1SNl~=4~$BJUJc>1R=J2JU02C z&97(8!ybrDU58LpLK3k9x7P`mK`1^{d;i*U*trH_a;-AG-IF*1-Hhn9Nkt>m4ilYZ z!bRPd6LV}ECuwbym$XeqHHvanMcHbL9~mV|rfHVR%-A>uLpitj;C%U!xw8WjEtR!4 zGe&Az)kE~6h4lNT~s}gG?h1_qLwG+U{!96w6F~tXIU&%ZZilg4G zlD7U|g0xm}=qS(OO4Y)A0>D<|<7HeqG}+|jA!PIM(2p#~K2V-)@xtQ3KS>vVs5QO} zpGB9pwQ!O8^p}^>rA~$S4m-OO}0~Ve?mSS3M8K{-);v;6uJAxx$Y4Agxj5 z#jWLgaK)GY`$O!=@;X=?KQ|1X=-v-l)(f?sNu%shejP+ zl(dc7BOo30XwU&W+C_|)nt6n!$%%3^2qjJg#u2*?scX&ON%aok~F_nw+;))fHyW)Q!_ewn6t1uF<_^3B3^xF}k}d?t+MhKAej#Z|h{K z!JuUuEuI$3GGE@z+SPWhQPE247<3`*AdsVs4$(MEC(2|>M>4aS#_=ABr+F3oFi|KE z7zT2Y)^$0%>b~fTQU$F~O?gasj6n#ECXNL8ga0Z>c!s%Jh#8iOGC1Er?Pe@l0ju3? zLMaIO+| z6xYYNh#zWCW0a?3_|W;JqeQE9G3U|m$JteRNhJy^kyiLzH4c}XX5RGBOr8F}T{AAG SEYr1tjg8&DkNwAfzxN+awns_; literal 11962 zcmb_i+io1W5!Eg>FA9)v=*N*I&vrL2&4xGolEotL$@@T&W$yrz#*xRiWSu%>vHRD5{Qb}0{pWxGJ%K;ppZw|5=63(^!*?eqKg0_s zfBCez*}ng6|I7CNpWEB(@8JgggFk<)Pfk8x-al^d-Z!7GuWa*qbG5tK-M4Q})#V;8 z@2?-OcDwtxaOczA_TBFOwz<9B+Xh>bYY0-d22i{0TX=eV*R0M?e?M(fQ~TQwo9>M| zgBCY^ya0Fbc>VQD^Vj%rziQX*MboX@v*P~4W4y0@L*q>cmsjXn^NP{X6u=B!F$&8> z3-oCH@c6a)F+Q{D)?diTl95$LRyhd19XMzKYq^7#+F}QtYResS@ZHVsa!(%mXodZJ z*bMO){>#R3R9*9$o-}$iJv{UA-}n2~+ugodfz3rUJUehID5nD0+yNCXZ?<2rS8@Cf zS`hoq{pI6kjMnK0Y_kCd0zKZm-QI6H;21oV4&^CqIQMkF=@L`o0Xzcqh&DjWX0^TB zH{0!|izH~@=0Dxt#@s+slV$wYvP*$5lo>gOQKDT=i>r(a_J?*+q08$Ek1$qfahj_{qET1Y;xR zFfpS2ApjDA0AhH_ktPGYehLBULkLKs$^~qlP$pc!m=Qo^OYH&zupbi$NEkvG=Mcz` zLx3KMkpcSlC_was5Q>!QQKvY(eWccHlr#B3LN)c(RleM))MCn95dS-Sc191rhKM?# z#FS+keBe$#&{k0!qZy_!fi;-R>1j`9p4y6hEX>r?kp0OF6o4K>)QcvAr2J* zN+Ims^MtV1D%6V#fs@OGu-7WoiwX$<3s92c11asb3iYBwf+9Dru25tdc}?8iie zHA{`Kv_c?14gsuYsTGz^0ZdcGYL;4LDJg+g5gdZdlfsSsu+3cM(?b=p-Sa47HF+(P z7xM?4Tt*R_X`8H2Wh(#<%}j)?W~mjHiVGB)IRMR4D=e)5*pFgple3zoR#;jgkRKBO znx$4)It4I85zSJIEES4~iabRTm${m4U1V!D(b(~M6mgooP9zqbTt*S6CDw_=3IK;@ zCc;j$)G3y-3ly3;0L@aTSXu(GABPcknx#&$v_v33CIB=`onq+(z%)giW~oD#3Po}# zuzmVz%LNT_B6F2b4=Lh?XHrCy*NMb}lglXLwZwXnSOMVB%tY90mU>~SAW&%L05nUz zu(SeTKMo`8HA}s)v_c?1CIB=`y|8o&V45Ocv(#71)k;Nh9HuGa%jK$%Y^_wpKXbY2 zHF>>AEI7H4B3fd-NUQ*GXyziUS?YzQf#c%hMul|`g*CY~T_-oH;P0up?nknUS~pYh8>*`fY$MQP*cf-HF8EEC zOK}tH>x7IJsxwu=Z=ia_J{b_~)RpWJ*gv(G@>E!i<**poPyxhcVKKC!Vq(dy`q4D1 zCkJ6Mw4q{P17LYr43WSLWJQg}*6IPH*c;hYNoMn5p|~5^RMFj0ovB)}6nqQ8FT#>5 zVM(CJmq;KBG{}$^h_E%-zO98h^3{Z6Fj7 zV*)@I&_N35DF9vhC8|IeSMaq+50TRagA^BX#ET2Oq?X>y3CXpjWKqs(X(I0=1Bq9t zXRfB<#ou8$7-;qi)$Da#^#jddfoHHKsvl@o6G&AWUZzfTi54_r@oF~EBo?Yk3{w3^ z_}by{3x}XLIs$HV6j|J^WB%q#QTisbI7aCAa zwmt-avu7p=M=d0y5)yWSvS$uJ3(2U2qy%6;ilN0U9<`8+N=Qls@?!!(3(2U2WCCD1 zi*r7MoI^fa$mg7|lE89Qrn1UszLB>^m?)Ckyb6N6gI08o*VbuhXhk&UPY~i%eR6XZOhze@ zl3C1k^%adw*`uBoMw}L^WcN=c`&h0pMqb;YMX0mGu8fC8)99)>}daHGmtyTfx zB%8_AuGNAAXK@BgL}Mo?&1NCA)(o?N92Fj1)Nl!)AD3vxD9!Yu#f8MKtBi=_^koFLC zHUycW41YTDA<}HvliiWjhp_VVvTjL+G5LdhLYKZ+!UY*9_^8qw-nxOTXD2`GzVJs% zP<4ETN~4b`>Gms@ef)|juI#|HUB}Ov(2}~^#3}^{lOxQ<6D+}8^a(^0c$XcG)kl6l zF^-s6REu3(R+?}Qy}?#f-y)=S_?H$Z_>~qsmEB+nP(m)Xy0$Ds;d~uyE$Bc|IL7Po zjYW;c=S~-3+?2W;)mz*7{W@RW7nADovYfB}T5PO^({;XF&3~U)>qTvQKd$mcwVW3- z;?Y#!t@6qAp}x00rz>Ohs(7%yn0Hgns^yCwR&IO#{Q)c5OmC!@haw9v27~pYyal1h zo!57_+k7#(xoEpr#r$D5U5ZPu5oX62Vx40Lx*(Qrhvr2sy~cM3-K-Y=vjc|Xg%9m$ zOZ0_(42^ms{BmRxhS@>KhnU+A8R9lXa8IGLje2X z7wrK4{Wv6tfCs)h^MY{@M1g)p5-1f!B1kh4MNyW@NX5fLzEH#xggJP%H?eDCiKXbi zy*246x3j9K0ZG$l)?*t9a&1PQ(ss5xkM#;@Ow$(u1CO$l3VtHW42$gcY9Z*|bt&S2 zqemP7lHY@IY;r^R)NW^U9Y|0IC=&rlC?a5ji4GHbnTdK0lb-v8xzMhn@e@4VMt3*t zM%66e_$3sn)O3@IS-KF}jX4s{9ZcR;Rt7-e=s9mDg3nem(Bwa-P zsx0ylbRqXGoJ?H99sk%aYmq#H)npWP_Rij!GseC;P97aJLrI`$*$dXjW`wCQ$K{ZGBK*7j6 z=fr(mM;7ung|Xf`MDRa4TxCRxj3^QGmce!UHFr2hB};fM3gxwLRHP|V`*{IJAS$jp zQmWRulA^bcm@ORUr(-~nj8sf=6;p-km!Ju!)=>$xE1dR87zj>tmB`*Y6ulrE$qWvO zV?@Fr=D;cy_tufJM-Tk*uFMDny&9D!y>(=~*Iv=#92Z>xRi^stNQ2`g)Kx(!sBGsj z^L_ z=vcI9G~LkHSq6BT;-d;?-tPzmf#1TprsgRs?Az6mGSK9`Y|3MZ>~!2U$Qy%BngU5V z<%p)6HdV+l%$gF(O}8D3AZawB*6dhnx}o7ng8i}&JfEGb^O^rCikHcRx)~7Fjy~=+5ALqr5C6f>PrKwM zTW2{LS+DNy_he+TeAwUnkypE9cb_h@$It15AMGC!edotj{-bm7@{p{y$Ir)y7clff z`z-7}?@xa4=YyT{<7%_}dwcXVygDTLZu93RJ8buU^uJ$vymRe#f^E{(mJNpeZ+&KvncF`g z%_MqfMg_ZBuO1SPA8*%Lx@U`3{tu=~BAm%Kk@z?KV(-~t09&#@bN(d(GZN@Eh;YHHcg6%gCkQRx; zS&F~GL`PFfk;3O2R=9M==X&INN2`Iu6h&r@Peb;`e|pm47+T{K&gUjSoiQ+bNk`=_ zJ(VXs7b}v*y>V$p@%RxYg~-VmqI_T4B%KO&`f15>iVG}K3Y=P#xaM+Jx@i`0In%qR z_t{XN>Vdb#jMMQW?kesWxPcv<2)9#iUGtKYxrwaEY9HH7$40Uez#;@2{2V{xOw^`K zcs>pgrsgJ3YGZCeb68N_iOsIsZMbBG0Pt7+Hk)UL+Jr^+tN@ z%}~DF9oG9K(g*cxmaPjYkv^-dTQ*3yPlLOBneLbQzxOGe^=hz?+#sR@NU4!N5yRn- zeFL2C5Jendx}Erxm@zxmGYgjU4Ml(|laq7;xFdjnYxMLn^1@hrd+o__OU~FZo`b1qtRf|`Z>g*EL zX^5(pCm%NG48}xpp$<~2c${lgXE4}Ib>I=dZbLi=#6DQZm}^mR!SYEfV=$>Pz8W#t zf>S}vqYH?+dAjRU;1ZW>mGV*Z0Ae0h5py0u3}zi6=DYzh)fg_?5sNzFtF?h!Eh72G zb#2w44ZI{Y9J2mJ;81(R|XLjpfXf4NmA z%2*dkO^i*cR7qniI0a)Ag{o3;lr*9g97Un36kygB<5>e^Dr+3{s*SN#KC8xt@zqix ztTGYC0w3y4&p1B!0_XBrSjDl71*$@ou|P>9jKQqV7|c3iETS-DL3K@lV6`v?lUg2M zkJu^`MXYO}hBOvDgqT)80#%`g7$uD&MpdY$u>f)GMk<7CKumQ_fMB&Dw$fKlV%mV1%9;SZYC~+5&mexL7z-;* z6vq4#V$&N^#FAD*(v~@uS*wV_EPxnmxlRzvNf@!DswP3MS`dRtNhqGF#nS2$fg!QI zYtmv_bOG=Tc3LcHB_wT`Q<=4f7&W1q#S&||ZV-zG#8lN}drt=@Rm4|Iu?%%|Qe7e} z15zw$AtXZ`okTq&QVeDR!dS|6Lm1mTAFS&=Bo#H;-rs>qmGIR{EJNL$ywu&vP+ZlTK)AE+PBwIRifWo_@9w~)L>S;crz}>X?oM6m?o_C|Q?v?Fq3%xA zx;rqdBL=gMl2|o#cZzD7YVYpAq=xuvolv3fPF?EmRH(aCvhh)bQFeMCfhW&W$Ww=9b7J1hMq zHhFP1D1GwZSsIlre>WOyjkF$Oti;HBGyN8lzJ0ovBMU|O(=?Z13$;Jw0@p<`0xrsT} zT%~!LX+S1O*hB%M&zh?&KQl!kH!(9$K|_sj-x=QyW3S$Rp3@!{06XiSdQC;L4@+Unr zJVQLPFx(GT;Th|cDZ;~%v)uhbdafyT z2!&4uQB!!{(P;^EJxM$2it=QCFK$>WSbi6UoCP`$PgyApo<*TZvXoqtjY$xhiM`Fk z{Y}QRJeVOxGOz)7l_fDbgh^_c`h!kzFs4iB_7YfoPP^_bkL~6}){s29i$E|m_=H~h zXb`LsWzLL#UQ6PbV-;Y(eMOZa(bvSaq4l%kGaS5+bwG2S4GIT?P%OU|#ulGY>Wrd@MOxWXa(;+gFl1!xx%8LLFDuy>%Z3w4gAgSoQuzs`R?=+U)1q z@hlVo@mzoue{*5PnJ^?MnDAWGxvtasknDggyS|^Ju1#hAgL=xXQ8a>JV`HiE`%yg^ zFWC7)n4z>w2Iziswd}gr-vPM9u}t&bCiX`}Nd*Ez&uh xv`o!!Vp~%7;DFlIcw4c|YsF|c-9(G@X-N0CaFK3@bbGeDMj93b`lGIE{{f6kGBf}H literal 1239 zcmZ`&&2F1O5T=!-M&u>t2$oA68{1e`dr4*Wl2dYDQL_-F<)^U5*pZ(j57k3osk6K6 z8k`1MhMArD=9_P3w@*KB|NMPBSon;r+dXMgdU&QSWuHG;7XI+LsYzZ`S;&N~TwiJu z(UQMhJU4ri=FMYMjxb^*^BR0LVRcON1RA>Yp&`4171eZOU%6SDyzmE_b6P#^LPj_C zK2Kw;sq%WPu1aZB=OcX8KYRx(=6et>5E|1(Mda+HPK2i*elE7AzEFwMbn?N=Kh zW<|(B^4x}u6>&`NH|WQ{=CEUFNoJin1D=)GADIh>{)TVhB#dmUFnK77D)QPRjIp4R z8y&6z?6UkGf-f=<#4(6tn0ZqdzQR4e29YNfNL#+IC@SG})0!AMuGeCDt)ABk7-K0S zswuA(V44qFqEL4v`IsZokAXPpUVNRq=rLS)2Lwgh17CX-r3PA>>}4-ebtC6XN8mqhLKKoex}PE|SKu13&93)#c3qJkTgz_1KddKzCgVGZB$X1(Kqh2Ry31y@^(_*13)87QmiM?ntG zr`O0D?mnm@$e+cZ*>Ak#vTZ4ly7JN<M9im1V{Cp7 diff --git a/examples/runtime/shaders/glsl/fs_rsm_shadow.bin b/examples/runtime/shaders/glsl/fs_rsm_shadow.bin index d39d227eb9cc831c0a250ea8550c5321a5a3ee45..b45d4144fb8118801558dcad7e5ee1381ec2f55a 100644 GIT binary patch literal 286 zcmZ<@_TYYeC?=Hw2pAdIO5;m1^GcW)K^zeH1;kvXd6{YXMY#%PsmUe^5Ea&3TseuA z`K2WqIr+(nC7Jno3bqOcnhHP>h_a;gw2FAQqQrEU#FE5l!&qys%sh~cu|ipV9?-DF z9H0?p`I#vSxrv#18k$_yTna#ds?8u)uL5W;#7eyiYwSuY5lSj?D5*jysluV89H>MW N<~BW`s#-2C1^~uxR~7&O literal 169 zcmZ<@_TYYeC?=Hw2pAdIO5;m1^GcW)K^zch1>&;AqRPy?bcM3iWMhT0_`Lk0+{7Gf zuF|~BG$0csY@z_sXU$cXpP8bNo0yrWprOfC&847_o)hm@l$h?4SdtiR5UW>FS*2hL bRSn`;V=5^JD$vz{*`rsbY0Xv3#l-*sCWJC} diff --git a/examples/runtime/shaders/glsl/fs_screen_space_shadows.bin b/examples/runtime/shaders/glsl/fs_screen_space_shadows.bin index ea771134def9867238c5c0d38c35a430a08e6b3c..02d441dea61712b3184ad29351885f260c395ab9 100644 GIT binary patch literal 2587 zcmbVO$!_CD5LG6JB$|9f(5C@8k~t*1o6E>a4haT1P0eM*t-nT5MUyd}977 z?{&Ah2=*m}VY9lbt6sfY=udzB@wWNtm)jAZZ%5xBi~Dj{ZuW0}9F6dU=k2k0SXYmK zSEs6e^UY|4A3Wdfi)D3x_=loB`S*v>X#7wuq$pG-XXEj4yIwWBjlh`_7r&pQcs^@Y z`*L$%SG)Lk;oNm9cdHEzhwCkU#p0njRHsGL?3UqdT$fMH@!-|XqCBjdt@v4lzQBnM z`{izRDn9MXyWg6+*}=y{vtEi#x!!vI_<1bwm_S7o$G8f=hvTmD9GYoAls_}(tGX!< z0`?O2ycV3S!ayrz&U4Re^Nr`h=}EjFcoLJ259rU2J`Ct`5JKjfA>gqW!mu0R9O0w~ zrJh=oC;WwnAxfoF>vFvkUKoVpwhJ81gGb+_^lW~UivkzmyZo~E@ClHj`mb zt3=s|Zj4l-t!yg^@K!AF1{ACtX)`6ph$x*q|1jWmpr_jlgx#m|+-f+It>qLRyt zV(nYmjShC0@YY+*yh^wu!kK-$6*%lDvYkX#CMMhrS%itSC<~RQMj%88i4n{KQ7H!) zo+p#*VFV>8N31Oos0x+{j?lwNhVDV{SimeGTL!j<6JD`9$AgjhV0@r)2iDvp%5^#& zPzp|j2Pc<((<+`W3O9XJxR5E!08G5jm4HDoi-0}M_bzG?ry5(sv>j*Ch@IN;9%t-K z<`{5t-A4YiS$0dAH>WJ9-v`PS=jB0eo>ZkW#UMn9)LKVM$B9hRD9fswP-6=g2;+-) z?|_^Eae&R|+X^tb=XNDhV*M;A4*8>*lrfPn>-%!f#MReyJ2J5-=)L3f?fB@NAQ%T*fk|D{2f&q5LMGd3#I>{K(VKQj1-1TO0@(#xikoJD9`}z%`ga7qHGqFD3H{L75KmR z&Fm*-6=(&+wq|x`-@KW5yPt2rysm%wcr(D~`@!p7wl9mrpT)7LUVS$h;0K={ciA>? z@^$;_r@;U}`25gj%VOI-(h9ZcXE^qG^Hgpg#J*T0VxM)zaZ%UJGQJ+}Hsz{r*5sK8 z?~oTBb~6bao6WUtBD(b!L}e1R2=_&N5a6rZH3jkvbfROQ#n47=iY}9! zr1~#9K4E(h1g21T$vxTL_O^==nAiNme>#L%V8KL3j;{lr2#&!S9qq}+miX8cEZ(5H zc~zbY4@62JPU4+VK|?;kW5hdy;~Dl~w?O0j=!woMSI94pVsYbq@;*9*q4);35Z>ne zuNGXeRbZEmMWi5Q&qC2*@fs2|fG4kaVIYei1EUsozlBOY%K&vO|)pQn3rwVl+7!TK_(jl@d zok2bUa@2SVV8)axCPh)Tg)X#l(P|m-5HZsi_zDzZl&IVF)~|^I&7*Es@bKF&ckw;W zv5d?hOKxbVce3Z5pLvs>SH@@VwC|Se_7w*wTOf3<6DW8v3}owznX^0L^YK%A(JqLw z2+B<-%8aHrzUF^!1WayTxEI+o8ksSpR?q^-eUwSoMXik6_LjBUYNKRvWUmuGmPg0p zEII&!E~RfK@%V62ZS`@69M)F1bBk4HDDvk;wsAPR)IfHv}lZ?3qyyiiH5MWEz1 zKo;+9uVH_v8jSHKrkDvA&f-mC!W&#d!y1l>AO)g73b*QXLq9alwn-8ztwvjL9qbyu z9{>&_r6FVKlaAM$*@W*E2Tl^W^VtGT2xP9S-|MA!WA#rSQ=fu!eH3c}>3AGVNV&lx zL-FQ~9nyqcMjXMQ9(;7Iz03h>O_#s3jMWn$KtmhOdjm7_TI|Bq1ZQ(J5{n8HqAmuA zN1cQwA_qt&a?_bT`?azCe|3pH6w|vFct7uEawPPxf5)MTGy~>&!$EtG7`jeWc|A(R zi+e?5_2Z~rI$7g*nV#|R(fXBzLycJ_;mfpE{eMpeMKE#DVV<=8uT=U`{$n!zO%}#k zI=I38gv=Y$^ejJFNJhN-&1GS0Ml0+Vu%~64%xB^I>yV1-DE*M24Hl^zc#VSlhkrq! wt literal 80 zcmZ<@_TXlK16v@gEI%_vAvZBIPeDVItC~weAw4JFttc_wIX@@ANWoU2EH&9g!$8kK PM*)S*jxZ3! diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm.bin index a8523bee2e8cd18a9f3f9dd6c2fdd38a8272a50a..1d653fc0c5c8955bd117c43eb4786ef2d4bbfcf3 100644 GIT binary patch literal 3623 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 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_csm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_csm.bin index 909f34b8ed21554a40526b5d435c03794c321bbf..a49117089c079fbfd45dea7a2c8a6538e3065bd9 100644 GIT binary patch literal 9496 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 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear.bin index 4824cea0a6da9c6519ea6c8b0909824ca6f1db4c..d78c1b068adcebc23debffa78c9a4097d7f5e9c8 100644 GIT binary patch literal 3634 zcmaJ@OK;;g5O#ZM>rK%^dntP1-lSber5>cj28&|RV6jC}bb;+%U~D;2D@%qXKZE?i z{;JN9ltkH1l!qoKbW09ue154ko5~z&0zJ-CSA)~uA1P& znm??4XS{!^n!L@ca*+Jk?_0IEd7aHs{Cip2dH&Q@p>4BrBT?h?x@!O0K<9YNIHJMB|WxlNH71?InwJ`htwC&FRW;N~FNb8CZu4wszn1`>EN-TSJXD+3DXO{R1$jrPOJGI2ySrcR z(+{=0{|%V|`)sRxK~^#^9e4UTCGbE&0+L1n1=G>)-u^&-R$^zozH@JsK?kn#r{lqxQXXPB=(Nb1=G3Ead3;i) zS0B2C*^#;%uqm^4&HG_Fm(V%?}Vi?AS4)+EDvK4U{3>rT{6o| z@WB&;@jB&6qR~LDN0kYF!zbl}n_UJ}hAnKIQC-&?zxC+g%SE5K?GVXesR<(Zvmrs% zAtcCdu*Oa9fQtVPOM}By8_WwB6Hc~YJ5D#jeQ!tJz$7%2!8^L}>MW|(X|sL1sWZnO zC^M)=LS0qe$l)FhX~F|wkI#kROhnxG8Dn7>3(ArtyQT?($HF*?DUA|eaLOVf7-gUz z)5xbjGxscGPnYjQ%RBPY~` z**)Y%<}4+2kZID6(99GS_#2W`FqoEDTf_uHB(L9f=SDX#z1?XeYtxt^NGC@iuo%Pb zCL4Oj$5?P2DtgA{$IMB=g^3Q8OoXxG`(l}0B7d2m0J$9=5jRL`wm|5FfY*n0{k*3Yoj!=ocRO%jE-Rb?ndF%(6LGyaxl=0V- z7b`LJhyl8vEZVUlUJ}MY0<82l)ed1E09}l|9{7wRhY=TicTzB#0m>>Pl@P8VitB1O zhOhSuLMH&G0ZmX>!35jPh?RzJAl2&Db+|#gcjj*arr{1{B-DfRO%JdDnWNM(Yh44A zDGRU%OoN!Mw1RF_76+Il@DSgXpP5QX-Zc*X!P5a}-7Z!0pGbWuy@c! jK#LUE;q5hDPQ-^!Y_2jV;$tU1UbNnUSas&pbUOJT;U@Mw literal 4073 zcma)9NpIU$5LSC>tETOty%f2;UV=wQVz_99;Q&F6AVm?hfO{usiMCl#BFn{E0w40v zJ2QN%NEvYg!>{%SCQ|L~(|fu?=aM5{c@ zOHFyvM4Pxy$~4aYjQh#!esZPBKQ&R7-apiT=T%y#`Brm&7MypR+cepNz%DVIOYU`g zch^+O3HKMFds8H@$bht+Ef`1!}d;4v-_>GqyICaaJ=M%%pH#M$N0AWwkYYOnIVTw6R;c}$bt z<*?bNcc6=QCQLQ!3_a-3sc9XmZrphm1a#tCX;mGT)x>_T*~oqgvzh%8RzuH;oHn&z z?p;q~wPY1jO2IjD6@rs_=rBN9O)8Iym5k^3^iUHj)D2G5555e2|K*BdeT<+PUaJd?^H8cOdN z=hB+HXRlsKcHkZyhkXK>lK>{Dr$U%O2w759=luKVAAYs|m0F1D3%?V~?*#m!hbNX~ zRU!fqlBjhHDR8e9LAkpuk82t96e&V@iY|yN9fc0NfLes4Oxq_!XNKAgqPbEwEXDyC zV`*$kR-^&<*yYh)3W2#{XzuPn7;0kCp!;7w5z;ETwWsKaR@!he3J~mmM7Fn8< z(E@p0Dmqs90l{5pG;xoVrd8x6TERBRD*2QNj#9imaBCn{p!*c^7J=$)7et&5F4L@ z#t}%mcYDX7Kpe16Rlv=|^q=sTIr2W?k*tUhDUNx2iPB>Nz=S8J-C0YE(8r<>j9ByG z6GBMS0hksSQ=W3jo~Bfa;98sBd&JvNqymDD*dGEgNR|E8bpr|5_~BzPFzVJ#!f2p~ zB4w=8Nu>x>6s-7&E4orLq=3q-r7$PS69()e5$0(58OX2lip%Kwju5RT{ zNVV+}(rCMLuv`6C)?zT*8{!9Q6#YP&kE@-0V`GJfqC%*ymoD{(h;CMW@H38q4Ham4@}?=5V-Yvw-^S8#enboEP7wY z_rK#;G=e(ZZYmVbXnYHpqfy8BN=3r>6d<%T-{_D(=5CZER>JhHf;PlKT+r2*OJF|b zl@__MI2{*jAuNg&crF|}a-p`%_)2G6w!R#6qpv!q;prBf-9OtvMdULuA}@CP$i9%zixzdMFYwX`pfA2VpUp!rzz2bL9{9$Pzy}&f^W@Xm NSe;i-&ZpsU@IRG5$hZIi diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear_csm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear_csm.bin index 30a281bdbb3163557210f23ee957b49722d350bc..98b0c9a52471cf67c4fbc2d95a9381e548773659 100644 GIT binary patch literal 9699 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 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear_omni.bin index 13ee81df15ee55f8aca9a3fc35fce6d456f11170..1e41518d0232ac19d075b15af39c7dac6c3eff97 100644 GIT binary patch literal 6363 zcmcIoTW{RP6;|>RbQ2(TTObJfLcekC)pmI2L=b|shTEcO8`OR26G2IoM3lQ+EV4o++|gHci;Z7 zx+;rx`(wQ?wx54?c1Hi{`D&M~^0wHPdG)8s^&^ zPe?UJ>Sw!blW+4?zpjR?k;W*4*be_5RQKMgS!R)MwwEoy~UZ@|IHKJQUZV)9JTxy*Qp> zupJFCDQtX4GkW2h(GUv{a2`$RrJK=^#(UIn!OEDQnxJq$H3Qh68YleCaFee#Rk8Ko zIClEYxX!rp+#B_CK02OEj{^K5SElFvFu|A6OyWCh3LM*A|ECy58Q9 zzh+|B=}&bAQ=MVg88{EwLs{(Y_L@udVpipk^{#cR`kJZkTsmUzP>=HO>hAWCz1`+_ zzXRFH@rSy+aaMV`cIUJAGl!nrs?J*{3;lp(Z|c?^6f5&#d3bzUkPls~XwNT((sD{# zk>wfUK{O=}COtzq3Q2gCA6)z(kOjh#^96TiVGu3Gfe{NQRnK)`OuWqVVnP9FqITd= zJ4sc$ymi=?b9qVDqHxZ$R7&-Hp9T^^zCF;wsTn~wo!>y2@7le4Z55JNbzM1G5<)Vs zD)(+%;7jrM`+Q9n6G2EoTr9=BbJiA1lz-@AA4!q&4L!y`w8%)JjZ{U`99!^?EPUV) zAy`yR(KjY_!hhq4k?h!(05i7#y(5-^;K%c%FQlK!C=yBP`H}M-4O)77X}En($Cq9&-t!L*3{B<`jTGTyBC% zP6Z=QL4)R%^rv`5icj#$7PsmF-FOtgq(9^rM#gcVH%lat8S>0{FvT;78642UGr&W2 z{STXDn!eB7)b2gj-0_b;n(XhV@(;RuE%^Eo@BE{}#2n^^;i*sGGMcD<2S+s3^J88H z`{nIO=`fg4ipG#=Y6V;^z1DD&THy(5r5^kmEm=_@pGB?IkH*L_wMg-^sYP1G)apI> z|4>WW%*f4g07EnYU`L7&g_uG1r%)@@)CwnPeMGI$2em?`Rv0~tTGrWHE zI$h|q+;Z={qO)|@dYV(y#rcEw%I$7jxb}gNK%v+P8-^}kia?~XPrF4gmNJfH7<*n6 zMM02A5v6HyE>gf31xcC+5vHDuMHEUIiHPPWBJ_k8#Wal|qg0AO`qWO-NCt5l#eOW) zAP)VAccF?1bLX6P{2<`+iT*U6A7~rSTGTv~2P-Wfoc(=S74B_LJ7-;5hO@dhDK@pI z)aU>Ya?W{q+1)vGCtX@)$Mhyy$w#51>l0!y9PW;g01S_^CL@%YI!u;Ng$or{>1!V) zbMd-v+--hS=Ie%FRF_*5hh}naLIZCdt73iE-X9wQOHff{+gc3JizUz{y3vsd%=x&< zgY()sIpLAmmB}QS&oT4l)TeH0_a>QF&Z<1PipG4*BwW;?@*G|-tPE;5$JY+Pfv7@I zWR%Z2VzM*3qBHr&W%rAY15@`DR7>Z~V^1BV1RZ>25=LGiq9B!_pyP0i0y5?;#xidg zPSX|}S8`ydQr)Ag%Di80-uK(44$pH#E3L5Suem?~6+5W=g+;0E3Pc3p0hWe`OsV8G zn!r@GMogx?Z_ImNTmhg>l}cg@f||qPsJIJQZtDFI#9lECx<2uZ$O3tlF3@w~Skb6b z;mHUK2oakIK@^BghUPV zNpHb1`IsN77H-@YAI9 No`$&~Kg?!l{{vB!+Z>-9!C z@IUwkNc=~ts=N9zo-vz5&bq6*Uj5bAkA3<2hmT(V_3z&&@aMtFhuir&tFq-Le*e9b z6Zi*z?3i?8A8hA~vM4Jz^6_@Q%xYETS@BcWK77$Wym7;yZ0ALObzT2jZt^-WS5ES| zkvvK{UWc_0zLn@TKNvXX7_ci zR@)3UUa!mgmn~%Mg8XbduT@=TKbO@qE55Ik3N!G8f2g7;cW&x~VCr|pRyoM?p3xP;(F;N`{%2ZlbfvC=c_AmqZWy{nXf3OC#T+U3d3tt=>tKnZWm=) zUBsOd*(pgnC21hRxNdT_dvdy6<(Cj32Ac|t!H#io+|Va19*jCXc8e~$MVkXrfX#NP zkI!}uAEWIW0ZzMAnpkbud)9*215FQ>gxO;X8n?$Z5WC0ZfL|xxWXpA-D)~bAKn9SM z`Gr_!`AS5+)3>KW14BcdU^xd|n$gQ_pUv1>H})$X=Xlvyq64cYvMe~Ai8e-Qvqiw)!-uRe9_($#jX876&qzrAI!vbq9Lnk?Moj+Gd*S;%+MLh+2y1s&Y(Vt zF#$D8IQw`Q%#DZCo98@pW~La^AjY<1N6o3&O$SpObl|3I*FoB?-~^A>W$Gq>SP;c21l9&z8`U9l-Q)xd#3`m>B&mh35W!0N-qApSVbImkft|s}acmgG`5vL~ z0LyU_g4t|39G~G1XJJf$X7Pao=zefyo`9+`d+&0WqjVnS$?qZQg<+&cH6eT;i8 zLJs&hHe83bcO)4T`8a?lO@JpJz?)dI4Co4qB-jP=Nhin~FgJ{akp@5y$uUNDdkb1 zq1N^Ft8G!|>mpaxJRzqo!|2;y`XRtG_XIF7mo9&MPN?y5?Ky*lI0qR#TkWHubzHEw zd(%1&oR-v$R)Qxd0+nW{fHQm@bmJPJ#fQ5J&~nqNV0_jHZznu}L~E9%)ho&u1zeX! zq;A(y)KqJ`d?@OfZW`GZ-Pd)4*eEL|yy^In_Mk@#`XFPjF=wq$S^bi@FYlCm;=)HKWr5 zq$<8SbOQ;P>l9DKU;y#KdlE(iMKmdE3Jfwd+`=}HzFehvG&StP-!Uit*%%0mWJrW{ z@Km)ZHxWnI_JBkk3c1FUbd<;$-!enH;axDn)6C}2sy4{fZw^Unv6#TIQ|HW)U~!`e z%KJEq7}iH#VS$Dp*_yUSy$4=l;}EpA`N+1+(Twkcxxp6$blf?XIlP&eCgqUz8wxc6 zHKiFBZbwKaCKl1>V1&1_CTDzZ4qvAcFgz0wc5aiK_TY6RqE)osmiUy`ZEDxI($?DT zz&zwIjJa+C()A$_xYtp6txvQ8PeI7y_gc)I`1Yxofdg%-r@=ui8o(^|_puaD+*D+K z?so9f7bfT@$z@7u7cqcHV}BbDt;V#0M+SvD2j+2b34vmq6sRHKb-6QdXCUe8kZjtK z1eUN!Oos>@j@K-wTgnj-C}TE3HuZkXvVlV-tS` z@{lr~2#78H_jSl0bN5P;S!FskQHS)97hLtZ3H)bxJBwTdk^>j?oa#!G!qoswk2CM9#Z_*5njnN{CYh>NZ~xw_<=OLZ-g@@?pMMhB6WZJ3@`S67>Ld4TECGJT*mJztg=o4QyX;96U* zH#hmRSQYbiXy@MB7Z?QNOG=rKP>oqy1bu zws%$pcKO@dpP!m_)mDvT!bhE_P5ZQ3l@}m?yI8o9{n*64ZOg@`z>4R~ru}h4(Y89? z*yI;Y-8eIk*7^FTxNNrH7fXgLsYLzt;nC6YW>H;HNW9zfBJzxUC$FdbD{O8DBnb*P zzk?MW^W}gfnR|I2Ea|w{1Cq}7VBSfq%=w`OD({C@Aoqvplz&TJ7xQIZuEM9D8-7dI z5m%N6gLxSbgOhP8lHbS5__`+}cp0pem^nQ@t`-UlxA{_o^wgPa%iTrOtS-r3yU*B82w0_-ONT_>f9-DYHqwG7szS`x_R>k#K06Q6e z+frb0Vm$eruBQpD)BJe-Q7>g2IDKnlhZzTHpZ>M@&NWw zjIjer4`7ZWVxAW}AOGOU6z*h`shrHCP)vu85ei2|PqbqaczF;+lrMyd#@wT^h}F2d z@}w^B?2NQU(L}CNA=T?cBE*bryQRjd5kWe=&mb)H-Px_y3eNMUsl7bm;4JFezh0Ht zDSo*r7Njv|lnJo28JiemUA9Eohbd_z2~xIU#@dGwDM_@Fx?HdKH3WMaUP>3iSk~*Z z8;r_?{nil6Y0wrUXHx$c9-DC{zaYp$mW6311WVF@K=C;d9XTC0%s!!DP>H}Ed@?sQ zjYJ_%2~ZG6@@L|NSLPJ!Y*LgEWn|}?b&DiM5Fa_(phc?O4>tj?4++?2WnqN$k!>lQ zuvUbl&W zZ~===JVsq?F~Ijq9eHBvOfB4(WPp&NNTgl=21bwxxX1)3xMWmTd4!(?tBg5#(Tio1 zak6DYXnpMY*Y~Z%kZvEwtqw=26$qMYFKCNydof&n*_c(B5<$P+@KH?h0j3~9<0=iu za7BU-;L2ss`hI|<@Rf#re1S6b1G9OOVmImI%vvypGqBk_V1%!i4>k12J5A}QJk+rq2`{|~g3&Ya8~ zI?&IC3kr@x%)$F#pv5(`_z0}`pv6N#i%WoU@gQh98zM~aJ7YSmRMYnyAe9FIfYp*L zKX`y*DZ?%Rp9~B5)wJT#l|<9J|6De5i+j;+bPC0(0E(p;2fu3UZnUZyrfR=i-1X03 zBt#>2A1|6Mp@To-fe#3MoRcIAQELdGH zc%?~*BiTgmS$5cZPDjz-?39&=2!i9Hru&>PiW}lqCtn^ zcC#vd_vS|sB;V=iPWg)bc*ZzOpRg!kgd|!@|bQ2^0)~}bg1@DJl|KCxTpVH z({~d(yBn}f$Vif?cx+6Z5WV!aH&tEwR|OrHbv<=J6*{!&>k{S~Gsq2z^&X#@hX!-K zrPeycH1TE}rL^~ELgOPOvU_XJi?od{|(hi?tY16|W76*3Zg6ir-VmeT_Cl)19mPB-lV1lPv#G){Z(?mGx9mGo9PQ7(oF8xe8b|};D8=S)6NEUdJ^4!`!*08lik?wX7eZ3=`1X!Hp7ZLUO8YXD|6%v3**<$)LX zevGMTiET=$mTpO}

tbY_|O*c7loMhlDo*3;0#Gpo%U7)*Dqy6ig(=KC%J$M!=_I z6gH!atZHcbRwfk@&Q;UU4#y#CQrC*sr531~jT7`&01{()y_-s(iu1LPfApCQIxmy5 z51{?3GIA+f*zLGdNUX{^`OKw;C>%$&`*7Kp-J|TwmTxW4ms7@O)JLUQZB_3*voEwy z+LyXE7E7sjG7_yC$5-f uoNCpnP}5NRZ+NpE!5}A_XFCOtJ@TC)-;I**4f%eQyd|hyBc_TEzioLtlY@QyX7jYRh4JOPg(cydH3+v4S%v*7Ww5>{cE|+>%3e$$>&D$ zeDx+*Yf#uL&pAt9<`);ct!hZWFmq2g>TFkJRYUxx6_@qPyi#ZA`N#Fzckng4uWPm5 zWvFqwDeGT$kg*H$v)!^*b(Q^GR;#S|zEUd8z!UzVilW@RsSkpw-xWLMWS<7I-;`g+ z?Q(mSotOL9*=CIErI+llua1tcv+6cqUy5sWmWb=+nqqo->?xI#>Ir$GdfY0RdvLsjwLA83)G=eZpdE)ZwvTblxx8wnPCoyQMxp zyES}_c54JU?Ne!DwOj9b2VPs69xMs7hZHn!4{0EF56J<)PQ1-ln?hCcrSO3aASv^6 zvC8tbhz7@RkA((?hC0D=3Ai+)7ulIQRfX=`C4hs*6G5POQC_PmyHrcSq!10&(T#W} z&dXXvL5EQhMmM*2L$5*bd(dU$w$p~L)4h${bsE7^-rK~!(*#tz-$GGlwWwDc;DjY~ zrm+78Q>*MoMD(Lov|+1`w}YXc(A0$zHiz~DDr0^jqNpi@^>}837!1T)h)IZG*&(!R zU|CB}r~s@Xg&kZ@Fcsksz@*5V1r-rbd^4jx#U#WVGG$6K)pqy`j9gX<_qgA$G61IM z5P$+9MB~wTDBy?A5UiDD!RgGjF-n^)0{$L8WQFPI)@IxYWUlAh^_fE`h1zcW;)pR0 z_`z}5i8CyO@jef{&%wL)@=mB?t4!&GnV3#AW;LyS;bUl_$BcsoIwLu|oDIYys83={ zK+O`)J{|{i<1zK-3C~=ZDaJI2vF+GVb1HUIYiffI+;r_aNV^l9;L*BFy`}1hCvi~+ zKw~1W5TkL7<#HgEO^`|p(gr$W>xQc%!Bh`aep)EaUoEXw%542@+PiRX^F(I^N$ei$b7}}P|5ZoN#6awsmwvFx}v?Z~rwG~1e zk3mezhoDVH?hkE`lGrivQ2=c@`5$PvX-FbdI7oK50qy_=dmNE7FFg)rJ__hP(CLS^ zjmGR^^cVfmyV>$wZR)GnyQ0oFMXsu)B)aPuh5+FTWL|zodpM=JFLUeh_s4|z&Oa(A z)Qcvagh(Se7U_lvhxC~nmymIl5Op9CXY1Q2=m2Zlz~2GP5;Lpd>4$)!StjUvUk80S z5VNFxKBD!avSMVcCwV{M0i=6~3bEVi66I$F+;>H!ZZ=WWwG590-CTr-=vE5XoO)L& zxE)9S^>}FO6~ny?mLZL%qj55xPZM=Ap5xJflFa5a_?XarWSlHyJee-cr9hm()hk?! zI~a3IelvjUQK$g7HVSP39_g9`sk*}WC;5aZlB&A&vN`;2r#?D1z;5<8sB?|x($( z&_clr5k>=bH7RRS3oh@+g*a^lkJ~XZJ?@O5t7t_6AqF(XO0Am8%0pwCsD*WKk%*!#QNCQ zv@_~kASyNvL2H|jZ4VvH_%4_md>EkPUa-pH6~uHchpb;ks0pY`&A4zJpUg}wV#vV= zZ)Hu+_<$U~HzQzpCLrv@CO5~1jA#|Dw-r8)^_$uct+catdoT|bnm%ai)KS?fA>Tg16 z>~GAW)tI*A$e>W?z{H-8F;I+?0yT`hDfi|z3?xGxl1)33z!DaT=@@~-@tWmyOF01o zWy~hXrrz&Ows1^@^~L#Q^Kny%Fqj+S4Kk;VlZ%EMpavI?im5K$d=Hx-I7n!N$eajfJ0-iDO%h(T=WznDY*n7db! z%qr74h&p6|yx^+OP2fMQ+gaoykhEOT1F0)b3YQgVK6GKb%lo}iXgPSQZ%4m1+Pn_* zU}7MF1#mez{|O)uRcL2V;7u`|(0{mu?SJY>n`cCKe$!7hkND)F*_YM_4j~fOCmzkF kvt%ssu;7A7>2-s{2Am=+{jHzi6Chv@fT6AP-SP3!f5<>(v;Y7A diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard.bin index 9ccdac1251c50586f24a93025e9f0794dfb30d21..7009339259ac3da4087c30a3a7a5b3480c1526b9 100644 GIT binary patch literal 3580 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 literal 9411 zcmb`NZHpYo5yvliV{#G15EC$d(PNnT=&%?BfyksIIqfs&#pZ zmVa8Uq=9eP{B~Qeb_KS0cUy1&y@MG?C!cNRoAhbV#FfbpWjWNpj6#IqwPr>}nx`m+{ zQ#;kU4Idlrw$fX77AphoFc%s3EL%$R*a4@ zaK1O^q3g`|3C)L(P~UADIzM%GZtX#F0Jh%jUu?sJLsH&SqDD6{RgYAfz`UhAZG=&* z9up-pwr;(`;+h8bNBbdXQXd}$Xx$DiMfJ4Jz;@t;%p)~xEHcn$oPu#+q$zmVwCypD zZ5kmYSM?SWx_sE~)}?*(&-%(F^2l<=D{5i(;L(6$;F9rhl#Qn2tUMo0QQ&ztnNHvX z&-iVg1kW!@Qjru^>~e}*FsKx$C!uDS%@xhzqhwdxEe}8R zm$ilviVE!TDr&tEl(Urz^i=&aC$jht$=2yK1Yq|M_O<}K`ryC+B$uE)CGSt%vq5-y=Q1#A*r0q1M)E3 zGB|(IVK^?hfLrte@k&d^c+|0(zjjrI~FM#fV8`$nB*g*(< zUZ8`Y2X+c~7IwjI+!^&ag^xoFJQ0y@=&^nj_L{}^vq{A+;Z+thJ@Y#s%0`w#(1hB0 zpSZAFi!)h(Xcsab8w@91p>2xRSm&RA8FyEhG5&hKvFco3$7m!JG_f|5kVNc z(*tT4OQA5s17+;fS|;fO4${J*Sp60fvwfOpbfj#g&c5VrC~7Qb0jzN@cor20y=)@9 z=V9T1dPEyUB=->R_7YNhqZt{{sVV6KJA?abQ^1m*&B53|z2x$F=tqc6zp z7A-qKrQ3HBGnnikrqYO@rb{I?gOLm$0|Yk@IYe!bVkevq{Ys;&pNpM}p4kC2gQ(-AYSW8L>5amr6I3Vt zvY8( zc!*UTGknrG5|<9!9)-&+;*zeOKgV-5I;~c+|FEfXiE#QPTtrIjzcv(8UrwhSRI&pbsXDkanuBRZ|#$)H^*Y(!lB{i>)@^~W1Ef2#z zi2n(M_hrKOLI<6CFfYu(29Mx14?Y?ATcj7p-zFWN@ssMSK2U$i4Jcez4<@->zlXrFRqHp~C|~Xg=Fh|A;F9Ad_<^e!tS#|% zU;j||XQ8(1r6sKRIo;X8yC)tJ?}VcSl=-F&9r2pmJ^Fd(vF8V1Z+h&(b>IvPG(&mx z5IwZaXcyyEMYK|o`Mr7|Xr57CKt6?6e>rV*+*RH5OAu0$D3 z!8K%wocWkGWk2kgo`p!HY{>66!pY|DUqyZ_!97NB$MkL(20OaI_swGd7G5I1#&4XU za-l<#P@qT;#RaG}=Aih72sM7r?3Qo%Vg5LG5t1S_rUMaW$N;$zqtCLFUjzuf=qm=Q zX3xZxZydr07t)Q1kX_;%Dtct~)q;KRH+w_FsoP5e0}$tgk`b@#n^ts!$^bPkr@xqg z`@c5Mw$F<=eDkHD=3V1+<1y9%n3kw~xV5lE>2NZhWFw0g`B5Tcc#sUDh7Y7n&?|ut UAl}ejiQpb2K)dH}r>7_X2UDqh@Bjb+ diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear.bin index 9204c73755caf03b86899ffeb6806ad02b5aca56..b3ef51e8606a3ab5a881507605e3bf97914497d3 100644 GIT binary patch literal 3591 zcma)8OK;;g5O#ZM>!#?Ty%fE0Z*0j*(Nj>cZRT4Ymyg1)CGvvG5_g{ax`RDxvo^K}KZR0Gxf2iNC@6sf%KNS0<{QR@Y z1b*SU*v4yBCuOR#-&MEV7~Q0+)wW7rFj{s--`hyHn`E)gRQZBc)meSDjW?=P>&iQ` z=5}k}TJIl8jWiu$iDvf$iUm$z;0C(^XNf$u3!N()jP8d_C6akUkM%Be0)`_NO z?0Py)bHl{WGPWp+60kDMKH0^)G}-sxb0AM;*V9ZLi)~G_VxjATydi8xV8yt*yI&pR zccr@j6)OYc?22?r)+){EZ2DDt|&4R2R;K! zm1Xq4Ot2gOeo#3@hjU}h95$PcOhV%!T@i{7X4;?G5AF%pa69NUOR8$@(d~JB(xypP zCFgyhdlSrPuChYakgxAT03GKS!W^IJ$91L0q!&pcSQxpUAU}i9+P9VhEU(am@oU$m zut_b8(M}A)fy9Vdej_-ahZz9umxJ>-Czv`AVB{Xd{O8JTGAJQzLD+O&~JFl(M$iM=H=o3K0!j3>g zHssZt<}hf6ptB!$r!fr!M1FLxL1`k6&A7sS;bSdA>;N;k(#M3x;KJ?>mFx~9#zAXQ zRJ2sfROJkR|zj{V)!K8G|qmL)*O=85Sd0q)I59Bp@ zQQ=4~!F?3WW~lk1>SLqYe1pv;S*HiO$lw^Gbgd4^imAmb-1NMMpT*_$JVF*=tLoP!uT%QR)lALi*22m(_;dM2edextE zqPtJ(#QqnzrhVHf@=4EEOB}L!)zy^s*A_1#(aix%bUQAL$lQE2TOkoe-`di<@FUq_6b~Lh3=KL7AYgrU}B#`)Qa40uYgm z?)rn}-k85WCt(g8T4p49SUFl9vo;vmOofN#ZX3jg>Q4m`BC1%2*tpuyTqmUNDvE#b zG{p6;jJo+R+v@2{_PFg{CQ6s6Ueh-q^NRh_^WDEu4t)Az?#)bX~A|_$h^U!mH&^8B-2CaqH2q-h|LmA_I@%FKQ`jWv(|eM>&|?dPAC5X D_PXkF literal 3947 zcma)9TW{k;6b|qJgasbp1@SVxtj2BP_1L+pTBH@#Y7roi%6sG{ZfoSk!FHOYtNwS+ zIdhMlinNO2bD#5lb7uVh=EGNCZ2$StgU{E!FL#S=TBYk+eELbR2mkOfve?Q#-z}D9 zQC3#+YPVRYO;+V;@mtz0UUiFWEBtmP9)VbTFUzu8c{+4? z%(MMff49l+z!&3;m;vjIJZ{Mew3gHYcU}bro#ZxNbxY-e*sXPe?6z>h?6&X#J!f(X zYPa3H4q&ZiovybjxMMHnC|^A%gC`G)bJ|FO>ymY6M?>_8YU#1+V#NA{L+59RQ1 zWN&=n!+n5Ww-l;bZ-F8U0Fp8N8-mzyE}HEyD^20C$|VKdBi7Slti;hk`1F7a(A3eXH$3>lU0<=V=7jW7A#I2^W76LE%F#&w~6ZgVBIPUb=c-G)FuMO#}~dL3>+u zOb7_A&MbYH!jg$6+9W>7-eE3F(GIv16@zJn0E+CVb{bfKzk{h5-Vq*prk0F-I_Z=@ zas?TQ!Q1a*7LK_$P!8qpPLi$f3P&IHzVX_F_>7cKNcw5vta~CqW=%UNRl~#o$k# zulGRyKyMJP^8@3{0?tNeO6KbngtWhDFRFCR&QLK@wXlIMhB?S8n&9oqzl zn#GL+I6^t0XtJ&GNIoBGKQP)ehz}9*2vE`?eF}K#r40=VIUwkJpk|T^psP8P4<^bS zGRjcy^zdos9w}l9B%>zl`=q5;tdG0cw24jxO^BI$;0Z74ETlt8v5?Z6+XAG7La|ON z^g;r-E%)pccT0#Eri5kU6p5qjRn4_f#(`Y|%?khz$Z zQ=^Cv=`GA0J9V6w8Zy4nv)jET!}@XUPD@f_O!s=)Apy<>+kH(t_cCp~=$h_nS}9h_ zST}2qXB(w3yUTg0@*{iK^LF)hD>Pg_6(z6%c1;$VnY5roJApAX8q*&l*#0RCRh3U5 zh<;y^*W3%HW|y40giChV#(;|mr;}+C#dra*$zzu!@IZ6~k^+0w#Q>@2A#W~y&;5Sy EKb3o->i_@% diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear_csm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear_csm.bin index 300652a517aa9a0c03745cf5c6fbde1ec6d2a859..050962de493f50258c5b3ee9f445cf07c608e2e1 100644 GIT binary patch literal 9527 zcmds7TW{n@6%M>0!b%{)3*yBqUOKZ$Q+8c!6RpsS(Fg>Hm4 zW?nB3P^~=GPdC+Ly{sQr*+^UJ+kS4jf7`BR>sh<-J-_bcw(GaEWpj=0KQ9)coxgEj zSg)JKrpAc(kL~*J8?xPV`pKrcZs%>#^2MrJ-Pbqm_HXqggU_tng64F*IU8^0zWKY~ zo}8R+7PH%S`H(y{*CKIB2BEs_kMQ9dbm=&UAsdY7h;Ig6nm7vGU`R*38g$tZ`u0`* z@HlUl+1n&=74!YpUPG7q_EEam`m{4mG7x@vV)A+b=Mp9}pQm57B>FI1? zBK=gYo85KWE^o-TVIvtdY$Pj&jlwnZe*s)cKYEop@+PdC6&l>A`MiZ?w*t1>CQ>m zx;?uLskn@&vQesR+M^OYqT-`eyra5m+c{|{3!Isp_N5Gw6a8c4r3We`fMw;h)NVTuZ)$q^R`|mRjL@lB8;aZ zZ8q@G{D?BC%c(Pig%rGsIKN|3kv2!W2A{rD8$}k>`?^ zDEj30)N4HtSsghLLl}bm9r22??k>sl=CqUwT zkGCjtXxJ+Q>cn=(oOE)LIFXuApp}?i znM`-*6zTPZrt9@)+5EM=nS=|PbMhO)0{7_Ph>4mq&I*;48B0}JDp?AZrcz4I^ODJ; zXf9ZR_)DG_Ib)(oDL17kiIJr7ITIsZ>Wb&J`z%Has0}MdB z))*|k%4m+&MoWbVlE30P+6x^ES)84nW5Ev3ejy}`9jqq@ZF<>YR67b9A>KumviY(L zH97(q#OqK^1BWS7m~|{3YVQXj-G_(Z=mMGRkIEPCa1FrbhrP&6i{h`rgnUjv+ zwu)1|g&eH5iSq$C4(WLhe$Z!fomhW*uBRNP#PIBu7=vdB@s0RUfA#BV6wWezPdhMhf#2hU-Opw&WsT42sKP;ZcsHx)!GODARfjT zt)n@Fj@PxItO$2yAac*REK@3E!tr)fYLMM~rw7R0Gew|lTpfTMxb~(Be#}&nVXDyn z{~=Bl2i$UK$^aS71gYIa(zKycnhd+oyfRu^6Yoz4e4dSD3xrs}Cn3iJA2B6A_5k0jwJ(7ob{J!{4(bn$c*c_#JymM7 zpx^yXDZ25D%QB@x#K+q$OQ6YrAMnAo2l$jFpML0q<#Ve2|Njm63Y#FMXl0DgR{+0P z#c?vY4Tzpm;+es3H=<30r^f)`i00vG@oG+lx^o^ws!*S81e0&MouOekZDaI59i6dA0z zZda3KeKV^UtBJdW9l6#c1%ohjEcC29Zx(m!`+*#7xON|D6uOTNq^WsA%s z$ydq20nf=B@~~jp*%^i&9Q)FZ?fxLDH_5|nH@TkEt?gv;Q11{SbMScq&k+QBS6T-R z??(|4IwYo`kTMxvF_K}SXCLTBaX<0)+(mfoMs>O+wxkrJ!!G@ZT$H(x1O$>7rC=f} zRgvQ^uamD256tB4$3a7&lWaKtRz`YMG<(3`wMi!xD=IwrFyRO|7jNE6X^`lzgF&ZIP3B z*No1!P4(4kf**QZ1cPr&XiRw1MIN66-5``cE8i9 z5OirF8A;Dd&WTE~l2fq;73z>R{x-sNM`=<~HcWRWJ$l{GuG?Ou^}1hN_sb~tmb!I8 Jemp%r`47cRtn~l@ literal 9547 zcmb`NTWci86@cZu7%K)F?3a+2G6B=GE6q+2Fc`njO z#t-=)A^#x%(dV45%Q-dGvlFtri&kB?bLw2as;=rcZ-4mXn}7ZH-)HdW^RrKO^ZROD zEjRfeJ~}&tfAGhb=}`9ZZhqY^+I1-TbT?mC+j`wpi@#Or;+u5wCKP|Rn=hKXciVrq zn`Yazt5EZWt@&((S%W zL|SOMsh0PPdaYk89&+!ghk$U_PxfctN!DXtl54+jAL?~=SI=Q^D%WbeyoZRL!)VI?uD(?ni`?PLlFg_FoeT@!34w3}gxZ9Gev#++c9e1xNL+suT9 zvp(D86oX!YJnykiP@=~=`G}b(&xLe&>^Bf~JZhnw^1+%Y*C`v7r`U+Hh}$TK;Aa5@ zk3A8TQvwAmVGgBYD5%kArGi_@Nb%;Fm9S%MC7g>3GZ*=kb$(r&=ajli@e)+w1b{?w zno|x38(8*mZc9V1F5mq|REb4q6!w7JY^cnl7S)v;L}6vD&~TuEq?4?!FF;j{@| zd1~h}x8bpi-6*|fXXY7bhq>r*@4}YSJaocL&uBq#9?T~L^#ZtKh!b{Qu)Q^7`}pR=C#X-0hR)B)&e0ka25{18+u}q>Zs>gY2pzz<-Q0aETpdmgx6la{ z~Kvb|5LQ{%&F;%UeG7+C)`2CZO&kzxQ%!%57#m^djoKq0+jNnX-LzXELcQPa*0p~9_x46*e9v>?LIT`{HUOmt zWC@dvhofRN9T)ZGXo^Wv7L(}&9)M`jYE;a0UXEd9ru0#Nja>SyF2jCyxF5I-vzfrR zJfN&I4>?dwidiEc1#3i1)0W1ZYWmb|4Q8fTf3+oKFgosVMC1gPXtoXtvPE%dSt;qJ zOTl}1~D@&3*_mkO+uymq32cL*efjGykf;jf{$0k=M<56}j=(SrgbO*{L9jnS3T&GMA(wXmLKa0V{R3hQ0={Sp6S_GCx);FH(lBdQ~ z_B}*}_37xQlEsBVIz>!Pu*}b&+NZh7q$ap3f{n4&paTwaGEfa$7o1?)0}G%Ua~!CKan6l`n`aNglo;4fLj(VMZpLhSVGyw; z6>WNf%C+G@HHX+Y(_WxLRSeYkgs)S28UfYx1C=43$7snwi!s{wmQFezdrQZxvTBtG zqyGV@)IJGRE;VEu^PYX7Md1vnC3{z8dYKvMbt+J??MXl_JW#E+9|)-6%l`|g-r?3p z^dJ3zNG-gtXhC(3!+a^7=Nfp57iHb)f#^jH7A3?`GMFEl@aKj`KHG~(cS8zM zPw!H$2{M;UPc-jTaUGC9)}O>zu)O-}Pz+2!-T{=fSR{rAgWD;0{1Y>@7WQ_f?kB`KeMzmD;P9#~VC>)^700V9<^EQn|5@4*o3qiU;Zs zCtOgtZ1yU`N2ng|A8#)i`P6+Aeh2@zYz-iMX z4~`UPNHS_|4-knSGR$b9b6&+`B{H(R-}h)N3(5<~Cw~Q55};gHah_C)QMx# z`>j+t#j{V;lN5c?Iq<%HRI%TkE3!-jB|;=lF>su|*0{ly1)Rq^6~XowfG~f*zkwYk zSO@#lm@nf>41+1ChAiPTAJdv^haJ;B9R;Zq1jo8KBc^0`2O%s!=HMP9xI=n(41?90 z;rnhee*>4<-{Y4r7`f0P%g9jV;pz&aHBg6rsX~okICk?d4PgE_cV?2xH>NEUWyk=z z5UlUQj(?Egd(o#3qUJ!vjcx4BhsWC_!eh3&WD2uTUz~rKOf3Lws`EW9x6eEq70U<=j e@DAyN8XhPzAzlf50P&9QA_)8i(QoJHXTJl|jIp%< diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear_omni.bin index 7fedd177753fe7f78bd89d487f14e919831647fd..385ed30c29a1b249ef0e5bf781c197f53b7c75d6 100644 GIT binary patch literal 6320 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 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_omni.bin index 72b8cc61e208c393e48f7dd2960fdd9bbfb5de19..7423d04c974e04723fe63c2b4ae26d633bbdbd74 100644 GIT binary patch literal 6309 zcmcIo-EQMV6fWE#%1W?+kPtWCJ7+fyw#Q?8s4BFuT0s1*SZ=to+{SG!oH$CHCh2M~ zcn@BIC*h?y-^|!Ej@{4|!mz1)&Yb`69M8=2m*2kk{Exr>Jfi2}(MRjFEUvEWr?c}S zpVu#{O}>2lt)nCQpPmQnbe7fmvdGHsGed5Ko)wpu>s5Y0XljH$)|Or_@{4tuEe}Yo zjMTg9bdfEy*(xx!57%j(*URjuYB|fwZE9k1ubC8fl<$uB~u(QnoDbbp1ZZI2~E zVb`~}q7|O@SW>uC=iZW5devj;diUs7S!K-+El_nov;wt1#Hacj_9~k#%6u6-bL{jR zzRtMv-0#t4J{p`1b5Z;*R)*I-9l%R(rNqqX@o_O%Shz_S8lRkfUwzh+@W z42Fnoh!{3R=G>$=MZU4$=dwjlkIQUVt!uZeE+o{QGshb_L{a{oUtMm~=gaKsYk-{` zzp09;Gs}v(J34-K?9g*rR$1+&Vc?PMw5r`svr0Tnw!7Og`Ow6Q_t9xrIvSEzV7Z4l z3x>pjqX8mi0x$J_?x{fOojLR#QB{z( z;?j|}oU=2s#{H3`s+59H>jPp$G5K~wgHt1dY&xGyrfX9-+A1W^tEzO;m_aftOZRG- z<4f`Dbv7r9QB0K}-L5zBMvb$USg8F2N%}~Nly9II|L~T^VW^Fi`D(Rq!QZp+T80S0 zyjrx z>M+pp$l4GYg`zygAy5$e@;9{7D{G2%rYK5@aau z2pF~C(puby3q(xe@z&-RFL>^>k;V~?M72o$b~QCX5NHzV*PFly8UYuM0w}l$YO6HF zFTqO07GCsXjtON|%Xnuz>%`ZMt;LYlp3n^Q(wE361YKbXV{so#;C6L`f|@%i_q*eU z4PuJ*Fa-@7SBcOi?u;E$d;nLLxY&yWEQPN`bnyjFKMqjSSm0~Y#hLM72xky8b-){* zPCXRqUu>pvBD#fuSYNZoAD16Z>F=B34|-cIz}87h+WNMEQ)ENoln3-JqlN0%+k+`| zVor4j%fUwKrKn#L4J{_UXoqGv2(9n{v=Sfv)*D%zMfZYM5?JFGk>ZiiBE|QH7HR22 ztM%ajftIqFlAHbV-VH5=Moc05U!WCgXt4oU??H6FMvFliOrFqJ6JUwAzl- zp158w^B=0IYoGlHgfe;rF4G*k(Zpk35(Tt7^dli6F2aZma?V&RJf0-^iIX zkFrKNp#rF5VR4(gP+>K(_EE$bD;L$uU1rlFo3H4&r>?06j=$vGfQATL_cEVf)z|w* zP+vK=$Qc6@P!p1IDXjzo_n^tG^Tav0VCOuh^hEw>gp~)E-Zo2{za;b6nH5|2qNIBV zR~{ItE((t)lrj1gnGEX8^e+%l2ReIEDN@QOfbH5Dozdy~ZrRPa!NAas!(>BRflyx^ zi99;Uh?vfo%;PK(p%(@sN@8xAmxxxFmA_-vg+c~)uj;BkZs*CXcH`aD^Q4!Q7Qf~y z08ng7-A)drx@i!vy=1sal}hS%U`E4C4e3bkVsV(qJ53W38&j#}aFJ0-5^A}qHr*o9 zsah!}rW+962rQ6S)q*M7;hShwD^W606mxS1;5Q1M3~{^(olezw(kF3gh;Xi8uLF)4 zwmiC5v@Lr=LyzpYR*iB(CHcUS5a zjbrJyZzH?9JDh#p@&X0+QmPmRyj0sF-@1(MD(&1~QmVTiuNse~)}1VbzN~FIRL58r zO{Xp7^1mqY1Wo=h4*ZDD5VB3+6hVx36Ud9c0iEnr?U)_}YB1&7ML=2cCqcl`ecTgX zLf1(F3x!XgijYMf`s9%HKrlv9ktZ1Ss@0**K(^b literal 7141 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 literal 15665 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 RZyezkVvOM1H_x6O{TE4X2vYz6 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_linear.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_linear.bin index b6ffced335907a090eb9edef210aedc144339d5d..2194dab6141bcb2f9d0ac43dae658998ea5efbf6 100644 GIT binary patch literal 4699 zcmai1TXWk)6b`%qp#u!?!tkQL$xR}5wW}MU!*u9$V1S`BSDXWZ4ztGWzU}PJLjxkz4`gmk5_;Fe1^|wXJ2j7vbeo#UMy~keA&FNw)y(Q z56;f;AD<_ibdfdry2#33vwqncy)5SQO`ShtH0zDNZg+aK%BPz$TR&n|_g0^5(p9$3 z7PWt3P4;VFZqj=3CR?n^VtM0ZZgt%v#OduHb_kG>7z|Lt;%Y!@}y4dyKGi%f6rEe5^8e#?-yrh=bL3Quht9a zKA&pG`X4}WeW=mHa3o^myMMO}}0f0{Pm1=?o9w%iHrB zJ9)Hz2;q?ehihRxEhTKmP@dL%aRSaGO@{RP{JdBisP0=xr&YB^GR?Ab?$i4s-wvOb zKsPI|&&%wg+B9xiO_?~(b4N@ZtQdDUxAR^4YMtHwMAX4P_f;`-7Fn@$C+Ba^9ej{6 z-$_Fiz;v{`w|j8DW3fA4-%hUC@}{avCyiAM%d9Nj+jUO0{O4V^bjjhRF&3VfOvWZU zFdmAz}<(+01Cp%PMQ=ya_hoeSUO= zrv!hbOni~}aS{X~ilrYo-$N*jy|vT|mRID#tTW}(IN}7N+zzt!{wyLtL$tm9r9&qh z?G`5#=X{+_8#nO1B=!>-MR5>n9ViO$Su31XjeA?RSc5x2ug`xNNhyL*#7b)%Od$49 z$67_e2L97%p zj}MUuO4+okhcd&vL<@*qm!4c7r^jx`oz~lLNx({7zxMVV8&Wn3L@I^4XBN>{ct1oi ziLFJocHCkKIzW@+5ZCS39~>E)@8lqb#ify4TpV(>rA1&A6cisAwX4rony z5F1`=z#~J@Tg5sGgAmB}`*h(+s^pY5^mZr2KA~vD54{+HX=I4$&sA_iv7!nHQKUk^ z>oX__HF2&`?oz-HFG!qXs30eZeW;)q;1nETn)0s`aVynQk&-s67<>Bqw);j;-6?~R zL5Knm4V5JJLlM*Y0!{-?H0Xe|91iv-8`J-!2z@xrmJj0wNPgN19QG@_nKh1DF4}c! ziBGXx=o_Nh_3>e76-p72mUiyDRf&)1I1UmOqG|hK601=A0S_0`?(Jx_SvbhRJ7;@Wl({?4FyaOTq@IK{ zP&y>ahSOs5Hkxw~`(_#JR;;GXGvS4^J5Qh6`=Pz|c-zAs*V;;Mk_UHP6bS)fZz%Q{ zoe4EBb6F|&IjS2@2FI{fDMMw)^3#2`iAg6gBX`%bs}!rg9B?A&RITdwOavK=90 zXnaMP)0cx(wvilPM+p&{+gB7!7*RdA!^|!)q~CA6y|jEdb%FJ^aEqXX9W6T2Nu&dy z8mJhZTKh?eyU=j|ws}(*WXfZ9QSl~xw#V|>!E7kqb*r~s+qSS?^$cqrc4Vex90T4p zpK-PLf_gu-jr-KNG;?3IF3gCCcu*2N^bD@S45Q5DWAUkYiDvMs+KzGT979MK9!4Mb zEnZ;hr878&E?0Y0R z^i7xGJ?)nQF&Yf)w)HuBCmlN-iw?ckBd-sf+4kMsN{&LqQqT0sjkQ zkzji0$VZ8`B}4IXp6TTR#0xdZK)+4S+LvMP!QiUeK4Dr{zFXnCg+Au{xTfQxE)o%I zAD1nSYdt2J3WW+J&nC`@3QcCrU+HO$=@bZr<0oLD#$>~*0C9*JP1S3=?)a_J+kqk} hm|`!D2jT}SZZC}o;=L8`4e<`dTZp+>-<_YI{Rf!n-I@RZ literal 5462 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 ay9b9s|6|+#C=NF0zeB$b%5RR2Ui=rD#EVh@ literal 16157 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 literal 8735 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 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcss.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcss.bin index fdb69d3b2fd97fded2a343c34d9bb69cde6308fe..54a940f45a1f1e4220e3ec8b1afb1f35ded86855 100644 GIT binary patch literal 6537 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 U{TYKhL*RLu<+){kI6Xc2FNT!(H2?qr diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcss_csm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcss_csm.bin index 80cee35da9b97cb34f4ccc12b86b98a953c49724..52744a7c1be748424d3e74b03f16c5564d54624c 100644 GIT binary patch literal 23245 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 DO>q0b literal 27225 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 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcss_linear.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcss_linear.bin index ad202efb3c6100754b681fd09f8342421d56330d..daca2330fad4d32def163728911570e6a9b54c00 100644 GIT binary patch literal 6564 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 evdZ(Bn7@h diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcss_linear_csm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcss_linear_csm.bin index 60831983400e22928bb7b5455958d07db2a0c1d9..ad786c5f612ddd3a489c9da267528cb8c6182c88 100644 GIT binary patch literal 23545 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 literal 27351 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 literal 11061 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 Ll9V5gkB|NXH!!b< literal 11002 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 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm.bin index 280858061df7f4ccd233d789d4802be2d6e51182..89e3e929ca81a9c8def88e1f9639383e8e62657a 100644 GIT binary patch literal 3913 zcmb_fOONA35Dr{`uqzI5L0o!o_H2@Ex7~g)jL?eFY7s)LG~6vu;>?(J?8tVWtNF3~ z6RP@Qx8qC@5}uhny1Krq`s&d=@9y4z{pI?v_ak^-j=tT*dG_$wyj|UAY0-QrcWL$c zXQL7P!t-JiuaYLMvLyd4>6W$9ZMIx)>hyxrqEq@#S-M-N^G%*q7qse5>#I$?PO4;8 zvomW>xAu)f|4`Ohla)m$`M$MVHn&-o&QbhpQJ8W5pjl{|wAduL<8ECxe{3N34(W?c zJTLRoSb0&$^<%OqcfTiVikwN>{(dZ*-Qv6PWws!zBr7a?{Ao#tZ=jCW;>f)89Sio&=@{qa>M}(0k%o^&8A8%bH+@7 zKI*7KR|?Qsfs2)fC15Se#zFw-tgbhx8!?CbVaOxb54q3$D0F>~aZ!L14BWOSq}4s{ z{-f@*0coN<3J#*5vwat>%nNY%6No(e|EEWE_$t{0BVhRed4W&h%9XS?F_LgJNYzer z(Z87FsZi)Vk5$FQ0hoA$sPO(;yaxiE2YMV~mW(=jBD=>dPpxGF<3!n1_5jn9CLoh8 zK^v-^ktk>k^6Ew(qx$%OS{e=l&iU zVy4Z@+NzR8mK3$6&-F7W5jb}Sfkj{^Pm71<@zjV284CrR>64AVSx}}(_C=F>Ov5Fg z4w#>iMYfGQFK#{Rt@<5wuE;9eTk{;Q0G5TN1$mL3Gexf_27}6r;aQG(fa40Q3i!nN zV3~}r;N*N>7h3aDcsoD^mnamEc)Y-i0*^Z`+xh&d9cMb9)2^%(U|YXP#W2QIVwWfc9DpR| z3@;0q8Zi)K(3(J^MNlFpT){-H%UwT%Ei4Ev2E~Sz0((WK(9VPyk;pazA~7M|^%09+ z>%TrHp))x2K}mQA4vFm;hAMd#EcdYHRi7wZ=5*i@o;_HM*uPkYfQca`_qF)5y5ctO z++qgc=`;ABM;}XVD2b?3h(%rcrf% z7P&5H`80B&agBD>{nx*N&-PFkF_ecsYEQ%mEk4L{IuReW_;^;l1F`7Nr}23753!su AR{#J2 literal 4430 zcma)9TW{k;6b`%qVbMOo3*u#XS=nux^^9{>Dbk8+wFn`Q%6sG{ZfoSkS=(tYtNvYn z2j`r*J5C_2qIl-qzjHp%yubVK^_T0vKXl;pP3No4Y@L+Jvf`hA*6F}Me9W4#YhP?; z^CB-wyYgx?TPAf{W=Z~A(!RWCU#{%(>&-0B9-rzziz=(LVr6%}RXgvN_gT6EfouTjX_(8j`>vXkAP~vV~)PHOs zV;khFYF0fZi(>nGvW~ENvVi}*?sT4$a-Xdp*>gIN+4F2wl*=T)?mEi@SeDxJq9_;M z9;!TN>Grz2S!EBPi*^RgfOTSB9IX>*N2?aN(_0Ww!?)3@jcZA`LU&EU7$ZlBR zq1@l?*;^m@{x(Fddoooo*U%y}0Fp8N8;m@bDbCtoPYHN-?Dr^uAnHdw24A7HR1~>Z zj?qx|z=A+q>+jf`H+oz2_hHCBflMQS0qU6$1`tA?R@Ev09R0(W^l#K+OkepOczy@q z7d^bNG_O(>fRaS5dq^ROqzKAAq~mRuYsj_C=8`hT0jfpCg85W-}&54=WDaZOYgSQHGV zN@5DGsigd5)lmc;SeP5uZI4-4Fe>drw~=}tgFOfcWA{Mz>cwf_fXO2)QP3#Tfn8bR z>+iyr`2oZYHL7tU90nR zhY`198O2k*#3vM+h3gK+s5Ng92c!+amfG*{*z9Z$52}hqOs_} z*Z{IIlw2`}(d0-P%VcM%2R!TnOWiT(5F%9lBHi~K91p7gO-D5T4mok+0Bt4$5BfJ| zgbnBjV?HK;0ko3yaA_ZgPGG}O)7lGlGk&?e!d+tFBXDpP$k%;#NTHYUJuWSHTAC|j z6E2a3KOZ#vIvtE%9ZU3i33}~-@n{j`7}tA?xC})r;Ml7%rN)3MXFndhfdqV#=2XZQ z^H6@3vaGzDv+&1V;JDjL>5#?>GyRM?so&awS0v%jw!qn*7gZ3PIl}d~05Igr$Ae)k zrW#=1u0QKSfZgh2SqI+0jtyV%u{NV4$KnP7l=p2As5U$s)Q&+5o{M^K+fs-ylr}G! zwtZIj;OTk~qz_#Vi^~iKcAmrWhnbKAnquOAN?o~Q_BAOY6$|U>V3>ofN(m3p{&^eQ zS8IZMGr58z%Ljy_@wUWM*J)Egn|inHYzK&6A>t9&bz_jO+X9|@85JF>Bz4nwPaZ@} zWzJ!>Wk27rDL9a(6p0Xp_-#fMt{WT)oQkZk47R=G`^aT~L7b~q@q}e3#j^^>Eowy> zIJvh6!WaX^I4RHz3E;ZevL@~(?LYua80Hpq;?nUdI1QA16513-Av`$u#tL56fG;*4 z*}QCSVjD~#G{w2X5P^FJ6!Ze1CN;H?$6*^JpOOu~@-A@;ByKz2lEdIl?9lgPK6_s# zkH6qO7(16rN`;~xP40nnEbBP;RuaY|3SE=jixA|GxjQ9Ej4)l@XhK5d1zUaH=I(vT zXpswV=g7rE3F~4F>BWyO%yc>TX5X@R13QksIx-FS3)K=>0GpGA251u{=+qO#Rc0`x zKSc2OC$NNlO^?8cKKIF+%mq{2C0UnnNq1`jxbXgXG>#*YUPaE^U5pR_T?yz0y1PWV(yGN|#uzrNnC+dV{AmgqNH(%akia=U0& zd#Kiy>gU_~wpled>ttdswsXJK+<)lS^Ub_l+Lhn-a=Xpz`KrC-@?Vxq*UsM=FKjmL za@%mn+uLsQ_bqIi`C^mH;ko!aStpBx<> zZ8ZF5BU{cKWcdX@R%r_=Pl? zZ`y~;u3KHfw(%qk8c)KC@uV=5X>eEH&D(qT_Y#@aEY6P?&11LSgp2M{W`6Kp5S;{= zQMz2byMCzOteSU!V(vr9yKa6J+%)rLcyj#VIKY6{lAsnM1*xO@?BOx^RxXC_?ET5P zOO?eQRWeDH%!X8zN0m-er9IU}*Dau7AwbnE7U7~@umADBS%%d5ROuMasw$GB%F?_L zX`G8FPqLE}t*~ZN!qc>RejR|k5GV4N@&xB=QPL3<^KR9$eU2qXQKd#vHZrSZGMsif?Q$^X7#bDU`HtI{lA&b$K_>)7H1{f*bIP;-j z&q|1Az66!sB>k5%ny z%IeA4LC$Khu|jO9oXM-Mx7gQHdpVb_X!+>(h}}M*5}LGdJk4o(`&C`#x)X7V!xzh$ zx+`cFLeS)nBsN2KutNbbVn_*}9k*Ygz5dgm z_NC~^R3)7qdMNZ1oZ&#F4;ZtD6C#yGT>wY$wX+V~q(C#|F`=$X))9Dtg0MDEYk3*+k|8S?6Rd5rBwnHD9fx$^Ad27S7n-uBrD1|$xi8rlate+ zr+vDAChcCsjKeBI2z8x3_?D}=rl81Kb6b9uYcz zs}Lfo#Hkahr-9c^aYixy4tEPslghWtC|XNl--5sV@{RhEQxYa}a}+QZ4>Is$aQ}Y3 zXv6CUnC&Pc+qMdO8lrg!CWrte^Si$K6y`K|ZuWWUh-9TK9;w>1Foqm$R0sXe!4vKqtErtC z#}OSe0+v1yQ$8Wbo_-Jvt}!65>KMHJh;VJJ31_)kM#jgQUW+NLA)W70&Ws|&$^Am5 zrstz(H0G@m4VwOVvx=1dorEJQHfRW(;uwoIfsQ3V7n_pVUTor}&^~OUIE7Dfobrr3 z0Z_8@l)2M+NX0>5V(XTtg5`S5oqN=?I1rMxJ=OJ2gn~pKu49J3E&Y_gc z9J{jVi^p0vD~V(Dum&>fB=Lp1?SnF^+8doSK(GgP0nf-|obUuSW-FE}(~H*P1u$*X@{qyXSbTpg*uI4a}X(N~RX@#G}cvrD!{yps2WW9%=| zL7VE4PhT!kD-IccTw?hZ?la{+mH4^zmpup`y01V=GfV@WzAgsmJxE9%nm&mJ2WPJ7 zBz8fZ(;Q<{I9tcy10VayXqDK70yYTb!r=u&O&t=7tTML`3;{pKymd5l*{77s&qhpg z?)k72oYmlG(~9dHedZ*CqaPOs=*p>SznUOrJS~k-_OO4++3*-%A#sg^!3NqUS?(vT zTHU1?S3%TYSK2E)tJN;lCG9vmoSlq57pC3A6{Cc-U>pZ-nU>}ZrYbPpG z=0r#1G{>|$CSj6-v33zU-H*_`?RW^GDHbh9&|3v{pFrsZO%$;kbWc)psD>3MC68JB zp{^&%?$eQ)#9tn%sc!GhO5T8>-cxAJtvV0jb|Q9C4SF}XaO}&#m&}J$Hdck=v_f5u zQcnq})b|jIQ+?x*G-3dm2DwCX&`%c);8JFJ4a^q`&G|*5Ihhd6@i~R&l(!@Q_n|t; zi0typP$GMt;uZvwQvFRQQj?&r41%`4A%2;SI?Fho8k6N+dyC0p@?O8_@AXq_Gjyv> z<>6#>b&8w(KMs@AY;ZM3{whtudfcwYrjP*P$>hbE_W;5w@j{raghIHOKt(?$)KceV zUZ^7)sXq&oOPUN!E}YvGl*3_aphyO%IW9gIlSO21ZhDVh4*QqFbfSoOBG6pdm<$=? zXmfo!;#{d?Fog?vSa2};VCs=}939S%DuZ3&lSRs-w}Z)G_vx5S;+Mr_p)bdv z_kK*K+lk2__&>`B*;o}O(+Z8rG>ouFeV>ELB4YqS2YY#S4f^xZ?IZ@An5@uFKm&P& z%`Xy@$wUgz#LHrGfhTiyUgG+ae-B{tpwaprhG5UjcnSKx#l&@U(eCiD^rTTY8^FWT zl8)yGNw20AP2c-d-H=c(@&Tv0cw_6q1xxViJM-p?c_Rb0ETi$EkBO$uBC0re6$q8b z8*1kL2ZoKqkjMwT>Q#vOQ;YllVB+}DsEHf(V13!G!&P%NZT>q@Q3_)Qr`1P=pbY4HIF4RbwvgLg}I6XSu`J{#}B z7D`32ezc2sB&tGWI2vbZS&2v_RbCc+tD~2HN&@w0P5wO%)|>V=tmN!oStiUXrF&qu ziD|-mHgZd!%yfodFAR8(n|`%qC4q@g|L$tV5>?OC(JTl$L0x3r#qjVqbFIXQJq)E; z(keN{aNc(JejIzoSPTAh{|Gxe8-T-P4gN9kEl zc}5gnSq4qJ4PeFpfFD(iNB2b%=Y_5lg=TE-_K7&|U8~rox)-SS)IQuMa7sK&l8oh- zMO9RaBuY|I#dxAE(mYDDIB(DJk_ogxbeSdQGoA^7=iONZ=}DEQpvt2vMX@>+YD&(3 nFKzaKG^mjc<^VHTel*LEDtiXYPiFaPa`_(1vLHVmA0Pb>Lnq%| literal 11745 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 gk@I#}BLsje0sV>X2u%v};2haJuH~;_u diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear_csm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear_csm.bin index cfc05b251a65b9ff34c1a3be9d763ae0b227006d..e5808573443df523f32acfbfd86ccc889ee92089 100644 GIT binary patch literal 11283 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 ZY5kE%Z~D^{`EH>{`0^8p243l&wjn1KQ^1@ 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 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear_omni.bin index b6848b27e4bfdb0dec5e64e9c66dd784a46425b0..66aa9ebaa2694707594cefaebe7f28801ef7a38a 100644 GIT binary patch literal 6653 zcmcIoOK;=W6?VHR>IP`icG0362Hj8-S>gLpcMv2QOi~1GgHAVH5wuO)L@7~_C`T1<}-|nl;kAHM_hW~gz+7-*Pt2TAnd{>%b&Gf3iz1?lA6HGUT=~qhAn{{=)Ys$?D zuC3wv>8@Cpn{v4g%-An>MOSs3^3UyNSvKEns%mA3u+1X=y=t0vZ>XOPs9!a^%FsR@ z(EeIkw)a-}X8O;SKi{|8x~p5ugx~a@w%x0GQ(cq%$JNS?>~D44yRKU8O3rw*Zo9wi z5N)I5C%fXhZCY#OqiwOhFK^oYpUSnzEXhRu?$>8$=et#Xi;y@E)pg`(`Bq*pk7tUCQ*DA* zjvanOR}q(%`=fCY4~>&)Dw99N%JjT1C-5?wDKK++eqOI679NVV0_mkS)>Vh=w%y#o zUNcb-22+FK)L^6sL+7D*sH?sGz7i#RdES(d?XGj1_F6#QdFgmF2P4wHtGnAn@p@C< zeNC{#@Q1d(ah7Gha%bmn&mBCsO=;luDSDEj4*fM1=hlGs~ByHn}v5#*>nt4h|Q*F1$8vG*- z?}UqFteS1rzf8)c{W4ITZ#Wg&Vvji!`oD0zMd*pg_w&HZgDj6h&k$?p_aIshX>Olp zUmzH%(IIk!VI~T3@;#sc6Zq+SR(M5DInN|T3Xw+kt{Jx=F=FZ?lrFvDLoEUhu^E$) zU?td);A|sH@e&##oiJ7elh6njHZ;hs;F0Ix9>XJq+mrAxteKY>n>j3DlII2{939%s zkpi4bsRfr_<1t*wViM1{KDK<}^Q?{{&GVs=LrEG4A&W%V^&v2#YQiOE0wi2Qloe8f zPrxb+Exf475gVM9En}UrY~bI}w;n^PeNZZ&9!FC-LFXD{iCjb3N)9m<58F*RiK%de zDN2yI%20GuxQd@^J7ndf*h8yEBthW|f`|Abb?gU6i!5ZY32qB#y#-S^Bb&(s-}nsj zA%}iIX8|)!W;M%Lvc{iSG=;q%ia*NkrEv8F?&2d5a1L?Gs#7?Pv6f+?{7jBus^&)# z=lAW+>cgBcbY>KyaY~?>&`O5|5KTfWIt8uRS6LmdXlZbwWzk{q;&}IGLN}=BNtsk@d@`J(n4tDqlNerj4)+W@ZN0({^&e))NK|RbMbcEnpPUOE zq1AzIahN$TtXCXyD3Fg_G4qHk8n(~fZd1AT84-CxI4qdTK9$ER!-31gOaTE%q3JMQ zmX9;$Xa$u}7T#0Jmam zseIc9gh3%R|GN}$D-5i_~Pq?l2gA5eF?|k}FU&QF+KbD?x z&6C#?dzzz5C4hoR)CX(&%15d50&cJ68M}U}09^>Nu%^xQ#JTsn-MX9drY=`ooSx;a z-^6VK44e`nmg}Zk-F5dPJq#`_p?+&a%wgu!MJY1oC$%1!jZFo}ByC z&+UJJ>xHwd5AJn?%N$pn!jU0aLl?sGxfM!f$@p4^8NrE`0P_*o86C4DyTql%^UNsI zQ$Fq?7Djo#JZXAS8s%ve`=J+y8DJd+fNdJv`sZYj4MBX)oo!dG-CT^G)TPrb8)4s& zO)2ZNUKoTafjyYb6$@dh6W+I8DO$tO7uO8zSr3I2DOa&v;Z3&2M4S$INy2wv4QzAd zTeu~>5<^Vqy4?@+*b4^H4S+gA2K*{tKq*d6#v55yh$gdQZX{U&TEJ&h6mNkh3?^Y9 zOcK+D^RnS6hm(|BNmVmSmz*H$Hx0N55R-ftS0!`dQ+c&@`G-em(7MJIJ%P)SEMc3n zmu%=(RWMdmJ4y+F37>aY$F6@L)~ zG0QLZaxaSlF9@UD$2uH^i5JFxQeAjrJwkS+_ww6cL=jf$*n{>U4?}PzULK-YtqRp8 pH@xs%9N0U72EEiCksmc#?eUJtPn!HB!F5F5gDeX2-TC?1e*n{9lzIRF literal 7703 zcma)BOOG5i5MH<-79c@{>{`23zXYl92*@v6)B3ov&Rs8;Y zXJ_ya{n+dkNgCuLDCeapw2@hn^C%V}2poYgm9*Eg?x^Cz2eF};1g{=HmH*VA(D zdp@^4&t|Wt`5X+kc@Ug?UrcXqHmkhS`-L5Qwa6!%B3o9vzjWQ@`o(maPcZUN^LZHH zD-OS2=kra57FUaM{o4jI_8>pojMw>knf+QWXIb&XGS6iOLFZq2QIuOh^nn=qeX+@X z->0JQk36j7YP@=#U6XRf->SQOlBm1!oG?8-51LbGUf4<> zb*%H`5AXQqhCB?xy+n>G@_py#as-HdT&;4eb!PVozK=YV~|Zr1mP{H(VKIa+Tac-mxA9v|=)47UT=WouHA%>wk(Q*vDw5>PUB)`fFvu?*g4r)&nk>YuImoKy1 zd<>jas$$yNsY`WTu2m#f7!{$j+aKD&0>S52osWI34^yXmJ2})k!BXDa#kST3RJ++j zQD$qko-IHV#;`J#`yE`(vYm?P$5GMRM|Iq{+Gar27D`xc+P0{S(;F2<)jpVyO9!IW zQf~m0QexTx+8wB@6DKqP)zHc{j(eDj3L9Wh6pVt3s3)PD&XzDK^@?2ClJt!qegY@A z%N*Zvf4qhJ=j) zRKQqx3@KZMMT&wh9Esu-fYlM#p*m)+ADm!;IK@;VNgaKa5;GY_M+bt#U~8xYZ-$V^ zu~iTsyN9s_m*Yf|*}ilbpVbcUp-+V7?xO&(`XR)LZo%oeXV-(OzU2ZZ7DA;QwbTaZ zE_g`oQ`+koa-_ep)jF)b7s;5!#}hoM57+vWfbPiku?F_PL^DknUirnVC@BsT->1Hd|JJ9H)qZG-BZa)u(e81oQMKOPs9ojZ7__dYfTKlai__l z8X`XDgvFm5P}^-0MO2x&RYD$w+p?%q# z5g@WT#cv0bX>JctMP(o-89XvPq(Mp-!X-;18)HHaP#;dU!NX(!FbI$hT6``Pg5i#0 z3F!(4z-`t=WNr_qha65Qcw=Wgz})#!Br{=4N()~ko6^c>*CTLk?^XH27uZG$Vog#^ zFN|JeZlLf0lmxpli5jr7)i=jsAOU;A4Z*-QkhtPQG*Ew=vMIgDP%iKk7r3vK^K4fh zL&Ti;ck4hFNv`k|SNNn{MU1ZQP7hQaPuAUdkoFQi;t7_1!u*xkOCsSK}EMyM!e}K+|J>-*Hz}!Ty52Nmudt7j4LZ5 zBq5S!B;rhPlyE9Ce}QoHO3h7DsQ)R6E)Nwa=2Un!r{&19(B#0vm-Y}S;v}Gt%mgmV zt-a2Kp0$=oFA|S@KCX5m4Tb;> zwM1l2ZvoDn-T?Hj;g-I+R}4U!Esv~xDBLLuw_n~y!{A*U$oFkAehGKu&+$VZNgZxa zs8Gbw>=kH^SDoO)8yVw9#Vq}>XG^&UCCQvIZDeVMv``m(^_k}3mk~FLLWrKD5Ol*G zlx9G$ehlGOSMcFadKTYWVD@n40`x0u&GRt8(~_kG7QpA^<0rs8G@*@80++&RkN)Bm z9{&n50Z6Nxe7_4ccWjT8)i9&JG(Y)np<#aF&Y(X?x;nq;_B@Dmh^a7a;3*72vJ(42 R!Oa^&Fu)xQ-kzVI{SN}0=YIeI diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_omni.bin index 852d20d99335dd843a054e6da2d455c6ce748cbe..b315b67cc89f3ed1e58c8bf1593b27397aa96742 100644 GIT binary patch literal 6642 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 Ir>7_X1DFHY=l}o! diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_texture.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_texture.bin index 0d5c16e94e6494159ae984968aa5850519d9b11f..3a9f8f9314fc893319ab3820073ebf6e69f559c6 100644 GIT binary patch literal 557 zcmY+A%Wi`(5JhP=mE3=*W(jJ9Y-0?Fw3}8@_xS+i@Q9EIj(8*_Rld4E&@trI0mNp+>0*^_1Ai$&U`%ZE=R8f6lH@gRL&7P{F&tG2r;Z}=D7 zt?}*eK2HT)s4*dB4XAL~8)~X`lhK$|>Ztq9u5_xpQrGYf)B#kCRls^v49T)ln{f$b z>~)#JR+Y8wkRJkAqb~_1b|SXxo7}$dGJhQA#McH75+($8?DWA_>(<78cQ~FL^yjH( zbC=VxL?A;iV1CG{$GGoY5Jja`hYZg!49XoQc3FTu$_t<_n;4Xdh%zP_i@XqlzC_Tt z$rQkZ$jUZVO*TQ!*EI#QsTpB1j@0R@+x>zK=>LUXTW>KD_n4Eq!XFR%`CJZF!PxZ>kk%3ltcgk literal 614 zcmZXS&u)V-48}7qm9lr3d;|?eCD2p5T{cy_?*UK>6d{!cg@5g;zWZz-1*ri=#?JTi z=ZO99&#Qj>+%a4ZTeWebPue&yjNyxm*Kw0wz9>nVG3h&ub;?|ea}HgWNa*NLqP0oa zTi%|Fqc$Z~BA9@4wpL|z%8dMmnY`tlE>b8}aR%4pHx8q?DJyIf2U|?o7(M`dHLb}I z;m!6^$Uu!Nh4jI0o@GUr6)spI>B!RPblD~p z{agq{PpaYwu5BsB1$M9&f#<;uYXE6cC(5LB@J`!sfw9RCDvs!T3Xy6VA-vlgezLhC w$>eJ@*?f#Wp_WsxMYI_nA5A@n<2^ihG@FGCqvfY~Z&W_~Df8TD;?6ny2LThbBLDyZ diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_hblur.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_hblur.bin index 3e07fc8990bbfeaf9b7d35a6258de2453a0d0bde..59d07579ce5df1ede8b738327d859730fa7a8fc5 100644 GIT binary patch literal 2279 zcmds2OODe(5DhzII7BZU$XNC1>W?B;pb;BZ93V3J43U!b$Z;~sAdbdKShD2?Y$#hy zCL=`}?=nNlQoEn3UG@CB`(1wi`0D4cKfik#FM6-nqxIKvl5Reg*P!#}(fIMQ*UL7m z`7BjSvo4p{i)lq4%yIHC%NFH6ZR&iH#$`QEEA!4k-zZ|X)3G&Qu4cQ@WmR6iPm5Fy zv-zsQ$!tgUbT>|^n!p`sk3c*H(kYNnfmZw4ruoDy%lRtrXWufT(Ka+<6zy?VmE$^Z zkQ|)^WG@8_j1!>tg`^#@P%>{!{x2q}&b9A)Q%&>Z-!M38ya#@KzdtKC(w)@jieRCzhf+H;?W_Zg2hz zB6Ls$i5UZjW|JT?#DLZcw;G>uXLVJCiaSM~IT1c60v1?;R}~yOPlVtivmV1UANH=2 z@IjL2&cxnp@-*+?u9Db$NuDT?{;>7bhyJd{+WPB-$(ym*?e@27Bki@M7S+k8I#}7G MDShqkdzSV70#!yYC;$Ke literal 1611 zcmd6n%}&BV6ou=?MfD-ByD5}re)>meO*)e^Gxyw+%y;*AfARMI`Jv%B(=MmM^f`>>;vt++Tvs2Ct8-18hiaLQM=(z! z4)dT$%1BBT(}CVn?3Tg~D*T`#4l4FQpN-R@R5?t;e3B)K-$L6ho|I_}d6%-pVam@2P`mxx%JdXBJ(FKZpf=CUJ zlF-Z%T0<2^1tFW)+*y-|S+3(V;U`_{nczBUJIQ(o_ zp{^koQj`(j&)75L+}?eC_v`oHKLcEE2Je^I@*ywW=3D+q@!kJ$6>kTFXtgM(u9}l& zK7X7|D)>UWe;!5AEZ@3S9nai2uS>Tep9oC|M#y?H7UcW=w8?I({Qk3>xoQ-Z3m*rv z&gw}scCISuAt*XQb}k6#g8W=ips%$n3o_5kMVv%GB7&7aCPik1MOiO_y|oY z#kyxw8H0PMj8vek;n)XK8!Uh!VJS_LAvt27HWy+O@?j^|QeYolE$^|H%fHZP{&X%( zVV^!nY;S$Ie)~CMd+Q6|_gChR*xve5U9XSW-uk*n{UNruzUfhai0!R!d(KkcVgKCa_-0D+V#-3=MMi~Y<>o1}}7)X&EMBer|Q>30ai{Kr7tihd;RGi@4_ dIgGv`UjDDlKR^01@4*w`^9lkq_cMwH{{XUcYyJQL literal 2585 zcmb`J&5qMB5XZxjz(dS2SxV%w^Qjdl(25Hu9v}*Bw_7P~DmVQ^JSj)6NIU?SoqSm? zRm#Rn)I%N1|NMV5_KY9Cetz@w*Wce3J+G{{+jRSs&5Fa9Y{O_={pk7g+OqbUJT2D? z*w3dN_GvjkPK!d$*uAaI_}UEi&hXwD(L3Yc+q?Dhv5+g+W~)s;m;4jxZfRw)oWUwv zuEBBb?>1Cc$xxQ3WThT)_?GWvO5dkp^&UQeLnP%+&PmSE^(Gn$bKwq{$GOij;I2|D zR~v#)$u&Ut-#e1%tSG^$zu+BDq(m`un8%n%NFYomfF5&e9kuLqx$Jznxon7gBo8eB z!zdBa6#xZS0r+MBzBde@Nkkq0Hi+=9i=p2b9FQRN&WGEGfrc2EAqK{XEvy0z1_N@H zL*znW+=i$+i|q~yHNemeFdPjqGyv=}*asMCfRPzsG#X%gh6Zd=p)$yPCW1J+PGPJO z#%6@^XoT_L6bf|+dkGVbFfk)cMk7oH6H;w#D=F*i1xO81)ly_;jI_?Qn*LjAkQq>R zN3ox>?x=0$L259U&Ff`7kJgPwi4CPz53%m@okdOtA7wTz9jA#9S-xxfG7kcewH^6d zMepq>u2fF9RQ#?squyY#+C^I9Lk{oh7SeP aa`Qi(MV>y$Z1J(k3rRYi1M>RAwykHdG35mS diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth.bin index bca11e9c0bee4814071d5b93de8d4db9b506e24d..8b0da550f005e799347aefd66cd46c7caa95c4fc 100644 GIT binary patch literal 369 zcmb`By-vh15QIZ(USdm|A7eYWj-!YQ=|oRYWCC}x6yj3|A$N$k;9)6Qn*y$93y(FL z-EY=+x2L<$@vF#le^L}I3@|@+E126|d8poCp@lnFwd8$EQ9-k_VD;9|GA8!8oO~ rjm`3SZB@21xv?&qeBKy+F*}{km$xx*ZCvBwJP4`P<_0iHBbP?R1*EnKi=HloF6{=&t$Imvm{}mgK<~qFuFs02t$Zn#ajOy9|zvX+LHiRpah_DoZRl4 z$!&VSzm9F}E5^nc?%>{sjtln60IO-EAHd~nL^=OiEnndB#7RC0Sb&m7z>-=u!x%?{ zD;2U$@9Tk+z_l?_tss>cWkIXO>2#{}U*nvj9I0>Y_Yug_CvbAT0BUlY5SX16`QoFp mQm4iig()*z7^`hrWH#4kU8LFwu>waih{yhq1sLs(vE&PTSZnJ5 literal 471 zcmaja(Q3mW6b9hz*1p8K)NZpzO`(Kc4NC9(071GX2x$y1q-n?AVvn?k>SZ;=M#f-X z=t2CybKLHCi}u@IlX3k#BuTIASvM8*?*|Ee(V7q4Y18DWH~I~ZN;iNB`a}R_ZBz%{ zv2~Fm&D~9?;RP_pbC_OW6`!%tnj^&rjpq{|U-4l#D=0hqM3WByf11YdQ?UV}3lhF|pxkw%$x*PAN$* brw9=dBK}9Jy4YG(y_(usrvx)cUkD{P;WUV4 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_vsm_linear.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_vsm_linear.bin index f1537b6e6a58cd5f157d2e6edc26cf7c5a65dd04..b44234a83bcde351176db5950f5fecd0b5ee76e9 100644 GIT binary patch literal 367 zcmbV`v1-FG5Qd#qeS|DGN+mI}Y$*~ZQz5i-*Md>)I5jv{Fp6;#@-}(Uo{9_Z(xErp z!Owkn-|qGK;l6yiMBnwch$7N-P`A!{7>a6t@*g>A?Wa3?+Pc#E#&xg-&Hxh__GJd| zhk7h_y*)g+*7Z3dgKH`{+NPt7TnS*|o`6DgBfC9=yDc=W7G)b}5rj!DDyUsQD5|TC>OA%#6>$cbpa%k|1CK+M7V_TJZMm3c zI6znmufli?!+JQz+%zfMfKC}9q)(^>R|q~6s`05pesR00g`sc;ZCWYfZ^7+6)25j` r)|ZnXGc2x~duuE?rVQHM6@`AKoNzq)MOKdr1Z3k zc({32_v%sh~|kwRH~NoqxMetuDkfi)LbS$<}ULT+Mao`xn@HJ1Vqpy~q} X3RGTFT9m3$4AKZTOb2Ah#F_j6h6XT+ delta 69 zcmcb@xPozlvTOqb14CJ2QDtUcxbCD(H~_~^S)tgey-5610Sj$ghChj%}~qMhW37n%EJ8)8RC-wkaY z#S6WJi*tQnZxlWEE(mFQikhJNa;lG;5Ml)dY5jMYC)S3IpPJCqM+zxLWkD7F+-;BL zYxKM4(1wUT_Mxe0=bN6TwB=avgZcm`>Dnl9P-ud?H!EwzID5|aD@GTL?% literal 366 zcmYk0O>ToQ5QS-Wb$f?hn0cdl z?>l@QAI#I+i-)!G9^1UV$ij@D(hBd+n;YxC&#iP)x8Y{d1Wto=*QzODP^S=vyi?Q3 z7*~jl^i6d(PD3lTt(6NuVD0>W$ImS+?im?ORe+XN1C)^;0<-lNI&Cp34>A;PGaum< z0*+ZLZMuG=YRw1~A0t|r4k%)Ey;I0Q*AV`inBj&=G~pr=X%eYtk@{#KN4s=~OYDQ- oLPYy8h?D(%5scx}g3hODVlzuw=LaXtcT*dOEH~VY{1W2*0lBJZ;s5{u diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth_vsm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth_vsm.bin index afc9243b5607b59f453066ba077a7088ec1cb459..b11be6d599b83b05e5f623d950a6277fafe41a34 100644 GIT binary patch delta 247 zcmcb{^pr`_E!cxQU(U{k0SK5FI7{OT5{nXZi;b8V85n?wfng%A1dBS5H8ISxo+~p? zp)57oNTDpgB()+rKffr&z?v&3u`<83L?b6ZIk6-&KTp9{!9Y_1C<0PyqL7rHRuS)3 zl$h?EpOar?&BaxgpP8bNo0yrWp~+Rvr2qt|N`U%78Z`>?%Qb)uV~v#j5)GhrC8bP7 zsT1Go+gn(eS{j>Kn3@@xSy~vInHZUxTNoOd>L?iM8E9&1>VUKxYruV?R{;_O$ysyN Ia&a*L0CZ_ZfdBvi delta 231 zcmaFLbd8DEE!cxQU(U{k0SK5TDoPk~mc|z(7A58u8!<65FaQw{NC2s_#G=Z~ymW=K z)MO)tviOqJisbzKq7(z`iMEz;W%-#Y3b~1yc?ueuT-96(AXO#`CAkGaUGaw2KmizA zuUx@a!BEctMXaK-3Mg8TU#_45)M%`cl3${r0kol{v?$fcMPcH1eJe{HkS diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_vblur.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_vblur.bin index 3e07fc8990bbfeaf9b7d35a6258de2453a0d0bde..59d07579ce5df1ede8b738327d859730fa7a8fc5 100644 GIT binary patch literal 2279 zcmds2OODe(5DhzII7BZU$XNC1>W?B;pb;BZ93V3J43U!b$Z;~sAdbdKShD2?Y$#hy zCL=`}?=nNlQoEn3UG@CB`(1wi`0D4cKfik#FM6-nqxIKvl5Reg*P!#}(fIMQ*UL7m z`7BjSvo4p{i)lq4%yIHC%NFH6ZR&iH#$`QEEA!4k-zZ|X)3G&Qu4cQ@WmR6iPm5Fy zv-zsQ$!tgUbT>|^n!p`sk3c*H(kYNnfmZw4ruoDy%lRtrXWufT(Ka+<6zy?VmE$^Z zkQ|)^WG@8_j1!>tg`^#@P%>{!{x2q}&b9A)Q%&>Z-!M38ya#@KzdtKC(w)@jieRCzhf+H;?W_Zg2hz zB6Ls$i5UZjW|JT?#DLZcw;G>uXLVJCiaSM~IT1c60v1?;R}~yOPlVtivmV1UANH=2 z@IjL2&cxnp@-*+?u9Db$NuDT?{;>7bhyJd{+WPB-$(ym*?e@27Bki@M7S+k8I#}7G MDShqkdzSV70#!yYC;$Ke literal 1611 zcmd6n%}&BV6ou=?MfD-ByD5}re)>meO*)e^Gxyw+%y;*AfARMI`Jv%B(=MmM^f`>>;vt++Tvs2Ct8-18hiaLQM=(z! z4)dT$%1BBT(}CVn?3Tg~D*T`#4l4FQpN-R@R5?t;e3B)K-$L6ho|I_}d6%-pVam@2P`mxx%JdXBJ(FKZpf=CUJ zlF-Z%T0<2^1tFW)+*y-|S+3(V;U`_{nczBUJIQ(o_ zp{^koQj`(j&)75L+}?eC_v`oHKLcEE2Je^I@*ywW=3D+q@!kJ$6>kTFXtgM(u9}l& zK7X7|D)>UWe;!5AEZ@3S9nai2uS>Tep9oC|M#y?H7UcW=w8?I({Qk3>xoQ-Z3m*rv z&gw}scCISuAt*XQb}k6#g8W=ips%$n3o_5kMVv%GB7&7aCPik1MOiO_y|oY z#kyxw8H0PMj8vek;n)XK8!Uh!VJS_LAvt27HWy+O@?j^|QeYolE$^|H%fHZP{&X%( zVV^!nY;S$Ie)~CMd+Q6|_gChR*xve5U9XSW-uk*n{UNruzUfhai0!R!d(KkcVgKCa_-0D+V#-3=MMi~Y<>o1}}7)X&EMBer|Q>30ai{Kr7tihd;RGi@4_ dIgGv`UjDDlKR^01@4*w`^9lkq_cMwH{{XUcYyJQL literal 2585 zcmb`J&5qMB5XZxjz(dS2SxV%w^Qjdl(25Hu9v}*Bw_7P~DmVQ^JSj)6NIU?SoqSm? zRm#Rn)I%N1|NMV5_KY9Cetz@w*Wce3J+G{{+jRSs&5Fa9Y{O_={pk7g+OqbUJT2D? z*w3dN_GvjkPK!d$*uAaI_}UEi&hXwD(L3Yc+q?Dhv5+g+W~)s;m;4jxZfRw)oWUwv zuEBBb?>1Cc$xxQ3WThT)_?GWvO5dkp^&UQeLnP%+&PmSE^(Gn$bKwq{$GOij;I2|D zR~v#)$u&Ut-#e1%tSG^$zu+BDq(m`un8%n%NFYomfF5&e9kuLqx$Jznxon7gBo8eB z!zdBa6#xZS0r+MBzBde@Nkkq0Hi+=9i=p2b9FQRN&WGEGfrc2EAqK{XEvy0z1_N@H zL*znW+=i$+i|q~yHNemeFdPjqGyv=}*asMCfRPzsG#X%gh6Zd=p)$yPCW1J+PGPJO z#%6@^XoT_L6bf|+dkGVbFfk)cMk7oH6H;w#D=F*i1xO81)ly_;jI_?Qn*LjAkQq>R zN3ox>?x=0$L259U&Ff`7kJgPwi4CPz53%m@okdOtA7wTz9jA#9S-xxfG7kcewH^6d zMepq>u2fF9RQ#?squyY#+C^I9Lk{oh7SeP aa`Qi(MV>y$Z1J(k3rRYi1M>RAwykHdG35mS diff --git a/examples/runtime/shaders/glsl/fs_shadowvolume_color_lighting.bin b/examples/runtime/shaders/glsl/fs_shadowvolume_color_lighting.bin index 4578bacd2b5f7953c0b24825166ce92ee8e69b7d..229ca9656d6348cde66703aa1870e7c7b47a6940 100644 GIT binary patch literal 1852 zcmb7EJ#X7E5LJuxOUclo=**!5)!3@OZNbgdB51e5=}ss%?GTV9Lm#&6pntn_??}p$ zqby|tNWMGWJ-+wI+q)l^^T)p*4Omyk>zeHZ-(S2ij0=ny?`xKd^+WY5FXzcp)a6S^ z!9T1IH7mD#QKw14$_J5&jF-LiyP7SZw(SucW6W@efk^17mFzDO#OXXJ)B z7J&$U7m)k)s$sW9vi^p0LBm}xmLP=4sAWEy1eWa2+-V4(sv+XYX*q1#~z z2=lxE3czz!U2xiGenjXx)tkIUq?m1u65T#p=U}`5!K6G}R}a7p z?xw@y6BhUmkbHob-Fqb!#&Iy1E#jA76HUZN&Zg+EtE8;5}Bd{?FQ^EUzDX311g2imnqzq9NFFgHu&Hx ziS1afNigvzptKwLVHmnW=tX`sai>#0c0i!kBa0NS84AaWd?CEqdP-X~!Cp3(Z#aj6 zTl-Jf4gxQVLkB$N#l8OV literal 2150 zcma)7NpI6Y6gH?(aC_i@IL~ohf^ocLQ7IQt1s8-;?$$J!q$7C=UJ|zzf15LJR!{02 zaC@-7dF%JRdAYv%cD8u@`_6&q+&OF09i#hSw4>ScXO08^@Vu1h34EOh;8mM$Nk#Iy zw{hFF-aQ3hw<*bQ87-RL5U>?nuiKjT*lC+C%dD(={UZ`w3to4e*`Sueq`GIt z2JPrFLc6pmtDIz)?h}}Eb?LSRTf;fGjgduQf0C0%pY)(Imz)h?P3GW05jwyXsRLXP zJ3xoz4oraH0d`38@nb`De_WG%o6#!#ifqP#&XTQAPFR7k=RUef(%s}+;5i*%0-)c~ z6_OgT2a2^G9=8xQDzngX3H?1djs4&N>+T-_eL5{Zz$#XxQ%06w1U?u`Y0-tY2tDqH zKEQnNLD1Eh2(c9*K4?Id8wr}(Da&dFOhRJo@&MqW_eha07LvA+H^zVPWcCC8W>)$cq_2Nh4HhIykw#i9 zUAR$eZh6kZb6f5aCbzX_%B(UWII%xjBaXPtIe~D2AD97>O7kP$h*}+@a?ZK& z!-89^(5KbWZL26TJ zud|{iGQCD7FE8wHgF#U+*Ki47mSikTSQtS5B^Icx?SEB;P!Ly=C&J1>(!^>$r*Kit z4VwaUvIM26xt+Z^UpA`0so_&rsedp04%GR?RSJSJ56EY6nZW{vk$`RZQ5HeFZ3q)0 sM{FNp+>0*^_1Ai$&U`%ZE=R8f6lH@gRL&7P{F&tG2r;Z}=D7 zt?}*eK2HT)s4*dB4XAL~8)~X`lhK$|>Ztq9u5_xpQrGYf)B#kCRls^v49T)ln{f$b z>~)#JR+Y8wkRJkAqb~_1b|SXxo7}$dGJhQA#McH75+($8?DWA_>(<78cQ~FL^yjH( zbC=VxL?A;iV1CG{$GGoY5Jja`hYZg!49XoQc3FTu$_t<_n;4Xdh%zP_i@XqlzC_Tt z$rQkZ$jUZVO*TQ!*EI#QsTpB1j@0R@+x>zK=>LUXTW>KD_n4Eq!XFR%`CJZF!PxZ>kk%3ltcgk literal 614 zcmZXS&u)V-48}7qm9lr3d;|?eCD2p5T{cy_?*UK>6d{!cg@5g;zWZz-1*ri=#?JTi z=ZO99&#Qj>+%a4ZTeWebPue&yjNyxm*Kw0wz9>nVG3h&ub;?|ea}HgWNa*NLqP0oa zTi%|Fqc$Z~BA9@4wpL|z%8dMmnY`tlE>b8}aR%4pHx8q?DJyIf2U|?o7(M`dHLb}I z;m!6^$Uu!Nh4jI0o@GUr6)spI>B!RPblD~p z{agq{PpaYwu5BsB1$M9&f#<;uYXE6cC(5LB@J`!sfw9RCDvs!T3Xy6VA-vlgezLhC w$>eJ@*?f#Wp_WsxMYI_nA5A@n<2^ihG@FGCqvfY~Z&W_~Df8TD;?6ny2LThbBLDyZ diff --git a/examples/runtime/shaders/glsl/fs_shadowvolume_svbackblank.bin b/examples/runtime/shaders/glsl/fs_shadowvolume_svbackblank.bin index 62e922fcbcd2865de6e9d98fde9af77818713e99..5025f41dc3d49103c0034e2192e4f4eb7aee14da 100644 GIT binary patch literal 116 zcmZ<@_TXlKgG3;UD<`oszqCXnCqFr{Br`ux!B)XQQvoQVP?nl(qL7rHRuS)3l$h?E spOar?&BaxgpP8bNo0yrWp~+Rvr2qt|N`U%78Z`{{3^c8|YPq-=0LkhfOaK4? literal 161 zcmZ<@_TXlKgFYauEI%_vAvZBIPeDVItC~wep)57oM4=?Npe(T{-q0E-0AuS_DA+0( o>KUMjRbmmV!Xj3V5KGUAcPmOvch1krF9M3fjJM{h<>F!h0ES#DCjbBd diff --git a/examples/runtime/shaders/glsl/fs_shadowvolume_svbackcolor.bin b/examples/runtime/shaders/glsl/fs_shadowvolume_svbackcolor.bin index c794807a722a92ba38254438de3300c03f5a88e0..332701e008897a381430bb3ede3978fa57551144 100644 GIT binary patch literal 275 zcmZ<@_TXlK0!9Y*()i^3octmtMg|5T0)lry%vG9~nU-Iat5BAjY@z^FV$H>slUSKw zTB4DYpPX2dnV+X%t6-q102G0!OG;0xh<7VWOm_yE2vlB{pP8bNo0yrWp~+Rvr2qt| zO7tp#CO}QstFXqVq7q3(B~}$xNGhtZswfA!Q_s@E00ayz4a|*AEX<6JEDViIt+{Hs GxEKJI|4z{W literal 136 zcmZ<@_TXlK0!9Y*()i^3octmtMg|5T0)k{9F3rnK%P-1RC`(N?QGlwj<|@n2Oi{>9 z%*<2J(B!J-Qcy_GiFYeXOm_wupjS~@rC!OJ7>Z3TRu&CXmJI8Nk z{(t_dAMVeyLw%lQ84La`zDzvC&QC)e;RbR6L}0(^3TXT7Yg6xhe-}gCRgCT9@CZ+S z7`b5Y45-=|12mY^=0zW9IF3{8yJ76BxxWq3PtZsuX=0_;`5&y3<$@MRDH2^Om?W$h z5;kGEz$M`Y)#?0$#P8J9Nx$ISx6eEUy#=0f2)Igz3%G`IUCw0-tF5yrjYdRSpfcK6 z>D*?Oqo75a&vmIJ8t1Uo#-UNBblMaOt&30g|1A9dk;V=Drp32klvXR&G(v# zx0@;Z)@#C8WAq*hrAt7;pB&(r8&$(8@gqCf2Ug&Fk_LSQoMDzHab?OnR;eyCA%K>8 zr~9$CcH3%qL8LI3!h|4k3DT2N`Zi(?K^R*72XY^T jIO8FYL5K^%*q>YnAQcS=}#2#mUH$7B9dhl diff --git a/examples/runtime/shaders/glsl/fs_shadowvolume_svbacktex2.bin b/examples/runtime/shaders/glsl/fs_shadowvolume_svbacktex2.bin index b61d9b67ce058e997cb0e34061d11bce1814545e..622b1dfdbc0236ff56f5016788ad4b5fd0aea690 100644 GIT binary patch literal 755 zcmchT&q~8U5XOVY^(DsJF4(gFX0vG&4?^(n1B6X%Lm+0M#-fPt>Z3TDL!r%8JICLA zGv9nuJwIJ%$NIU-GB$+I_&)I=wqfey2=^cb5P`$Cwa|3CkGk52?lBH=Uov)x{R_N? ze&m9EF`#N<9H2%?lQ-Q!;y6xKX#24%=l*VpVS-v|MT(VK%QLJAs|B@5yu?U&xxy#0 zUF;|b%X4bd8B3b3IBqyiO`Y@$&O`IYQ_u(CDTjbfI$XdV6zgKH+~y|tIVxumQCZZ^ zxLkR^T}c!)NXF6>TA}kE3*$UG?Fw(4)tGywk#>^i7Ea7&mrV+O0Wu--~08M#rWu5p|7~cG5px6f?_T6%SL9}5mcw8`M#T5uHgz!wn68tbU`VZtj l3UQ`G9-|P~etX&^*HMV`7t*g&<{Mq;+F*tiMYN-oya6RyWfuSd diff --git a/examples/runtime/shaders/glsl/fs_shadowvolume_svfrontblank.bin b/examples/runtime/shaders/glsl/fs_shadowvolume_svfrontblank.bin index 1c3da13a8bff7f1a8015874b47909398146598e3..1d7f4ebbabfaf2dea9f6a7d931a6fe1deab45659 100644 GIT binary patch literal 196 zcmZ<@_TXlKgN;BIS59JOerbtDPJVJ?NoIbYf~|sqrUFnzp)57oL?J0Xts>s7C^6kR zKPSJ)nv1I}KQl!kH!(9$LzAnTO92Q_mFQJ~Owcp1#wJ&ZN3IHwTsctA5M*X87Z(En DrZYBj literal 169 zcmZ<@_TXlKgK0okS$<}ULT+Mao`QxZS2dS{LRo6Eu|i31L0Mu^yrDHv0LIpO8@`> diff --git a/examples/runtime/shaders/glsl/fs_shadowvolume_svfrontcolor.bin b/examples/runtime/shaders/glsl/fs_shadowvolume_svfrontcolor.bin index c794807a722a92ba38254438de3300c03f5a88e0..332701e008897a381430bb3ede3978fa57551144 100644 GIT binary patch literal 275 zcmZ<@_TXlK0!9Y*()i^3octmtMg|5T0)lry%vG9~nU-Iat5BAjY@z^FV$H>slUSKw zTB4DYpPX2dnV+X%t6-q102G0!OG;0xh<7VWOm_yE2vlB{pP8bNo0yrWp~+Rvr2qt| zO7tp#CO}QstFXqVq7q3(B~}$xNGhtZswfA!Q_s@E00ayz4a|*AEX<6JEDViIt+{Hs GxEKJI|4z{W literal 136 zcmZ<@_TXlK0!9Y*()i^3octmtMg|5T0)k{9F3rnK%P-1RC`(N?QGlwj<|@n2Oi{>9 z%*<2J(B!J-Qcy_GiFYeXOm_wupjS~@rCLq3=K@%*=qo2B^i-PIC2MCIj7=vp;>V}rm8}|?$IS>fSvSgM| zn(yOH^ZIgIoaXnYDA*9b;>W~?*oLW(BRoPWfCwD6Z3XLY_ql5Jp?i))+}Dg9V!wg6 z(2rcOZw55GA%+Q7Qk7|US=Q%N5?!baYr;9LE=FLAkXeLDSZCM~&Z#GQia58Tm*mQM zSikdbAl*1lO=$bEgQsK!_rQ~a5bywg>F2SP)z(>*MkAuEP#JBkbZ)ySQ5+Xb?Uh91 z9C~dW8fCoGrc!8~R7kNDeg~I(sqgsVnx#CQSzgp(_*O-UE<|LK=Y@B={E&;%#k-n7AM^o0)le^UY-9 z-F8mC@tP6RYIQ&QB hLms0L7s1p^uA>m=FQk8_%s0BwwZRN8ifBhEc>_y(WS{^5 diff --git a/examples/runtime/shaders/glsl/fs_shadowvolume_svfronttex2.bin b/examples/runtime/shaders/glsl/fs_shadowvolume_svfronttex2.bin index 6e6f2c0dca3adb23050aa3f4b4cc13bf08f42f9c..b0122cad3f4a8053f2b963d9011f7930eb9973bc 100644 GIT binary patch literal 767 zcmchT&q@O^5Qi6!@g?S%fGznqNw%wa5Ekz~KuOnjSy(sFu0;{w*oSbkLZPl#JI61R z`Q|tE)8ln*c*mOe+_c;-)faeH8z%7)^aw>1V@xh~V1`(A-?Tqs(gzZA2ppRse zrql{u2v`~y&}ml&ltvm$JvZ>Tmwc0#{1^4oN|TpPcu_C;eh%^zgp(_*O-UE<|LK=Y@B={E&;%#k-n7AO)&2(PgeDf3U zwsZ1*uNfh&RtJ<)RbZSxDUcOfHaI1IWD*mwh8uXoW-0^AizKdf)x!NDIDaAiF=f8dg{}=|I8j79O352eK4hW* diff --git a/examples/runtime/shaders/glsl/fs_shadowvolume_svside.bin b/examples/runtime/shaders/glsl/fs_shadowvolume_svside.bin index 35f2195916789e99dfe50277054a6c85e7e2554f..b3e83978fc4a18a1d2ae3ef3ea679bd2d67569c5 100644 GIT binary patch literal 637 zcmchS!Ait15QdA#_!8qSMO&JrlcZMhAQbODz>=+Pi5nZ(twoW2E>Av|chf8gidXl) z&CEalH`CnToqoK3Zjz|SlO!Q_gx+~G!Mxhk#FSe z^*+u!x9k2i{__1iDFiKtQfk&ax&&vy^63PmHuCdqR>gn~#x} literal 452 zcma)&zYc;h5XNz>FL7?y7_bnX(8+|j`v9b(kOrg%35te?a&q#q+`Xa<4n#Zj&)55Y z-{pe!YWTQ6Q>$IKfn`;)s8yaooM~A?6{bF`wA#X6svMBBD}&Ep8oE9`=zzt$5J1I% zBTTX|D0E&1G9nb`U`$=5jRfV!*_f@`MN=sE2g(gSBXoD?OjvB&Ky3YTb3`<8Hn@)9 z+=z1!ju677kO_FR8R=h;x)(D3A9Cr1*x>!!$*C7I{t0OZDwCzobU~PIL_TX6vtBZm&PaO=j0bLF@ks?@D7N%O7k+)@{4j6%2Ja}6rf71xwvu? zEAvZBG;;Ej6H7Al^Av0q3^WyhA`o>+>1h@5Zbgad&L9(k%FFUIQxtL&GxIbwxvIGo zfB;pAUIowusOfqY*4R{3BB`jvs-g->MHN;RRI JS1lJ80|1e>QKbL? literal 136 zcmZ<@_Tb*T{cAP@5HK>Zm&PaO=j0bLF@ks?kPO77d6{YXMY#%PsmUe^P!-l(W%-#Y z3b~1yc?ueuT-96(3h6oVZbgad&L9KyDk`fKY+;H)JZp3nC`zcUwr7xY>Af z=hm4weKV81JYRo(es3%t3kz-2Zg>-|sJn}WNtn30v~;17g=%XU@+^RviV>0x6qOP^ z4Cy9DmDs6mZ&xZ4y;KdXz;i%nrp9$yyr)Sk$|qH+RyPkyzCtZzV>{>rfsW~~6cZee zZ&`qSQ&zf5HGLv7*_6&$m~hi#U@daT0Zd{)0(sTtr^zGmpd_<$UU9jDmEL0MozN1a zooD^aYtUoz_c=6Ru4~(3-Psx?-~!fKcz|dbjS&W+AM%i5=2J>>Kne3%h&j()k2>&Z v#`OG%V9GeBk literal 552 zcma)(O-{ow5QWn&%_WB2L{&l((N)L_DPqq7EK^8i<;Rti8Vc&USaB@&%ow5wp@@3n zpON49-q_{+-NncIXA{s^1>ztFw^vqm!+OO9Kh{Culs)RchN?Ac1SgwZ9C}?D+kt!9 zUBj%)g){mQI;DHSP`nBF5j8T+=|Bq<-vj_%0bXL=%F>#CEY*%Y!Vp+A-HedjLROx5 zVg=4_@ezswk~sOJBA;31GmhP!+K?GzrhWWEVbFJl=v~#rfXE>uNEyq;8+J&NluWK5 t+it1;3qm0lAe-|cuZxffvU8I>FG4o|Li{(V`qs3@5@vd$T%3dmz5uP5ioyT@ diff --git a/examples/runtime/shaders/glsl/fs_shadowvolume_texture.bin b/examples/runtime/shaders/glsl/fs_shadowvolume_texture.bin index d66b26aed8511199b1e421d77b4e50c4d432ac01..854acb84a2796eb40167ebaea6d46a9207498181 100644 GIT binary patch delta 145 zcmZ3%c!hC-GRqnU28M|a^7ULfiIw@KB^o*T$%!SI`FRSq3I>`AKoNzq)MOKdr1Z3k zc({32_v%sh~|kwRH~NoqxMetuDkfi)LbS$<}ULT+Mao`xn@HJ1Vqpy~q} X3RGTFT9m3$4AKZTOb2Ah#F_j6h6XT+ delta 69 zcmcb@xPozlvTOqb14CJ2QDtUcxfgc5H+YEaC_ju57?tk6JziCQ=unN1rkW8bEXndd z_~)gfsLLdaN)kF2o2hD*#>*^UlXXIsHV2D)sr6VW;va0j2xcSu?3EB#cvnHjHe;6iPFR-OJ)pYfz zN^s=RkXjT!Z6?PDu5~E%*`SE|qDX7@OWw&5_;$Kjquw7T#4=1>7ms8Lybb<-8uRUw zX(2kdlUiHZ)JMf4D>VUaLQrA%SZoqf$3g*wD65=n!?jF^wn|#k&l(>TI7=%-+)CwM13U6qeeMzHCzFklG+14O9Zbb&o*9IbLWjigi?LreTU=>g%oI zwcIT?*`${I2!14P5d3lu%sytl ziNk@kik#V*Z)U%5W_)}9>FoE{KVJs$IUk%g(I#Qr@2q9%^Jjwr{KMy^w4T7P6Ja=Q zqIF!xS=ISiO;l|Tjjx(0&K?q$*PSES7RhqiRIIbTf#5ZpH)&i()nk$;Ijaop7frM* zR-OCnCQ6glWBskD?&3w#7_NA9w|e-T=d8TzqO2;aS$k8YMal0auXZks_chDsN!pq1 z)4^a9mrqH)A{#azl1-EsWfrGbmSGOS43P7pC>P$|2@l{zURh0^EFqGkgv4OCJIUf2 zPdcM=mxT7r$aL>OvE8#P#(VZY>pd4>zGvHK|M;<1pgXSOY@M<)_((b_{&}i20a}Y> zL9#f>3AL@C7LkI~*&39H{3|fvGr1;GrDVq_DrR#JL8o#HjF78Fss`cc+YkSM3tL9u#;&y2{~k;27x;o*8M^dNk**L+WO$2D0OTSDW93T2#e zJJ89O5AYv21ivJksJ15>SpAy0uy79MV{brwC|PGx;_4MGD&h1h>e>ULMX5H{ yeObE>phskzZ3XMR;kF!1D?aTQnDPVP4Z~nO8%er2u;?m4J<`njweicc27dwTC%Vf3 diff --git a/examples/runtime/shaders/glsl/fs_sky.bin b/examples/runtime/shaders/glsl/fs_sky.bin index 66f6f32812e58fd117e44a24937999e4ae8eb6f6..3326d79323955f740ae39b76780407f5e3a387c2 100644 GIT binary patch literal 559 zcmZ8dOHRWu6bxMMbwE^SCkK8+$)pu(O5SZ?c97D*iC*QAIma2+m%#1(jMfhK*) zYTnFv-Yj08FF!w?zAc=Qbyf3R6e5+CEXvV^W#Nx=UGuWe9#tV%mD1U1@r8R*XKJI1 z6dJkmpl=YLulgo2Au2PPJ7{>L%{<2A<)f!TvGRnvs0h~>uMFre*QQFUEw=g~f;=aHSP~h4QOku4nn&FWmQF}@M z1G5R7&|yh-+wB<}_=P5bY;#H}NAEGv>CAQ*gWF+>&L9| zM`zPN&Gn9oWr-303PcmrGEK1&juFr(bSLI6#xVb3=h&Wq_=33;xl!PSGdBpMU>^F0 LW4JMSC&c;zaDt^g literal 689 zcmZvaOHRWu5Qa^c0da;|+K{Gg5>{2&fC_sK5SiAkED}3%9!-k40@vYKT!C>OYSQ9F zvNhxRKmTK|-(IhOzF&R`jtRLbqLdq+h+LR#azzOKIBtt5E7Y?zVv|d)P6;(3q~xZS zY7eE@1W-oVNByK@ZI;eiqLku*5=*C0a;HsV3qlwIFH%D&>S?)!gi8gKIiC)|F4jDU zJV}uhEtVMR*RTRQRQ4*k8=<_4+5IC0f1u!71>c)v8C~Esg{{tkVhMo4!}C}k1udh_ z6vKoIXW4PnysAFhZH!%#g8@0PWKpHGh0!VPO!*9EV-K~}!(i{4F}QCn(Y|N_kE=fK zcj%_?T}?P3hu#6%=ynvtV`DVc2cY~tqv*N6VT3h~6MG{)Fu;y=+5vN|T5H;E-Upp~ c;Y0Je@ZYlS%|4FShVPqagzVE%zZ{4B0q~T~NdN!< diff --git a/examples/runtime/shaders/glsl/fs_sky2.bin b/examples/runtime/shaders/glsl/fs_sky2.bin index 73d7a53ed9d2c4d7769e4a15a3473469379e4762..9f93377f76a8e92ff8e310004d00790d386b83ae 100644 GIT binary patch literal 24915 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 literal 33639 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 literal 5608 zcmb7IOK%%D5O#|I1=I(6Xs-o(30AhXS&~{k;KY{(K@0Q{v_P-I##REglGc@ETXK^B z-fxDlp)A{|5jYZu^Zw>RzxngmuiKx_UmoG-tD|qOC(UNjzMVJA>E_EXj*jpTKb`et z{m*W4Gn?Mhi97sZ&37l8RkK_#W}8j3yqG5P_t(Vp+w$fwaJ^l%e?J4;GZyzXlioI~ zX0c96zQgJD^7U*rz1Ym!Wg>jbgg=_g8EHu8#g9ivH_d7{TYgYC(+i_+CY$N@qHR}~ z)mi6yIeXu(7DVYQ=~g1Go5j_9x-zd-^6xN}f|5I$?k$=PDaf5oWUn7&=kR@saQYB2 zIDXc-X=j&e(ae^r=ypDK6!~V=$_Hkm&)iX8Z5CGu%*4<^_*~xIs#hGRqAIIXrOT?D z(YHII%Mh}HD9wu77FUaXpVe_x#**1{uf8vs`@$4hanF=~`IITOkXAo#NKdatn3-+o0SEJG3q-$B}kNG?JJOoh()x1WFWX zBc%^>=|)N)mMk5%3*js(^HNJxX@b@I-_@qLY&S97@Zs(>8NEFeEG_Y+`-jB9*d&I& zxR}r0tCV*b@KWh%ud2K1)2C z87_)43;uA4j1rd|a+S*C#n6xHHKCt_MG8+zpcn19kjTkyq8aiG8vaH)3t~VrkBO(; zF~0d|=a057KKuF^*ZYTz)npU}rC3m#YTm624wq6zutm67cbV9AEdYc?v;Ch;nY#h9 zTrbHU8Du?5ZAyM$PY;>aMq6Wz5Hjwn6T(1k2P17q-JH||N$a7l zE9;yEc4D8@o>!0UXlwwwj6$r|n!&Ihc-D+eO2_yaj;&-o=u>j=L=_B;;2EdraBjNl zoTr4#5p0V*N!+pO84MB^rW0JRht+UA@C`AgfLdU{xgJB-diG&iJfPQSg-eqV6x1O= z=c=Ikq$Cn0U<&#|VJgLZkq4!Vy)u`RxAl>Z$aiCES(hmv06W!;LCyC`Jws zqrrYL$65rub0cOuxhe}c@7)r^jf3ZZ_|6SPu37#{S|>|%lvBcL=WaP2;w8i>`E8P_$mvKT@x#pA#RVB~BxymAFB!H3|kVO-_WlGD)8H1s+3 zJcDxgc(mnyWq84QFxve*cs&=K2czAGqmM<~iF-2I?%KoAX8M!SmW={#zKk)ou^Zf= zW(aK_IH@L(eut&dogg4Cj0OUHcHwMQ)|{iP%A;T@GL)W>nG%gI?+0W|J(p8e0mA&r zjZvrA>*dkp)l(-xBQeoUxd|JrDD0>gK7z7AX+~C$&~|CoI4MClFof&mg%=y&2}Z8I zhT0)sWt;2O)V%(^y+pCbw`APv%)m7U5|y4a#OWV0SdDhPPv$u1y(8SA)|c&#QT&j@ z|E_K4Q6O&!fs^-x5OZ?OjSThtITFv|e4_W!onw!DDJRZr2&D!I#Bj0G%;`nRvPD8n z-b6)nAh`Y<#G7%%XciO8`3NoFduX}I$H8K$&BLX~6;m?yKq`HXW0$QrbMH4oZD6|zm}Z>MqC6usO#YNMWu(RJd&>YU-!QTk$(`?wz8w}kPW z+hNl+EwG&g(bo8x9U7X54*J52B-2{KRT0{QPndOiD+IXU&YFV1;~(dk(Q~m`Y1_^en`#KTM2r%z0dTK~$$0 zx*lk}6Z0?BnpGF=yj@K!PmA!G04Rb)YxRJ+!I6+B$Alf1x8Q=IgysOoF=HccSVa*P z#DQSSS|fOY;Gc_(4Xz+|LGl%aDf{*wOO2LKcWD@FEK*|TlSLoqlQ*m8!!P74?2HDU Kbv}1GNB;qk6$|zN diff --git a/examples/runtime/shaders/glsl/fs_sky2_shadow.bin b/examples/runtime/shaders/glsl/fs_sky2_shadow.bin index e92f00627732abd8d881add362d1e76d09067d7e..5f0a7b28b7bab01ca8226040badca5bfda30a6b8 100644 GIT binary patch literal 184 zcmZ<@_TXOmOKBwo7%T;nTseuA`K2WqIr+(nC7Jno3bqOcnhHP>g|gIS6NRMow2FAQ zqQrFP{G9wEYp%>Zh$tzJ1;PkK(gTTx=VbAC>K5l|P*B5ST%E-nTD%AP$c diff --git a/examples/runtime/shaders/glsl/fs_sky_color_banding_fix.bin b/examples/runtime/shaders/glsl/fs_sky_color_banding_fix.bin index 94f5b51f98d5807caa652f40cbf606963a3e9e4c..58d93b76cf44c4d3c1de51ee72ab15230b1eb3c2 100644 GIT binary patch literal 779 zcmZ8eNp9Of5TtdagS=smGq%jkzJSOnft`CEK#V0yAWU%tE?OMq3;9mIkl*+V?vWIm zbd$gU)!o(A)%QPtT>t&^@RC5xl21di^{wBOec5)it0aLR;`2~+L-W0A%SB&><~{Lm zmL%!WRIAW#(5_raG$zPDrp6?BnpREh5olNJs&WtX`3UNsj^9EZ0IU5m3_Y&H!pG_8 zE20Deavu1&ULA`2)~_$s=`K`DwDDDgN%|{A5UV=)9u<~D>sViQKsO(NeB9s+G_Z`K zJG2ZvZeU4YSI;GW6HMml9i5t#9gfe0O!yd!3d+M4V_X3F4Z?RkqlBO@QyIsIfL?-b zQP-DS3{_AKJ@XTMW}R*h%<%wt8}`^gcA)XUgFq5(#v8Dth#G(io_So25Ln@qrI}Qx zPh0Ak)6#IJjnmdB5O|@$tJW`ita#=ucgz^8w3JFPu7LHNj8?7d%Sl4J1S6mw!w`;{ zfRS&NlUwXBN;sw&)rK*uG_^uXYAn?P1X(GJnj=V4WrbnVIcBMG!f4K^p-~0wL*QIA hQ*lfz6^=8dtyNBFP|LNmLQAfUjpb((^7MC_Ca)eB+S~vD literal 863 zcmZuvSyF>Q5XJb1mM8F|KYKJm7($jx#h+Nwe-A*72}w}~CN&{svAlxU@mOBL9u|Q_ zpn&S-E!{JHeYyJndj2u!Y8lsCe=U@Vf+SFz)`elvL)XpL-)!TjPzAFjlyQ}~y)=we zs6!YpAq{3Or2gjpFp(>%M&?N(4TBv)jLdBuE~JWdLl^3VXQ?_V;mL3gkqBczW`39e zi4b!2M~cMU3Q&vbnQf!7eYM&OoBZRpUa19O=GQVT##;>9XF z2AKMVDMpDloMf9rv-XFhE@SMR*{w0VnmO37F(<s{jB1 diff --git a/examples/runtime/shaders/glsl/fs_sky_landscape.bin b/examples/runtime/shaders/glsl/fs_sky_landscape.bin index f883377c751da1c76c79698f12ffd59d1b1e266b..105e6f3722da761721db9cc538d1014dd73b7b15 100644 GIT binary patch literal 1247 zcmaKqU5=YD6oqNkzR;gF_|Z&LWc+VMed=h`hk0rjfINhxs01Pc2}w1J=uWzbF09uO zGN3`@L_+epKKJ@NzWed*-Jiemp9kx$_pyohO>vu5X;Nop@%okL!5>yH+&9~-utkzi zgZHxX7lA`hr$lrBq_^kMV5YUPi0f% zyiBYkhrS>ZAlPw-IeOTv+xV`so3CYFR^WOlvlZIftiXZ)+efgvCb5=qvTu}~Q#>>c zmZO@8Ybe4PcL1(;4BOKg-GFI}Nk|rGRn{2%79+bUF?S$RHMIDQ>Azk=wi$;2-{$RXh=!7 zxRRQw$XT+;nK?I@!+pk2D?ImXrijB95XC?$Y-i=uAfIOC^B~WgA3+8(*HAdLQXDp? zLtJ$Rx+b6xG+cRy9|-g$x#)gU6B8N96^*1aQY%OCf*Y?Zo77m)&}eERrL>To3r7c- z^r8!WlV6@1yi91~@`EN6M=XRlIaE#<9s@w%6+xy_MG+B_XvR5Fnn(r%Y0i{bKmddY zmkT!ruA~f8l2W3Ei~{s|2+5T)L*XfCEew+|EtN(y$*EApF literal 974 zcmZuvTW;Gh5L8?AM@@T%{UjTOk?6=tVDzI%5ac6&Ie@^*j7!uK1xoTO=plNO9wGMVZTCrbdj2AHU@LuyEciilG88wf7P^?ySD1<73(C|3~ zZ>A|Kbde=9EOhVi1H41ElcaM?En>0E?u=O6=%qGnv)v(*5P}T=Qiu(Zn8gvybpxa$ zi+Wr`pO%193g5l|gGE=joTuQKaYVx6?k|ptS&FB+32a9lZqL-q!!hAGRF&9nrPn~j zubSYdn$}2M3mNPs>Ti*<4UK>^PA$JZk8}NyW3D)S6wDf9LBXT?KCpv|w`t-ud%@7& zMe05gP8`2tWTzgukN(Msydfmz?D~pda}??;ZVxUR%FDT}M6vU(Yx1O!7KNP`9 wGO??)zqlhu;?!}w;^}3Q#Oc(^i{tcaa+#zE@~|_X(mC)nb!TVc-!Keb0mDid`v3p{ diff --git a/examples/runtime/shaders/glsl/fs_slug.bin b/examples/runtime/shaders/glsl/fs_slug.bin index ca983f90b39fd0c4e3eca1266f4d222bff0fa09d..ec849a54786fcf5b09e9b62bcfd9e59329590fec 100644 GIT binary patch literal 7178 zcmb_h%W~Vu6;&RK6z3DNK{iw1$l{AQk6`(vdAvUnnlZ$%?d?26eW>X%}-^Q zZN4n$+}n-r21#4V49cd6?)!fA0r=*xfBxz}fBDz1FL3?p;x`YokMr&P?*5m*xVXSS zT%-Hh+xhz45A)reE4ujA{p{vp`?yF~|NUE#KdhIxo9$h8Kfn99T5RnPSrBl2a<`Wh zwjUQaRpxEE9*u5S^If)FXR`h{d%rq-{BS+e1)Dw2c8mSZX0v@)Tn|ZU`*QvMdbFA! zHV?aewYiz^mYa3@UtfLHk*MjQQ1}`xmh7?xq25%%f3OBT`cKt zb{XBnwO1}81-^-`v9oQ}is9By_D&~b(AK42KJ*?{Txay)$YS+ovAg+@hXV3yW)yh| z(yE>upb?^=xJZ;XjPP>3%PDZO2YE56V+v!$WhbkrJe;DeE1F7+FSC3moZo++8Jo(h z#ZTG&I;)D#CG~c-LHW*1-B#*nSm@JRw{*IgxZDbHyx>_H>(Uk$ywJ@y%i)D6qVL7E z`}!J|H|~yFW~Q+f^8|z3t<~G&@^UP-^(>#R%9xXux%zxg4CFB>_)}1vsjDa{lqJ@+ z?G&Ok+-*5XOrYvaOqC`j*wqzBcJ<>V6iYj0jdVuL$*!d3q~NJWf_@E#1ivhpP(1uQ zRtISi%c+!>p`WK^)vYwq9Hnb;u-np8LFd z3BCO~wOMoDWH}05BLdq~Q^?0zBnPRn)gVWHTWbAyJ9GsJ7pwb4V$iX9UX_a{=b*Kf zbR}GFPuoW2j^XOF45>LG6nfyWZrsUAYkBn~ddNya?6qi9Q?v~_390~u91VjQCT((mcMftTf56 zJC)^K>rF|wQ&m3FjV)8MurX*5Mq1}AfXK2hnBQh#p)+o8t}~&1=S~5#y{10n1r@>s2WcgY+G~}dY2G;Pk3_-u_2Xbr$7K| z7+^U)$!#kql8O$bDWLPD9mCh7Y_cAsY};vJaQ7t2?%XW#m0fq8W&;WCs3At#9lNJr z@GOmg?g|TT4&m9hN7-VC;%a;a%4R?Wbc-5h2Yo=T+MQFUb8F(9T|S_P^98{9TU!{adV z{j_-2W~}1Nh#RuCXo{+fagk4NF%=j<&>f+s6m(ODXoUzq@WRE$Ok|$n>lEGcQ-L?6 zXra)`=sednmGaaugx8rSthO zE1k||`qV``0|_h018^{$lcboxtjoH{7n0V!+~BgmxUDZCAT{LauMe2ImUhlaVwamJ%X&PmC2utn3(8sR7>7rWm9k zYz#PLG(w3Ch!?_eFRXCKA^eS}97Dzn$7aE4?4V@Vor01ELSBp{<@ud)jF2P+ASypI zR#(fZ%0UiwNk8eB&LdcoCg5~!HFiMeBiPu1_%M}UfYrSeyr4svQAEhYU^u%x$oSSg zz_XKifRGpG!8#a(DD)3ahF1Lid2k00tWE>%9qTPgx6?cbfRhj%1)N*{Rce%^z@Ln( z=VVj`u}5VR#3m)8V)gSu(Lhyls7NaRxZK_UZS!{mIRBFgo@CWAPc6{uEVcjnBK;MF zJ-FQG7)VtvtQ<-eBmt9CZjRR*W5EaY0}iQ^B&PWyNqbD8YUF2;2khdv2igFXUX-0R zbR;6SPTI2v92 E7s;gywEzGB literal 15931 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 W-I&X8+H-{g$M|Pi1k~r&H~$0R=wws? diff --git a/examples/runtime/shaders/glsl/fs_sms_mesh.bin b/examples/runtime/shaders/glsl/fs_sms_mesh.bin index 6a982f5561e0d680968428bd45d8ff54179f87af..4d6a5eddd9aeace263758556b001f2b45bcca889 100644 GIT binary patch literal 5146 zcmbVQ+iu%N5LNS3D3ASt?Hife%I@;ATnK$?5#*&nf#jW_ZQ52Vi-sg$1OI71re|hJ zQJc`xnoNT1P5j-JKLW9EJ0ySzpYj%j&7Q+eXXgyxK0BmH1uASm2H$a&~q3SbkbpSAR6i zW(_;{&Ei7bREt#`k~v}MFJe}pORNRg(+rHFndO)(Rs zTRlmV%3RSAkd_bRYCg$r~}!2N7MfY5I);7-+y)qu1;K~TW| zQOWnq$W z#50bsgJD9oBP3R=R7^axK5@tc#H}Qkl>m(+Zhk03etg5(h?PL*n!HfvM*7Sl4>3G#=|<6+z0UnD5stdc$qAi4cgTa>xuBH< z8^>MKAs^!&7BEWYoSsH!K6l82+zsa^!Nzgt{65H?8t{?MsifruHHqIkNgiSiSHolQ zxP5Diw$0b16mC&>ZR^MF-MWtU25BC#66*hG;nbubpD<{mF~|Li#>k^kbV&!zbO*(X zN6@2KG%ANJWQWBn2urW6AIXEPQ`cSqdn4ZHTX3;iF|3oKDtR$60rkibv&=;6*%K zFP3$5S>ZcGTP6KZR5Vl3D?EJ_s?Ik2kK4JNDd{eiqD`t?DVr3j$uk(Eo{sNE)b{D~ x3P|946BS6@=fx8<-@f^6Fu-5@yxq>X z*Ncn%@$bbQnF{N#KL&$`#pZc+d!-(h-;8>g-{zZ}#rplQVYVtY@M2rF$RrKXf2!qryNq2Z!FsvfiqV4%L7*Z=HLG$G z)4h}qDKQuFV(FTzGo!1!NzTIhU{{mklXT`xs$E$6>I=ywtyWlbTdh|blJ3H$lkv+V zLQ~>mFVRh~%y5Acqz?IjP2nw0~G zUL?|~ERp7YLhDY6;1ZS5vCU1FZG=gr2@Kk*NEd9tyOHL#uWclerUn%?H&~@A(q(N| z5>W*rV)d2U2A9ZjiO_obs3PrJB;q|oqi8!GKyYbFgaUfS14x%Wg=-YkM&0SOm&%CO zz9wei4!<&Zbh6K388Xeo}j06dW zK(nomj06dW7r%)i!BD%3G=f#CBf}xVa7Zu_B*3BB>fq3eMuvc)-jTbfk>Op#bQ1$y zB8`rgNCF0P2pEh642BoKiGjh0zyPZ#5eEjtfx$$;00$;fPrzVWfWh#lVY-0S;stw%7p%k!mY2SbdBKXj0IMhw=LO4o!A86Q2PRQZykJ{+!SSBqx_JRE`w|_i zkdtV^9ijy%(SqZZ?_yeTA}zowDdadUI8F;Lq6IiK6@o)Aea^Meg5xd2b<+Y|_7ytz zN#rD0aED;QNwDB};ky_XoCpiBiVAU9a2ys~1PgFr3iSjFt_2nx?-;Hd7U0rQ2;#ir zzeP@h1$PJ*oCFJ=7ru{S!HKW{t0a- zh3pV3WD+Z6yzsM_6*7?(V3icgI4fkF6|#sG;LubE4!yLwticN9i>UC7-n}S)r&3>@ z2K}VhQOyI3EVPw!SZ2rc4zE1Xs*Uur5YJrE{y|V}$o^;h3wq zme2ts4oFYJN#pn#M|HbHCKt{mabQ_Su`c|fSn;pL;qBFW{%Nzg`jD^lP5pX}rv7s{ G9Q+R*W!PwJ=qAvpmwC{ovD~UJ73T!8FQsjT%ccc=T zjp}GnfJkl79z%ZL-SJ4?-KQ^~-~W8|&*urgca!OLUM1rTCf{5X zi~9Dj;);g+X!Oej(^t#0dVR@m%F~RsYv)hD*c6vnRk=?7WP2d<>2$fGH7UEvZ*D;6x~kXU zxv7^6c3CV}Q9S)NW%wLzo+TDbJ=gNSj9T4iySw{%?xvnqb+Ki+OcKmp)Z6GL_bZOr zF(EY5fS6!brZMZX*hM5qwCadOn{9a&@fkmIFfseUuIk%}X1PHEeL}@Aqh!YM4=s*k z_K^__$XY$Uzv4JPVq(TI=L6%jR7=Q?7N~Kky+~5)%~{mWD({BI6;NDp4#fjE!w2j) z4;YT$HrTZKq^>Jkondvcx{J=&Ww9;SUoVPPM4*jEPR-}bMBblpL`F%4r2Z67>4@`W8v$5%vPk1S@Vz?atE`ajXAK({oHI_u;j{! zkP~tTr=kBR@!_6p8j zWNDFw%#b^n6H@af=6=2wJav(!6B#l?-e+!}PVJuAsQKJuNH@^zo*mN_#WU+ZV@#5X z#0s7%ktI?a+=)l-$=#N_?e)5h_R6V!6p&Lm`p-CF!Xl7OEfBz)bQ&8Z``O% zGQ+P23ycv39=)l9BhP`1%BXbs4MA`I+wW9R$eEU{)Z$2YkJp?qE*w#ZN@8>hV z9@4JHe<73VmpcmXvhEy^Au;3*VtKe60%z~qKnU*BRvFeq8gd7-I$RHV=AO<*iib=z z*D5TCNbX=ZhYKRd+?QDTtks0|kcQkrY!BB%JvUfrA6Yi6hcx7U&b(jQKGM z!$u8%3?0a*t|SzMLtl70J#T*{wdpdQso_Qu$e4Bt$MqGA0?4S0lCSV03V@8tDE$f- z1um>H7)2dzt`gZk_NYIRUkl=|$&$;SO)AVtF+*_r!9 zX1Ne(5!lpZTA{v2o9QD%C!Xd}aZjyy>gdmQ7$VS-b9g1DQ$pM;UI>Q^<58 Sl(x#CA>VZ9=hKJjbn+j52o7-o literal 8266 zcmcJUO>g5i5Qg1772f^`9_c3WTKuqO1nFgq#a;>&XzzwLQ5+Yt71++_BLBTJBT^D2 z+F}CPyKoYU98!EV?~I1u{`vm-*Zcpz58(4@Fnm~KtL5GP?|k>^m%#x3!{_sEvAaud z@~6L&du%FNe`ABeW3qi&ZI^d*fWgA&;x{>2mn6 zS>3`|w4+$HgzCaBS>I>rR{Y6oYXM{V>V~b8)rRrW@aK@B0l~8CMRZyGA=!R?56f8y zY_PwxD|W$)#jajcUQIZDet8{@uCwn_U)&@%$e3S1Px3_z4dkGpyD=-tO+Bh|S zhLPq%-Jlx3zy;1Z%xdQ4-1cLCT(QY`G8*B<-x+mTC(n#S<9V?TGmtSZ#uMmchtd!n zWEVPO7xtnUojW^Fa2UY{W*EU333IY9EQTL=54fYSNSfK++c_<)wO6`o*`~XPY`>Ud zOMP2r*kH`e@ZOzA1Q@`~ZqpO3;zyomc3g}$R=12Nn-{*^rpZ3t{(G0egJ2Dx)0{lQ zje;+{Irb9**j1TD#EmI6ObKhjUe0v& z-I?Rna*=b|A9$*f_#~QZ83|2WZ~s7CzTKidS9ZT5nzS?YYbo+Z2qXJ+UE zB#;jFxroLvEq>#C=Jw`h1oTkMxcOIf^F>4s$eN90uC52{%-V|V^kA&?+KAk?TD3p} zjfv1_;elzk7LN>L_929k2MN?~G5!6FG^eGQF6@ z_$+BTi)ZkM;UMQC($l$l%Ftu&GYD2*!Re5khR3hiUfL|Pfe{Hob$_y(iu6#Kgi;|v zYEn_hsK{#76&3RFYSs8uH>iNxd8nwdhYBwVomoQU0IZO=E>QZTpo&R=mYJ=DrfbmX znjam>TD1w&ZgkT&x?pmonN4zS@vQmN)JKkFvsyGtV1wMuOKx@oa&hnE;xKZq!bbCM za`QI1P$d*bcpZHblVd(tlhxAagb`FD90J3!OHQC(x0DcCd-pjJ^-T^eRzi8$=Y$&$ z1juVg5Q8rDAO`OCjvywCI=kpF0dzB#%IQRr15)U%&>7XW=tyrHHofTN3DBW1e<-dU zl1rh&(77=~fXH^CLuIGEru?Ho7pj-SsI$Ax(_`qgM=ynuU5kzcw_($ZZh8WAsLcJM zn}wlsgN6W=?Lvpr-ar>j&Zx7y%S9S&+UQNP=5(=#oOJVDNrKz3=_NPspPWQx?v)%^ z4AD#J1`P=++d&Sxw8(`@-Es=Gu2U7F-V!6{#XL{V0M0G#p_NR*oqt9F4zp`y253!t_4*8=t7n#rNu5-bLR zb0dc8uA)GfCb-Zjr+hUOb*zS>d^Hs1=EJI8Ls8xu3bghQuJ;;>3agvj!Aduu4r+B-SjdkqCFhKQwhBZls-p+J`=xnOX<3W`2fLD9Yn zigvSM-L9Z$6!cbL=PwhBb+; zlUHgK^ftH?)K7Hp^%Jmo$m2}Gh@yIVzVU@caFj&p_ZyxC)lY&nMHM>?(rO4x=A^J{ z#GSfg_xTeXd;ZvQJeiYldKck&VDUAAmut$VifbGXZsFkhj81UJFK`4}9^Pp>>n##( jw4yZqLtE`%i^HpBw)nP9mS6KM-@-!5g literal 161 zcmZ<@_TXlKgFYauEI%_vAvZBIPeDVItC~wep)57oM4=?Npe(T{-q0E-0AuS_DA+0( o=oz4hRbmmV!Xj3V5KGUAcPmOvch1krF9M3fjJM{h<>F!h0EJX4BLDyZ diff --git a/examples/runtime/shaders/glsl/fs_sms_shadow_pd.bin b/examples/runtime/shaders/glsl/fs_sms_shadow_pd.bin index fc12abd40a3b4cd1f678a28986c8d4e794dacb24..503eafaa421479ad8aa75a5555c3cd134ee94837 100644 GIT binary patch literal 466 zcmb`CzfQw25XMtRv+)Es+WZNLQ@f5LCZvjup$`z5G-)lRag-(@DdH`70-lnQb2&bO>e6*yx7$^w%lx@0_IZ0Ta|IWlm`GQd!ZthT^K1^M z?t~Ci9gBTh+r4RxtrAk|(RM8@ZKj<74-haw<>-9b6hpdf^ybl)w!sm-HEY;uQ&C3V z2w+U>QYEmnXmr+6C(uv|6-Eo;2e%+az^4lrQwn`taSfEx9}xcl_weia>Kvz^@CODr z|LG%R$%ONl7@-{69Z*dEFpLKrI{^lc438j+c_^e(B95dIlFL{{a?Zsf?UEY&dlgae)eznAD_SDV|J74#YRCl+7Y1eEX z*6mjP$@;r5n-Yo3w#eqPsi$>2ov!YQgK zQ84Tz!tdTMkM-Ma^ZpOg1Q<`Yf+Vk5h&f1FMzsI11eTHNUb6^v zDB^BnH)81Q3x-L~OBDMvL{n>=sg<)tk6klmZQ0*SUdwgY?8(iM8@$UCoWR8?o4EB@ z3RWlKw1IM)=Eyl^g7bLhh%?fa(ESx5c3awZ5Q8tb&3vEU;A2GSz2dRwBHbl~sVXaj zuS^KWD6Oktw5g;qHmb&MV&1vL6;WZuZ|M2_5}z~Ob5O2|K{;6-zchNvAH`IjE*K4r zbRBMv`8BR8is8kpK93`zJ(W*PK0vD(puLK}<_ljNT)vWW4_|}iL-v$;g8dk4fSzcP z*nkXzctzzY=1j+VckjAiD3-Zam9EZ!- z8l|rmEhvF>bR0>KC#jM$UO$ok4^f7QD67v9A*t5X%fmF)cd|9i{Lbnj!l0HKsIQbbF5e-J5)extnD`JAQHF7k}5+m*Hvhte#s= z=|C4!ofQn&;PyZ&pXZK`%U0*ZjhwVw5jZ7Xd;2P=>g?@!D73N~f*0(pcrR^RlYi z8{sH&j9LKE9fXO_b1LrilO>Mj1KRc#!+ugqC+HxB4O(bbX&0oSah$S@NZ}a67NxQA z<0=tkaOi63d~jfN{+}V;vK$bc=10~&nFf`z!e>vYk}{M$U;ddU`3)!MbAmrjr;~pH D-V78{ literal 2799 zcma)8+iv4F5LF8l-MamTf{#+FXhrIh7)kbJ7mI!GV-N_ctz->Yks&F*Ez)n_Lvl!w zvAd{j$TEjBbIx!s`uz8o-@89Q+y=OQ3EsU_o4T*t;pabs0AF0c4%MPtcYW|vAiucY z4b^kkxAl5j!lq@j8NW^|zYW#!wO)3+VOsll76jY6Kdhdg*tS^+wynlyzv#MtncmD^ zo>z}BDYOncXok8ejSb7()UXyF4S(&x}sy=x5O1bUPN-{|uqAnd}e8 z2sVHr6p4tLxkbtr!IGXeAZ2j%$igs9Qg&;WMY4+`_6=YaAB#Vi{w;(2Edw3PQwkK6 zm#WbEcz~(_olDT{f{CI?QU#OYNQ>kk_vnWU26&|?NUHLI7?d8QGTBQlrM8DnUcw~% zi#@K9INF$wge6gGKjC9vFGkt{#XOypszh)+vlL5M1cNlq zudfR}zmBy0l5xO`*`@xGcWqSV(6+jE{t?}|=XH+I!7<5vMDygRLIJDnk~v9omF#i2 zZwDm1Jy!sM8e&1V?qs9I*lBDeQUf4|}4?!I>~o12J5RWCut{MjuL{I?5f>{b+S;LPTRKt;w9< zJa`FXUQ1R3;6M9W-;5QfqSMbN;^-rKG~SB`xpv`ob@U@we%!eyf(}MV$)v1e!xuu$ z)C&r=3A0JnuRB<1R-NPFC%@lZ_}uY~WU`*^I1+x`g{<_6dM2qK(P%UgV&!=hl+6TP z$Rb^=F}PW{>_+ra!zp)iwuq$N*g0LJj-C|DY=~7~)p)0oXN+aA6}Bt1={H>(?jb?7 zybrZ|Yd1D0Ak;MB&1G6dxRimI89SI?u%L#rQROjMltKw;8^(fHkvWDfiR7rl-pMk^ z_ti*bsxMHtH~Q$KNJk`?d_&dmW>4$tb6-Dwlq*xR KOIxqAS@0b>sRzOU diff --git a/examples/runtime/shaders/glsl/fs_sss_gbuffer.bin b/examples/runtime/shaders/glsl/fs_sss_gbuffer.bin index 7489f9d024ffe12d0f6693a42a789dcbf7e5027e..65b2d413d08e6daa8ba0eff42c43afb2044b28d2 100644 GIT binary patch literal 2086 zcmZ`)+iu%N5LNrqLj8#a`m%CtX1O;mt6p9Lqwjqz0)m#PfPf^X6z!4@^1}uC4>>bS z(qik-hCmL_oH=vZ;r$=K|FHYaLtost<%f4=SN^HrBiK_@@5QOC&vLW= zv=+D+S?El|83MY;wvvbWq@k`PI*roN|2uSyAZV7Q!O@>%v@aqs{_%Ne^G5Nct<|Fd2tABMnsU zVVBWu5H~_6sO25^My9xr;KQ*gJ3~-% zEy5U;0ektY?MMRD?3<1xf_k{+Xt-Hc)teM9+y+t!6iE3u8&kl*rcv4)j!m&HliHY% z)zs(x{k}(grul?7dOa79#zET%8@>)hjjg5{|A%d=ECMow3Jb_J(-nk*afZ9LxnS}T z8OdRkmU;~786kKH2r^khtN{cBV7p;yNxuHT+lQjNl&6{OJ&isO+gl;y;bt@C$w!@@Fmlr)D6iFm%CPC z5)Kfrk5Bwdi-&+zPU<@!FpM`xfSP3J5#lBuJ|dyB^lPLMzX>`EKM8q9$MTkg(D`}& z{aAs|9Je}Ns@G*uj98M0jML~G6$Y(rS}Au&taeGVdClo5{+s|Q*2-qIINn6<{5bEu zaV8wkL;>mpZZGugM%koqq5IE5+HGQ!ZcBaxs1C;sP@mFiR{=8nVz5pUS1up;q literal 2837 zcmaJ@%}(1u5Keol(w7*i7aM}{ZtMg^>8V1!^wcA&B9j;zDT%3Lzz*U~`viT8&dlzt z*ESRogq@%7o7wrszWVX)T-{htK3c})bo1udl zi}eb&*?I>-IDQ@j+-{1jg0gtH`?bsW`vv9(L(qhL&+Zr6omJa=WV@KsfqaHbxG$a{ z$Zqxla<3lB9O(qYXW|i$!>Dc!As%4|0v+iI$geQ$gCrhEf*^*^`j7|GIu7w@VsiBB za4^;Z2TDB%41(U#5weRzI01!!`XL8|+W#)AAV4entcnVH2_`*^&=lE2k;=H!QB(K( zka~Sc5p;F6s<8z!CW>3y51M&FGZWOj6{O`V=U&i!h-7+zSLXuGynwSIiVK(u!nqf4 zjsZbnr)U;6hZ>H=FNqFyL!EE!c;MU7eK;}-HRA?T#XdmN1xWhO9UCfD+_W9zZC1H^RlZnNavlGqA|yh!^{XjYFP7w5bv*TdJT-aR zK!)QrDw%whD3Xa$8LbP)Bf;#R_)N>Z)kmDWOW=SJI8gxGHFhhG&L^}BTrZ|k6QVgp zuQ-~~?ZlCm>vbwoz8Dp$(J@MCWgP*nkkcSwB(q1&o>ge4th`#?5#BX<9vfy|+kyGm z8}g;9SlsK|R&tp90G}_BavX;6%;22}R(C5W61WeBlC8N`d5FkWu*d;AShJ{xFI}uQ zGi?Iw0BINC1@g^4w|u%jC#{q5?Tov&33|BAo4A@5M4R$eT=p5@`fbv@5*$&D`xw*q zdSU-XBR`?cRSIG8rIjmB6FEDh*>cg`?oNZmk7DIBkJ}4%sKe7=GMbhQcCRRL;JNL~ z4ZcaVgE^l7Rn6nh(}vH&IGNMq@YsAxU)ea?-#D5!j>V7)G}eC#I-SwXS%z+jXn%?5 zg!?#%uQ6V^aLJ3?ott-CX3NUzNNgGt*%+*p`f2d75OL`&B}ArYyJ%Ds=k`H_RY?LV zAaQy8C8X2n3Dem55+o8lWpCe@>>HK56va`J^7jOVIs9n4cDGqvmD%0btjf%)b?I$S oTT1@!(WpX3ceN#a8>xN0kt{Q2?kz^j>SOZKcHS4`m+^S?50*?t`Tzg` diff --git a/examples/runtime/shaders/glsl/fs_sss_linear_depth.bin b/examples/runtime/shaders/glsl/fs_sss_linear_depth.bin index ba4e326ac6f59396a1de47daa0ef21b609f3d2e4..cb3d9e61c074d596142fdc3ee915bdc0a2076f02 100644 GIT binary patch delta 153 zcmbQpyqIZ%G0STP28M|N=Ji~ec?xBz$wmrg@g=Dh$@%$3DF)VDIf<3|r6n3U`N@eT znfZANwh9KC3P2H%QWJ%w^t6h2x1z*!=lq=fB5N+Lvi!^xh1|r= zj}~cs&_*?62KTt%Dcf}@7b;7nVJm2}JzDBG1SR4W9G9Lcz#-AXf>jxs_|(J8{SQ7k zUG8pN!O!!dh7n*PTNsH7r*#Y;Yr5mgb(_#z%Ql%kSQy6o|H>y&zXPXt;P?Wfga<}M NOPy%bA=F5{KQCmu_0s~J9cck>|R!gJK}^;WI~G~r41^fq^$Vi{R(F6BoY!N zm)P^>y*F=id3|+U|M)*F!gF)9SR~CB_N!XKzS?%Xjc=Dp>kr*a&)Tl`eba5>0t5%V zAzT6XkL#hj-1*19zW2BCZkZ(eu6clsZ?=pl{}R9_Fjl$I*c@q_w-uWt_%eXjZRdNa zq?U*xaP}4p*e&VaO!vb9PJrc^fSA6!N8}icqhK(-ZpT>N`ppv~+i5g5>dym^V=0P~W;u|va zx5x?|USoyJoheG0o6;FuqVqKD?knbeW)3Vdr3#JFPS!hL_ZSwQC>2~_2n8=hN~2rc oHkHL(9rvwR99ibtSgV~fRvT%YRi==-v^ge`(jS0%yeG-x1DZ6@@c;k- literal 1288 zcmah}J5R$f5bnSf{=`WvHiZ!9(TAW+2(dFFRGHFNk(_f^Ys#T^H~DB>3UPHba5H%Hu*EGbiM{5gZBVTe7kx< z{8U}yfqRDu7*f8U3nw56fs(O<#U3R_ig5I>s^Jub3Zn}lkOUy~)2kPj(1*@REhXXl z!01kBPZ5dFcl(46@&$-icn?<-h{8xpcxNR)-IVZ6jVUJV`NUyeu>-)O*yydRF*79J zCJrmO?%Fh}8LDF0hID{=@jADebRg#~#y~rsgWo*sKRpNkdlKY_r{9~Qv9tpmVuh1$ z9cV&z8?uSoP=WzLLx*$6O(pJuV{&^tJ@JV4l~?LO$@tlg=)fXI=z`tal)|potkA2M zX7`daF7%A1z$NW=x5sOSQh1k18^@8*Y`L+fy98Sn)7w%nZ}e6_M30Db8L={wS}*@^q3{l|tV>cw Y+~Ev6?7PRDlD#axm-4+(`49xXF9J|!HUIzs diff --git a/examples/runtime/shaders/glsl/fs_stencil_color_black.bin b/examples/runtime/shaders/glsl/fs_stencil_color_black.bin index fd7715392464b86201452d5933e41f01bb15004d..54189acc718f2957aada770bb700d2864b786304 100644 GIT binary patch literal 116 zcmZ<@_TXlKgG3;UD<`oszqCXnCqFr{Br`ux!B)XQQvoQVP?nl(qL7rHRuS)3l$h?E spOar?&BaxgpP8bNo0yrWp~+Rvr2qt|N`U%78Z`{`3^c8|YPq-=0LkDVO8@`> literal 80 zcmZ<@_TXlK16v@gEI%_vAvZBIPeDVItC~weAw4JFttc_wIX@@ANWoU2EH&9g!$8kK PM*)S*jxZ3! diff --git a/examples/runtime/shaders/glsl/fs_stencil_color_lighting.bin b/examples/runtime/shaders/glsl/fs_stencil_color_lighting.bin index 3dba56f1c5741779943e30992eca5439a82ceb81..b13c9bfee4d3f4c5771a91a2f30393ee842d1e8f 100644 GIT binary patch literal 1715 zcmbVMO>fgc5H+YkF&7Sq^B&i2VkNfoVTE!*s^Esg5mlCxIO$4`9mRIOs{UlIoO!dm z{z#n@+o)Raym>S8W_Is?eg80h`uo|yx;EYx!A?Z`t5=3`MJL9`B8bK6G5?un({Le* z?DZSNzz^$F5oDWaUc})x$R0%^k|@hw!xKNO_eHP}%Vm*8^;yX_UCn+ZNwl5TY=DRB znTV3ShF=%KCftVW2J5>bn5S{NtwDc~jaejOnQqr?9p)ZWHB73*T{Ne|^E!SH9$JWY zIW34TsdX;NtFkVU>*`vbs>0T>ta4(SB4NniWxF6jfnhvpoKUMKW*i>VBIj{B4|9gR zCBKZ*P&#{xkIuxB@p5$R6Z^{gh%WueTKm!$!g>e+1naUak2Vd@j$-GOnx)expXZ7z zinFNtxJWGXv(8c1iSQDXf&6y*Lc*rN%y=Wp-f~dFmMNrx+!_PGBthmplkaILt`xXXzA)p zT1iJ%?hKFtHf88IN>=$Jml6^4McwxZ+C@q#0th`Vlo}DGx-+7iHIKvfh7)@@%SbZ) zAZQV)kvOPa<^3lcBIq0B4dmZ&-1GbX&>K1Z;m9A3M+2#F#Vi{`fgc5H(eyC0sZl&U0KhjTNU!AqwdQRKX2}BdS(z;-o7%cJN0&)xX0}c5a`^M!!ROL>Rq(Y4H|H-L=UgJrWx-cL8Z5Ijgz$sU z>w*W%M-j$(4V#JiyvV{5yD0cHiITKL-W5Dsh0`JmQl34DSj1sgA%0u%NGzW6?@2ZZ zW}?W>UOEnb@G(=9#pAa)4%10F_4~qc)EPSRx%jao;rtZdXOVll^g zSO$3?RJkRH1QJvwH(*_M1J|WDa4NrnHYI2*smt(l@NjyCRfATn6EVZ8L=4Pr9a^B& zAga%@54<-rpj6_ENcoLLlw`aw0W*fN9*TX)jH)h$n0Q>$VQRfvB$-{cM)o3KuCNJw zAcM>pW0Q*jsOl(Os`w!*(aIeTh{SKvbtev}goiBF;ew?#qag z8hwI+8nxRl958o)d6Wb>Op|yfa*@RRgG>RcK)EA;m;=Kim5;nV+=1_PUBh)8#&8lk zY754Q*KWyVYOcZV#-&tyR|yU93}KXoI?-ctN}MtEMPx9pu;^|fi7JRrfY#`vg3Oz@ z!4fgmBUE-!5+0dWZuKDBYk935hBbyEMoY1zb(mB^x-g2Ud+~pSte7jiFI#G;c%7NKH~*{pr_89?c;3mRG}hBg(M>q-A^u#672OBXNGs@wtU0Mf~+wEzuWd#_w@J8Iz~;`eE= zpnI8oK89%&ELYe%DuMJ39y8m80riZ2P?SEn0)2sZEH<}4pucPEQgev6PFv|xk~Wh2 dKVsB|oF(rzd7^4n$;(3j2jJn)?sKc<`~@h}Z(jfa diff --git a/examples/runtime/shaders/glsl/fs_stencil_color_texture.bin b/examples/runtime/shaders/glsl/fs_stencil_color_texture.bin index 0d5c16e94e6494159ae984968aa5850519d9b11f..3a9f8f9314fc893319ab3820073ebf6e69f559c6 100644 GIT binary patch literal 557 zcmY+A%Wi`(5JhP=mE3=*W(jJ9Y-0?Fw3}8@_xS+i@Q9EIj(8*_Rld4E&@trI0mNp+>0*^_1Ai$&U`%ZE=R8f6lH@gRL&7P{F&tG2r;Z}=D7 zt?}*eK2HT)s4*dB4XAL~8)~X`lhK$|>Ztq9u5_xpQrGYf)B#kCRls^v49T)ln{f$b z>~)#JR+Y8wkRJkAqb~_1b|SXxo7}$dGJhQA#McH75+($8?DWA_>(<78cQ~FL^yjH( zbC=VxL?A;iV1CG{$GGoY5Jja`hYZg!49XoQc3FTu$_t<_n;4Xdh%zP_i@XqlzC_Tt z$rQkZ$jUZVO*TQ!*EI#QsTpB1j@0R@+x>zK=>LUXTW>KD_n4Eq!XFR%`CJZF!PxZ>kk%3ltcgk literal 614 zcmZXS&u)V-48}7qm9lr3d;|?eCD2p5T{cy_?*UK>6d{!cg@5g;zWZz-1*ri=#?JTi z=ZO99&#Qj>+%a4ZTeWebPue&yjNyxm*Kw0wz9>nVG3h&ub;?|ea}HgWNa*NLqP0oa zTi%|Fqc$Z~BA9@4wpL|z%8dMmnY`tlE>b8}aR%4pHx8q?DJyIf2U|?o7(M`dHLb}I z;m!6^$Uu!Nh4jI0o@GUr6)spI>B!RPblD~p z{agq{PpaYwu5BsB1$M9&f#<;uYXE6cC(5LB@J`!sfw9RCDvs!T3Xy6VA-vlgezLhC w$>eJ@*?f#Wp_WsxMYI_nA5A@n<2^ihG@FGCqvfY~Z&W_~Df8TD;?6ny2LThbBLDyZ diff --git a/examples/runtime/shaders/glsl/fs_stencil_texture.bin b/examples/runtime/shaders/glsl/fs_stencil_texture.bin index d66b26aed8511199b1e421d77b4e50c4d432ac01..854acb84a2796eb40167ebaea6d46a9207498181 100644 GIT binary patch delta 145 zcmZ3%c!hC-GRqnU28M|a^7ULfiIw@KB^o*T$%!SI`FRSq3I>`AKoNzq)MOKdr1Z3k zc({32_v%sh~|kwRH~NoqxMetuDkfi)LbS$<}ULT+Mao`xn@HJ1Vqpy~q} X3RGTFT9m3$4AKZTOb2Ah#F_j6h6XT+ delta 69 zcmcb@xPozlvTOqb14CJ2QDtUcxT)NEMr0ka&piDi%NI8g{2Pz4f5s4P)6a*|1E$+06p@dsf^> z^SCN5UK$4c!g^QnVl8G>66L&jjMF$3MR5U{@C)m@;`4a1s0z{AYP9?1^h=tG{Juql z@MtxSMOwDuuPeTe@@UmTeO2*UmSlMwWEQ*>yN_tZ%BuLEE5k4sNfwoa2QC|%W|hW^ zEMJjTRQg1*95=>|n4$5Q>CfQdB;u6tNr)zWVwd0z@pIss|4F9OpfwlKYMqFjeIhOO z)~mTlm4J7g60mq=!&9IiCF70-M_qq2hyWdDS(eY8v6)2stSV`e&7v~SQZgZqMZkh! zKAA2TJARi(ODQ{4*<|q?q>WQ*nZHZ|OBUtK4Ioujjt_#?U0CC85OW}?-;Kh~j$#7G zQz;yF5RLHEv7MtJ7Wyg(CQWFZ;_w}Yy^q!IJqhFv5jaHmr1|#NlHI7rvHAMsIDx`L zTf88&K9BZ+d>}4VmwD)IbMXtxB5#NweNvQS-O21Jbc(H6x_!)fYOq97i00!guQ`CUAb$L9uJ)j#1S>ywHcnpdD10+{kgl*Rzw4m=E@Df9Oe;7H)ybMrO5=)Q|&! zY^TSeMu(Ty(q}08JS!<43J~542c0OK2Kb?{M{Wtl)x00F`VAbf9Znol0n4&5?A!~a zqp6g=jR&slY)cyu>_oN#4$5FqH#Kfw_6B7bb1bU|x}M&8&=?lvXzAK}-AIRC$^z&B zHg)Mlq|5S=N{JBptnOPV+J}}@1po}RQ0j>2n>9kcVDD1|kER8M>swa2pzW*B>t1R( zMS#Y9V9Xr3{BSVzLN^#P$8%YLgz?3c!D`Za$}ZNMCGhq%1wnuPW@*uzBe+BMoQ?dt zo@4ug{22_LkvkgrA#(@eXfO<+B#g4=fY-v4y6VHc|1TuX4j%@+#apW7JASq79iBJO h_3fSF`OLkq-TSldL+w7Cb#K9~|5e%W#y***@eg z--R<)<|i*52fz5yukIEPpOYlY?(C~pPK#*!kw@YQ${c^6InFxFb}U)II-2%jO_MZR zhVi&nF$ZWy-)Wj=vtI2Dci=>fTV=xL=n2cP7=UEQ8WEZsB|{CfVyR(QOf~F+t%kM9 zSYu0_wI9R#<2wv_wHey7_wXJT%M~_{4!M(FqYp89^tQV_T$qM< z+lKFD#rM+NqIb{3&KtZ-Z+FDDx3($+XjN$lSdUtA&T=zC3*-h5+_9d5nwQ>pr~#kh%89VhvMjiH0dXAgC%0B2Ugxe4tOAG z9_pUA*WemCjA{rY^yXx7>7W#JG*?KYtEO7WLP=Wf@au{AJ;bq6RGUW1QMONe`n3dn z-uhWufKoCYbaWPe&jt>RQ4Eq1pdScT{sTJ@@)YQ%wIslPn@WA%-U~B%E~-J}_1q4a zc~#jQNSf51+sLNU3n63~Zh_#$*phr#44gXBILj_ne3aA)(Fyo~szU_VsPF=`9$}Sk z;7AOt8q+>@cX%5OBhzS}l_DegQq*P7KqDyyVe%ls5EI0*Y&!YRtk5)o?5-+kWT+UK zRCumO^}E3`y4WsNJWs1~2FL*vlT&K}3cB`OIpB7ph1DtZ#VM@W?xPm*f-A}_!t!woAU7byuARrH=W7>b_`imSQA!?G>&x3CAC>h%5}8k;Ic Uf*;C_%6R4K{~%uXbF1b21%wH}z5oCK diff --git a/examples/runtime/shaders/glsl/fs_terrain.bin b/examples/runtime/shaders/glsl/fs_terrain.bin index bfeee603cae57fcc085bf75715956a35af2af34c..1c511f63f6f1b71e2d8f756f368912a404aebf63 100644 GIT binary patch literal 234 zcmY+7!3u&v5QaTZkI-d~8nW!FYl(CUqsL$6XnU%}Ks&p;DoM0!rVTTx=VbAC>K5l|h>7Hh6rE-nTD&woTU diff --git a/examples/runtime/shaders/glsl/fs_terrain_render.bin b/examples/runtime/shaders/glsl/fs_terrain_render.bin index 78ce8a53c3b9bb9604e863ee50580458dbaf846e..38473fa35dee5249399b70b3ffac2681bf4cbde1 100644 GIT binary patch literal 399 zcmY+9K}*Ci5QXcWB;sF?IVMs=+O)1v^`b0ZrAJvx?6ylFZA!K+-4*}46Dw*TVZuya zUcPMdmkWFKcpsov!TC^h%BkkCTKU%Nawzgfb-8LfQ@P+Q@C)^d8yQ+%Ti3v0K8>GY z;m&>yV^t=2Hiy5(+l&z10#0KXi@uslYu!#{#HgbkdTMN`dTm>H0Kot!-kQMszMhJW zQ~M`ttiz1a>K!ynx0I0&0;t+p)kBdAyjmK>qAda{qfZsZ3`uV&KGzSfq6^gUKL_K} z5w8Du#g} literal 7056 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 OSmlM3KfU5#oU?E3z+xf* literal 6995 zcmcIpZExE~63%DcPdK31qCl{!6;%>dpg7sNOX5rKkQOcCpg5di5EQvmc;y@TBGbUygYx#KmYjavu9uJR9=K>B9_iR(m*?!K`|7k$OW;TX7HE4%(2=q<0R*j9vEhMhS#uFAgzcV5~Z8n7}MXOJ5 zSU0?~%)@n6DiJ1jbLZuEVY2ORQ4+5{dO>=-xRh?;#aX2CiE#Zi&4V$=os#VqS>%<{ zs2gA$TP0mY3hn@NAMps|c+{8-k%ic~Fn}$atwx(D^-7WZnba%S8;egOSE#E*%%`(& zTyG^FMl48Nyx3!+9SP2H%jz&72#z>pbq-jU4ePSUx;$Wo)#j7OhF zCfa50B}JANN)nDFF_Lh>>^fsHUX30`T@7d$Pt-7kYfzm-yOBC=Hx}A%EEdPiMHH>M zt*I8YG4)YUShxq(_*`44({Vj&U)>F;v5;zm-2PsbK&7a|K0Hrwv`gXU>1_v&m?crK zXE)bGyFps$alZe!Fpr$Bjs}FFij$rapSK6~pnH(WO@qXx)!Mp5Oioz~hkw7d#uw*N z;}5ichWUTG@lCwi$m1-w=^ZlN#B49}y3;@oq5o&3VwIFfvN%{boP-8Y7Y-Hm5!3+- zpN?9nNcp8)r)fl2P!ddpX_sYQDf_VTqC$20C$oyb3zxXW--OEyw)+pDqP!QHo%Fed6+8_LJ$X_(6+mYScmj+=lQaf9M-Y;S{pDHXF~5MY1z=2 zs!g&NR}&f?1FQ0p*bp?@6tVYII`X8-Hgdo~h^)#-LdTcf5tYjmDyt;iq(A= z>h?X#b~PFxd{DKDS_o}Uw@_`jG{tCl|R z)90W+jJWlN#rrgU%-D;I##kfsgYq`V9kjV3zXgOH_$%$?iO7Zy-K1 zfuc!ht@4ZlL@h+@t{n_G`e`AmPKaRnt4YyRf@tpRUXn z9|QIuiqE6lIxIh=|Dm2@(~K>$T;G0cB$HQ?wwqTUAG>&a*}#eQiVSsxKgS-e7IY91Bph6xv`{ZzAavBVZBZe!F#28pKRxQ(BFXCb^94iy8>n*~}9N1Q}<5NRVA zbGWop?nHV9rB{_5@(nRf<1VyEn_C)=A!pINHb8FidA{oupbjZO2#1^P2P9jez2iNK zt6@Jh6KrO!vwu*0Otg1Y2OPVM%kR$%UgP#*O0rH)5S7EMfNawO@?l~?)|ok&eo)U| zT!4Kwio81nToz@34~XbHbekvJi{)6XtIbB`qH9@F;@Gs?OiVsF#!v+)9+0C@3R$!EbMd>BJ z`j8Ts-n(yJm!dRy>-lAxceKA)OlN?L((OX}5nPh@{Af6JQ`YU5T2Z6NPvZ>V6iJD0 z=mhCc@5R}LU`O>~Ht($!`Ua1*6XC#q>Rno@X}FbZM@TMxI-Js<;xmRnMLz>Dl^&W2 zgzuYc?;gh`QpvXbD1CHndp8ApF@R(@R=RKMz;v9@Q-Z$J$rWuLokyAuNGlSsLk-h% zEWQy4n^oAs@rPs79Z5bPen(yZHV;en4r8RAD)TV@_a$7VX&60=l<+zXYIp%#^}^%R z^(vr38#rm)-02Wk?*37LG_~Q3)eMr)xLZKAy_c#i@JiL)AK_M7m+TK{HCv^%05zmE%7SErHFT(<$bV1P5y0W%(L~JGjUi!O^Bg% z(k2ycl3%KjYwY67566OSiM=q91cd{QZy=}>^Op15;TNg4J>x=VY^z1jr0OeZ% diff --git a/examples/runtime/shaders/glsl/fs_tree.bin b/examples/runtime/shaders/glsl/fs_tree.bin index 2b9bdd1b2ce14f19af21378895b2a41b9d3f7f61..a874de8a483e1ed9536d6ba685d10b561fd24aa2 100644 GIT binary patch literal 1188 zcmZ`&TW;Gh5LAo&RP7<`9vgkg3a2)u;`gF|Nt~wm*(qe9#b!Gok z)v7_3A%4-|gW+2E?#6N4Q&|KglZjZl?r~pjRkI@+vx=*igErrRS|fiED`QW`u(2kK zUqy{|fL^snDW9COgKAgfR>BrqD3oe8d;*cPhtl$Tj-Vwgx6TK3>}aiuysOlnd?(x^ zfS5MckJ~=GZ}La&35cFlwIRE_+EdT{>k?ST0wE=Yf^v6kN^1LC%Ye zgR4a)lU%PLjuJl>VIsK?mK(E+8ZI>5sE%qfXBHiqwH4DX~K06f8LaRf=o`WZM( z;4lL(6FANJ)f)hZ&}%?n4AaT2VVnh_{zM5+MH&UM6j7W;SRJ%tZUNN!16O8XFdlu}27G1v#Uy`+=rIe7qv0`@Qi76TY#CwYQCY2Tu|LPBzz z+8&H{+3!!{;pxZ6-}U;Jho2kIKPE$2oF0p;fB(+&@P{A2OZsBGmz8X(G8I3m;!|HX zO;yA4<{rKRdg+gCfl`>&vT#jun$T$CL?aqWpjAz#ODhL_^#-`MvH-@I%|%>JaOdPC z#xsXoauKpXEW>yKfe2$xMaG5%w*()-MId4hpVc2%D$5-qGgJkD1UexxBD_&3Mo#Tp zI7B>KXMX?FoEe*m6rl_Pxngbu99hQ zW@2Y1#+h99Gkt_xf#(x*2q*=-+$}{gxut*%#@fMHqv3g%T=2Cx8+i5>D#oO<3q^nt z=?G$-m|jMlFRpyip`R3)Q!<_}NW>a>0+#;lY?j!-VZ|MaZ~^8r?QK@!dof!_wc0W{ zR{OjRXXlYow{e_r@LUk{Oza3Uyn%>f^(F9sZzlq6b)(L^0a3?&UnLK1y1%El%chJX IUVY#D16K)VL;wH) diff --git a/examples/runtime/shaders/glsl/fs_update.bin b/examples/runtime/shaders/glsl/fs_update.bin index 05e3cbc7d14aa3405f413427ee2ff05f81ecfa9e..cd3f7ef83685234e361879425a5b275e28d4af48 100644 GIT binary patch delta 145 zcmZ3`AKoNzq)MOKdr1Z3k zc({32_v%sh~|u|ipVNoqxMetuDkfi)LbS$<}ULT+Mao`xn@HJ1Vqpy~q} Z3RGTFT9m3$4ASUanv|*oHe=#!J^+MhFmC_= delta 98 zcmcc2xRP;#l57(L14CJ2QDtUcxn$}#kTwDwQD$^e) diff --git a/examples/runtime/shaders/glsl/fs_update_3d.bin b/examples/runtime/shaders/glsl/fs_update_3d.bin index 0238c128c30024aed6dac6612993891d17e43f04..96d72d7738b048f6f5029a7a07ebd4a3784c4f9c 100644 GIT binary patch literal 316 zcmY*U!K%VA5R3{Q)_;&aCO#=eeW$7yAL88)D6vKfwB1LVmWufAZY)?G0tvG-vy=Vt zFrn#oEf_;Fu2XLdGaLxPhXGaUO}nFsP;0aOnXZuZZKBJOqYDRUfOi;^!3$&Ga9mIEVM19f;%AN zTf+WON%96?J0tr7^Vf1IKek8h4QCifzY2fCbRolgjrZ!5w{ge>-OZNmsC;ic>qEQv5<_3Fm_3*KA^wuV#l#7uaH;` zGqbZ|v)ew{`NxuA%?Pc8S7B`n>&P962kX8TUK=&L0l(Na(w%jgL!|M-`dUg?r`!+1!h>|n0*~n@V9YoHzeZqQh>eqZ`!5LhZW;Zdl>7lyk%IF8 diff --git a/examples/runtime/shaders/glsl/fs_update_cmp.bin b/examples/runtime/shaders/glsl/fs_update_cmp.bin index c76f8dddfb2963384f6fb23f6407805fff0c08a6..28659a132e638eec59f5bafaed2be10c97d8186d 100644 GIT binary patch literal 235 zcmY+7K@NgI3`KEU?_jzd)DVKYLfvSHdk;WH9LOXvHN!w4#?yH*J8saQHfev__p|F| zPK)C{V9f$(bEk$A)ns||#d>o?XLL!n!B#epTG`}`(`gD&%aJ-KYAU4DWblA-i0ojm ziY?x%a>z3)t1mePZM?t1-lr8r_8v2%Cw<38Y9m5;0$C$hi*6`I#vSxrv#1 z3L2VR)m#b+={XY@ikKR?C}YlBB%fW diff --git a/examples/runtime/shaders/glsl/fs_update_mip.bin b/examples/runtime/shaders/glsl/fs_update_mip.bin index eaadf83e554b5bfb17945d60152f4d87172f0e48..4f34d6b14a9d0208cdab6d618d05da1310277ecd 100644 GIT binary patch literal 307 zcmY+8O$x#=5QSrxBVIvfnQAG;pH{|gG6JB~04=RS_zl?iw6pxZcX{1~19>@UZU;53lMXWM2hBPEj*(MXmpc#gIwycP0QmxqE=`93 diff --git a/examples/runtime/shaders/glsl/fs_upsample.bin b/examples/runtime/shaders/glsl/fs_upsample.bin index 8c1dcbf9cda1313d25220cd9c026af2af81832f4..8d8a1af7b0d2e98754a8453481a4c2bc7ab0dd54 100644 GIT binary patch literal 904 zcmbVKUr&QD5U(!2bl<_;BTOVnkj0?BXqLV20}y0oX##YCLO|np_b3j^USwXHklfwx zAMIwhU5eY+XM(jL%PKtbhNV0H$*!*m!Gnceo=cXOT()EPrVJ%(x|M$GX+a3Ba-N7H zgPO%2Xk@`KDWmL|vci1_g&zmMkU=S+l;<6h3w5Uy3sLNyfTmF^Drux5jwBa3yntf@ zc6!Z^L(+tsB09W@R20Zj3%-Xe;<;hcFA7*mDk2G?=OOf7^Jq7LK41Ii^R}N)C2+|& z6}psF!3>qm(rv??N@Ad@1&-~QCam!L;69o-GX4f4#?pVN-D(swIVM@pZOr6QKEkzs vxw?uzA{`&I&lFWq-Tf*2B_uk&vEYABCM1`*=f{qnijf4x> zIeq)j?9S%zLw5i2B=P4?8f1PRR?>~sy!;s!{)SdzG^ZcoEncNb9wr&h>;3BYK$6NJ zt!c7`GF%u?Hn|pzrAuup7YSXlG=?mQH&K`xZy-wT4LrmGRPM;KD>;=*Mwbu=Gyz4G zKV@j@S&$X6uTQss2ITRE)A&ZS(0#)*u0X2#x3`JBO;U4zjc|B?Rm6h4%VQxgi~Bq( zh?`U@GMl904sCrACn))vq7mJ&VFX;HyhuZ?h$19;00k)r<1X4%Rgqa}+h(*;DO;3k zc{{tAx#!_md;w++;_Q$XC(9F_ma>_R48>xB|$ zyo1s)R6ACC8^Su-wo9S(4ytbk&P{f3Vbp(RJkdpTMeyimY}S!KOM~?*i&)y+FNMFm QF}X&g?P24dU$QLy07+WPQvd(} diff --git a/examples/runtime/shaders/glsl/fs_vectordisplay_blit.bin b/examples/runtime/shaders/glsl/fs_vectordisplay_blit.bin index 06f49282de00b43270f94dfb5122561560c0c93b..75a8a7c88d4e4e83b5e604733c87755589fbaed0 100644 GIT binary patch literal 322 zcmZ`zNeaS15S(~X+E4T`ksuPh1y4%w?gPS@je#T`CW}$=Z zGjGD{Wota&FM?qbT1QRVpF|-fF^GN`n>MPLWV|-#l8c#Qa>&aJR2qArbYColOx%FB zWquQqL(ONk|3nSt|Dfs~DYH)!7 diff --git a/examples/runtime/shaders/glsl/fs_vectordisplay_blur.bin b/examples/runtime/shaders/glsl/fs_vectordisplay_blur.bin index 79df46bb1d5ad05981438a1c9040e23ba98d5440..4ceeff17d4c68060365aa54d6f0d88d3b3730050 100644 GIT binary patch literal 1473 zcmb_c+e*Vg5RHN$>rd=s;w9{THw2#)@!byyv9=|Uc1xPpRPjmhKm7&2z}corFHy13 zArE2ZZ)6pdF7wi_Vp>bQC_j>|2v@t^27(|uCNypj8Z`OO@LYDtmyk|i!YZx`Wrrm6~1yFKxJ)i zxNu3Xf&fe*A(5mGEhLeK$Vf$u8)hhz0lvWg|AmD4K}d>5D5`b1)QV}NjFOBCt|ip> zl2Jd&=thRpXc?MQts@c{Nr@JWn!SaZGa6Riw%Xca)g4{g2=)=7gwR^@h$!%IkM4GK zTI#wZB^cL?a>|8Pa!+coxc%o&KO41!_5-3xcUq7<__Tntd-@=G;L`_;-P;7o|J^2c j;oM#J+ey4!uBYp6$lkGF@x_wSE_o}r@df+9N2vn0!vfr3Bix!(udFb~t+kT1R8Das+t z%XqT}hiGAf13tINvV3XG)cq!2WqAsAVY*GC+vU)I%08K^n#zFw)dd z6<}Q(EU=XT&Z^%gDAFzZ-@wERt0W5xwqoHGx@&=FFtT+6jJdvk(u4q0Kj9F;G+KD# z$4O{I-4+hp9qMIMy}VQ}YjvB1(!6jS0$1$w2vHi!uKQ$tx8y5W#xgf-35X)$mG zmoApJBn%uW1Gmj!DyUC8)Ef*OUB+N~$$;UQ+`{2d9KP1#;k9`9f@2>$HYGefDG$HR z1ENajB?pZT{RR2mqk?t_gk5(!VXal&X&u{9u{`!4_XA<`f*N+oAY&Ff#}c*|W^S#n;^&#QM&j+l<-*i0EmQK&V0+@whBk4_3;Znhu1(xs q+dHGqzP5M7U0-jCFPtL*uug*4JY3K5YYfM-%*Lz;Ax{2FRh2&$VNu8c diff --git a/examples/runtime/shaders/glsl/fs_vectordisplay_fb.bin b/examples/runtime/shaders/glsl/fs_vectordisplay_fb.bin index 487a2afe377434139882b3dc5a7b90c5a938a6df..d2288dcf21a37e669373c614c1a582249fd122d5 100644 GIT binary patch literal 319 zcmY*UOA5j;5RKwO#!JjH5s@n01y_o=_W&inapg(9f+ujI#_ABl@ZQXO zZ^FZV;@lp0f;A$v;&sw(RjxE~h!#5B`Dnu{9HEJ31EB7n8+zKcK0=2no=Ib%e$E@7}_eZJ2mNN_!9I z^xVVx^W)auzr7%+8M@o+&got5T-g*mEoL_e!2>lx_!)VaA%yo$xv_0cx;$NwiAeGv z$`g#s#`6T}w9EU{+BORlT$zL2J6hS)xY9P{m4u8yXT0L8*z|hcn&RD7wgrvOmKmu{ z*-(bRF@YK+H5Uq~7s}*u;*SS?az$7IAzNoX^<;L1Nj_qSOKekFEEM1`%9X*+LA*%sS6p&WT^yoQw_0eM54_pcMu%=+nfc2>KD4k7AREg9AGny$;5Y z4u9lm2)6RHJxBc~5CLlBdB~6E{Z>#I%^MqD@bw@AE3>|UD^)V0bRZo&?PGG zw^Fv5w|0*Eawpq*L_%1oUq!{*>13HfotAr`%=va;l2>(uc8R}U6tDrnfC65C&gOuJ zr8n={jPD~q+hjep{TkG1OeL7HgNZ#{vUinCl^r0Q(LBH?&-hBMSg+#C)l0LFRw=Mf!P%V z);*eKig-VaJ2ru?ty*ir6Xbm(Y@~2fH@l7a7iyUwy*d3_Od+1x#{3hRKF5c3y6YH6 h8T-vFR+FKnh$75Ca*Hb2v}y4sE7_jCQ2NJl$R9ss>0kf= diff --git a/examples/runtime/shaders/glsl/fs_vt_unlit.bin b/examples/runtime/shaders/glsl/fs_vt_unlit.bin index 6a2e6f39cc83818cb5322496e47901597039bc2b..24769031acc3ff347d3553522ab1c75c8b56af7b 100644 GIT binary patch literal 923 zcmah`O;3a{5XFxZ9!$JzdMt`ayO6j+y=XQby!iu~E?*%jbOQxJ<9~O6b@`CQ2?^=E zd2i;;Y~Ekb+K!Tf~PwX=JW;4S`8%&0%SmE0+We6T^GEO zrNTn`TqQC?kH|I6fq0#<`lUSr#G!L*Pu?Vf>bMabHO5y%?q z`vhIJ3A!>`3EQ&wKeHz;G}>=wdY-{iZ)b996FhWNL4TK8bpvBj*M(l_ruPG*8tns* l%>H@}>m8l&KgaZr3EaQe{XD2oO%Uq?ye<$LaQ3b1+7Fry75o4I literal 1056 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 o2DhQeEQ-1dCF>6Lh3_DpByl`B9AE#w;&h($ literal 426 zcmZutOA5j;6pSJW@e*%oT@)MLNOA8{5Zs7_YGaAmro^=V@G73ib9fS8{56VMJ!U2| z!%Qcm7Qr{TUT$?l3tmdG8*8<0)Cg%-5X^tU02oZSS{tku^_?Yit`@<1YxA?aMbJXmQ1M{B_?bklD?i@OwNYAp?A=&Wp YYZ{D0@q6J)%seY})_C-CRy$Kl?zTsTN&o-= diff --git a/examples/runtime/shaders/glsl/vs_assao.bin b/examples/runtime/shaders/glsl/vs_assao.bin index f733ee8a7fb368a0a16b6ed237b97361ec64a384..943ef652af7a4492f43af2f3fb99c089f19d71fb 100644 GIT binary patch literal 294 zcmZvW!3u&v5QbOqG#z?_n4?CBiZ`osM zGp36c+qJ>wH7_X5@>piqsG^f;FlP2^_S6k^DGyW?SO^v1BpL$bqN7?_IVD0#Dsh9Z zjk3fhO9B-9Oc&YDL(r*y=wriG)+R(%>V|)C?}PgqA0?q7nQ9AJS~lDPbscjaz3=P4 e6E|EA4%XMfX}jABJ;$}f0UwEI{O8#NfV}{(@mv}J literal 319 zcmZ9HI}d_D5QL9}>MTtB0cK0EAVTO+YfBOnTY_+sGr*Gbc&PEeyZA(|+RV2*Gq>Mu zCyXA>H!Fip>!`p~yJEWhNLd#5mf<2tbG_o(;do`kSxKn`HjOXRTmW*Ms7gDXLedxgX>V% nK0*ltmI_8Z0631(!U$HEp zh^ra&#A=XT1#8859`CWPM2<;ZX*BQzfd|?^lO;2VqbrY_=?14XXlQwyD^6xs zJB6kXg#=aEEToQ6og$Asgk?s72XnB6&Z(SgSziBQl)I72$A4Kt^h~Wke{lD=uLWv9<0wm zz(HkWH1j;)*j~K7-Vyx1e`dc9xv%0}r6OBMahR9teR4y{#MtDva|Xq62uZXq<+{=W zYO$F@5*Mn>lPscFMu^5T zCpv^t`H24KE`t?vluU7tEWq{XCj|oxLFaoU#X*F^<=;QR3j{uPv$W&sjOuVG9|be8 z%i?)=PW0VTA9(0fJu_`Hxs}fwCc9#CgD{!y<&H6p`^BF8EL=oE mUuMZxLl5quXOcbCnE!0j%+jS&xEtVtU-QJO8x+@)3ELU diff --git a/examples/runtime/shaders/glsl/vs_bokeh_forward.bin b/examples/runtime/shaders/glsl/vs_bokeh_forward.bin index 9dcee1eaac8a9d084d0c0704bca6d8fce96ee711..13b28eb6c4fe840efa073845f6d214a064babf2b 100644 GIT binary patch literal 754 zcmZva%}#?r6op4^VjLH~!d-%C8yHBsAnsi@G3lmh2mv%>fH4Tz*7z(wjnCrFty}N> zls{oHA@`m+eCLGC!~HeE=lkdP>w?_WVJ?z1+wk;lU5e+~86h*dCYNT@O|I&Y7mZYQ zv(IxvXkG9}QRa|Gl@BAsU~;>4cmEc~JD@a+4x+BCOvF*eMFDr<+Q18F(%6S6d=al) z&Vvb|a}s(eED$Qn0*Yqxt_RI{#Bfxl`&fuFai;v($&aC5PiZXu-hH?IP=CrWPa}AO z$aGZm?bnHMWpR#am@}hWDF5Ci|XrZ?BSDk9>>;?i8 z9tFA>eoQUPIBKn8K^VQq%M3YSp~|x)(;OT;Z3$`kdi|mCpd%HuEzQNX@(=yhIAmwi eHZnjozXk#+2V_tn=8#|t2}zAPg6axCC?$U{K;(`9 literal 1040 zcmZ`&Jx{|h5H+F_A`JWmj|qY(aguhZ*cmG!b*ZW-w4pL;;wm`l2jZtO@>|$gSve<8 zY=_XHs_yyTd-v`-e|)$?@cH`w`8-FLWlZyGPSgG9455(#&~+JSY@KdJbylz!gL1 zj!i2QT>aA!YKU)8=?IxxWlo>LCe9Kb;x2?gbt8yjbm1>Sh|x80(Hz^3^=9G5JkNIE zItC*cx4-ed7KD2^o&*TNh3yM4*S#k09^U&dq@vZJ392ojfHvEBCbI>^?ky1Cw2z6? zR|_=eU_dPp7JF*-nx%ZG^@p1F!doiYz!@4e(psZh+A{`?q_l0fCk2ee^&EUBB56jE z=K;#i)zMRGxAPkwqS}LO>aGp?jN3C;G1eT82f`Vf;nZ2E%k))jHIcsLiN-t`V4g^3 lZ77&Z{#79c!DT~Sw^)6NOzI&apLRP=Z(yQ4frWR=Lcc`_NR|Kq diff --git a/examples/runtime/shaders/glsl/vs_bokeh_screenquad.bin b/examples/runtime/shaders/glsl/vs_bokeh_screenquad.bin index f733ee8a7fb368a0a16b6ed237b97361ec64a384..943ef652af7a4492f43af2f3fb99c089f19d71fb 100644 GIT binary patch literal 294 zcmZvW!3u&v5QbOqG#z?_n4?CBiZ`osM zGp36c+qJ>wH7_X5@>piqsG^f;FlP2^_S6k^DGyW?SO^v1BpL$bqN7?_IVD0#Dsh9Z zjk3fhO9B-9Oc&YDL(r*y=wriG)+R(%>V|)C?}PgqA0?q7nQ9AJS~lDPbscjaz3=P4 e6E|EA4%XMfX}jABJ;$}f0UwEI{O8#NfV}{(@mv}J literal 319 zcmZ9HI}d_D5QL9}>MTtB0cK0EAVTO+YfBOnTY_+sGr*Gbc&PEeyZA(|+RV2*Gq>Mu zCyXA>H!Fip>!`p~yJEWhNLd#5mf<2tbG_o(;do`kSxKn`HjOXRTmW*Ms7gDXLedxgX>V% nKuBtschk<(i`a4FAel_mj=qgS!y5)TQg zG+0GzpkWKsv&t`}&C3IQOWkYPR`$f(P&sg|=F=)F(@i2oG4tBI z1lEfW%X^ii5`2bmdCpw&MkpR6GNjSfH6pTkdsBL$aMmQ%ql3QZhL#e5G6Ds}{${%~ zxQbArBaO_nXkwyP`gUzr-_Vc5;pb+IdbBrDpx#G&dZ}&gSuqPiwT_qXQpSD{!l0!K zTBKY#LXUdrp#Iu1>+b)E!|h)R^)g{FDa3NgD&wOkcc@Q^3r|u53sxIZw?)p+8% sDRbsW4iAF9KFTj*!8Rm_YZIV@(UmP~1M)>D(2Qq~5PBUPlXpU#A4+5?0ssI2 literal 1359 zcmah}+fIW(5XD$E!JpViFiKi3ZAs(1k4;Q`X&ORXY}OQLkkX6sSNtBo!!L1WcY%Ro z>;q}$a^}pLnSFVFy4B$4e}Da4YS+7<;L*N!p=mv|YPvK`v-GVt-t2-nT}7MP(!0{M zFwZl-*yRx`qNU5iAW5@0+)VU_!vV)Oedjq(la>o}@-SIPN#63<=!p)?G|g81iC%=+ zktb`c0+$P;1E2ggOP(st^D;Sn5xN32B<2^QZsN&Q62Y36>>=- z7t@StNg&O(`X+loHO>+}lIRJB{f1_qVu*lpPnvj@6okx>U=BMlhs~~Cf>BLkL@-9s zkgUy5k<+iUXram diff --git a/examples/runtime/shaders/glsl/vs_bump_instanced.bin b/examples/runtime/shaders/glsl/vs_bump_instanced.bin index ec367da682fd7ba5505f4510934fcd32f7a03c31..23392fabfc03746abe14007fd95b44319367b011 100644 GIT binary patch literal 1111 zcmZ`%%TB{E5Dci|VEzI5=%9d-I6R_=JI6{$TrJav$|#Ldnx-v?U*UWB4!(q4$9Xg| zIaKa?W@o&!&rgr%9(?J~_wT7kwxUt_ZeHoP*@@@P@Wwl9i$mc8>SSB0S6!{?TGk02 zXqoFGBczZAy{%cH7qV8mqz^RlsVZrcFA}Q6Qr0re9H^TqDsrK2r>NM4x|^c73l()J zPNjI)8-;#dz_0@*04!k^vT(uTF|3y5DlhAdz%cOboHjjmRC2*yl&iV}hezEozrGMd z`#Rq*w62!U@$$}G3~v}ANu$*gvQ;JX$tR)knV?0?Q^*d_%%&FD_@eF*cL(lghG{Yu z={*n)|I(z+hUo@0x()|0ry@lapj__{A8nIWA?7v=xEdCY+HMv+X_ZhBB@qxn&5jQU zF{sh2*2PHKCV}X&PX^pJUI*1jhXDpK*l1Z%0bjhp=$35|Fkpc PVj8vuw2pS?ixBS*kS0%c literal 1506 zcmZ`(OHRW;3=OET2$z^;f*{JTKUM5mA|bIsC`#K<4Qi7rOuvY$u;(V6gOlL-Wt<^p zQ6WFu&+o;ar^ov%2mZ!CU%%(heZsWg%Lj74Axpp%Ic`Rd9>{@$SHT2X(5bb#I=&SY{7u zJvo(Gc0-o>Hc=lD^#xJb(%4r-o~N$@y2U~0lUwcv9==gMKs^WDs{6Pw)m{uy;gA;s zsoKaktF2;$3P&9(Ms2%>$ns|DG3qhyo_b`aR!;=vsZSt8!=cDmz{EvcbcsTi-h)AK zIPT5o83)Jxfjet(2w)u2ecuFz!A^WpxUfb?gjX~Q<*}$Cu||NzxuDsQ1AvN~X{+OR wZKTPA5s$1?#a~Yk_UDF}AHF0ou-r!BAL!F-i=;%M+)eY;K+o3O`RTgOANpk8K>z>% diff --git a/examples/runtime/shaders/glsl/vs_bunnylod.bin b/examples/runtime/shaders/glsl/vs_bunnylod.bin index 13afb58e1cb9272cacf137ba422aba7b129caac9..69e8b981f99c4acc4f9a3b7824e626c43a51c4c7 100644 GIT binary patch literal 408 zcmZvX&1%9x6osb}D2xkV;VzRRl4ur%!M#hNAQX{dNK%B1W) znj+rSaLzaPoV$8i3>nSO@%L}QMwQGl&CE(?&9cCE?}0I|wb^6m^vWxFyt4WYiyU%Q z#&Gjl+;!K{MsRM_0jttCn5a^tg*ik4XbW|g%s|N&_4Y>dJNGd48)n*8oBHm5qNVZJhclP e*p(#6@2GXSaX>KnIDB3xSG*5(4KI=3oU;>zeS2d7 literal 539 zcmZvZu};G<6h#fHgk%PO;f)PL)WqE)cE(CbU8>45O{k0+pTaZYo(~UYMmWnuWvX$pvGR)@E11>68O`%6q3DD_=le zYy>E2(Ur<%{GYMI7wt9LjMvKTwcWN8bExG84Z7KxEJ$w9nLOi_)lU=&rSfwalpA+f z$(q7Y=QN`&Oe6lz;Sc7^9l>Rik#M}n4ctKzQ-PlLx_={8$*wfO*2qQJfxPLU3*4R( zqc-Yyxxh$!+35%`jmLQ533{y6Y~5kfsGS<3L=PoKP~wC-eiT&=UqGZ#m{LACXFnEI Bs~!LV diff --git a/examples/runtime/shaders/glsl/vs_callback.bin b/examples/runtime/shaders/glsl/vs_callback.bin index 0c7dd20d53954edbb47b6e6d651d7c87f183edd7..42640c4b27bc9f6d4ecb7d44737d132612531fdb 100644 GIT binary patch literal 397 zcmZvXL5jja5Jg)NgmU2(YMBfoiDn@*?p=u>xDjbWl9859N@5aqWOj2CujNr(Ol6Wx zK&(~s|Lb4BHtWSe@ci5#&#oBeDyA?p8y%fjDIIzpA$p}P`nA(4OZFg7^e3e;#(w7E z%V+u4-MTvoVEilPnPn*OGffH3(X~-0SVX}TeRZUhE_De^Rbrvel$!8g@vu+<8A=`b zCe3NmJWgvcC`gA~RVS7WH$WcV=b@U+xIp=|+SMa;$Br%ksJ&6Ex)FmfXW~a0P=R$x ZhOC;}I=c$6$Cv9@Lsg9!Ys-BDh+hd7ct-#L literal 475 zcmZvYv5LY#6h&u6SQra`;g!ZBm}nR5w-gp^M22Xhj3jw7PLg$HyZsD1f6Gs?@Fk8q zN>YV;x$oS$)9;TQMhS;FxIYY_Gz4_awIR*TFFJOV<_U~ z2tu*M1l1tmFUF9JE$*b2m<7BD)m~=nTcUU*EO`ipC{ZO*!1GM5P^FNDdIWFfn%$W< zCkD!hGBSgn!w(#8Fr99RBD{cv`@dVl7(ACMTiVb5msGnnz&a5V^9J&IZ(X4Oxad@; m>NyOU~it@8q7#SE?K++5^ftaf_FEcH_C|4mj zvBX3HO{p~(S59JOerbtDPJVJ?NoIbYf~|s~rb1?(LRo6Eu|i^eL4I*2NZgtWs0t)# zqEHr}oS&0lWMGX&uK`T22~aOg8CO|;W(v^$%sdTEu4*m?AV|-N4}h8sv=Pl!3R+-` bG!VAyC>ZJ)Xj+4{!mJ1CLs(JE#l-*s0|HjC literal 303 zcmZ9HF%E)25JeY5wH97sO0Xaj>4?2{Bqp>Q#FeZ8maGei#uIoA@8=a9Lz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_deferred_debug.bin b/examples/runtime/shaders/glsl/vs_deferred_debug.bin index 3eda012466700ebf324c78dffad28c37a74a775c..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_deferred_debug_line.bin b/examples/runtime/shaders/glsl/vs_deferred_debug_line.bin index fd7adfc7862d2301d2c8a614bf2c5a5ad3970df2..2c2cae9f0e5c26f2b00369ef3155adb39db49e85 100644 GIT binary patch literal 278 zcmWFw_TXj!f+gMWJsBDJOXG9%Q&MxnGE>U~it@8q7#SE?K++5^ftaf_FEcH_C|4mj zvBX3HO{p~(S59JOerbtDPJVJ?NoIbYf~|s~rb1?(LRo6Eu|i^eL4I*2NZgtWs0t)# zqEHr}oS&0lWMGX&uK`T22~aOg8CO|;W(v^$%sdTEu4*m?AV|-N4}h8sv=Pl!3R+-` bG!VAyC>ZJ)Xj+4{!mJ1CLs(JE#l-*s0|HjC literal 303 zcmZ9HF%E)25JeY5wH97sO0Xaj>4?2{Bqp>Q#FeZ8maGei#uIoA@8=a9LlMWzz?f^!-Rn#Z+!Y@&uR;rHtML< zPJyOEKb{OKgO=%aQ|QEfo(+olw*p(rOA{}^Jqpd7CM0-7q0u*I0uWUOJ+Gx~2s#Eo NuN&~r@_i6u{Q`i^II{o% literal 1608 zcmaJ>+e+j>5RI(55PzZ{6Ty(~WG-RweIEs3Uj_-$i9^dwA~BP>EdI)V&whvhv0(Kj z)76>QJcYWQQ>Uu>_x-Oc55DZ*-;W>OK9}Dxyje{qFfov z{|nD6+P2}3o3xnOlaMZd(%;tXlp>&10>xIB zsRjyyez%|+i{g;n2tAzSN2umVP=Q=Memi+cW{eWY4l-lA>yb;j392!1)R^=QxrUMA zevWgTqLNeSM{PJilmSdsh-?I&$O0!SXQ)EvAeDVbYV0IMtzC@2rj*U@k$Eh4u zpjT=d?GHQC7>%RDZZD>80>EGeKtdQA%P87PA>c?2BEAXA#3dY;*zSnIg(9EDl+79P z$?z#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_denoise_gbuffer.bin b/examples/runtime/shaders/glsl/vs_denoise_gbuffer.bin index 5f208891232766ed163b68407656a6aaf40a4221..8890394efca5b1130be15c3c9da81064b1ad1aa8 100644 GIT binary patch literal 965 zcmZuv-AcnS6plJjBjPLMvXwddGv}mu@8v+)%_t$PRU&OOx^`|8AHo;&6?_#>(zH!$ zLkZ0}-}%mWzGV6Ge1%~BeE&uxbW_q)L~*j@@y8+;@1qlhMly{qO1fb=OSh-j2*C&I zT!UNCWl4Fqlf`X}o*{(GjK7LJB`GVWq}L;8vb%UKvsIs!>xXU1EL^$&6S{4Hal#Iw zEUZMVS;0j{o``D`o)JaP=tgY0j0Xcirw00j(G2vmB)~u>Ykjiohdc-s@qR5t9yvpN zUd`tLpMlhrQ={H(8ktdVFzUmUJHaDxlV_HVKQV!&=A*MY3@m@GcGSuKa2ykN;@E*g zz9n>_T>x1sd>0J o4>LtT!L0#P>dW^)pM+?C8{MYE`YG3Hzzb!F-lRdD245JXKiIw{od5s; literal 1547 zcmZ{kU5?W*5XTKF0)h}%@MDUgiu2JVs(9ydC8T|+R#Di7l~I#a*(CdcI0T2_I$VLP zFm`Nbrev$Cs{Hf(XXZb)FTZ?#!{GDh*Wbg6y&ekLjF+;yTRmfJr2u<36m@&3j%xLy zYroIrr6KdmtD!iRU0L5gf6Ewr;q&_iV`blW^6Su7e5|e`UKUN;)#Y*L5fB47wYRdD zZF7b~Kz((8-L~B!*m+~wJ;>%}QX8EbS`PX6L_my)AX1owPm*Zo4UPN;4e+|`W9}UL zZ=JZdO!wky2H=g7n+)8G2+-Kd1Ei4+_t)MJk53)<^$A)npnA^jfBp%%x4D0KR8T9L z9ng{69d7Pmzu174Xbpm3)e0(fb1W{*K!EsX2Z6u0o5Qu*t?e-3;F430_Q4f|yUtW& z2nqsY3PS=D3L^ry8sZ{ilqWtbBE?cM%mG)JQAmr(DWpY+KvQgdf~rUsj8D|G&WzXB z#8|mS@mn+o)sUM&vR;~bibB(c)G1A^GvU%R6rU}`XC~gaQ=bb;7YoXfV6FuNatL!P z=-W2}6vIuh<{#B@)yK@oSFqiD+Tp1-aT{NnKc{-1`INDh(eT{lMoRW!pRpmp?-J KA=^*SWB&j>%;r!4 diff --git a/examples/runtime/shaders/glsl/vs_denoise_screenquad.bin b/examples/runtime/shaders/glsl/vs_denoise_screenquad.bin index f733ee8a7fb368a0a16b6ed237b97361ec64a384..943ef652af7a4492f43af2f3fb99c089f19d71fb 100644 GIT binary patch literal 294 zcmZvW!3u&v5QbOqG#z?_n4?CBiZ`osM zGp36c+qJ>wH7_X5@>piqsG^f;FlP2^_S6k^DGyW?SO^v1BpL$bqN7?_IVD0#Dsh9Z zjk3fhO9B-9Oc&YDL(r*y=wriG)+R(%>V|)C?}PgqA0?q7nQ9AJS~lDPbscjaz3=P4 e6E|EA4%XMfX}jABJ;$}f0UwEI{O8#NfV}{(@mv}J literal 319 zcmZ9HI}d_D5QL9}>MTtB0cK0EAVTO+YfBOnTY_+sGr*Gbc&PEeyZA(|+RV2*Gq>Mu zCyXA>H!Fip>!`p~yJEWhNLd#5mf<2tbG_o(;do`kSxKn`HjOXRTmW*Ms7gDXLedxgX>V% nKnUyf@Gz5;PrzM@=-c~U9U=F;GfdS*==m_=^HeVCbv_Enex!ccyu>1Ws YKE!x#wA`UJjUalvaMZR7{h*Zm0Vpup_W%F@ literal 1033 zcmZ`&%}#?r5MI+J#`WMU>=BF-SeEwCc=y=Eq?e{4*kZG$unhwJF}{{>;Inx1>eX4; zg{4Ifgv_@y-_H)Sr^jmq&-c&o*8p7=Ay3O0k9WfhgoYA8H$|9;RlJeaX(nD<I zY~^+un1OizB6Na_l)r!!l0-QpjnT7u$80}3_ZC1T_zGt6lvp-?$D|gYCtFY*f)GOV zH+eA3I{U*>f)EbVCqP_tnmRi;?>S)7s6i7{^*{-&H{n#}2Z(iYN#s@^ruHeDZ%p=k z*nBDRgsr+tMbC_WW^m8lMN8}3eMSSLHK?fFj?q9-Tb5oMm`EMhCigOu+KO5aV6Hcd zA7e}V?`Q}r4XUYG9;vw9Js<=MutzP|3GN8I?6bs1hU`&KVxw+iRY2{!dTo}~AoJ$O t#^iC& zGp36c+qJ>wH7_X5@>piqsG^f;FlP2^_S6k^DGyW?SO^v1BpL$bqN7?_IVD0#Dsh9Z zjk3fhO9B-9Oc&YDL(r*y=wriG)+R(%>V|)C?}PgqA0?q7nQ9AJS~lDPbscjaz3=P4 e6E|EA4%XMfX}jABJ;$}f0UwEI{O8#NfV}{(@mv}J literal 319 zcmZ9HI}d_D5QL9}>MTtB0cK0EAVTO+YfBOnTY_+sGr*Gbc&PEeyZA(|+RV2*Gq>Mu zCyXA>H!Fip>!`p~yJEWhNLd#5mf<2tbG_o(;do`kSxKn`HjOXRTmW*Ms7gDXLedxgX>V% nKz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_gdr_instanced_indirect_rendering.bin b/examples/runtime/shaders/glsl/vs_gdr_instanced_indirect_rendering.bin index 738bf737de64acc08c6f6ee9dc0cef81cfb1bf52..01a0d4c56c94f3469e047fb9e9dae87def10de21 100644 GIT binary patch literal 451 zcmZvYJ!->15QW#^YH|ZtQ?86K`s)^VE}YH~NV_byWG1Y&L0-vmf=}XWlW&8jt)L7S^$9G{2r#WbEr^ z$|CA5QZ)M0ov97O@ft@5PEDl@;0KWB*@@G35my)W*dDFkb=SNcn!+W@wmjMPBKxDS h>vxFJDhk5RC+&(k~MaX(!$S+p91z$dKQ1W12wbiB-^oZr4 z2(ER#&EL0I?j-&II*F?-4}Pq=#Eb6EqiKZ|@(7PPP-g4eU5%l0c_(J1d-SZIs53_~xGxtjOFz z9p%E|tY86ismTKdzX1~j$!E1R=|?U|H#Sc;_?RxcNXLgfC=f0R;JKE&X>Z6y=f8v- Qh)$ugJ_*OMpkI`dKP_;mzyJUM diff --git a/examples/runtime/shaders/glsl/vs_gdr_render_occlusion.bin b/examples/runtime/shaders/glsl/vs_gdr_render_occlusion.bin index 6a00929179cb5786bc57d406cf841f7e7ae7deef..43d43acdba5c6f3f3206896e27bc11da538c4e82 100644 GIT binary patch literal 377 zcmZvY%L;=q5Je+&HT{WMCL+bxPP*^XQs_1WwIxN9Vxy&${(GZD1j(!}%z>G6ub0!F zxCsahe3Z?*?Db<85VD&WXPaP9@}~O^J7IEMsRE!CA3Ye_>Pi@?6&^8RC>4%Pm80af zFd{BIRJx@SAC+yX)JNr8D)UkCLS-oUQ@`Z&uQeF8tgV<-l))F!&b{TO+gqPi7ek~| e1Jrp%PB2+Qx&-@oI9EW|QxPVIn6UzW0OSt|I&zl) literal 417 zcmZ8dK@Ng25G;wO^%Hvp4@3&L#=A!o6EDUzji9L!O0b}4{JX1yRC=1s>~>~$vtCYF z_dEu*Y;<;ARpvDD7@K^AmXI#6$@VcSS(=Ns+7tr5T!LDr%BuO8h{gmT6S080&<9iH zm@Av$U@o9BIwh7o`~V(+-wB(SjjAMljo9ODtqbeVgB>o0D2^P}gYv(~9fiU}3dPjGZhgY(VLTdk8=i#lr6YJgz@pzW2?sTO2Lsy)k-*+M0K^_DGo&f9xLjQf= diff --git a/examples/runtime/shaders/glsl/vs_hdr_blur.bin b/examples/runtime/shaders/glsl/vs_hdr_blur.bin index c6c5022f82beabc676d90073c49d50a9969ad910..791f73227f81f8e5bd4f4c4a197b261c2106920a 100644 GIT binary patch literal 944 zcma)(%}#?r6otpy)pX%2+$GdX_?ak%xOdq^)9r)+HDd@&0baW;qM+WkAs(gDuT-9CQU!h{R00oR>L3z8sRKTLQ}3dldlXgm z(1wC%Q5h(ehNd@Sw~lrj?Hy&~XC1%Qrgo?H=+qgVGHg&N5n^wVXgd9*fagW>ZNrUy z&Rzr7bq%JSx^2KROx-(JJLS;YD^Mq&))uatoVKJ literal 1395 zcma))&u)T15XPyo7d-S8_NX=z<&T({-g`7@(<`BhW*cA)T@>2%Nqg+IZ_rC;7lc_v zBH=*hoBd{g^YQZZIMCqv{`vduX@k@|(BSwSWI@=w(KLABxl6r>ZG!Lxq*cP+`cUpm zWqPY=KIaL2O?f~L!P+9ew`cE^Qx-3EMKVF+LAGWr*-V%E!B27;@5CXK94;s}QfA5- zte6)S>!M;W^)#kimPFzPHbLOE68T&x3OqP6x*?HIV=^4+pE@ZFc(ey34{k}w>DxGx z2Qo8&7S*!+1FCpUgzQ3ZRc;NmVPhm2SB@iLg|;P~&{oyUz+$Swrje=5My9B_7>p7! zax%eNF>*P(L^F*7q8ibJ#3 zP`H3KCZ;jPFcuWgt~;sR)YdL;O9p<%U1Hdc@XQ)n63YLu>~#==a|QAo_0QXoEfv}6 zM4n@0r!#7&6S**|Q?_bkNr;hMgy3F*yg>bnHe_2xb~}+57}@Pab~}*^qZ(QKfMuva I_@(RGKP}+IhX4Qo diff --git a/examples/runtime/shaders/glsl/vs_hdr_bright.bin b/examples/runtime/shaders/glsl/vs_hdr_bright.bin index 3eda012466700ebf324c78dffad28c37a74a775c..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_hdr_lum.bin b/examples/runtime/shaders/glsl/vs_hdr_lum.bin index 3eda012466700ebf324c78dffad28c37a74a775c..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_hdr_lumavg.bin b/examples/runtime/shaders/glsl/vs_hdr_lumavg.bin index 3eda012466700ebf324c78dffad28c37a74a775c..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_hdr_mesh.bin b/examples/runtime/shaders/glsl/vs_hdr_mesh.bin index 1f9cb4208ad340d53168927eacf2501e13188764..fa436e4e339d8109da2a155db53e04669919e305 100644 GIT binary patch literal 497 zcmZ{g-D<)x6vv}@b$TJ}3C?9IozxG85O%*yVc=~ET1O;JhPHK`_yT*E?HPB{RvO*R zMM=;9Bfn(z`Vuf&Pu~w;eKstT%x+S>Qt5HIx4S`)v4N9W;3?hohjb{6+S+}FnatN8xPrp4fs6}ZOc`;Y{rvE@l-&5o7Hz048tV7z`nOTM5SmK0azAd+U$i~6qNCi@O*ZRy_NG? zoC{P5x*n*Y3JYS{jVjEGI#rzTuXEL+ZNTDNQ9Ov^hp6;oYu-df(dlQ=ktJyiFaCX+ Pt&V?wH<~xmdrHYaLOjJ_ diff --git a/examples/runtime/shaders/glsl/vs_hdr_skybox.bin b/examples/runtime/shaders/glsl/vs_hdr_skybox.bin index 3eda012466700ebf324c78dffad28c37a74a775c..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_hdr_tonemap.bin b/examples/runtime/shaders/glsl/vs_hdr_tonemap.bin index ffa6dffc31abcbdf22e07e7d68502379012f0cac..61ebf65d4036003ce55e153f32b6421eaa8f805d 100644 GIT binary patch literal 964 zcmaixu};G<5Qa_ZKa9Dij0yNl_aD>3_K?zD{sKUxumI0 zT-EZDyZ=9b|7CH1Hz9aFzka?)WKt)M$X*|^Hp@q6gy6+r$-crhq0}2A~ay`%aNos$&d^Db3TZtScv%%d`@*gj--!5TzRALz+Cx7oqAg zMU^Ug&?HsXE~VV8SZuNLz1>5*rtJKI=I8xXz3N%3zO@=)f<}rJ6sahkDSe}WXPwKm zf`mtyM%#tk!X-p5QY+D8p3J*&JDIT<6sk=+hXu@lyKMSr)i!`uBc+;rXmf0LbNWpn z#kFFa=|*>JeztIB(R9yu@j_;a$8Yxe4iw%|ijbMl+9(DZlOhT&6kaf-@Q+eN;c1G2 e#-!jZuweM!5JTyX{1O(N=D>&ki4f$SQt}Joq%XSw literal 1325 zcmaiy&2EA~6osjAg^RwzU22;Wfq^tJ-FIoy#x0?WW*T4&9T3{|NxST>=^J#@3-WVO z0b(MV<2~nmcU(O^P858;zW;tl$|QCY?j4@J)bmGIih>_}u45+<8_!>%w2Z{-7>~z= z@`GQllo5Z4r3Z<(HoA1u!S0jd@G_LZ@_?nH%j2jTxr3hqu?6|Tpq%7rhcdZTVJ>mWUxmj2Wvw84i7LT z&RPmLaIej0`EQEYatI0PAwxUhn6BZD$XS}b<0)M(z|MD;<*tuGt)duJxgYbI9T!gI zF4|>qX?3uPm63tm93I?N#(H5~rkGmR_SLeMQQrT==(fWsUjU6PjGF(5j&c>6N6<~; zz1HQ~VR>ut)co`Ie^+GW1B1FI80F2SV6x}I|MPRI981n?i>V>g}Va^Q)V9W-l g=uTm50%H%uuoD=&7seijIX4`DVGRs+|5R1wAA#eilmGw# diff --git a/examples/runtime/shaders/glsl/vs_hextile.bin b/examples/runtime/shaders/glsl/vs_hextile.bin index 3b2447d10b9ddad423b85b979f838374a328347c..151ac3be37cb9228c402ddf338b31b4262b944b0 100644 GIT binary patch literal 447 zcmZvY&uYRz5XRRc2-8RKGRLG8*{HY0yGKFjrN|PJC@V=uVzT}zJ@yUyUcL8eIwsjz z)IEORe82g2-j?%c!SCmH`28dXmCh(m(tb~f{zVp0X={?hqM+?n{9+rb+^ng{Fbm5m zwz>CUrEU!uR{&{vqN?;#io()Rjx&@#njCEsO)%6u+MA26fTtSK-iu?jx=fA{Q4ve^ zfEhUEn3?}3!IFu&uE{+gJ^=ag;wkEh kEn~}j1ndTCVuSUW&;T~6UbH8u3%Sd=LhUx!<`Y2t0V&IdssI20 literal 609 zcmZ{i!A^rf5Qf*LiOKp1UglOXh7{Nv@$RvSiI=9?U|E}O3ftg9p~koHy}bK0&Qg$R zqdn32|C#@rf#;{k8-~BH@7vD_JeyOa2 zTCHP9<=(t$t4)#cGbuvJs%C9WnavYkr)8^)&8ev-O+<*GrY%*WUrm`qo>~DTV8Sni z4ssc;FvRE#?YaQZ=kFX`ngE;cF+_$57KZ2G01prb2u5m6d&DZ;sGATET@i6d==Ayn zE$1t^8%&`e;2h^1w?uCr+>M}AF_{?$M~8)S06jw*L*2TQLHX+2*HDO<;fjs zi*#CR`EJSr3Q;}6nO|~1n|y9j=b1)v)yPGW2MHRLY?ULE!r5lz)wic0=l7q)n?}LGtRe9)=eHkG!BEL zWql|<@qv(dwg4Cc8aSfM*mC?Dp0e@x`UmcTd084}P7zpOFLM!5cuH$CVJHs|A;wH- RX1By_z7d3Yd#hhc$sdg+mxBNR literal 638 zcmZvZ&r8EF6vyKnC{gg{`5jwvrA-GOig%AgVV6=ubah1fi>}R_!++beFKyRfYsewI zZ{GLweaZUm<%ZyTJ^tNalDm?}=_ZWUGTg87^lN@W$Xv_hs!_Vib;&c4i+DG?B?LFF z#~C4_D02B;79ptc!v(>UG>=8((K8`Sce0Ra;!!2?gG{z{hiW@UWrd+US|;)n9U&IQ z5=L>SRo@9Z0YmAwI=SyKlvFA=XeSdeOnRiCV=SSFGvsr}!@}uo?co_5%O2Fe4?kEH zyc-8#8}U^$9csoXCOou`rnc(ySkIeH@R&8lQ(QkzjcP`F3aXonmhRg@2WF;L&**NC n?pAbrFs<9r4de8$Xvr+wgoS>W+OPS)-rxhYTcJJrODXvWjMl{+ diff --git a/examples/runtime/shaders/glsl/vs_ibl_skybox.bin b/examples/runtime/shaders/glsl/vs_ibl_skybox.bin index d0cf8fa81c1a031988abf7c44f2e36026cc59c0b..a6b6dd5e51605098964475414def33cdb54418e2 100644 GIT binary patch literal 570 zcmaJ-%}#?r5MFB!W;O8@=C~L{SfJQ!Jb3fiXwpkV2mv%}fNdzyALG0AWqc23+fqq2 zPWH0%{msnu<>``OZHq_$oLo0iq0%g$%4|8Q)cf#^kfDYNZK4*N&skCru!#@rqKW2l z6&H)a6(RVrz7U~JDPL7pKoQp-oLGt@+GdGHJKJBt-g@TnP*9r3Yt_^&S4mt;Rl)<< z2FMc7#DzGTtA*5k@dwfAh#ZM^wn~($Qd>~;+soT1l@(^RN~SooESW(+C}6$i(d6Ka zi6@)Djh1`tC*1_cvJJ75?o3g{^buHhsF@v_=+mv%|M33D4UNv8VZd=}Y;uf%TOG}r zjyn)Jvn|i@xa0bxU>tDg-sL>--LXC5KFV-}?$XuTJzP67S?*C?SgwTZjQtS+kb1OuZ1-NqH2-rf;g_ zRFomE3h^P!T-O3JnVUeKC=D!w6CK)mlabF>aEcTu$rDi!$HiZm^wKKd!SS&lLScNT z2l7OG3eJpLb8Mk%jzq|28!v_lfjR%&keidDtEIpb8!ODvX0*}W9u53}`TP<3Kx(`W z+LC)C0D5pcvB4{&N9aAZYSk{70dwOR9(gO+JKh|8S3V2Z^61}&J)l^59BxwqaFld{3kBC)0g5-v9dl^{ln;? z=9HP*Qi*RE2WU%dcbP(~x285>>YMUEUNp{UdCv zGs>y*rVZV!;@Rie>wrB@S8S*yyJc~3xMehW~egdE!6R1wi}(0xzH6 literal 550 zcmZ`$OK!q25H%7j_Y$*ASVSc84s~C4NJwm|$}*5fgGh{w6MpImdX3(%H>enz7zdVtHM*b|SA#1j;y<48S0S)iG=ZPZmJ(Sdr#5iRcS wPNL)KOlWu80QpwV+T{}$_=qrqz(t_iH3`H2zU_i;7I#(>HP;d(`Qn^i0qnZ4C;$Ke diff --git a/examples/runtime/shaders/glsl/vs_layered.bin b/examples/runtime/shaders/glsl/vs_layered.bin index 9cb0ebf5e72301a8974088c6294abeeaeee9114a..ba3d67b15dbd4dafef5a59682ec7fb5d3044c4bb 100644 GIT binary patch literal 573 zcmZut%}T>S5RRp%?ZH}K@qgjLsh89Wl6WXlI+&aPg}$%=+pT+o}5Y2 zMvFsWv)|9mw=;XXA2?VKU(ef~b6oPw%w;-Lay7N)t$*Y=eWIN~$>l~)g%w%eLli%( zZ#+)qx{x|oM#J5NUq9aP{8h}QWrmZFkkQ XYBRN4K&)E`J-A*4DT6R(pNu&_Cq}H( literal 646 zcmZ8f%Wi`(5OkxQoI`(MkC3WX61btB+CwAtkg8I8L=JHxSAZkO5J=T8=-2g+y5>zR zB=F4c&g?GRkJlN&^ZxhwJ0bU3n5eyow^Cd-T76CL2$@=%%(76FV#760&J#rO!Sg&J zgd3yfE;9mh5&6KwNX1Go0y-i*Bu?rqjZ|qsbFNF79_x&}%V^<4thj;PDh4!5-dI*;R-f9h#oKQ4eS)~1jrUFUOHv4snd)~;*GIZnLWJ1g8?)@K*Doyn$I ZEGl&KZMTY8|4U$xwp{NK2meDU`3IjQ$Q=Lx diff --git a/examples/runtime/shaders/glsl/vs_layered_blit.bin b/examples/runtime/shaders/glsl/vs_layered_blit.bin index ac17fe8c513d980d47e0683ffc906aa70342d470..5ed61209dec483a3e135c228d9898a78cc5deec7 100644 GIT binary patch literal 215 zcmWFw_TXj!f_ynU8wQ3WKo(a{Vr715iAGL-a$-qlex8D@f`O(&W}ZS>YO=9HVthe< zaVALInhU53Bxs~i7GIKDk({4jlwx3wMY|zPyAe=3l1i?!{LB=E+{Da04Nb0UE(IV+ m&xsF!nh&%WXt;?6!bTkhLp=jcYp_BjD}f48jIHJ3VgLZP_Cj(1 literal 239 zcmWFw_TXj!f_ynU8wQ3uKvrT&Nl|7}X-TR=S!%MeLSlSDesN|=W`3SE7mAb-P^u)g zA~`?5D8;~AQJ xW9yYG*eV$60Zl^^tEj93iXuBhK_NXSJ^<<}pd3s)NE?#PU|mQqtmWcj005*WOn(3X diff --git a/examples/runtime/shaders/glsl/vs_layered_eye.bin b/examples/runtime/shaders/glsl/vs_layered_eye.bin index a4870e808778aa27a1f673166ac7940ab59e1c47..eb9ed5e34189edb6c7b7305d45911ff51b317bd9 100644 GIT binary patch literal 469 zcmZvZOKQU~5QdeIm9pp+W@-0foX1Xd-=#|-T?*kSMMd%y$97^uPtaX&)*E#s$B7d% z7$nck_s{%j_4YDl6t92pKVvqnrEYbmO69iW5o7dG+||?f22V^db5&!@I literal 575 zcmZ8e%WlIU5OkxQ$f3WmN0X{3iF31h@6lDI^oVFeA}ZTN1Un{Gzo1{&|LLKN;|C2w z0%mt-X4%c_^DM&k^7HmRiS8?2=$*_rN}e;LKc;t4H1*+VR&nWMCX6Uf6GU<2`o%+7 zYt(yXCDd}e2En&F*JhEDe}M!8M}1OO=`tm?Fiw?+YehX&^zc5{!b0s8Q&N>`uT24k zuxq&SH%43Sz$0pCwZkG+LQKggfvXsL;LEgs+2V+reC2`u&d%@zONI>uSmQ2;hAnh_ zT~!ifCzu)E7=`)3Pkm}@gSm^>>M8tlj5VHR2sQ8kag2q4N6;p7$h=|;3Xk41^%-;g qrD0aAp`&)f&a{<3fjN5KU>tAwBRHe00hZIkBA&tvDiatc2976>Za!Dv8_OZ0Lgc865egTzC_w zU8jH;MfsR{@68)eu0DM{4-h|oe)x47yxyCk>FQS}L4XVKW^X!sUAI?F{pE6N@6M1u zn=0pC<(Pdq4T5mrH#c_Mv9aDL<`mb@$*vkGxlsLgbsdInb+G$^w{}wvjqTZcmPD-S zNnNta+}mA4`So9b!Uy)SRJH36Vvai!ckw-9%0=P@N3qdtY-_gyzDClAK3*{G2mWZO4RudM1HhCA!QoF@>`OKKoqg2FFY1}rHQ|>y9NIM z!hiVFi5Z=OPOscZxnf3X+~DbgUL)7ZAu~aZD&tN8fXUuFM^0e%8LXHoXe#iOHx$fs zZXg3~ozh5CUl9vkPElmKC`zr$RBM?hqLjIgq7^%e-?rv*-Z1oE{5Paq$k_#L6A+IO zKOVk56=}6Jji=z)k&l`u{R216g+W$WhKM}Myz(TWo%6QtZ->u(o>jz3xX@)LRHjs( qYgvjco!6SVYAOqr6gn>xk!Td3EW1Aqx~@BVU{T)P9n$wO41NQX3I`Pc literal 1385 zcma)6O;3YB5XH{}J$UlINAQC{`DmNQqlw2RCSD1)Xx0F$bc-+lWz!FKNrg#_-nxVC%&3)(@{v^LlAkT#VI3nk+W_SR8Z)=qa^Je zNN64d)d(eu2vMZ^(EA0alrNXeYwT2`!J5`Tu*cFoQOg6qovCqJuH!}*V4?oBZ7m_t zqDDl*$aw_e*31vpkUhk0YgLSDDjYV{ky8!;B7s`R#+or<9Pdyu z#zRy^72}=Q63~*5?OiMr!ZJ}TU`;1hvoxaAbo4#_lWMY|>f9NR0(&kVx0WxZthaO_ z0!WxXo4|%G#`j}u6W&yr~mi|io z3ZJ~cf&hratIjhg*6T1+I>j-1994=%v>sw85Bj7G7eFop11t=r$wI3QtyihT;RZ-m z$ubyFh-n??bC?I(J=F!IetEwH_d*h_ OHZQkR+${y%0oV(vj&0un literal 571 zcmZvZK~BRk5JiosKr)w@Wy8X1YVV@%SylqEsj4W@P`PU2DmZCVgg6;@;t0$*iR?nM zivG->_hdNQ4O=Y3371FgYG$YPW#nYvo+igO>rb}4t2T( zd!P)gas)2Pgd_WQN80YwWq-8}Mz28^@Gu!U5FJspXWA(+k@7c(3Ua8C9BL$odn0l3 O89ZM_0$2Uyoc#g=tgjXT diff --git a/examples/runtime/shaders/glsl/vs_oit_blit.bin b/examples/runtime/shaders/glsl/vs_oit_blit.bin index 3eda012466700ebf324c78dffad28c37a74a775c..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_particle.bin b/examples/runtime/shaders/glsl/vs_particle.bin index 074e93bd2d4541f2032f2f18752999ea4f093c3b..8c9647daa94de81f23dcfbc67570091acca443ca 100644 GIT binary patch literal 619 zcmaKpOH0Hs6ouo=AQJbkFStpxly<7C;>wLnL2xq+A#|!_=rpCTX-E8F`s=)D`WP88 zloIa!&bcSa>&w$6!L_~m{+g5XO4KUeFU|;Am@2ubL?&~&D`s;-@WX{nmh0`rT+axh zRjS@}zJr}C@4&i*W3i4SQ?yR2U_Etu+!%(GCbHF4$r2sOQt1>Pz~`V+==4f#WGTJy z56T;;B}kF!LK$^P(aT5!s6`n!k6Py&98znw!I&y#oPJQi)iGjukMo#~4maIQ*3WdC z_TYf;dYqeWc%%w^RHb-wnW#g|qFfgRLocUuWvFq$>wlc{UOMJ+8eLI=JB*yJ41@v;21+nU00MkI`Zz_b5Pw%p!Y INIxkhKlDMhivR!s literal 841 zcmZuwO;3YB5T&*;X1#l!Bhi)O28piyAHTPK%^o*UX3jaFFYf>39VE4 zanccF(dQCGcu+^FrAh+UD|sNpwa{W7uuP219nQ}Mx`;tLVHjd z`UjG!4#W}ESs8nGS2$eBH4cyo*be(*Kq?;S_<*Y6B0!*d=4W_>1xG^$mKPwKcsC9+KJYmC%hH&k*)dxD9Ku;sw>Z7l6L8!F+?gsu|4r!Zecg4HWMV`)>u_02q7Uggo&F-1y(W>1Z6IHIK47$CWt<2wD$qRMf* U4`1q!nVeUDh>qoB*x!s-*^uAyXrhnWGHdla@C^H50Vq zg>^k4gtkiD>bim|Z&u*UnZ)c*bx^vpFmon3qg3WQ-8P=oMcxRl-~vJ)gaULeA?FYJ zQJ8-Ai;=lTg-E%~D2Da3otYiIcewVbaWJ!jju%?$nju%G#THi-%JbK5Ak8~mD0VL`%dg<%@8G)mGqX6H#5#U|r_T7O(`l#(ym Cvcd@f literal 737 zcmZ`%y-ve05H_V^a0g!D#soo>#vPC%MkK~cNL{V84V6)1SHVdsh(};#}?qL*$5qiLndLpr)6 RFAQ$4p??uKl7Dc{egWL%LqB|Q-cRI=lr4eBNgyt8EphM6{oM<#w0EJ^+KVy@<)}u{M<@<9 zybvVjVIUY!@ilf#%u)=fhXZMg$+~|4bi1Gk(p8j-L!8~^9#}(yZY5Jvk#|k?FXa2A z4Mn*s(K_TjTiAz;c-n{yFYAz~+o0$aFFW9){Mz0Pn(3e6GSFtw2Rjy^3yv z{FR5r@i28%gZxe8LIg3}MuZepZ%1QqGPbY{!lra-TKI2z>ivTbGoI%J9%^Aa^S5XYlbl=u>ROhiMQq+b;89tFWmktMbwwxR}PQrP`?rWZsb-IX1Lhl(*iYzVo%-!=r5yn|rSX_1} zgoHe87G+s2`!jc)R2x=gSSlpzUpx_dUg$%WWH?oalD>9in-eGBfpx(iKrxahJSJMb znX4So2Re*&$|Dh_qDG`cC^;Y8K?5aQLIqY3&v)Nkg2Tmx=g%-K9n8R>{s*t*k_-aS z!LT)(Em#w5SV}80M2ZTH=nx`3d5ZJ?9XV4$13!Q~7-<%d3^cM7j}U^CvOiHNThVLT z$*!1EKo^UAS*YzXHVVavd2s5xB?2rA`aZe9!S}$S0S+bD?w=KHl^q%ANDSBSC_Cy7 zCt5Vc85{iA!jHSW=+xvV20yXz6Ulp?ls67G+eWK647SY%bn0^TNg<`OBt<+Pa z>=bw4lHj9|tk^d7U^mnYp%ab7Ziqy(lPT=&-`v>3h5z6tniKc9yQC# q?FL?ab$>A)6puVO*mI(Od_9@LsK){swa%76^%6l?=UsYtUFQcQy}Aeh diff --git a/examples/runtime/shaders/glsl/vs_raymarching.bin b/examples/runtime/shaders/glsl/vs_raymarching.bin index 53d00a7e4e570d4d1806ec2eca5dc09238b42422..1e9b2c401c8a53c8cce391ee60abe8d4f64ae5c4 100644 GIT binary patch literal 373 zcmZvXK?;IU5Qd-NYFc!KS!zV6xs&!Tg}|+dTD*8VVQNLR>ZDzv6EupVh_f1I{%`mu zJo+oarG0*1O|0uEr!-Tc%#OT@}R8j++sRjSV$tU#{d;$*;f^@q6zTDTl z?l$WYqhq~3Z;Oo!kzp*;osyS8QbrzxBEl5)+~25xM Ga?ZX*;C+(- diff --git a/examples/runtime/shaders/glsl/vs_rsm_combine.bin b/examples/runtime/shaders/glsl/vs_rsm_combine.bin index 3eda012466700ebf324c78dffad28c37a74a775c..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_rsm_gbuffer.bin b/examples/runtime/shaders/glsl/vs_rsm_gbuffer.bin index 83bacc9b743be0e0c75f10056bf7556dc8f02d72..ec88f2d642b7049bea991f3666dcc7bc96111b4b 100644 GIT binary patch literal 403 zcmZvWK~BRk5JgQD32D0E3bVAKL{2Fyi#^Lqpl(VPS&gZT92=D+&>}9!Rk#S_CTXjx zv#_lH=lwskr^g|q`TKn_19nyCWhjiBS@StvhqvT{u_W5;vU3i~GkH*Z`x@3Imb#kY z39Qb#^K792oZf`G;w~(8WrN2D%miAGjalBI&fmj_jk-FsD32FCm20Pf!dkY;dkLCg z3p&htF5nxGX65o}mrRW(=i+rtnD9gU2(wfQwL|+{;&|I&w}$gBV=fmxPJHW=FeV&t cc8BrXm^DI4uSmZ(TS2}|@ArQEEBFCm|EO1Y;s5{u literal 481 zcmZvYO-{ow6od_`gk%<6;Vo?tQDVxUin5(hfvyC6%5qo z5;MY?>1QPB&~J1wrMl_^`-)*GbQr?H3`tM9lWdAKZ|9h?4j8AO z6e4yAp;%&#$|MTg|6~OZkR|D!_Oafes#QM^V3Dg)yB0lmum!F=B9ExuKC#0V|9$CR zpGcZM#KlQI_-A|j$R~l)Y9ZW(&8iO7p3G6 DrK*us diff --git a/examples/runtime/shaders/glsl/vs_rsm_lbuffer.bin b/examples/runtime/shaders/glsl/vs_rsm_lbuffer.bin index b71c19fd0ccf101e7f5c91e837922ea3033404cd..7780fdfced2fd5bcf1328097b48451ee40a1f10f 100644 GIT binary patch literal 1120 zcmZ`&&2F1O5TUFinYnuvK#J^qjIr30B^d0&n znPtHXvAXiX?962k~pAI7S6aX5>bbfKH-Ev-y5Vh2$cRwM#egd%}&;7lM) zq+kyiO+_Bc`<01Z%0)$^aJMgRc~bCf9k7Uxih+nk<{)wFYCNlbt~>GDNU#E^>)xo& z1uDFjT#oCgR$d?uULo$O5kqo`3~6K; zU;cm0s=;2M=d^f)*fnM_O6RCLcM*N+b^%-US8;j^Qsx)1^vYm`qOZv)xwGBD(3Ls6 z>Aak`yfJ&;aO^QUvF9s_zGPq?E@r!lRIRCE$KW)3S5TZ-IJ}u?x#R?L{V`4B6)xaJ AGXMYp literal 1257 zcmZ`(%Wm5+5LAlfq7?lG9_2JqZAX5==&3oRKm!CY&?}+Hw9Qr$1&VsP=y&9!a_BF0 zNl_x@B!U5pyUW>`SyDeY_m>VlFaMsa3&$;RNlEp{*{}06$2pf7=VO8M>_9mAp6=KO z2*VGaPX(rF`A}w?L%3y?slUu|u0juCCTrXBiyZSjG3(y|9ty$fQy~Z{Npy=soUxn= z%F?x4hPW@e022J2^u;Hlc1*t{B$@K0A+ak~6d<|}yF$2^! z8Uuu117v5HUrXeE)u;w7S-+O}hTT#2)+xobPf3nF#8E-0>Fa_(%MLoQnWbXpSI`Bd z4Ptd8dk;+Och9ZLxpZK7YJrRHJG0#iWTj5b!HXmM($&rVN>#Qa8^{h|CEMwgEj#cV za1IO|Pdddt#f3$20gX>b1n1_R;mD1s4Zq{F+dq@-ClcLd^rruhnCu<5kO%%n?;2LnbS-9Oj{nn z1(0TKqRBIv8sGlKrcW61S9=?K-7pXjw8$lnm%sudD(@wsPY|{q@9>UKXk$n_=pIk! QkFcE5XT^&KD!c-)fBX-A-2eap literal 486 zcmZ{gO-{ow5Jp|pmAl{yvvi7xQn$N^eV3Jxx;} zL{`y!p7%b@@^L<5^nHIlnHx5$Rq0lySfbet2aF9v#BQVMqH>!)`J^}6`wE|HZ=f+R zQ_#w~s?bI2 z;LgC8Tk@z$PJ`}0-N6G)((G!sKOAYQRo@R_U8u#mE@dJr6O=H%5R-t4eKKOplP|mS t$+Yze(VdEDGR+dWgL|sh0?#-3<10Jn5F;# diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_color.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_color.bin index cb4153a78efc8f51515b19bb1d4f1fae17bab28b..9635f92ce4a43a7f8760c6185b174f77e6054114 100644 GIT binary patch delta 135 zcmaFCc$jg52Fo-C28M}l@)cY;iIw@KB^o*T$%!SI`FRSq3I>`AnRyCjsmaC)iSY&b z#hD;+Yc8&`{LB=E+{Da04Nb0UE(IV+&xsF!$^-S4#^>gzq~?TWrj`d3KC%+&ILqWmltMg|5Juy<0mDj4b+pompeRsltkty54)&xsF!+76V{K(kUo3vQyOHCHVc7XtuL C1x76Z diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting.bin index 7c8c015fa693dcaede2330c1924c0315145bbb71..76ca975e695f6a74d76b99d2ab0f2f8b97a8fb72 100644 GIT binary patch literal 683 zcmZ`$%Wi`(5OgCBt#jxv>=D{Df|NrgRP~xmrAU=>wJe~CBfyA<6H@ixy9ON7Dz$vD zc4lX0*V~WvoZz`F4{L|qw=9=Qnr%gT+*I=5+z{eun9L`Lt=_e)t_wc@x4!Pdi2bq83qUtouesTOaj|YeZ?rJJ~jFCS%?RS->j< z9*6=^;Tbq9Wi50)xt3C=7E z*P~w)@brVQ)eGj*PuC_|K(O?^sAugmwi$yW@z1{C0Z?Ed4sxN7ER-5DBfdf~|OD>1kuA=@$C@=6{TVof;m& R9qkaj{P42#%s##;B|l#5%>DoX literal 894 zcmZ`%%Wi`(5OmudTIW!yU$94LRg?rcq26<;6sc0KmK$i|2rwdsJgWYC*E~&0Ee^25 z?9A+X{jr=9JonjtIU&=6B{GcSwTO58z*#EugvS9L04@TVJP0LZ8qkvGXOV6-!-cYA7-bL3 zhaC^)aU*3OjwmHY322duFI0nsD-Vn~|06o+2yMgmKozA6jOtQ^s3KCZZ2C>1&Z?3O zEwg!mh4$S!!W+z;*`RhhU$AOU0AL%lRWlI8EW^F_2+v(dTeqqVH5v<}_d;{6cIe1j zI5QhwwSy7QHF$32b2jklI-mSPqmT9;*>)M($QuYjG@5+R{MtL}) zlIbn~8BVX|Ra%uneeoLCz9Hpbk@6cUoLPGx;RP%+GfH%;cg}X5#=MQSrS{hJj(q&} Hhf?wj)a4js diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_csm.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_csm.bin index 4f8bf4943fb4c0801b19b927ef101bc5e8ec19d0..28d96e7d52d33c98115032103d20799fc784800c 100644 GIT binary patch literal 1221 zcmaKqO-{ow5QPI&0^9{x@G^l?<*zDL#1^rsR0*k@s*0>8fKd`xX_B@e7Tkj?a61mb zIDbxvTPurb-Z#(lY|oz_`wFawub=M=R_8^<23YjET$RerQkT7G^ zgA1gQs-X{rVdb~tns*SE|EeP902@PHb8_k>aA#$D0RLS+zQ$lsfQ6l{0|i#aL4a<8 z6TU5W5U$m+09=st-B;CyJ9Oqlxwbys?cWDj2Oo|9mUCq;KSjP-y9?&YvF1=?Nk)8w z)zTdHsvqZYuQk()t7(Vl!N;xOlMxX4$kjj#eOX}nJZ;zdZgbn#JLf% T$U&O;3YB5Jl5Or3e4Q96=)imiE$kHC~!DG3mt^vbLye3foZnrSahZ@GtoPJUR;t zyA){Sq0XC`_vX!Prw{ji13!1)zdz?je;vkr9xbLU+V)NiqbDHaQj1Pf{;rTSiKxiM zI$Y9}#w+g>>+!FsU%k;e-;U{Wob6ndjh%JG>qPucgec?><+UGMFoLPRiT9g47cVBAd7Z0&eOS9>!c%oCqg=rpoR!t z8(hlBTqo=WM}nAU0ceZqM#Re6(MRt|0l8n*_EcOF>3edIqUghcNWB)lID!g4IGf{i zECI_lKTRkWnZ--oM~J-v%J0q=ZozX=M{=ERO($^*oh6OpCz;aRoV7E>OHGsd}JM4O*xMk_tU59}irErO%8M)yX+~ zyO>60*O#UA3>sq(H7&yyEyGfaT>hi`q_-1jKAw8bg&F$kx~gI*m6mTmzm0<*v+iut R?Cp1F2hD6!&;Bw^;~yHM)>{Ao diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear.bin index 60477d015d5fab78bd888781d834c29df0ac94f6..fe3963cba517b419d3c2fdd2c5749607f062cba2 100644 GIT binary patch literal 711 zcmZ`$%WA_g5OhNht#aru?9pygW2Y_@Ozyc90)uX7CTjXW-~CT#V5X)q c*{vPG%MZIJr@xP@y}D-_&k*f3WIv2qznr$!Gynhq literal 939 zcmZ`%%Wi`(5OmudTIbMT*dsIwA^}dQ>NS^2kt*ei+&~jYfDtj|QT5-u=4ncbIKYm_ zGqby!kJXgm^Ozl06EZD=M1)bi;n8VwN617$aZzsZUFmUwFDx3ziqIHHso#ivEezfcVlCSB0t{Ew)hBeV_M167nRFsch4q6$yJFzGjiI;%`F zv>YsaEVSR&30`4g*@N2oa>c6N0f1c`teb`)W@zq}M|kOOG}Tp=p+;k=-Mv&?qis5} zmX>Y8Tsau=9F6BxKJ9@|$Etm{GU~U|ZU%%>^=$byGIYbeS;thQk+Q2PyEi)IHp;^e zm4TY_pXT&hZlzTjREyWR_B1K)hLqPxVb9uqgc%rmW|ZhgZ(YnfjlPYwrFLt2N8b3T Tr3P;db{R`Euq}1?hf?wjI`}6Q diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear_csm.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear_csm.bin index 5476f3c9261bb59c569b2761c9009672df796e34..b1794cd7f468bb7f2ad68f277144e3006e914767 100644 GIT binary patch literal 1325 zcmaJ<%T9wp6h+fSr3-)IF2Pp9tEmm?*0^cX#H5?rkV!$s0Mk&Q597lB@E80??*Qc? zLnkcAJ?EY|=iXU7KlKGXkKeyP*TQXL2h?%>h3D?(5&h_02ttp+LcfMo)tkiLkcb3Z z?Gl;z;khc96$@3j@5G_I8QIL@z1oRrorvCv7!~q@R>dUrUTG9SKw=YWrdb@T6RnWc zU9-L-R#mU-Ewxn(Xe2y~YG+aXENWPy=#v9YV#%j#5_>d+DQGfyA)s>uh`pg(kJT*> zQ9Th&B!)O9;#(q$<-IAdl;Tq;IVPkv{i2Z-V|Tx%G;%N-r;3?4Rm{SvnwT)9o`VbY zLP-`sMZlA7#nvA%Ec=zJm_yJMRkkwLn{UsH^ho@-e7FM?$ced}sUi!d@5TdPi51YUVW>aLBHM`JHMys0|b27pJq(U6; zDj%nEkn8EI)ilGi;NwQ{$p{&l<&&YMy2@#ppQdWL+f26c&RNf7RM;;cf!-o&e4^1J f>U^TvA{u<6rW|1~#RarYbs|P5V%Cr^Q560Ft>KOd literal 1645 zcmaJ>%Wj)M6s1wBrex7yxJyV>1kBhQtJ^4>NRcXK6Gdnm({w7sSQx(&Ws(2LFZ3UK zFAU7^isglU&$;)U`+&Qj*XIs?uHOE=pE>8-BvZ?DbtlvP=_kiICCK?^MQ;oB*C1as zVj^F+$yyX5+e9arkKa0f^G7Vz{zj~C%0p<_SlLFRNhF>`m_gn@JB}#JLjKy8DeTfm z4kF1_k%`s9?Enmcwc5y1s(j(@L~)e)6J;>iwHa2JV|bKLK$#vMl`57|r;?4tlL(tc zcn2Y0J6y`b-RAN)wgj0dIarICMrdW@=za8HfNEat_Doz0*?S5MWK9s5tS3akn zZP=J)J|zv5@orjWJ~AP$mAezFud6p4qs1$&${;;e+V#wmnvF=!v=q*)d3fLwJiBL< zXiqLU`gJ#k-CdUPGaIx$x4g_pyv!RfdinR^gI$i$sy*{G*Tb++H#8Y@?X-FJtJ~u7#IGBzu-SQm)E88 zxM4x&oH;XRW>#;nQw874_wUb*a+i4#_k(c7g2OW5ACoIZnFv^!wh$S;&Ac5=XtX!4 zk%=EZl6fK9Y|}-0ltdKXZ>i4@3%WzV7(~oL#2Q3wiI~_e$zt}-lL#W3I?(D{IC2M3 ziR8grY3PoF_hd>xrVLo+x_hi8|;o=gh|i zvRKu~CjorLRy^w&&5B=D+I#?0H#E0kZ9;EZxkuu^<-RSp7i3zgup ztRPkEu^_o*vU8xSEp^N+n(`b&Kc3DHV4#jBeyhH6PfSr1yUfCV3R=}vGuop0`qFB3 zX&GjqR<#gpZdE^N?P0W*Qs`YAs1R++)#d9YS{=SQ%C|dwYn1PF`1UB@)Xy-R<5ZtI Poem=QAmX%;FG7?*p0A5@ literal 1572 zcmaJ>%Wm5+5LAm4Xq7{LVUJRS2$D#jj9!ag0vITetH8#p!@v>^nern=5B-n+LjSS5 zdXahxK3F@mJHy?jp1yy(b@2K6=ilFt&TW}wYMbt#WO}}N=QuY6Id@icQ>a&id@7TJ zC`5LQ-Xj}-__$@Vm%A7Js4s?yC5|s*tIm(&fIv8lM6*adi!g(1J~)ohx{yCgox&-7 z<{*+>6`9zt-5$UYIH;r4Qsry+B#Nudca*{4)MZ#`_F-Vs&c$9Vpwtf~ zw|F|4gXg=yT&M@Bvjff}!P)@r|KJQ?APT}>>~ej>s6AeQ-9Fhg(?-m*x<v?dG|+9Q7gMg+ZWLz4LFmH+IT+>PIl4Sn`3!qLSy20IW$3liZnh7l>cy3Bsb?ED zW|>b(BW2v1PMJ@1h&Rgp4%OQ=XpYh1l~!etZdK!YWl60jq*jd-_N=`;a1Wk+W|Zi5 zF}V8mX$-p>R=bkM&Z^;cH?KBsuUUv}b7u$qYLfkrQnbWpk^sx;Ug&x_-dWZlD#6L@OI6XVmD(O1k7H<>P75c#8JrKm24p5?;;K%WQhxnzNI6t z7gb2+FJxZnOvOvR%3TXMaX5%tgQz`-IvybbJBT#V1F>KU7ZE&xWdM%=J9mK5jo5M- z_d1AXMRbuE;h0$95fm$Ov#wBv*HCj@$Qt@(q6{Yfej!A>L~k8Y^wbeWFC9@A9cF?r zae+M24f06J5VuhY z9*PP|wHgbO3noAMy53O7%)BY;n$!K^H~|xN4EbC3l~FlGS?n|m`^jl#Q}t-`=BrDq z)Rkqp2feI?V1298gV7vDV=1}b$$?7Ix?EMhTB6#_S literal 1408 zcmaJ>O;3YB5Jl62(u03tj-ZhMOHYkgCynR##L&35+sGBogc{{H*9F@|}V@F-r*SiBot8OA_D#+??OX8c1Tw|Tgx8BI3c zHD=?BkC}%nwpfaZ*sDZrv02iH?&}k>4@KpkX|HcAyU^C zeHoj1%HHuvkWdkT=1o5$T~lZ=mc}_1ulm*Qb%2(G7g3zUiAcQ`XK?|Q^WZGP)3FpR z+x#@4G*TpM^drRH0QI-CgD3DDw-wtTju_SL1z4=YY2`LzmNqpx8@O*e+OkzKp^5|5 zHhjLUwd#$+D&KK!c$5k{b$E`ZjublGmQLc7I%^vFv*50_52?zz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_depth.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_depth.bin index cb4153a78efc8f51515b19bb1d4f1fae17bab28b..9635f92ce4a43a7f8760c6185b174f77e6054114 100644 GIT binary patch delta 135 zcmaFCc$jg52Fo-C28M}l@)cY;iIw@KB^o*T$%!SI`FRSq3I>`AnRyCjsmaC)iSY&b z#hD;+Yc8&`{LB=E+{Da04Nb0UE(IV+&xsF!$^-S4#^>gzq~?TWrj`d3KC%+&ILqWmltMg|5Juy<0mDj4b+pompeRsltkty54)&xsF!+76V{K(kUo3vQyOHCHVc7XtuL C1x76Z diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_hblur.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_hblur.bin index ea81f2ad3600b0632568427b8f75e1dc21ba0b04..3862474c2d833b1e3f2d43b4dcbb56691fa7cc36 100644 GIT binary patch literal 1010 zcmaixy>7xV5P;pnWQIz80*^pxls^ffsC!2wDpt#afLz%z3P~DT^(Fdx9lQ1oy7Wxb z#3n&lS$w|lzPrnE@i;(mKEHmxduWi;g2yjUaT$y2D}>;KbDPt>Trjy4JlW1!%H+Oz zyveCl>sTy-o2Tlz4^01vee@8*dBQg;m86JQAu*~)r!S|5CPA`Hqn0JYSg?c2v!PHc zmT{Gk2jY$hPqZl@jPBH)>v)7AO9y>Y&@3)jN~LQz>cG8!+y~sqtoYF2y}GIy^*f_M zXEcNf3dPq%GM)@a_ze>{8=+W6sPDlv#di)wD;>+7ys__rqo* z6XH4U=npkk0;n~%?x%Uy9aVMe)j(VKy4i^dItTk&lDm$aN?*-84WPQ7dQ5x={*A5n z&#I?^?dnpua%}a?t<^zWt^4YpdgfkMw{mQ?=T2*P*mj3!-2h&ex0AsBjxqWLfjKiw~5QS-*E@Y_Gxr4`~RjmMqCFo)0bCCX zzc8G>=dx2``~)o?LEzRMr|WArnu=Dg^0-AowCgw_y*A zDPfAe)ZryqtiV4O}Eryu6rum^@n80h^= G*R_Akk-^{q diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_packdepth.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_packdepth.bin index 99ff9a11ce135a875ee50d24939749da238b0e41..c56c542b2713cde7297bf87659d56c281f4fc6bd 100644 GIT binary patch literal 246 zcmWFw_TXj!f`TbUKNuPKOXG9%Q&MxnGE>U~it@8q7#SE?K++5+ftaf_FEcH_C|4mj zvBX3HO{p~(S59JOerbtDPJVJ?NoIbYf~|sqrb1?(LRo6Eu|i^eL4I*2NZgtWs0t)# zqELn;$W@k~nF2IAGfzX4tC~vz2-0)n1E89KhM`%gpanKV17Wa^f}x&)rZreA!epRM MBy+5}YPq-=0G1L>XaE2J literal 285 zcmWFw_TXj!f`TbUKNuPKOXG9%Q&MxnGE>U~it@8q7#SE?K++5!fH<+Fq$o3~v?Nub zEH&9!Au+xnzc{lbGe6Iot1PjoGBYn7Bw?aZh9ps%mzkDdl&g@NSYo1pW;#$?er5_# zDl<<(LzAnTO97(4B)0%)Uc8|-Pyoi(D_5{pFw`?Z5v!=I0*WHLLqQ=uCq4k`ETEhQ anw1J#a1%8_Mj@OERE(t6nyZ$Jiva+I*IVQO diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_packdepth_linear.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_packdepth_linear.bin index 62d2d90debd34e2f9ab1f02ca981c731cecb1027..81c16500239b4dfcd4d559671225bdb5dcbc3798 100644 GIT binary patch literal 257 zcmZ9F&kBM-5QkUjG#z??E_2ihF|w0%ubU8fmBl}`u{vU_k0nN~BR# z;to9rRf%nuY*5A(T~)sifK!-jk_Ov2%_?(dxFwacSe3Q|4?wPyj>7?A)#x2AdaZB& ev@2Y@o)di0LCcu^XK_2GJa_BhvL69F0mKLSWKCZH literal 298 zcmZ9G!3u&v5QbOqv>keYE_2iZQL>YCubU8fUAEk6LtU{|)97t_&7d(X%!Ofx|DXBh zk9M00!S|ePTZ2qXma14JkrZ`UsEcV3VsAXxjqN9%;ZrODWqKcFk<79k}+B`1Iwm&3LVx5o#semUVy^4cWPLJ=eU2` tt!YsmrT{o4EbK#}XN^w6{71AqRG+h(v<90_i-WGSvSIQ00{Wnoya5^DTrL0r diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_texture.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_texture.bin index 3eda012466700ebf324c78dffad28c37a74a775c..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_texture_lighting.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_texture_lighting.bin index fb723ebeefe2c06fec391961d36d54e172952852..887d065fb0b71d13724230f53d97383d399f1840 100644 GIT binary patch literal 553 zcmZ{gF;BxV5QPou(fc4Oo`8gQcT8gLR7Nc?p_v<#%pv8-T(SgWd9&i`MrgvuzfE90as2!1&O=hUs8s>u}H zOWyb1-Rk9WM)3K4{(G8`S(`Vitm>7hcGDX|rdA@i!E~wBhgV)FgcQbT@z$COx@x_E zB9}@xMV--sz){$$Pho_T7ZO9sRQt73x=b_L75X6L#=3Fn&The&;duOq4zp*pmEs+9 zKvS3n1o_7m+YISSl=zd75XJPH!m*TTw#d)t84gbG$qpW1o?zl&wm*E~G^`4+sq>|4 zj#?Ciu}HW(JI2T-u4*6nh8fl(CqD1XF$XTeE-C?)?RjntX| diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_unpackdepth.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_unpackdepth.bin index 3eda012466700ebf324c78dffad28c37a74a775c..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_vblur.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_vblur.bin index 73edf830907c3bcb7476cd858861d238c4c5b709..ae2364270d80f715e8511f08c4f7488bc19e2dc6 100644 GIT binary patch literal 1010 zcma)(v2MaJ5J26+2M8#@Z5RfZ7Mj;8Hsz1@+>)5q_(4}Wc zi490#dCB?Sy}Qd~{Bnoje0~4^w9sA2Dv_>V(@iRGZxDhD=b>aPHRft5MYb66oU2vy zcwaK5XQ`Y3H_G)}8<_SE`)nbE%S_C5u1J+mBVtugj$e)qO@iWuK^;qivE*A_79FXl zybwAg&&2N%kr`7+I9uwKF!2OKmI+c)u_E0}wa#aLat06naSFJVS@V&_2ZyS5l%9=- zXQL5JP-!tEii@n%#qXHFnM=(J!e{`~Sj+OZqzB)}EArOKj#@}Is;Av?&ZdAgyYDm` z>65_oyL;4H382o{rl027bX3bt@b$G2hrkB+*b=83%AKcNYJG#~lbuP;x3G5#jqd)xmJnH}e literal 1404 zcmaiy!B2xQ7{yWNg&j;hd+2e~j0`AT7VjRHXm%xaV@nOC3o8sX{-qwh`X6}lgE87N z2ZRIZqwl@n*Dju)h6X%e-@iXs#xM;s8tz}hJd7?c3VO+|>ZaOolvZ267~%Hx@-Ne)ON%$J-etLe>Ohqb;h*HreBh`9edpZ!w=?XDI zV>B9@A0|TUh!cSX+X8d|9H{w5k7%SsTLrp@z_z8eAD5e|z}f|v8yCmggO6>&RF$>7 zc!yQ>I1t)I!Mr}5L$Zbj*+=(7o;;PxNjW{e42-!6cCB3h*~&GwD1()o0LYVLtX;*{ z9bD_sze#NwmCP-p2i-{CDjWVi+Lmq9Ny1HN%Hz)R7`mQhPSB`!wqbsbH65!ExDx_b z2X_MTuc3r-Buv#^h4B;^uM@`WhjCjlUMGy#57QV*7+1nn-BlQ0f$=+G{C*hRg7G_H S{C=3mP{Lpd1KmGO)A$1jkip&n diff --git a/examples/runtime/shaders/glsl/vs_shadowvolume_color_lighting.bin b/examples/runtime/shaders/glsl/vs_shadowvolume_color_lighting.bin index 064847e61a81c785c3aea09afc7a955182bfce51..5d326ee3765cd341db51c0c5bafbbfc1294bd9cf 100644 GIT binary patch literal 458 zcmZ{fy>G%W5XDW!bPU~?Z*(e(Ak9$8VrN7}VvQ_FDCCI&<(%sx;SLrI z)W51Cvij)DLR!Dph4GGO97k*%SK0cBb^7i;2Ln>OOZYbj hV-mxj9~&V=MdQQqG~!9ywvOTUzkZ0U7ZiOGiEpeEiP8W7 literal 583 zcmZ{hF>k^!5QSZo$qd~(-G-Yj(;iqf6>!dr*4gJ2<#Y$5q*3ijsC(eV`*W(#|1Da$E5kkzv#to0Nt$ zqelv-c(&OhMa)VpobUM_7BI_;QSIySjnz0bz@`?z#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_shadowvolume_svback.bin b/examples/runtime/shaders/glsl/vs_shadowvolume_svback.bin index e11fe84d0f9f2f965c292b049295a7713e2129bc..a9dc4761dba148f96deea783efdcabf39de12f34 100644 GIT binary patch delta 202 zcmdnM{GW+GEZBpa0ScHHL W%c#g#uBoG7sAr&Q%~i|A#Q*?n#y2(q literal 432 zcmah_v5EpQ5RGCLi~9tp+?=>5XSdi{SXc;xU=?y2y^-CGWGB0x;=em9ifExjAmP0? z^Im2#pR~oTn&KAJwdmtYQbom$yYO<0K z*OD(o`Vr zW&6^2JxCb1zvBu`AnRyCjsmaC)iSY&b z#hD;+Yc8&`{LB=E+{Da04Nb0UE(IV+&xsF!$^-S4#^>gzq~?TWrj`d3KC%+&ILqWmltMg|5Juy<0mDj4b+pompeRsltkty54)&xsF!+76V{K(kUo3vQyOHCHVc7XtuL C1x76Z diff --git a/examples/runtime/shaders/glsl/vs_shadowvolume_svside.bin b/examples/runtime/shaders/glsl/vs_shadowvolume_svside.bin index d92ef6f7bee2f51c768eeef5015b15f55f544878..5b21805f137b983816666f08ee45a93b1d9ef48e 100644 GIT binary patch literal 587 zcmah`Jx{|h5Dir)Gw>6*G2tUhp#zeYje&uo5>i*oN}O`kiBaODNl||n6aNZ!E{<9X zLdwa5efRF&yXWQ8!>LE{@&2`*c;~ffu(Y+*kGOia3sVWz+On?D6!%!!$%*IDp*X8W zZc?R}s5Xnzyi6%Qb(K%LvAV#_lsPminZpPvKcI7Id-N}2&X|^+sjaU~A}tAl7@`2M z=*e$EidR!%pXdJoXM5lc0j+8iW6Ct*jQAkaMp|gZnnpARQ^+M2e!$)sP&jgNH|Oq! z8Tdy8VGD5#voH!=b?E53sDb4DXo5@d3o=4#+$v(&YlZ7ESHia225>P7+XREcol~N8 qrA8zj!&h3+A3OI*_8;eIc>jGq?R4dK9XiP{x8lLgu;XmUnD-4%Y`3}q literal 598 zcmah`Jx{|h5Dir)Gw>6*F$NK}g)Pd)z`zg*sjFogCmc=U%5gqg)ZfL#&tis4O4_Ca zwIav9_k8#6-TdY0(xLVB`Mn%DSEa~wq|!O6IyCxyeBn6b7Iv;nQK7M=OrJ4%v!O18 zYOE;>)cGS8c0^42X#LPnT5IsNv_Q7B$j--jHPq*#>!9Xnl#^Aa~ zD!m4R0H)rAb7*rM-Vv*B6K=uHNw!RJquh=KaE#xbQ|mSB4euUuxH(I%Id41Iwp-_g z%~oWln6-ia?A6p92_M9$3`O@IB&i7hMnz%w#Bfs5C+q6bggU?WBlOlj+cM_-0#We7 AIsgCw diff --git a/examples/runtime/shaders/glsl/vs_shadowvolume_texture.bin b/examples/runtime/shaders/glsl/vs_shadowvolume_texture.bin index 3eda012466700ebf324c78dffad28c37a74a775c..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_shadowvolume_texture_lighting.bin b/examples/runtime/shaders/glsl/vs_shadowvolume_texture_lighting.bin index fb723ebeefe2c06fec391961d36d54e172952852..887d065fb0b71d13724230f53d97383d399f1840 100644 GIT binary patch literal 553 zcmZ{gF;BxV5QPou(fc4Oo`8gQcT8gLR7Nc?p_v<#%pv8-T(SgWd9&i`MrgvuzfE90as2!1&O=hUs8s>u}H zOWyb1-Rk9WM)3K4{(G8`S(`Vitm>7hcGDX|rdA@i!E~wBhgV)FgcQbT@z$COx@x_E zB9}@xMV--sz){$$Pho_T7ZO9sRQt73x=b_L75X6L#=3Fn&The&;duOq4zp*pmEs+9 zKvS3n1o_7m+YISSl=zd75XJPH!m*TTw#d)t84gbG$qpW1o?zl&wm*E~G^`4+sq>|4 zj#?Ciu}HW(JI2T-u4*6nh8fl(CqD1XF$XTeE-C?)?RjntX| diff --git a/examples/runtime/shaders/glsl/vs_sky.bin b/examples/runtime/shaders/glsl/vs_sky.bin index a64cef2cc91aee42b8c92ba9efef888049f8d753..e54cb72895d37480366024c324fe5a618d23e339 100644 GIT binary patch literal 1983 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 literal 556 zcmZ`#yKcfT6g3D5$qfC4JCY7j60=3@9g!-rAY_>mkWpfz;3TD0|Flz=PVF~vO%w8H z$P}G(&%eSiLb4aq~s6TOY%rHqP2st=<9AtOtZamm!k4|2koRBkd8K_0y@ z5M1dr5phWW5l4NJMrsw(T%>2I_J4}}rs%*03PPGGxkE=tgqcC7TR*$<*BGJY7By1A z)S>SbY}O1+a>NkshX_>vZUJ-fU9W|`p5G7^yzbm~2pZQxk3-=0IqYM;C`Ul|Y3DWY wSak{dRppQ7dm;Cc7wTKFm;e9( diff --git a/examples/runtime/shaders/glsl/vs_sky2_bg.bin b/examples/runtime/shaders/glsl/vs_sky2_bg.bin index 3c41616c8449d596028828435becc0382d370f1b..8181461d031064e97f79506b93aeb533adc5a6cb 100644 GIT binary patch literal 183 zcmWFw_TXj!f_ynU8wQ3YKo(a{Vr715iAGL-a$-qlex8D@f`O(&W}ZS>YO=9HVthe< zaVALInhU53Bxs~i7GIKDk({4jlwx4b#Z{J{nWB)Jn3<=c$yLpz00ikd@c~d>K+}L) jOf(SY=v7qeC>ZJ)fC)`&um&Upff`WMT65KMaWMb@T%b1& literal 227 zcmWFw_TXj!f_ynU8wQ38KvrT&Nl|7}X-TR=S!%MeLSlSDesN|=W`3SES6O0FWoBMF zNWw^=EWRYQA~`?5D8&FMlb@NQkeis9r=X$9Rn4UUQevV|l3M`O5^rb?6o9eys>&5? x!6s-J>KW)L00~VL`HD)QJi=DJib{}ldQN-*)Ez)+m|-9pBzItHtmWcj000k%M+pD` diff --git a/examples/runtime/shaders/glsl/vs_sky2_shadow.bin b/examples/runtime/shaders/glsl/vs_sky2_shadow.bin index 3a31e58eecbc324b8670107223ca81467cbdaa1c..d751192535b168fbe690482dc723963801d6a9e3 100644 GIT binary patch literal 379 zcmZvX&5FW6497=S5VD7Th2X_j7HO%s;@yiN2wp^np{+X0w2?ZkitGdVihDAxmD0r= z{~y03>(%^I@ZA4~_YW~BWJ+;j`aL1~l`OsrY4rYJ*E%^bbNXo=Xq<(;wBm@1P-J>X zd5WpBQ*4MEe;fWcI^g#%!$Sb0u2fjZP^7G;3}@)Ms52~+C_p8Tbkda`0;ei*ilsaq zR7~fHD36&?l8*TvojESt0D0<|3_OOtPV}}ou63tnexpC}+_0|fja)XX>Q?7|t}^Wz O>}+qN{LCx$3m_gW4RM_S literal 447 zcmZvY!D_-l5QeuX6xKsuVeq6L#6)kQcP|B@;6-FvO&Z508Cf@pw)BB~#hyB;vB_fh zH2nX!Gylx;b>0*FF5mr2M?B^#r7%jm4?=V+Sv=(`!FXqv7?le{`^J&A^I}hp_|6}- zwFWo2ji89OQ_$)_N3=*;APa5In8lSbgF+p5I;3(-WWqq^8NQK8A=P#Ub&i#{zB8OS z|GONCXAy?n3^N!E<)?(}P@5h&gz^FwZuPi?XYj@oM?0NASZ#-QJNPZyXL4|hJXyo& ful2B^;zTX#6I?-Og@*QjY3D30o|kgbFDb&BpiJBTAN4!SbG0i8YLi}AP`5y~J;N$BWvZ55}mgSQ(( z33ORgZga%CkYjmC$V({ikCJz23L0jdi1<4Px{b{ieKTr2mmBgp90B?mDMe{?N;f(c-l> z92&l!LY_&btGrC6t9HT&B?lHm%kaZmDP6=VZE}4Sa%0mb(45menW5|r)Ka`5 z5~|!xVNgD$*W6{YLXHvz&Ik!XNIxmG^-Z-!QkJABoc_@sW{^bK&C?FY4^;i705)Yd z?{-8l7<7U0IWe?R?pz&%dD+bI;tL*&T3!&G?(2jxuqY1U(Y9+dyL)-~WxVRiEVOfu O-k;Fz;T`mgQt}TrYp8+% diff --git a/examples/runtime/shaders/glsl/vs_slug.bin b/examples/runtime/shaders/glsl/vs_slug.bin index 3b72d445837d003560aaadf3bd9b177a9c59aa42..84b2b4eac67722bd50f0d112d98ca3c944ec1f17 100644 GIT binary patch literal 1340 zcma)*&61Nq5XVt-u<+n3%*ldvMLq%{MY#u09z1OMvDYaKB#uRxm_P!td?_Enm+>|H z_do)KSS7W!fq!@Zx~Hf6;p4k!8lKOM9hxf7 z1}YQw>7`+A!(bRH^rrEsO!kVA65=2VR+%PVyE(It1G;CsBS<}h)R&N9iJsk-7^tkX zaG1jJDFt^?FBLV%=)J@@rN%dYx~{tTcIR*(G!1S>|C|9Gi2xx$yYJfq?~ZSx$k!wz zA2or@iXXz#UVJyI$U)PK+c{6KRRNbsqPg>1MuUaR$Bp%U>ah=QwdJoee&4PV`2RCn zpf%alxONj(s@3A2PqVEi;jJikpX6te7lWFSyg6G53s}B~0E)A!fgTV@>Gi1>?Z!dx w4v586o5j`E!KC&|6@az?{(=R*@A)O#(o^s5m=p9hq`Tq?we>{NKXqOE3kO`~!G*6dD+9NR9SZ$P<6XFN;o`=hyCvAtiUFq5ffkG}G2D%YRxjX~a)>CY~ek{F|y(X3nx)COE9a&0L z^?4xeE7Jbeusm+NPYB$XwnhuZc)^SFuQ)6-}2CC;c;ijfh<>UzL1 z|3adhMhsJiUZREX&;3HLw#Tc@J?iw^TZ9(_GTXKTa`m7#+nOVERl9rR09D?ZrfmU# O=KvtO37P&fP2(Q{em~~` diff --git a/examples/runtime/shaders/glsl/vs_sms_mesh.bin b/examples/runtime/shaders/glsl/vs_sms_mesh.bin index 884f27f77d5a7b7c3689305c4becba52d15d9b69..117026e9c0f4dce2445abfdde6cf07cd1bda8329 100644 GIT binary patch literal 663 zcmZ{hO;3YB5QbOn!E6uyg*k%OW`V7=A;xPjCQVFw-4MWb8_G5m=!fyYJIjKg);Vov z-g)Pl+2z}ONHA`9oB0j7E5%mDNxGEDVUerN;EIreE|X!e(q(BWQn^|euf?%TzFZSR z%S^tjd<)yK;Lz*UuED?6Kb6)!pfn9nsw}KjMPVUT2G8KwATy|v$b(Sq)L!a*a6!mg zAxB|`SYaAaG&8-`rBsC%_||Z!#C{#d>JTZF#|Tp?8RKp;vuyf70Ru5O2zQEH`e}7U zBXGvd4rCR48kB6MHZ$$9VJ{$9K?}JE^?n%VR7bpq7*JvSA`a47(VX8NYq;)ifAIK z5Zk9^&Ogx&vQRS6(Erb+s^VCX%g1rEk`%(f5x-ddRcE(R74fBmME`~sQP3G4s> diff --git a/examples/runtime/shaders/glsl/vs_sms_shadow.bin b/examples/runtime/shaders/glsl/vs_sms_shadow.bin index cb4153a78efc8f51515b19bb1d4f1fae17bab28b..9635f92ce4a43a7f8760c6185b174f77e6054114 100644 GIT binary patch delta 135 zcmaFCc$jg52Fo-C28M}l@)cY;iIw@KB^o*T$%!SI`FRSq3I>`AnRyCjsmaC)iSY&b z#hD;+Yc8&`{LB=E+{Da04Nb0UE(IV+&xsF!$^-S4#^>gzq~?TWrj`d3KC%+&ILqWmltMg|5Juy<0mDj4b+pompeRsltkty54)&xsF!+76V{K(kUo3vQyOHCHVc7XtuL C1x76Z diff --git a/examples/runtime/shaders/glsl/vs_sms_shadow_pd.bin b/examples/runtime/shaders/glsl/vs_sms_shadow_pd.bin index 99ff9a11ce135a875ee50d24939749da238b0e41..c56c542b2713cde7297bf87659d56c281f4fc6bd 100644 GIT binary patch literal 246 zcmWFw_TXj!f`TbUKNuPKOXG9%Q&MxnGE>U~it@8q7#SE?K++5+ftaf_FEcH_C|4mj zvBX3HO{p~(S59JOerbtDPJVJ?NoIbYf~|sqrb1?(LRo6Eu|i^eL4I*2NZgtWs0t)# zqELn;$W@k~nF2IAGfzX4tC~vz2-0)n1E89KhM`%gpanKV17Wa^f}x&)rZreA!epRM MBy+5}YPq-=0G1L>XaE2J literal 285 zcmWFw_TXj!f`TbUKNuPKOXG9%Q&MxnGE>U~it@8q7#SE?K++5!fH<+Fq$o3~v?Nub zEH&9!Au+xnzc{lbGe6Iot1PjoGBYn7Bw?aZh9ps%mzkDdl&g@NSYo1pW;#$?er5_# zDl<<(LzAnTO97(4B)0%)Uc8|-Pyoi(D_5{pFw`?Z5v!=I0*WHLLqQ=uCq4k`ETEhQ anw1J#a1%8_Mj@OERE(t6nyZ$Jiva+I*IVQO diff --git a/examples/runtime/shaders/glsl/vs_sss_gbuffer.bin b/examples/runtime/shaders/glsl/vs_sss_gbuffer.bin index af5d96a134b32d1ea45def80c26b6789994072ee..8554e755c052556f135286518ff65ab80ccaeb70 100644 GIT binary patch literal 576 zcmZutO>2Wd5Z#18VSDIb7|3NUX>irs(tD4ALM|c5qT8}X-C)(4l>XuViq5Xu7;z6G zZ{EC**}uNr6MV_~w_TElI?he1vb|PcyV88D7KE(qnB4V~E3#M;LhC}mnKFl5RuN2= z#q9LJkAl)no=sh`%p|hXrhsSQ9_RuZl|&%plljyZ7c)eEAcjaR&|GGMqL|$cp_xJf zLX~P0W6IQ@(+dW@0QE-9UNRc(b4=bConl>GFpqvyz~?f@VSpvqcu5X6q$+_SWP^2RcEs)hU)EC8Azi{x6$aPle)y)wI&<38|6_~Z$fRA6#X6Wrl ahd|+*vaZK}dp=aTwZwQ%Zm9G_Dft6p_OH7D literal 782 zcmZ`%!D@ss5KWhbLVD;g1bWdzMPock?>#OQ_OdKu)h;P&78_l6OTV%I(XZ%aH5$cw z3iIZ@dGp5Y>&qR2FM0TFSLnWu3Xx{{mS?9;B|g?S2(1;2ZhK^`{Hzd)rL6c{Ei=+& ziBICF6jc%DA)WvXfTQ^2l8bT%QGjIDCPGxH8{#Ie&b&NyYR#Z#lqqTcAut2+LR^>p z9n6p-mW<5ST1I!?9vlds0*9Bxvhf!tofTOe!9xVHgy=VUHr8_5^F@IW1JfPU=%&sI z`aK7B92BS`K~)PX=#WR7J}E$~nQ!u_o2fmY<{QfXb(%Yw=J(SqOJ51psN>q?N%`vZ z`ov*$cSwH8ENx=v?#KDQt>k*ra6sTq&N zGp36c+qJ>wH7_X5@>piqsG^f;FlP2^_S6k^DGyW?SO^v1BpL$bqN7?_IVD0#Dsh9Z zjk3fhO9B-9Oc&YDL(r*y=wriG)+R(%>V|)C?}PgqA0?q7nQ9AJS~lDPbscjaz3=P4 e6E|EA4%XMfX}jABJ;$}f0UwEI{O8#NfV}{(@mv}J literal 319 zcmZ9HI}d_D5QL9}>MTtB0cK0EAVTO+YfBOnTY_+sGr*Gbc&PEeyZA(|+RV2*Gq>Mu zCyXA>H!Fip>!`p~yJEWhNLd#5mf<2tbG_o(;do`kSxKn`HjOXRTmW*Ms7gDXLedxgX>V% nK`AnRyCjsmaC)iSY&b z#hD;+Yc8&`{LB=E+{Da04Nb0UE(IV+&xsF!$^-S4#^>gzq~?TWrj`d3KC%+&ILqWmltMg|5Juy<0mDj4b+pompeRsltkty54)&xsF!+76V{K(kUo3vQyOHCHVc7XtuL C1x76Z diff --git a/examples/runtime/shaders/glsl/vs_stencil_color_lighting.bin b/examples/runtime/shaders/glsl/vs_stencil_color_lighting.bin index 064847e61a81c785c3aea09afc7a955182bfce51..7d3889fd7a78c5f56266c2871025e69557a2d7bc 100644 GIT binary patch literal 458 zcmZ{fF>k^!5QSaDbPU~?Z*(e(0%Sn4x-+6yVvQ_FDvZQ2Cd}0pFmAyFphLR0ieT34R@X)qenM#F z%?76$CnGu&qY#&HI-MgwwDOWX;>kFUR876vboqM_z&~&DLojH-HXM}fU_fej3IFC` hOs25s$3_TI(fH$d8gbmVtz)?TzaJv&1x24k;s>e3iO>K5 literal 583 zcmZ{hF>k^!5QSZo$qd~(-G-Yj(;iqf6>!dr*4gJ2<#Y$5q*3ijsC(eV`*W(#|1Da$E5kkzv#to0Nt$ zqelv-c(&OhMa)VpobUM_7BI_;QSIySjnz0bz@`?z#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_stencil_texture.bin b/examples/runtime/shaders/glsl/vs_stencil_texture.bin index 3eda012466700ebf324c78dffad28c37a74a775c..42fef7b3ecdab3d5ba95a60cb37cf412de013861 100644 GIT binary patch literal 290 zcmZvWK?{OF5QSIpG#&Z}F-MIEHE&kujzZvd5w+M@oiMc``q|x^jUtl<=JMu!^Io#u zj06u&)=Nu_TUkz#0MQ^h#~xXv)$?QH3k? zTvQcyMYh0H9_gfv9s#?I7+@!x;*t^7xflJx{SO{6-g81nD(4oea$L9p^6a&Y-~Tyx b&<&?1E_A*fX6Vm7H+rGH5{&)?-2ucCD1cgg literal 315 zcmZ9HPYZ%T5XD#Mv_XA?n4@-xG;dbtjzZ8?OgGt3N4E7}(RXi*ip@C<@5j9N=5#zv z84WJ>TZ_%>sK8X@Cn?%c;dNp$HW@IR(H3j14%`)G k8CuuhNi|CXWO)>RIuo-;k+A$ZI)jzb_3dQ*^yHkq0N(3k(f|Me diff --git a/examples/runtime/shaders/glsl/vs_stencil_texture_lighting.bin b/examples/runtime/shaders/glsl/vs_stencil_texture_lighting.bin index fb723ebeefe2c06fec391961d36d54e172952852..887d065fb0b71d13724230f53d97383d399f1840 100644 GIT binary patch literal 553 zcmZ{gF;BxV5QPou(fc4Oo`8gQcT8gLR7Nc?p_v<#%pv8-T(SgWd9&i`MrgvuzfE90as2!1&O=hUs8s>u}H zOWyb1-Rk9WM)3K4{(G8`S(`Vitm>7hcGDX|rdA@i!E~wBhgV)FgcQbT@z$COx@x_E zB9}@xMV--sz){$$Pho_T7ZO9sRQt73x=b_L75X6L#=3Fn&The&;duOq4zp*pmEs+9 zKvS3n1o_7m+YISSl=zd75XJPH!m*TTw#d)t84gbG$qpW1o?zl&wm*E~G^`4+sq>|4 zj#?Ciu}HW(JI2T-u4*6nh8fl(CqD1XF$XTeE-C?)?RjntX| diff --git a/examples/runtime/shaders/glsl/vs_terrain.bin b/examples/runtime/shaders/glsl/vs_terrain.bin index fc276fbcf9201b27bf30697d0b3565002bd4a68e..2b783831cc993671d464826f496a659bacabf1f9 100644 GIT binary patch literal 340 zcmWFw_TXj!g7deer!X?`m&WJjr=;eDWu}$~6y;~JFfuT(fTS7Jfh?}lyv(%xqFjaC z#1az)G^N&DT=}IX3T3Iu#tLQe1^LC9C7Jno)?7J>l|XTgoc!cOkbr`%f`O(&W*$Ug zB9cO=ZX=-XlGKXi{QRO618mw2VcLxp5|LGMmE~uq0G*bZr=iJJ&7}YY2zLOjMYanf s3AY9;3+Gvb^`_^<2S7amlt%Ncf)>dACK?C}bQBEr3^c8|YPq-=04E-7ZU6uP literal 367 zcmZXQyAA>&5JfSu!om-*nNlr`kL`$!m8FS^?FM(zU=}dQ;w%1z|7GvjIQZD0QVnys zHzzFS(+0tFySJ`2(kxSDa#1X#*w3ul)N6#)111xkxN}x6ODDjKYy>>rnw@mgXhy%# z5Rnsy%ov;Z8TH&ArCz^6J_1E+omV+dNQL+d#BZ_lHN4OS zLd26L%euRFzT4j4UND-E&&#)SHm@^_g)&>Mo;MDkW@n7eI+)F?Y_Ifg?;lj_Yo{0? zbZFk`;&rJX(OIaZJs9QE8<_CL55-Eqf{Bmd9BU7a%2Q}Eui6~Z6^YvrV`i^klKy~|?%4mylR>@&IU@1~bpclDG6?w#2b$48$o7xd2_9^|(cvL_ z?eLC|1XG}{vpXz;NiETMaRf=6gmDX3kgnG;#qW%ECfoFZXw{@RqEczA;5T#x3tA%h HE9dMB=$@F) literal 513 zcmZ9Iu};G<5QYuvWQINf%Z(|jtkkqq#MXg8O_Hc8W&%yC0%)SiRdq;!%uh1h8 z@ON%Je0!%d2qxW^zWowH7A}~DE8v?AUI#mouECTw4j^8+!gyy#bYC$Xnpd;E%k-bo X!Muofzr%NVCL_XTqa*fvqm+CDCJ?86 diff --git a/examples/runtime/shaders/glsl/vs_terrain_render.bin b/examples/runtime/shaders/glsl/vs_terrain_render.bin index 7e45903b2ce58c6a60fb9588978e1cd3969ef6b0..ba0adeb844409a75e09cb7062895b4e5b19fafd9 100644 GIT binary patch literal 1704 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 diff --git a/examples/runtime/shaders/glsl/vs_tree.bin b/examples/runtime/shaders/glsl/vs_tree.bin index 40dd288b69664215da4f05465f39fc169fd9e5fe..5ee5907f2d5fc50f0ddf16cd60c34da4a7e2bddd 100644 GIT binary patch literal 614 zcmZ`#K~BRk5HwX!?tw3?#KoyfNz)1;S=>2RLh9ABl7NgH8->JeLA-#M@(b2+N}W=C zuLn@9OqzL@rxV*`m}NRc_a{eHmX6GWKmUi8{yX)rb(<8ueuB3M$#G zAcA=T{%@C4s^#9c4bwK4jj{&rVUd6`;L3anQoPzXr zph4k;lYtXWxy!Asi}c*U>@YAxXAzP*s|t*+3`^(-1w3ef1!8%JdHj5dr5O$+X&d^u55h|4u6JWI|XZP0XpBKCq9p{aDE3hJi?Iiru2ljs>A>2yK)|nv>dAMf}pOdE_uQ>M@(p7aOD1u{IJKnXDid6<(B4Scd!$8F@_*b-D<7 z6YEZu+1u0zi`1n$p)R0^O#p*x@}WuzsS;d|-#PRF0hpqqK(P!-`2Kzi8(8|(Wog&$ gMyfp$Aj`%6vzeGXsD$}1(d(nEt*<0&`Ga%z1mK@z)Bpeg diff --git a/examples/runtime/shaders/glsl/vs_vectordisplay_fb.bin b/examples/runtime/shaders/glsl/vs_vectordisplay_fb.bin index 53d00a7e4e570d4d1806ec2eca5dc09238b42422..1e9b2c401c8a53c8cce391ee60abe8d4f64ae5c4 100644 GIT binary patch literal 373 zcmZvXK?;IU5Qd-NYFc!KS!zV6xs&!Tg}|+dTD*8VVQNLR>ZDzv6EupVh_f1I{%`mu zJo+oarG0*1O|0uEr!-Tc%#OT@}R8j++sRjSV$tU#{d;$*;f^@q6zTDTl z?l$WYqhq~3Z;Oo!kzp*;osyS8QbrzxBEl5)+~25xM Ga?ZX*;C+(- diff --git a/examples/runtime/shaders/glsl/vs_vt_generic.bin b/examples/runtime/shaders/glsl/vs_vt_generic.bin index ea24e9df0847972c5153e39ab98ecca5ffebf1dc..5f577fc4e780ae71b5855f1976a7dd7da505251e 100644 GIT binary patch literal 348 zcmZvXK?{OF5QVo8g6TiR&`Bdg&D&PzjzQ2RWD&L4P$x`Hi~f6SDONP6;hTAH-t4yP zAyY-8)uPV^xriwUBdy1nR$~UaC}eouq;%@wSdAf1x^ZwN*nK3z3DTPm~5G|0B0rxvk_Mn^2GpR5F?9 y2HXKv9V4-6{MFs=E1cAq99?f;Fx?h)iKb}HOv9L!)$QH#m*+=1<@uH10l=OKTxd`L literal 426 zcmZutO^d=X6wEHdLiRt%J6aFL#@_0B_9zHmL_)P$iL`wso7OM<@4ooeD4Ww`W->F( zd^Y)J^sqY~eKKClMyuV_;I{L@SjRE!tCj_3DsPdBxYSysSG85psPzz1S>d0y8q0*g zP=Y9{_G?6w4HDj@=Ag@s`y`<8nYz@!XbLD&8$;V8;cvvX%OYBm7wU}Ux`bZ9PaK?S z47R8!L`De#k2~DK4@4p5d)WSPB-Ahd>L5I|_{TwnH;3MRpT%Ga{byw0Sm&_G<@7!c W#gX{2a4Qyp6MAc0dwHv!IcFD8QG?I` diff --git a/examples/runtime/shaders/glsl/vs_wf_mesh.bin b/examples/runtime/shaders/glsl/vs_wf_mesh.bin index 7e29e577531dc82476a5fd9df94b3d961b26a5e0..a886946cd76f4c104db2e2032020a33b24d093eb 100644 GIT binary patch literal 583 zcmZutO>2Wd5ZyL`md&BiUob}vX;9NcL3-~oP)H9V+l?`0%jyQBwrT0l?N8{vv+f!- zWDt>gAHFxM=cft5dHH?49g&-gWonbkl}JC9g?b-f5Hi*jA5vtQWzA}AFj%aU@QjhyH%gRLg@2Cb_h~t{<8ol$u4t{q2AhlAap^Y&oTexX z9x%23bh^AV@aLWzHmo^lkU3=6w-yrWMXWXppFb#y^c+-5DfZY+B%tZ^hk`P;f;>(U&oCpj-^LkU z!7|K2?d$T5RnEGA0EdXJo4lxLBbV^fcGOj?KF{v;wkLSDF~uvHnoW&rl9_(>a@o>7 z)9=8xuGE^28>j+YcRDoW^b9$bA#*SQr!k~yoYi|nifx!WEY+wQM5A=G7`SmNH!l69 Gl>7sypV|EY diff --git a/examples/runtime/shaders/glsl/vs_wf_vertex_pulling.bin b/examples/runtime/shaders/glsl/vs_wf_vertex_pulling.bin index 2bde83ed8a18a4fea4af07c42183e700ced59943..66fc8947a96f4d4f3d9ca432c0c2658c019a5d97 100644 GIT binary patch literal 3091 zcmcguOK;mo5LS~M3ii;yu$L5ME7Rn1`9fkBD0*mbK@0dI2m~!rHXDizB+`-+_>bj~ z-_~z-moHfgT(l@*nA-Vf=ke{#aBu$n?Yjw{&p%%$FDKtN$%k~4uD35-7 zt7TT)N%h0Pp*837>yfL}9j1h}pX#3bkf3Zcb* zVkVX$-fm+_{gDe1fd}%qtmI1_MjwI~dD_(_yw`)usdfzu)y~{e_)o>Z&5DqRZz5i?5t+RHtQD8ba8#n+?G4CM$cIX3SgI) ztSJ%1;y%4CGPbKW@6%1yluPOSk?rpDA~RPh!a3qHRAHatQaC=*KxcG{Op-s3O?mo5 zHevZcX7jX*|CLQnMI-y8>r6hkKaMHqF;Pkd_9I?g7qc8DiSW4s!x1Q(HgN@Y%28)S zk5DrS0=pj=up7^(?5R*T)j5PWKxnqAnrOXJywCLN^Aom_6SeX= zn?V%%YFd2i8d?#=9h!MERPz}|Xv!f>3k?O=BDQy}M5jXio`{%+*gD@sC%|_}|A()U zRzzo`w1m_WF?4$^HHo?@)Q7GekXglq@+$37p(&x-uDRt7O@9@#f>r(^cE(GgmXcfA z^l!N3G=KgPxA3UBMJ<49T8}u3MaS8YS?-Uu=ukDY#3?u-W;?B~F-s1PnN=S~ocEAf zBu1AW+4QEo{LrWKH9nnl^tEIA^f4qQ6jmFaBAxqm7?K#;Z|`;RE!x!uDj#vea|`M3I_=qO(wt(v@89EDPiTisBK3B_NeUTNe>c-XbgS>U$&+iQb1G&w9YAa)9nN zi|trGp$NSYedPw8@B1!>U*H9y8%5cLbE?@WWZVltE=Ask%cD?xq#C9aSmJrIR=F>u zrwfIt?~-J}J`fpr?=8?w+~U=Z8BFX0vIk&t+re8Bd>}q(HWDIvA`qY5?pkYOG(C|K zkJ1A1rfAbq5;y9mf+%~0g!Z0tL=N`;2spIBVF<+Xu7Zt9__fkhx0=?W($x1pn3na9 Y(IYEHj4B2fzIXbrN-@Y|eKd^8-xu`eX8-^I literal 13887 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 diff --git a/examples/runtime/shaders/glsl/vs_wf_wireframe.bin b/examples/runtime/shaders/glsl/vs_wf_wireframe.bin index 8ed4efe1bbc5b32a08e55c01fb7457a4587b53b0..a90c4b21029dcc39cfdc33b99c0a00d7b6a7e186 100644 GIT binary patch literal 450 zcmZut%}T>S5Z>B?vL1YeIVNIDVtXir-aQtCUP4&5+qA4~G9gW(ReUBdKAs0>v#F`2 z!yK0Re&(B9JwM$ts@>1`*O1-SBEwB;RyuuMmiRInFgCI9vdX0B<(HY&ao0wFHvNBvmux>(9 z+N^xAW_D+0?bXxc4Z$jYzCI`9wqa6j@^U5e-BPQU=>;KEN0Y0L8IbFS)m(GAy_^t& z2kRT#xiMO-8 z1)M}3XOl1;2n^)L+SJJ$8LPww)kFm|kG@lI2^L^vjfog$hW_sF-~mEE_=mmj-w@?& z*aV;`*|J*9cf1+evv=sXPJAO)~eeqNDrO&y?YX*gK^|Jwsps+ MJ}mI}M<0}uU#`8T3IG5A diff --git a/include/bgfx/bgfx.h b/include/bgfx/bgfx.h index 2e6c7f6cc..60198b888 100644 --- a/include/bgfx/bgfx.h +++ b/include/bgfx/bgfx.h @@ -66,8 +66,8 @@ namespace bgfx Gnm, //!< GNM Metal, //!< Metal Nvn, //!< NVN - OpenGLES, //!< OpenGL ES 2.0+ - OpenGL, //!< OpenGL 2.1+ + OpenGLES, //!< OpenGL ES 3.0+ + OpenGL, //!< OpenGL 4.3+ Vulkan, //!< Vulkan WebGPU, //!< WebGPU diff --git a/include/bgfx/c99/bgfx.h b/include/bgfx/c99/bgfx.h index d7cca9ca6..a180ce6fc 100644 --- a/include/bgfx/c99/bgfx.h +++ b/include/bgfx/c99/bgfx.h @@ -87,8 +87,8 @@ typedef enum bgfx_renderer_type BGFX_RENDERER_TYPE_GNM, /** ( 4) GNM */ BGFX_RENDERER_TYPE_METAL, /** ( 5) Metal */ BGFX_RENDERER_TYPE_NVN, /** ( 6) NVN */ - BGFX_RENDERER_TYPE_OPENGLES, /** ( 7) OpenGL ES 2.0+ */ - BGFX_RENDERER_TYPE_OPENGL, /** ( 8) OpenGL 2.1+ */ + BGFX_RENDERER_TYPE_OPENGLES, /** ( 7) OpenGL ES 3.0+ */ + BGFX_RENDERER_TYPE_OPENGL, /** ( 8) OpenGL 4.3+ */ BGFX_RENDERER_TYPE_VULKAN, /** ( 9) Vulkan */ BGFX_RENDERER_TYPE_WEBGPU, /** (10) WebGPU */ diff --git a/include/bgfx/defines.h b/include/bgfx/defines.h index c1847789a..63b85e37e 100644 --- a/include/bgfx/defines.h +++ b/include/bgfx/defines.h @@ -15,7 +15,7 @@ #ifndef BGFX_DEFINES_H_HEADER_GUARD #define BGFX_DEFINES_H_HEADER_GUARD -#define BGFX_API_VERSION UINT32_C(154) +#define BGFX_API_VERSION UINT32_C(155) /** * Color RGB/alpha/depth write. When it's not specified write will be disabled. diff --git a/scripts/bgfx.idl b/scripts/bgfx.idl index e3d5e387f..f0890b020 100644 --- a/scripts/bgfx.idl +++ b/scripts/bgfx.idl @@ -1,7 +1,7 @@ -- vim: syntax=lua -- bgfx interface -version(154) +version(155) typedef "bool" typedef "char" @@ -517,8 +517,8 @@ enum.RendererType { comment = "Renderer types:", section = "Renderer" } .Gnm --- GNM .Metal --- Metal .Nvn --- NVN - .OpenGLES --- OpenGL ES 2.0+ - .OpenGL --- OpenGL 2.1+ + .OpenGLES --- OpenGL ES 3.0+ + .OpenGL --- OpenGL 4.3+ .Vulkan --- Vulkan .WebGPU --- WebGPU () diff --git a/scripts/genie.lua b/scripts/genie.lua index fd03adcf0..b0de201a8 100644 --- a/scripts/genie.lua +++ b/scripts/genie.lua @@ -260,12 +260,12 @@ function exampleProjectDefaults() linkoptions { "/ignore:4199", -- LNK4199: /DELAYLOAD:*.dll ignored; no imports found from *.dll } - links { -- this is needed only for testing with GLES2/3 on Windows with VS2008 + links { -- this is needed only for testing with GLES on Windows with VS2008 "DelayImp", } configuration { "vs201*", "x32 or x64" } - linkoptions { -- this is needed only for testing with GLES2/3 on Windows with VS201x + linkoptions { -- this is needed only for testing with GLES on Windows with VS201x "/DELAYLOAD:\"libEGL.dll\"", "/DELAYLOAD:\"libGLESv2.dll\"", } diff --git a/scripts/geometryv.lua b/scripts/geometryv.lua index 82445ee85..4ed06c46f 100644 --- a/scripts/geometryv.lua +++ b/scripts/geometryv.lua @@ -60,12 +60,12 @@ project ("geometryv") linkoptions { "/ignore:4199", -- LNK4199: /DELAYLOAD:*.dll ignored; no imports found from *.dll } - links { -- this is needed only for testing with GLES2/3 on Windows with VS2008 + links { -- this is needed only for testing with GLES on Windows with VS2008 "DelayImp", } configuration { "vs201*" } - linkoptions { -- this is needed only for testing with GLES2/3 on Windows with VS201x + linkoptions { -- this is needed only for testing with GLES on Windows with VS201x "/DELAYLOAD:\"libEGL.dll\"", "/DELAYLOAD:\"libGLESv2.dll\"", } diff --git a/scripts/shader-embeded.mk b/scripts/shader-embeded.mk index 2e2975673..f5c487c0c 100644 --- a/scripts/shader-embeded.mk +++ b/scripts/shader-embeded.mk @@ -24,9 +24,9 @@ SHADER_TMP = $(TEMP)/tmp vs_%.bin.h : vs_%.sc @echo [$(<)] - $(SILENT) $(SHADERC) $(VS_FLAGS) --platform linux -p 120 -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_glsl + $(SILENT) $(SHADERC) $(VS_FLAGS) --platform linux -p 430 -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_glsl @cat "$(SHADER_TMP)" > $(@) - -$(SILENT) $(SHADERC) $(VS_FLAGS) --platform android -p 100_es -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_essl + -$(SILENT) $(SHADERC) $(VS_FLAGS) --platform android -p 300_es -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_essl -@cat "$(SHADER_TMP)" >> $(@) -$(SILENT) $(SHADERC) $(VS_FLAGS) --platform linux -p spirv -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_spv -@cat "$(SHADER_TMP)" >> $(@) @@ -43,9 +43,9 @@ vs_%.bin.h : vs_%.sc fs_%.bin.h : fs_%.sc @echo [$(<)] - $(SILENT) $(SHADERC) $(FS_FLAGS) --platform linux -p 120 -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_glsl + $(SILENT) $(SHADERC) $(FS_FLAGS) --platform linux -p 430 -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_glsl @cat "$(SHADER_TMP)" > $(@) - -$(SILENT) $(SHADERC) $(FS_FLAGS) --platform android -p 100_es -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_essl + -$(SILENT) $(SHADERC) $(FS_FLAGS) --platform android -p 300_es -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_essl -@cat "$(SHADER_TMP)" >> $(@) -$(SILENT) $(SHADERC) $(FS_FLAGS) --platform linux -p spirv -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_spv -@cat "$(SHADER_TMP)" >> $(@) @@ -64,7 +64,7 @@ cs_%.bin.h : cs_%.sc @echo [$(<)] $(SILENT) $(SHADERC) $(CS_FLAGS) --platform linux -p 430 -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_glsl @cat "$(SHADER_TMP)" > $(@) - -$(SILENT) $(SHADERC) $(CS_FLAGS) --platform android -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_essl + -$(SILENT) $(SHADERC) $(CS_FLAGS) --platform android -p 310_es -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_essl -@cat "$(SHADER_TMP)" >> $(@) -$(SILENT) $(SHADERC) $(CS_FLAGS) --platform linux -p spirv -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_spv -@cat "$(SHADER_TMP)" >> $(@) diff --git a/scripts/shader.mk b/scripts/shader.mk index 8384a8f01..325c234d0 100644 --- a/scripts/shader.mk +++ b/scripts/shader.mk @@ -66,14 +66,14 @@ CS_FLAGS=--platform windows -p s_5_0 -O 1 SHADER_PATH=shaders/dxbc else ifeq ($(TARGET), $(filter $(TARGET), 2 3)) -VS_FLAGS=--platform android -p 100_es -FS_FLAGS=--platform android -p 100_es -CS_FLAGS=--platform android -p 300_es +VS_FLAGS=--platform android -p 300_es +FS_FLAGS=--platform android -p 300_es +CS_FLAGS=--platform android -p 310_es SHADER_PATH=shaders/essl else ifeq ($(TARGET), 4) -VS_FLAGS=--platform linux -p 120 -FS_FLAGS=--platform linux -p 120 +VS_FLAGS=--platform linux -p 430 +FS_FLAGS=--platform linux -p 430 CS_FLAGS=--platform linux -p 430 SHADER_PATH=shaders/glsl else diff --git a/scripts/shaderc.lua b/scripts/shaderc.lua index 97d44993d..b23a0a446 100644 --- a/scripts/shaderc.lua +++ b/scripts/shaderc.lua @@ -5,7 +5,6 @@ group "tools/shaderc" -local GLSL_OPTIMIZER = path.join(BGFX_DIR, "3rdparty/glsl-optimizer") local FCPP_DIR = path.join(BGFX_DIR, "3rdparty/fcpp") local GLSLANG = path.join(BGFX_DIR, "3rdparty/glslang") local SPIRV_CROSS = path.join(BGFX_DIR, "3rdparty/spirv-cross") @@ -408,261 +407,6 @@ project "glslang" configuration {} -project "glsl-optimizer" - kind "StaticLib" - - includedirs { - path.join(GLSL_OPTIMIZER, "src"), - path.join(GLSL_OPTIMIZER, "include"), - path.join(GLSL_OPTIMIZER, "src/mesa"), - path.join(GLSL_OPTIMIZER, "src/mapi"), - path.join(GLSL_OPTIMIZER, "src/glsl"), - } - - files { - path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/glcpp.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/glcpp-lex.c"), - path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/glcpp-parse.c"), - path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/glcpp-parse.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/pp.c"), - - path.join(GLSL_OPTIMIZER, "src/glsl/ast.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ast_array_index.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ast_expr.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ast_function.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ast_to_hir.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ast_type.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/builtin_functions.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/builtin_type_macros.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/builtin_types.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/builtin_variables.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/glsl_lexer.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/glsl_optimizer.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/glsl_optimizer.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/glsl_parser.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/glsl_parser.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/glsl_parser_extras.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/glsl_parser_extras.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/glsl_symbol_table.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/glsl_symbol_table.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/glsl_types.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/glsl_types.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/hir_field_selection.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_basic_block.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_basic_block.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_builder.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_builder.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_clone.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_constant_expression.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_equals.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_expression_flattening.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_expression_flattening.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_function.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_function_can_inline.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_function_detect_recursion.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_function_inlining.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_hierarchical_visitor.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_hierarchical_visitor.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_hv_accept.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_import_prototypes.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_optimization.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_print_glsl_visitor.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_print_glsl_visitor.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_print_metal_visitor.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_print_metal_visitor.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_print_visitor.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_print_visitor.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_rvalue_visitor.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_rvalue_visitor.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_stats.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_stats.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_uniform.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_unused_structs.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_unused_structs.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_validate.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_variable_refcount.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_variable_refcount.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_visitor.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/link_atomics.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/link_functions.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/link_interface_blocks.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/link_uniform_block_active_visitor.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/link_uniform_block_active_visitor.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/link_uniform_blocks.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/link_uniform_initializers.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/link_uniforms.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/link_varyings.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/link_varyings.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/linker.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/linker.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/list.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/loop_analysis.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/loop_analysis.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/loop_controls.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/loop_unroll.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_clip_distance.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_discard.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_discard_flow.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_if_to_cond_assign.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_instructions.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_jumps.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_mat_op_to_vec.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_named_interface_blocks.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_noise.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_offset_array.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_output_reads.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_packed_varyings.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_packing_builtins.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_ubo_reference.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_variable_index_to_cond_assign.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_vec_index_to_cond_assign.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_vec_index_to_swizzle.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_vector.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_vector_insert.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/lower_vertex_id.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_algebraic.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_array_splitting.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_constant_folding.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_constant_propagation.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_constant_variable.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_copy_propagation.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_copy_propagation_elements.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_cse.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_dead_builtin_variables.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_dead_builtin_varyings.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_dead_code.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_dead_code_local.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_dead_functions.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_flatten_nested_if_blocks.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_flip_matrices.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_function_inlining.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_if_simplification.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_minmax.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_noop_swizzle.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_rebalance_tree.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_redundant_jumps.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_structure_splitting.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_swizzle_swizzle.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_tree_grafting.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/opt_vectorize.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/program.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/s_expression.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/s_expression.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/standalone_scaffolding.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/standalone_scaffolding.h"), - path.join(GLSL_OPTIMIZER, "src/glsl/strtod.c"), - path.join(GLSL_OPTIMIZER, "src/glsl/strtod.h"), - - path.join(GLSL_OPTIMIZER, "src/mesa/main/compiler.h"), - path.join(GLSL_OPTIMIZER, "src/mesa/main/config.h"), - path.join(GLSL_OPTIMIZER, "src/mesa/main/context.h"), - path.join(GLSL_OPTIMIZER, "src/mesa/main/core.h"), - path.join(GLSL_OPTIMIZER, "src/mesa/main/dd.h"), - path.join(GLSL_OPTIMIZER, "src/mesa/main/errors.h"), - path.join(GLSL_OPTIMIZER, "src/mesa/main/glheader.h"), - path.join(GLSL_OPTIMIZER, "src/mesa/main/glminimal.h"), - path.join(GLSL_OPTIMIZER, "src/mesa/main/imports.c"), - path.join(GLSL_OPTIMIZER, "src/mesa/main/imports.h"), - path.join(GLSL_OPTIMIZER, "src/mesa/main/macros.h"), - path.join(GLSL_OPTIMIZER, "src/mesa/main/mtypes.h"), - path.join(GLSL_OPTIMIZER, "src/mesa/main/simple_list.h"), - - path.join(GLSL_OPTIMIZER, "src/mesa/program/hash_table.h"), - path.join(GLSL_OPTIMIZER, "src/mesa/program/prog_hash_table.c"), - path.join(GLSL_OPTIMIZER, "src/mesa/program/prog_instruction.h"), - path.join(GLSL_OPTIMIZER, "src/mesa/program/prog_parameter.h"), - path.join(GLSL_OPTIMIZER, "src/mesa/program/prog_statevars.h"), - path.join(GLSL_OPTIMIZER, "src/mesa/program/symbol_table.c"), - path.join(GLSL_OPTIMIZER, "src/mesa/program/symbol_table.h"), - - path.join(GLSL_OPTIMIZER, "src/util/hash_table.c"), - path.join(GLSL_OPTIMIZER, "src/util/hash_table.h"), - path.join(GLSL_OPTIMIZER, "src/util/macros.h"), - path.join(GLSL_OPTIMIZER, "src/util/ralloc.c"), - path.join(GLSL_OPTIMIZER, "src/util/ralloc.h"), - } - - removefiles { - path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/glcpp.c"), - path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/tests/**"), - path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/**.l"), - path.join(GLSL_OPTIMIZER, "src/glsl/glcpp/**.y"), - path.join(GLSL_OPTIMIZER, "src/glsl/ir_set_program_inouts.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/main.cpp"), - path.join(GLSL_OPTIMIZER, "src/glsl/builtin_stubs.cpp"), - } - - removeflags { - "FloatFast", -- clang 17 has issues errors originating in glsl-optimizer when float optimizations are enabled - } - - configuration { "Release" } - flags { - "Optimize", - } - - removeflags { - -- GCC 4.9 -O2 + -fno-strict-aliasing don't work together... - "OptimizeSpeed", - } - - configuration { "vs*" } - includedirs { - path.join(GLSL_OPTIMIZER, "src/glsl/msvc"), - } - - defines { -- glsl-optimizer - "__STDC__", - "__STDC_VERSION__=199901L", - "strdup=_strdup", - "alloca=_alloca", - "isascii=__isascii", - } - - buildoptions { - "/wd4100", -- error C4100: '' : unreferenced formal parameter - "/wd4127", -- warning C4127: conditional expression is constant - "/wd4132", -- warning C4132: 'deleted_key_value': const object should be initialized - "/wd4189", -- warning C4189: 'interface_type': local variable is initialized but not referenced - "/wd4204", -- warning C4204: nonstandard extension used: non-constant aggregate initializer - "/wd4244", -- warning C4244: '=': conversion from 'const flex_int32_t' to 'YY_CHAR', possible loss of data - "/wd4389", -- warning C4389: '!=': signed/unsigned mismatch - "/wd4245", -- warning C4245: 'return': conversion from 'int' to 'unsigned int', signed/unsigned mismatch - "/wd4701", -- warning C4701: potentially uninitialized local variable 'lower' used - "/wd4702", -- warning C4702: unreachable code - "/wd4706", -- warning C4706: assignment within conditional expression - "/wd4996", -- warning C4996: 'strdup': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strdup. - } - - configuration { "mingw* or linux* or osx*" } - buildoptions { - "-fno-strict-aliasing", -- glsl-optimizer has bugs if strict aliasing is used. - - "-Wno-implicit-fallthrough", - "-Wno-parentheses", - "-Wno-sign-compare", - "-Wno-unused-function", - "-Wno-unused-parameter", - } - - removebuildoptions { - "-Wshadow", -- glsl-optimizer is full of -Wshadow warnings ignore it. - } - - configuration { "osx*" } - buildoptions { - "-Wno-deprecated-register", - } - - configuration { "mingw* or linux-gcc-*" } - buildoptions { - "-Wno-misleading-indentation", - } - - configuration {} - project "fcpp" kind "StaticLib" @@ -718,9 +462,6 @@ project "shaderc" path.join(BGFX_DIR, "3rdparty/glslang/glslang/Include"), path.join(BGFX_DIR, "3rdparty/glslang"), - path.join(GLSL_OPTIMIZER, "include"), - path.join(GLSL_OPTIMIZER, "src/glsl"), - SPIRV_CROSS, path.join(SPIRV_TOOLS, "include"), @@ -732,7 +473,6 @@ project "shaderc" links { "fcpp", "glslang", - "glsl-optimizer", "spirv-opt", "spirv-cross", "tint-api", @@ -757,11 +497,6 @@ project "shaderc" "Cocoa.framework", } - configuration { "vs*" } - includedirs { - path.join(GLSL_OPTIMIZER, "include/c99"), - } - configuration { "vs20* or mingw*" } links { "psapi", diff --git a/scripts/texturev.lua b/scripts/texturev.lua index 59a6d60b5..b355e0c08 100644 --- a/scripts/texturev.lua +++ b/scripts/texturev.lua @@ -120,12 +120,12 @@ project "texturev" linkoptions { "/ignore:4199", -- LNK4199: /DELAYLOAD:*.dll ignored; no imports found from *.dll } - links { -- this is needed only for testing with GLES2/3 on Windows with VS2008 + links { -- this is needed only for testing with GLES on Windows with VS2008 "DelayImp", } configuration { "vs201*" } - linkoptions { -- this is needed only for testing with GLES2/3 on Windows with VS201x + linkoptions { -- this is needed only for testing with GLES on Windows with VS201x "/DELAYLOAD:\"libEGL.dll\"", "/DELAYLOAD:\"libGLESv2.dll\"", } diff --git a/src/bgfx_p.h b/src/bgfx_p.h index a0114207a..8079f22ac 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -243,42 +243,22 @@ namespace stl = std; #define BGFX_RENDERER_WEBGPU_NAME "WebGPU" #if BGFX_CONFIG_RENDERER_OPENGL -# if BGFX_CONFIG_RENDERER_OPENGL >= 31 && BGFX_CONFIG_RENDERER_OPENGL <= 33 -# if BGFX_CONFIG_RENDERER_OPENGL == 31 -# define BGFX_RENDERER_OPENGL_NAME "OpenGL 3.1" -# elif BGFX_CONFIG_RENDERER_OPENGL == 32 -# define BGFX_RENDERER_OPENGL_NAME "OpenGL 3.2" -# else -# define BGFX_RENDERER_OPENGL_NAME "OpenGL 3.3" -# endif // 31+ -# elif BGFX_CONFIG_RENDERER_OPENGL >= 40 && BGFX_CONFIG_RENDERER_OPENGL <= 46 -# if BGFX_CONFIG_RENDERER_OPENGL == 40 -# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.0" -# elif BGFX_CONFIG_RENDERER_OPENGL == 41 -# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.1" -# elif BGFX_CONFIG_RENDERER_OPENGL == 42 -# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.2" -# elif BGFX_CONFIG_RENDERER_OPENGL == 43 -# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.3" -# elif BGFX_CONFIG_RENDERER_OPENGL == 44 -# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.4" -# elif BGFX_CONFIG_RENDERER_OPENGL == 45 -# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.5" -# else -# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.6" -# endif // 40+ +# if BGFX_CONFIG_RENDERER_OPENGL == 43 +# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.3" +# elif BGFX_CONFIG_RENDERER_OPENGL == 44 +# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.4" +# elif BGFX_CONFIG_RENDERER_OPENGL == 45 +# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.5" # else -# define BGFX_RENDERER_OPENGL_NAME "OpenGL 2.1" +# define BGFX_RENDERER_OPENGL_NAME "OpenGL 4.6" # endif // BGFX_CONFIG_RENDERER_OPENGL #elif BGFX_CONFIG_RENDERER_OPENGLES # if BGFX_CONFIG_RENDERER_OPENGLES == 30 # define BGFX_RENDERER_OPENGL_NAME "OpenGL ES 3.0" # elif BGFX_CONFIG_RENDERER_OPENGLES == 31 # define BGFX_RENDERER_OPENGL_NAME "OpenGL ES 3.1" -# elif BGFX_CONFIG_RENDERER_OPENGLES >= 32 -# define BGFX_RENDERER_OPENGL_NAME "OpenGL ES 3.2" # else -# define BGFX_RENDERER_OPENGL_NAME "OpenGL ES 2.0" +# define BGFX_RENDERER_OPENGL_NAME "OpenGL ES 3.2" # endif // BGFX_CONFIG_RENDERER_OPENGLES #else # define BGFX_RENDERER_OPENGL_NAME "OpenGL" diff --git a/src/bgfx_shader.sh b/src/bgfx_shader.sh index 718c981ff..befb708f6 100644 --- a/src/bgfx_shader.sh +++ b/src/bgfx_shader.sh @@ -643,27 +643,22 @@ vec4 mod(vec4 _a, vec4 _b) { return _a - _b * floor(_a / _b); } # define ISAMPLER3D(_name, _reg) uniform isampler3D _name # define USAMPLER3D(_name, _reg) uniform usampler3D _name -# if BGFX_SHADER_LANGUAGE_GLSL >= 130 -# define texture2D(_sampler, _coord) texture(_sampler, _coord) -# define texture2DArray(_sampler, _coord) texture(_sampler, _coord) -# define texture3D(_sampler, _coord) texture(_sampler, _coord) -# define textureCube(_sampler, _coord) texture(_sampler, _coord) -# define texture2DLod(_sampler, _coord, _lod) textureLod(_sampler, _coord, _lod) -# define texture2DLodOffset(_sampler, _coord, _lod, _offset) textureLodOffset(_sampler, _coord, _lod, _offset) -# define texture2DArrayLod(_sampler, _coord, _lod) textureLod(_sampler, _coord, _lod) -# define texture2DArrayLodOffset(_sampler, _coord, _lod, _offset) textureLodOffset(_sampler, _coord, _lod, _offset) -# define texture3DLod(_sampler, _coord, _lod) textureLod(_sampler, _coord, _lod) -# define texture3DLodOffset(_sampler, _coord, _lod, _offset) textureLodOffset(_sampler, _coord, _lod, _offset) -# define textureCubeLod(_sampler, _coord, _lod) textureLod(_sampler, _coord, _lod) -# define texture2DGrad(_sampler, _coord, _dPdx, _dPdy) textureGrad(_sampler, _coord, _dPdx, _dPdy) -# define texture3DGrad(_sampler, _coord, _dPdx, _dPdy) textureGrad(_sampler, _coord, _dPdx, _dPdy) -# define textureCubeGrad(_sampler, _coord, _dPdx, _dPdy) textureGrad(_sampler, _coord, _dPdx, _dPdy) -# define texture2DBias(_sampler, _coord, _bias) texture(_sampler, _coord, _bias) -# define textureCubeBias(_sampler, _coord, _bias) texture(_sampler, _coord, _bias) -# else -# define texture2DBias(_sampler, _coord, _bias) texture2D(_sampler, _coord, _bias) -# define textureCubeBias(_sampler, _coord, _bias) textureCube(_sampler, _coord, _bias) -# endif // BGFX_SHADER_LANGUAGE_GLSL >= 130 +# define texture2D(_sampler, _coord) texture(_sampler, _coord) +# define texture2DArray(_sampler, _coord) texture(_sampler, _coord) +# define texture3D(_sampler, _coord) texture(_sampler, _coord) +# define textureCube(_sampler, _coord) texture(_sampler, _coord) +# define texture2DLod(_sampler, _coord, _lod) textureLod(_sampler, _coord, _lod) +# define texture2DLodOffset(_sampler, _coord, _lod, _offset) textureLodOffset(_sampler, _coord, _lod, _offset) +# define texture2DArrayLod(_sampler, _coord, _lod) textureLod(_sampler, _coord, _lod) +# define texture2DArrayLodOffset(_sampler, _coord, _lod, _offset) textureLodOffset(_sampler, _coord, _lod, _offset) +# define texture3DLod(_sampler, _coord, _lod) textureLod(_sampler, _coord, _lod) +# define texture3DLodOffset(_sampler, _coord, _lod, _offset) textureLodOffset(_sampler, _coord, _lod, _offset) +# define textureCubeLod(_sampler, _coord, _lod) textureLod(_sampler, _coord, _lod) +# define texture2DGrad(_sampler, _coord, _dPdx, _dPdy) textureGrad(_sampler, _coord, _dPdx, _dPdy) +# define texture3DGrad(_sampler, _coord, _dPdx, _dPdy) textureGrad(_sampler, _coord, _dPdx, _dPdy) +# define textureCubeGrad(_sampler, _coord, _dPdx, _dPdy) textureGrad(_sampler, _coord, _dPdx, _dPdy) +# define texture2DBias(_sampler, _coord, _bias) texture(_sampler, _coord, _bias) +# define textureCubeBias(_sampler, _coord, _bias) texture(_sampler, _coord, _bias) float rcp(float _a) { return 1.0/_a; } vec2 rcp(vec2 _a) { return vec2(1.0)/_a; } @@ -675,16 +670,9 @@ vec2 vec2_splat(float _x) { return vec2(_x, _x); } vec3 vec3_splat(float _x) { return vec3(_x, _x, _x); } vec4 vec4_splat(float _x) { return vec4(_x, _x, _x, _x); } -#if BGFX_SHADER_LANGUAGE_GLSL >= 130 \ - || BGFX_SHADER_LANGUAGE_HLSL \ - || BGFX_SHADER_LANGUAGE_PSSL \ - || BGFX_SHADER_LANGUAGE_SPIRV \ - || BGFX_SHADER_LANGUAGE_METAL \ - || BGFX_SHADER_LANGUAGE_WGSL uvec2 uvec2_splat(uint _x) { return uvec2(_x, _x); } uvec3 uvec3_splat(uint _x) { return uvec3(_x, _x, _x); } uvec4 uvec4_splat(uint _x) { return uvec4(_x, _x, _x, _x); } -#endif // BGFX_SHADER_LANGUAGE_* #if BGFX_SHADER_LANGUAGE_GLSL # define mul(_a, _b) ( (_a) * (_b) ) @@ -734,7 +722,6 @@ mat3 mtxFromCols(vec3 _0, vec3 _1, vec3 _2) #endif // BGFX_SHADER_LANGUAGE_GLSL } -#if !BGFX_SHADER_LANGUAGE_ESSL mat4x3 mtxFromRows(vec4 _0, vec4 _1, vec4 _2) { #if BGFX_SHADER_MATRIX_COLUMN_MAJOR @@ -743,7 +730,6 @@ mat4x3 mtxFromRows(vec4 _0, vec4 _1, vec4 _2) return mat4x3(_0, _1, _2); #endif // BGFX_SHADER_LANGUAGE_GLSL } -#endif // !BGFX_SHADER_LANGUAGE_ESSL vec3 mtxGetRow(mat3 _mtx, int _row) { @@ -763,7 +749,6 @@ vec3 mtxGetColumn(mat3 _mtx, int _column) #endif // BGFX_SHADER_LANGUAGE_GLSL } -#if !BGFX_SHADER_LANGUAGE_ESSL vec4 mtxGetRow(mat4x3 _mtx, int _row) { #if BGFX_SHADER_MATRIX_COLUMN_MAJOR @@ -781,7 +766,6 @@ vec3 mtxGetColumn(mat4x3 _mtx, int _column) return vec3(_mtx[0][_column], _mtx[1][_column], _mtx[2][_column]); #endif // BGFX_SHADER_LANGUAGE_GLSL } -#endif // !BGFX_SHADER_LANGUAGE_ESSL vec4 mtxGetRow(mat4 _mtx, int _row) { @@ -827,12 +811,6 @@ vec4 select(bool _cond, vec4 _true, vec4 _false) { return _cond ? _true : _f vec2 select(bvec2 _cond, vec2 _true, vec2 _false) { return (vec2(_cond) * _true) + (vec2(not(_cond) ) * _false); } vec3 select(bvec3 _cond, vec3 _true, vec3 _false) { return (vec3(_cond) * _true) + (vec3(not(_cond) ) * _false); } vec4 select(bvec4 _cond, vec4 _true, vec4 _false) { return (vec4(_cond) * _true) + (vec4(not(_cond) ) * _false); } -# if BGFX_SHADER_LANGUAGE_GLSL >= 130 \ - || BGFX_SHADER_LANGUAGE_HLSL \ - || BGFX_SHADER_LANGUAGE_PSSL \ - || BGFX_SHADER_LANGUAGE_SPIRV \ - || BGFX_SHADER_LANGUAGE_METAL \ - || BGFX_SHADER_LANGUAGE_WGSL int select(bool _cond, int _true, int _false) { return _cond ? _true : _false; } ivec2 select(bool _cond, ivec2 _true, ivec2 _false) { return _cond ? _true : _false; } ivec3 select(bool _cond, ivec3 _true, ivec3 _false) { return _cond ? _true : _false; } @@ -847,7 +825,6 @@ uvec4 select(bool _cond, uvec4 _true, uvec4 _false) { return _cond ? _true : _f uvec2 select(bvec2 _cond, uvec2 _true, uvec2 _false) { return (uvec2(_cond) * _true) + (uvec2(not(_cond) ) * _false); } uvec3 select(bvec3 _cond, uvec3 _true, uvec3 _false) { return (uvec3(_cond) * _true) + (uvec3(not(_cond) ) * _false); } uvec4 select(bvec4 _cond, uvec4 _true, uvec4 _false) { return (uvec4(_cond) * _true) + (uvec4(not(_cond) ) * _false); } -# endif // BGFX_SHADER_LANGUAGE_* #endif // !BGFX_SHADER_LANGUAGE_DXIL uniform vec4 u_viewRect; diff --git a/src/config.h b/src/config.h index e986734df..c25fd61d7 100644 --- a/src/config.h +++ b/src/config.h @@ -75,7 +75,7 @@ # endif // BGFX_CONFIG_RENDERER_NVN # ifndef BGFX_CONFIG_RENDERER_OPENGL_MIN_VERSION -# define BGFX_CONFIG_RENDERER_OPENGL_MIN_VERSION 1 +# define BGFX_CONFIG_RENDERER_OPENGL_MIN_VERSION 43 # endif // BGFX_CONFIG_RENDERER_OPENGL_MIN_VERSION # ifndef BGFX_CONFIG_RENDERER_OPENGL @@ -167,15 +167,15 @@ # endif // BGFX_CONFIG_RENDERER_WEBGPU #endif // !defined... -#if BGFX_CONFIG_RENDERER_OPENGL && BGFX_CONFIG_RENDERER_OPENGL < 21 +#if BGFX_CONFIG_RENDERER_OPENGL && BGFX_CONFIG_RENDERER_OPENGL < 43 # undef BGFX_CONFIG_RENDERER_OPENGL -# define BGFX_CONFIG_RENDERER_OPENGL 21 -#endif // BGFX_CONFIG_RENDERER_OPENGL && BGFX_CONFIG_RENDERER_OPENGL < 21 +# define BGFX_CONFIG_RENDERER_OPENGL 43 +#endif // BGFX_CONFIG_RENDERER_OPENGL && BGFX_CONFIG_RENDERER_OPENGL < 43 -#if BGFX_CONFIG_RENDERER_OPENGLES && BGFX_CONFIG_RENDERER_OPENGLES < 20 +#if BGFX_CONFIG_RENDERER_OPENGLES && BGFX_CONFIG_RENDERER_OPENGLES < 30 # undef BGFX_CONFIG_RENDERER_OPENGLES -# define BGFX_CONFIG_RENDERER_OPENGLES 20 -#endif // BGFX_CONFIG_RENDERER_OPENGLES && BGFX_CONFIG_RENDERER_OPENGLES < 20 +# define BGFX_CONFIG_RENDERER_OPENGLES 30 +#endif // BGFX_CONFIG_RENDERER_OPENGLES && BGFX_CONFIG_RENDERER_OPENGLES < 30 #if BGFX_CONFIG_RENDERER_OPENGL && BGFX_CONFIG_RENDERER_OPENGLES # error "Can't define both BGFX_CONFIG_RENDERER_OPENGL and BGFX_CONFIG_RENDERER_OPENGLES" diff --git a/src/cs_mipgen_oddx.bin.h b/src/cs_mipgen_oddx.bin.h index b9eab551e..d4bd1e8b6 100644 --- a/src/cs_mipgen_oddx.bin.h +++ b/src/cs_mipgen_oddx.bin.h @@ -1,790 +1,586 @@ -static const uint8_t cs_mipgen_oddx_glsl[6373] = +static const uint8_t cs_mipgen_oddx_glsl[4604] = { - 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x18, // CSH............. - 0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x33, 0x30, 0x0a, 0x66, // ..#version 430.f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x63, 0x70, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // loat rcp(float _ - 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2e, 0x30, 0x2f, // a) { return 1.0/ - 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, // _a; }.vec2 rcp(v - 0x65, 0x63, 0x32, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // ec2 _a) { return - 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, // vec2(1.0)/_a; } - 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // .vec3 rcp(vec3 _ - 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, // a) { return vec3 - 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, // (1.0)/_a; }.vec4 - 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, // rcp(vec4 _a) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, // return vec4(1.0) - 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x65, 0x63, 0x32, // /_a; }.vec2 vec2 - 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, // _splat(float _x) - 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, // { return vec2(_ - 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // x, _x); }.vec3 v - 0x65, 0x63, 0x33, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // ec3_splat(float - 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, // _x) { return vec - 0x33, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, // 3(_x, _x, _x); } - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, // .vec4 vec4_splat - 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // (float _x) { ret - 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, // urn vec4(_x, _x, - 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, // _x, _x); }.uvec - 0x32, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, 0x69, // 2 uvec2_splat(ui - 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // nt _x) { return - 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, // uvec2(_x, _x); } - 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x5f, 0x73, 0x70, 0x6c, // .uvec3 uvec3_spl - 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, // at(uint _x) { re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, // turn uvec3(_x, _ - 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, // x, _x); }.uvec4 - 0x75, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, // uvec4_splat(uint - 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x76, // _x) { return uv - 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, // ec4(_x, _x, _x, - 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x46, // _x); }.mat4 mtxF - 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x30, 0x2c, // romRows(vec4 _0, - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // vec4 _1, vec4 _ - 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // 2, vec4 _3).{.re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, // turn transpose(m - 0x61, 0x74, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x2c, 0x20, // at4(_0, _1, _2, - 0x5f, 0x33, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x74, // _3) );.}.mat4 mt - 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // xFromCols(vec4 _ - 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, // 0, vec4 _1, vec4 - 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, 0x0a, 0x7b, 0x0a, // _2, vec4 _3).{. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, // return mat4(_0, - 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, // _1, _2, _3);.}.m - 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, // at3 mtxFromRows( - 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, // vec3 _0, vec3 _1 - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, // , vec3 _2).{.ret - 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, // urn transpose(ma - 0x74, 0x33, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, 0x20, 0x29, // t3(_0, _1, _2) ) - 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, // ;.}.mat3 mtxFrom - 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, // Cols(vec3 _0, ve - 0x63, 0x33, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x29, 0x0a, // c3 _1, vec3 _2). - 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x5f, 0x30, // {.return mat3(_0 - 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, // , _1, _2);.}.mat - 0x34, 0x78, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, // 4x3 mtxFromRows( - 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, // vec4 _0, vec4 _1 - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, // , vec4 _2).{.ret - 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, // urn transpose(ma - 0x74, 0x33, 0x78, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, // t3x4(_0, _1, _2) - 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, // );.}.vec3 mtxGe - 0x74, 0x52, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, // tRow(mat3 _mtx, - 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, // int _row).{.retu - 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, // rn vec3(_mtx[0][ - 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, // _row], _mtx[1][_ - 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, // row], _mtx[2][_r - 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, // ow]);.}.vec3 mtx - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, // GetColumn(mat3 _ - 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, // mtx, int _column - 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // ).{.return vec3( - 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, // _mtx[_column]);. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, // }.vec4 mtxGetRow - 0x28, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, // (mat4x3 _mtx, in - 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // t _row).{.return - 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, // vec4(_mtx[0][_r - 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, // ow], _mtx[1][_ro - 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, // w], _mtx[2][_row - 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x33, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, // ], _mtx[3][_row] - 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, // );.}.vec3 mtxGet - 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x6d, // Column(mat4x3 _m - 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, // tx, int _column) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, // .{.return vec3(_ - 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, // mtx[_column]);.} - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, 0x28, // .vec4 mtxGetRow( - 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, // mat4 _mtx, int _ - 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, // row).{.return ve - 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, // c4(_mtx[0][_row] - 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, // , _mtx[1][_row], - 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, // _mtx[2][_row], - 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x33, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, // _mtx[3][_row]);. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, // }.vec4 mtxGetCol - 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, // umn(mat4 _mtx, i - 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // nt _column).{.re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, // turn vec4(_mtx[_ - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, // column]);.}.floa - 0x74, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, // t mtxGetElement( - 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, // mat3 _mtx, int _ - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, // column, int _row - 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, // ).{.return _mtx[ - 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x3b, 0x0a, // _column][_row];. - 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x45, 0x6c, // }.float mtxGetEl - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, // ement(mat4 _mtx, - 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2c, 0x20, 0x69, 0x6e, // int _column, in - 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // t _row).{.return - 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, // _mtx[_column][_ - 0x72, 0x6f, 0x77, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x65, // row];.}.float se - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, // lect(bool _cond, - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x66, 0x6c, // float _true, fl - 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, // oat _false) { re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, // turn _cond ? _tr - 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, // ue : _false; }.v - 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, // ec2 select(bool - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, // _cond, vec2 _tru - 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // e, vec2 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, // { return _cond ? - 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, // _true : _false; - 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, // }.vec3 select(b - 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // ool _cond, vec3 - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, // _true, vec3 _fal - 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, // se) { return _co - 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, // nd ? _true : _fa - 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, // lse; }.vec4 sele - 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, // ct(bool _cond, v - 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ec4 _true, vec4 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, // _cond ? _true : - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, // _false; }.vec2 - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, // select(bvec2 _co - 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, // nd, vec2 _true, - 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, // vec2 _false) { r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, // eturn (vec2(_con - 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, // d) * _true) + (v - 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, // ec2(not(_cond) ) - 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, // * _false); }.ve - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, // c3 select(bvec3 - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, // _cond, vec3 _tru - 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // e, vec3 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, // { return (vec3(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, // cond) * _true) + - 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // (vec3(not(_cond - 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, // ) ) * _false); } - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, // .vec4 select(bve - 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // c4 _cond, vec4 _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // true, vec4 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, // e) { return (vec - 0x34, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // 4(_cond) * _true - 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, // ) + (vec4(not(_c - 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, // ond) ) * _false) - 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, // ; }.int select(b - 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, // ool _cond, int _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // true, int _false - 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // ) { return _cond - 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // ? _true : _fals - 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // e; }.ivec2 selec - 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, // t(bool _cond, iv - 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, // ec2 _true, ivec2 - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, // _false) { retur - 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, // n _cond ? _true - 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, // : _false; }.ivec - 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, // 3 select(bool _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // ond, ivec3 _true - 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // , ivec3 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, // { return _cond ? - 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, // _true : _false; - 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, // }.ivec4 select( - 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // bool _cond, ivec - 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // 4 _true, ivec4 _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // false) { return - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, // _cond ? _true : - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, // _false; }.ivec2 - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, // select(bvec2 _co - 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // nd, ivec2 _true, - 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, // ivec2 _false) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, // return (ivec2(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, // cond) * _true) + - 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, // (ivec2(not(_con - 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, // d) ) * _false); - 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, // }.ivec3 select(b - 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // vec3 _cond, ivec - 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // 3 _true, ivec3 _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // false) { return - 0x28, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, // (ivec3(_cond) * - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, // _true) + (ivec3( - 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, // not(_cond) ) * _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, // false); }.ivec4 - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, // select(bvec4 _co - 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // nd, ivec4 _true, - 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, // ivec4 _false) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, // return (ivec4(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, // cond) * _true) + - 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, // (ivec4(not(_con - 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, // d) ) * _false); - 0x7d, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, // }.uint select(bo - 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, // ol _cond, uint _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // true, uint _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, // e) { return _con - 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, // d ? _true : _fal - 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, // se; }.uvec2 sele - 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, // ct(bool _cond, u - 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, // vec2 _true, uvec - 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // 2 _false) { retu - 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // rn _cond ? _true - 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, // : _false; }.uve - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, // c3 select(bool _ - 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, // cond, uvec3 _tru - 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, // e, uvec3 _false) - 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, // { return _cond - 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // ? _true : _false - 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, // ; }.uvec4 select - 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, // (bool _cond, uve - 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, // c4 _true, uvec4 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, // _cond ? _true : - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, // _false; }.uvec2 - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, // select(bvec2 _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // ond, uvec2 _true - 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // , uvec2 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, // { return (uvec2( - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, // _cond) * _true) - 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, // + (uvec2(not(_co - 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, // nd) ) * _false); - 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, // }.uvec3 select( - 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, // bvec3 _cond, uve - 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, // c3 _true, uvec3 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, // (uvec3(_cond) * - 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x33, // _true) + (uvec3 - 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, // (not(_cond) ) * - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, // _false); }.uvec4 - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, // select(bvec4 _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // ond, uvec4 _true - 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // , uvec4 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, // { return (uvec4( - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, // _cond) * _true) - 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, // + (uvec4(not(_co - 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, // nd) ) * _false); - 0x20, 0x7d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // }.uniform vec4 - 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x63, 0x74, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // u_viewRect;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x54, // orm vec4 u_viewT - 0x65, 0x78, 0x65, 0x6c, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, // exel;.uniform ma - 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // t4 u_view;.unifo - 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, // rm mat4 u_invVie - 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // w;.uniform mat4 - 0x75, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // u_proj;.uniform - 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, // mat4 u_invProj;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, // uniform mat4 u_v - 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // iewProj;.uniform - 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, 0x77, 0x50, // mat4 u_invViewP - 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, // roj;.uniform mat - 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, // 4 u_modelView;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, // niform mat4 u_in - 0x76, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // vModelView;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, // orm mat4 u_model - 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // ViewProj;.unifor - 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x52, 0x65, // m vec4 u_alphaRe - 0x66, 0x34, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, // f4;.uniform mat4 - 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // u_model[1];.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6e, // form vec4 bgfx_n - 0x64, 0x63, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, // dc;.uniform vec4 - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x41, 0x72, // bgfx_indirectAr - 0x67, 0x42, 0x61, 0x73, 0x65, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, // gBase;.uniform s - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, // ampler2DArray bg - 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, // fx_texMipSrc;.la - 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, // yout(rgba8, bind - 0x69, 0x6e, 0x67, 0x3d, 0x30, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, // ing=0) writeonly - 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, // uniform image2D - 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, 0x3b, // Array s_imgMip1; - 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, // .layout(rgba8, b - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x31, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, // inding=1) writeo - 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, 0x6d, 0x61, 0x67, // nly uniform imag - 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, // e2DArray s_imgMi - 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, // p2;.layout(rgba8 - 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x32, 0x29, 0x20, 0x77, 0x72, 0x69, // , binding=2) wri - 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, // teonly uniform i + 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0b, 0x62, // CSH............b + 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, // gfx_mipGen...... + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, // .....bgfx_texMip + 0x53, 0x72, 0x63, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x11, 0x00, // Src............. + 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, // .layout(local_si + 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, // ze_x = 8, local_ + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, // size_y = 8, loca + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, // l_size_z = 1) in + 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ;..uniform vec4 + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // bgfx_mipGen;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, // form sampler2DAr + 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, // ray bgfx_texMipS + 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, // rc;.layout(locat + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, // ion = 0, binding + 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, // = 0, rgba8) uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, // form writeonly i 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, // mage2DArray s_im - 0x67, 0x4d, 0x69, 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, // gMip3;.layout(rg - 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x33, 0x29, 0x20, // ba8, binding=3) - 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // writeonly unifor - 0x6d, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, // m image2DArray s - 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // _imgMip4;.unifor - 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, // m vec4 bgfx_mipG - 0x65, 0x6e, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // en;.shared float - 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, // gs_R[64];.share - 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x36, 0x34, 0x5d, // d float gs_G[64] - 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, // ;.shared float g - 0x73, 0x5f, 0x42, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, // s_B[64];.shared - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, // float gs_A[64];. - 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, // void storeColor( - 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x76, 0x65, 0x63, // uint _index, vec - 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x0a, 0x7b, 0x0a, 0x67, 0x73, 0x5f, 0x52, // 4 _color).{.gs_R - 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // [_index] = _colo - 0x72, 0x2e, 0x78, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, // r.x;.gs_G[_index - 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x3b, 0x0a, 0x67, 0x73, // ] = _color.y;.gs - 0x5f, 0x42, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, // _B[_index] = _co - 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x69, 0x6e, 0x64, // lor.z;.gs_A[_ind - 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x77, 0x3b, 0x0a, // ex] = _color.w;. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // }.vec4 loadColor - 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x0a, 0x7b, 0x0a, // (uint _index).{. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, // return vec4(gs_R - 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, // [_index], gs_G[_ - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x69, 0x6e, // index], gs_B[_in - 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, // dex], gs_A[_inde - 0x78, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x20, 0x28, 0x6c, // x]);.}.layout (l - 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, 0x20, 0x38, 0x2c, // ocal_size_x = 8, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, 0x20, 0x3d, 0x20, // local_size_y = - 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x7a, 0x20, // 8, local_size_z - 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // = 1) in;.void ma - 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x69, 0x20, 0x3d, // in().{.uint gi = + 0x67, 0x4d, 0x69, 0x70, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, // gMip1;.layout(lo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, // cation = 1, bind + 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, // ing = 1, rgba8) + 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, // uniform writeonl + 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, // y image2DArray s + 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // _imgMip2;.layout + 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x62, // (location = 2, b + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, // inding = 2, rgba + 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, // 8) uniform write + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, // only image2DArra + 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, // y s_imgMip3;.lay + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, // out(location = 3 + 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x72, // , binding = 3, r + 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, // gba8) uniform wr + 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, // iteonly image2DA + 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, // rray s_imgMip4;. + 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, // .shared float gs + 0x5f, 0x52, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, // _R[64];.shared f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, // loat gs_G[64];.s + 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x42, // hared float gs_B + 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, // [64];.shared flo + 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, // at gs_A[64];..vo + 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // id main().{. + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // do. {. + 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, // uint _84 = uint + 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, 0x3b, // (bgfx_mipGen.y); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x31, // . vec2 _1 + 0x30, 0x33, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, // 03 = bgfx_mipGen + 0x2e, 0x7a, 0x77, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, // .zw * (vec2(gl_G + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // lobalInvocationI + 0x44, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x32, // D.xy) + vec2(0.2 + 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 5, 0.5));. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x66, // float _117 = f + 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, // loat(gl_GlobalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, // vocationID.z);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, // float _12 + 0x33, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, // 3 = float(uint(b + 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x78, 0x29, 0x29, 0x3b, 0x0a, // gfx_mipGen.x));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x33, // vec4 _13 + 0x38, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, // 8 = (textureLod( + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, // bgfx_texMipSrc, + 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x29, // vec3(_103, _117) + 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x29, 0x20, 0x2b, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, // , _123) + textur + 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, // eLod(bgfx_texMip + 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x20, 0x2b, // Src, vec3(_103 + + 0x20, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x7a, 0x77, // (bgfx_mipGen.zw + 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, // * vec2(0.5, 0.0 + 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x29, // )), _117), _123) + 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ) * 0.5;. + 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, // int _149 = int( + 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // gl_GlobalInvocat + 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ionID.z);. + 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, // imageStore(s_i + 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, // mgMip1, ivec3(iv + 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, // ec2(gl_GlobalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x5f, // ocationID.xy), _ + 0x31, 0x34, 0x39, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 149), _138);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x3d, 0x20, // if (_84 == + 0x31, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // 1u). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, // break; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . }. + 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // gs_R[gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, // InvocationIndex] + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _138.x;. + 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // gs_G[gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, // InvocationIndex] + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _138.y;. + 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // gs_B[gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, // InvocationIndex] + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _138.z;. + 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // gs_A[gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, // InvocationIndex] + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _138.w;. + 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, // barrier();. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x34, 0x32, 0x3b, // vec4 _542; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x67, 0x6c, // . if ((gl + 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // _LocalInvocation + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x20, 0x39, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, // Index & 9u) == 0 + 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // u). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, // uint _1 + 0x37, 0x35, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, // 75 = gl_LocalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, // ocationIndex + 1 + 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // u;. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, // loat _364 = gs_R + 0x5b, 0x5f, 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // [_175];. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x37, 0x20, 0x3d, // float _367 = + 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // gs_G[_175];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x33, 0x37, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x31, 0x37, 0x35, 0x5d, // 370 = gs_B[_175] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // ;. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, // oat _373 = gs_A[ + 0x5f, 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _175];. + 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x67, // uint _181 = g + 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // l_LocalInvocatio + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x38, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, // nIndex + 8u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x33, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x31, 0x38, 0x31, 0x5d, // 379 = gs_R[_181] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // ;. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, // oat _382 = gs_G[ + 0x5f, 0x31, 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _181];. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x38, 0x35, 0x20, 0x3d, 0x20, // float _385 = + 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x31, 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // gs_B[_181];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, // float _3 + 0x38, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x31, 0x38, 0x31, 0x5d, 0x3b, // 88 = gs_A[_181]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, // . uin + 0x74, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, // t _186 = gl_Loca + 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, // lInvocationIndex + 0x20, 0x2b, 0x20, 0x39, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 9u;. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x20, 0x3d, 0x20, // float _394 = + 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x31, 0x38, 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // gs_R[_186];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, // float _3 + 0x39, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x31, 0x38, 0x36, 0x5d, 0x3b, // 97 = gs_G[_186]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // . flo + 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, // at _400 = gs_B[_ + 0x31, 0x38, 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 186];. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x67, // float _403 = g + 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x31, 0x38, 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // s_A[_186];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x39, 0x36, // vec4 _196 + 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x38, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, // = (((_138 + vec + 0x34, 0x28, 0x5f, 0x33, 0x36, 0x34, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x37, 0x2c, 0x20, 0x5f, 0x33, // 4(_364, _367, _3 + 0x37, 0x30, 0x2c, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, // 70, _373)) + vec + 0x34, 0x28, 0x5f, 0x33, 0x37, 0x39, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x2c, 0x20, 0x5f, 0x33, // 4(_379, _382, _3 + 0x38, 0x35, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x38, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, // 85, _388)) + vec + 0x34, 0x28, 0x5f, 0x33, 0x39, 0x34, 0x2c, 0x20, 0x5f, 0x33, 0x39, 0x37, 0x2c, 0x20, 0x5f, 0x34, // 4(_394, _397, _4 + 0x30, 0x30, 0x2c, 0x20, 0x5f, 0x34, 0x30, 0x33, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, // 00, _403)) * 0.2 + 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, // 5;. i + 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, // mageStore(s_imgM + 0x69, 0x70, 0x32, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, // ip2, ivec3(ivec2 + 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, // (gl_GlobalInvoca + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, // tionID.xy / uvec + 0x32, 0x28, 0x32, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x34, 0x39, 0x29, 0x2c, 0x20, 0x5f, // 2(2u)), _149), _ + 0x31, 0x39, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 196);. + 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, // gs_R[gl_LocalI + 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, // nvocationIndex] + 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _196.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, // gs_G[gl_Lo + 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, // calInvocationInd + 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, // ex] = _196.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, // gs_B[g + 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // l_LocalInvocatio + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x2e, 0x7a, // nIndex] = _196.z + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, // ;. gs + 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, // _A[gl_LocalInvoc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, // ationIndex] = _1 + 0x39, 0x36, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 96.w;. + 0x20, 0x20, 0x5f, 0x35, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x3b, 0x0a, 0x20, // _542 = _196;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // else. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x32, // _542 + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _138;. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, // }. if (_ + 0x38, 0x34, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 84 == 2u). + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // break;. } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, // . barrier + 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // ();. vec4 + 0x20, 0x5f, 0x35, 0x34, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, // _543;. i + 0x66, 0x20, 0x28, 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // f ((gl_LocalInvo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x20, 0x32, 0x37, // cationIndex & 27 + 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // u) == 0u). + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, // uint _228 = gl_L + 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, // ocalInvocationIn + 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x32, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // dex + 2u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x36, // float _426 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, // = gs_R[_228];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // float + 0x20, 0x5f, 0x34, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x32, // _429 = gs_G[_22 + 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 8];. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, // float _432 = gs_ + 0x42, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // B[_228];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x35, 0x20, // float _435 + 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // = gs_A[_228];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, // uint _ + 0x32, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // 234 = gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, // vocationIndex + + 0x31, 0x36, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 16u;. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x73, // float _441 = gs + 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x33, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _R[_234];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x34, 0x34, // float _444 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x33, 0x34, 0x5d, 0x3b, 0x0a, 0x20, // = gs_G[_234];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // float + 0x20, 0x5f, 0x34, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x33, // _447 = gs_B[_23 + 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 4];. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, // float _450 = gs_ + 0x41, 0x5b, 0x5f, 0x32, 0x33, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // A[_234];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x30, 0x20, 0x3d, // uint _240 = 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // gl_LocalInvocat - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, // ionIndex;.uvec3 - 0x64, 0x74, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, // dtid = gl_Global - 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x3b, 0x0a, 0x75, 0x69, // InvocationID;.ui - 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, // nt srcMipLevel = - 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, // uint(bgfx_mipGe - 0x6e, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x4d, 0x69, // n.x);.uint numMi - 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, // pLevels = uint(b - 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x76, // gfx_mipGen.y);.v - 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, // ec2 texelSize = - 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x7a, 0x77, 0x3b, 0x0a, // bgfx_mipGen.zw;. - 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x74, 0x69, // uint slice = dti - 0x64, 0x2e, 0x7a, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x31, 0x3b, 0x0a, // d.z;.vec4 src1;. - 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, // vec2 uv1 = texel - 0x53, 0x69, 0x7a, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x64, 0x74, 0x69, // Size * (vec2(dti - 0x64, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x32, // d.xy) + vec2(0.2 - 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, // 5, 0.5) );.vec2 - 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x20, // off = texelSize - 0x2a, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, // * vec2(0.5, 0.0) - 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2a, 0x20, 0x28, // ;.src1 = 0.5 * ( - 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x4c, 0x6f, // texture2DArrayLo - 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, // d(bgfx_texMipSrc - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, // , vec3(uv1, floa - 0x74, 0x28, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, // t(slice) ), floa - 0x74, 0x28, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x20, 0x29, // t(srcMipLevel) ) - 0x0a, 0x2b, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, // .+ texture2DArra - 0x79, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, // yLod(bgfx_texMip - 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x31, 0x20, 0x2b, 0x20, // Src, vec3(uv1 + - 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x6c, 0x69, 0x63, 0x65, // off, float(slice - 0x29, 0x20, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x72, 0x63, 0x4d, 0x69, // ) ), float(srcMi - 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, // pLevel) ) );.ima - 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, // geStore(s_imgMip - 0x31, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, // 1, ivec3(dtid.xy - 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, // , slice), src1); - 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, // .if (numMipLevel - 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, // s == 1u).{.retur - 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, // n;.}.storeColor( - 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, // gi, src1);.barri - 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x20, 0x28, 0x67, 0x69, 0x20, 0x26, // er();.if ( (gi & - 0x20, 0x30, 0x78, 0x39, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, // 0x9u) == 0u).{. - 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, // vec4 src2 = load - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x31, 0x75, // Color(gi + 0x01u - 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, // );.vec4 src3 = l - 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, // oadColor(gi + 0x - 0x30, 0x38, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, // 08u);.vec4 src4 - 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, // = loadColor(gi + - 0x20, 0x30, 0x78, 0x30, 0x39, 0x75, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, // 0x09u);.src1 = - 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, // 0.25 * (src1 + s - 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, // rc2 + src3 + src - 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, // 4);.imageStore(s - 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, // _imgMip2, ivec3( - 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x32, 0x75, 0x2c, 0x20, 0x73, 0x6c, // dtid.xy / 2u, sl - 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x73, 0x74, 0x6f, // ice), src1);.sto - 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, // reColor(gi, src1 - 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, 0x69, 0x70, 0x4c, // );.}.if (numMipL - 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x72, // evels == 2u).{.r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, // eturn;.}.barrier - 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x20, 0x28, 0x67, 0x69, 0x20, 0x26, 0x20, 0x30, // ();.if ( (gi & 0 - 0x78, 0x31, 0x42, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x76, // x1Bu) == 0u).{.v - 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, // ec4 src2 = loadC - 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x32, 0x75, 0x29, // olor(gi + 0x02u) - 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, // ;.vec4 src3 = lo - 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x31, // adColor(gi + 0x1 - 0x30, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, 0x3d, // 0u);.vec4 src4 = - 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, // loadColor(gi + - 0x30, 0x78, 0x31, 0x32, 0x75, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, // 0x12u);.src1 = 0 - 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x72, // .25 * (src1 + sr - 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x34, // c2 + src3 + src4 - 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, // );.imageStore(s_ - 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x33, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, // imgMip3, ivec3(d - 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x34, 0x75, 0x2c, 0x20, 0x73, 0x6c, 0x69, // tid.xy / 4u, sli - 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x73, 0x74, 0x6f, 0x72, // ce), src1);.stor - 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, // eColor(gi, src1) - 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, // ;.}.if (numMipLe - 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // vels == 3u).{.re - 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, // turn;.}.barrier( - 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x67, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, // );.if (gi == 0u) - 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x6c, // .{.vec4 src2 = l - 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, // oadColor(gi + 0x - 0x30, 0x34, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, // 04u);.vec4 src3 - 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, // = loadColor(gi + - 0x20, 0x30, 0x78, 0x32, 0x30, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, // 0x20u);.vec4 sr - 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, // c4 = loadColor(g - 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x32, 0x34, 0x75, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, // i + 0x24u);.src1 - 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, 0x31, 0x20, // = 0.25 * (src1 - 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x2b, 0x20, // + src2 + src3 + - 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, // src4);.imageStor - 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x2c, 0x20, 0x69, 0x76, 0x65, // e(s_imgMip4, ive - 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x38, 0x75, 0x2c, // c3(dtid.xy / 8u, - 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, // slice), src1);. - 0x7d, 0x0a, 0x7d, 0x0a, 0x00, // }.}.. + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x38, 0x75, 0x3b, 0x0a, // ionIndex + 18u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // floa + 0x74, 0x20, 0x5f, 0x34, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, // t _456 = gs_R[_2 + 0x34, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 40];. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, // float _459 = gs + 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x34, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _G[_240];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x36, 0x32, // float _462 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x34, 0x30, 0x5d, 0x3b, 0x0a, 0x20, // = gs_B[_240];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // float + 0x20, 0x5f, 0x34, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x34, // _465 = gs_A[_24 + 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 0];. + 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, // vec4 _250 = (((_ + 0x35, 0x34, 0x32, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x32, 0x36, 0x2c, // 542 + vec4(_426, + 0x20, 0x5f, 0x34, 0x32, 0x39, 0x2c, 0x20, 0x5f, 0x34, 0x33, 0x32, 0x2c, 0x20, 0x5f, 0x34, 0x33, // _429, _432, _43 + 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x34, 0x31, 0x2c, // 5)) + vec4(_441, + 0x20, 0x5f, 0x34, 0x34, 0x34, 0x2c, 0x20, 0x5f, 0x34, 0x34, 0x37, 0x2c, 0x20, 0x5f, 0x34, 0x35, // _444, _447, _45 + 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x35, 0x36, 0x2c, // 0)) + vec4(_456, + 0x20, 0x5f, 0x34, 0x35, 0x39, 0x2c, 0x20, 0x5f, 0x34, 0x36, 0x32, 0x2c, 0x20, 0x5f, 0x34, 0x36, // _459, _462, _46 + 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 5)) * 0.25;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, // imageSto + 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x33, 0x2c, 0x20, 0x69, 0x76, // re(s_imgMip3, iv + 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, // ec3(ivec2(gl_Glo + 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, // balInvocationID. + 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x34, 0x75, 0x29, 0x29, 0x2c, // xy / uvec2(4u)), + 0x20, 0x5f, 0x31, 0x34, 0x39, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x29, 0x3b, 0x0a, 0x20, // _149), _250);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, // gs_R[ + 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, // gl_LocalInvocati + 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2e, // onIndex] = _250. + 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, // x;. g + 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // s_G[gl_LocalInvo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, // cationIndex] = _ + 0x32, 0x35, 0x30, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 250.y;. + 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // gs_B[gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, // InvocationIndex] + 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _250.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, // gs_A[gl_L + 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, // ocalInvocationIn + 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2e, 0x77, 0x3b, 0x0a, 0x20, // dex] = _250.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x20, // _543 + 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _250;. + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, // }. else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x32, // _543 = _542 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, // ;. }. + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x3d, 0x20, 0x33, // if (_84 == 3 + 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // u). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // barrier();. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, // if (gl_Loca + 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, // lInvocationIndex + 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // == 0u). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, // {. ui + 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, // nt _281 = gl_Loc + 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, // alInvocationInde + 0x78, 0x20, 0x2b, 0x20, 0x34, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // x + 4u;. + 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x37, 0x20, 0x3d, 0x20, // uint _287 = + 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, // gl_LocalInvocati + 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x33, 0x32, 0x75, 0x3b, 0x0a, 0x20, // onIndex + 32u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, // uint + 0x5f, 0x32, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, // _293 = gl_LocalI + 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, // nvocationIndex + + 0x20, 0x33, 0x36, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 36u;. + 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, // imageStore(s_i + 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, // mgMip4, ivec3(iv + 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, // ec2(gl_GlobalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, // ocationID.xy / u + 0x76, 0x65, 0x63, 0x32, 0x28, 0x38, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x34, 0x39, 0x29, // vec2(8u)), _149) + 0x2c, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x35, 0x34, 0x33, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, // , (((_543 + vec4 + 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, // (gs_R[_281], gs_ + 0x47, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, // G[_281], gs_B[_2 + 0x38, 0x31, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x29, // 81], gs_A[_281]) + 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, // ) + vec4(gs_R[_2 + 0x38, 0x37, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x2c, // 87], gs_G[_287], + 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, // gs_B[_287], gs_ + 0x41, 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, // A[_287])) + vec4 + 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x39, 0x33, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, // (gs_R[_293], gs_ + 0x47, 0x5b, 0x5f, 0x32, 0x39, 0x33, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, // G[_293], gs_B[_2 + 0x39, 0x33, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x39, 0x33, 0x5d, 0x29, // 93], gs_A[_293]) + 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // ) * 0.25);. + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, // }. bre + 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, // ak;. } while( + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // false);.}... }; -static const uint8_t cs_mipgen_oddx_essl[6120] = +static const uint8_t cs_mipgen_oddx_essl[4634] = { - 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0x17, // CSH............. - 0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x31, 0x30, 0x20, 0x65, // ..#version 310 e - 0x73, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x63, 0x70, 0x28, 0x66, 0x6c, 0x6f, 0x61, // s.float rcp(floa - 0x74, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, // t _a) { return 1 - 0x2e, 0x30, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x63, // .0/_a; }.vec2 rc - 0x70, 0x28, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // p(vec2 _a) { ret - 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, // urn vec2(1.0)/_a - 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, // ; }.vec3 rcp(vec - 0x33, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, // 3 _a) { return v - 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, // ec3(1.0)/_a; }.v - 0x65, 0x63, 0x34, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x61, 0x29, // ec4 rcp(vec4 _a) - 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, // { return vec4(1 - 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, // .0)/_a; }.vec2 v - 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // ec2_splat(float - 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, // _x) { return vec - 0x32, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, // 2(_x, _x); }.vec - 0x33, 0x20, 0x76, 0x65, 0x63, 0x33, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, // 3 vec3_splat(flo - 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // at _x) { return - 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, // vec3(_x, _x, _x) - 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, // ; }.vec4 vec4_sp - 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, // lat(float _x) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, // return vec4(_x, - 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, // _x, _x, _x); }.u - 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, // vec2 uvec2_splat - 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // (uint _x) { retu - 0x72, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, // rn uvec2(_x, _x) - 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x5f, // ; }.uvec3 uvec3_ - 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, // splat(uint _x) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x78, // return uvec3(_x - 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, // , _x, _x); }.uve - 0x63, 0x34, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, // c4 uvec4_splat(u - 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // int _x) { return - 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, // uvec4(_x, _x, _ - 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6d, // x, _x); }.mat4 m - 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, // txFromRows(vec4 - 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, // _0, vec4 _1, vec - 0x34, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, 0x0a, 0x7b, // 4 _2, vec4 _3).{ - 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, // .return transpos - 0x65, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, // e(mat4(_0, _1, _ - 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, // 2, _3) );.}.mat4 - 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, // mtxFromCols(vec - 0x34, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, // 4 _0, vec4 _1, v - 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, // ec4 _2, vec4 _3) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x5f, // .{.return mat4(_ - 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x29, 0x3b, 0x0a, // 0, _1, _2, _3);. - 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, // }.mat3 mtxFromRo - 0x77, 0x73, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // ws(vec3 _0, vec3 - 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x29, 0x0a, 0x7b, 0x0a, // _1, vec3 _2).{. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, // return transpose - 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, // (mat3(_0, _1, _2 - 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, // ) );.}.mat3 mtxF - 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, // romCols(vec3 _0, - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // vec3 _1, vec3 _ - 0x32, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x33, // 2).{.return mat3 - 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, // (_0, _1, _2);.}. - 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, 0x28, 0x6d, // vec3 mtxGetRow(m - 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, // at3 _mtx, int _r - 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, // ow).{.return vec - 0x33, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, // 3(_mtx[0][_row], - 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, // _mtx[1][_row], - 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, // _mtx[2][_row]);. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, // }.vec3 mtxGetCol - 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, // umn(mat3 _mtx, i - 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // nt _column).{.re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, // turn vec3(_mtx[_ - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, // column]);.}.vec4 - 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, // mtxGetRow(mat4 - 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, // _mtx, int _row). - 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, // {.return vec4(_m - 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, // tx[0][_row], _mt - 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, // x[1][_row], _mtx - 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, // [2][_row], _mtx[ - 0x33, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, // 3][_row]);.}.vec - 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x6d, // 4 mtxGetColumn(m - 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, // at4 _mtx, int _c - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // olumn).{.return - 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, // vec4(_mtx[_colum - 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x74, 0x78, // n]);.}.float mtx - 0x47, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, // GetElement(mat3 - 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, // _mtx, int _colum - 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, // n, int _row).{.r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, // eturn _mtx[_colu - 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, // mn][_row];.}.flo - 0x61, 0x74, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, // at mtxGetElement - 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, // (mat4 _mtx, int - 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, // _column, int _ro - 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x78, // w).{.return _mtx - 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x3b, // [_column][_row]; - 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, // .}.float select( - 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, // bool _cond, floa - 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // t _true, float _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // false) { return - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, // _cond ? _true : - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, // _false; }.vec2 s - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // elect(bool _cond - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, // , vec2 _true, ve - 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c2 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, // urn _cond ? _tru - 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, // e : _false; }.ve - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, // c3 select(bool _ - 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // cond, vec3 _true - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, // , vec3 _false) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, // return _cond ? - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, // _true : _false; - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, // }.vec4 select(bo - 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // ol _cond, vec4 _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // true, vec4 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, // e) { return _con - 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, // d ? _true : _fal - 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // se; }.vec2 selec - 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, // t(bvec2 _cond, v - 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // ec2 _true, vec2 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, // (vec2(_cond) * - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6e, // _true) + (vec2(n - 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, // ot(_cond) ) * _f - 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, // alse); }.vec3 se - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // lect(bvec3 _cond - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, // , vec3 _true, ve - 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c3 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, // urn (vec3(_cond) - 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, // * _true) + (vec - 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, // 3(not(_cond) ) * - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, // _false); }.vec4 - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, // select(bvec4 _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // ond, vec4 _true, - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, // vec4 _false) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x63, 0x6f, // return (vec4(_co - 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, // nd) * _true) + ( - 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, // vec4(not(_cond) - 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, // ) * _false); }.i - 0x6e, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, // nt select(bool _ - 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // cond, int _true, - 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, // int _false) { r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, // eturn _cond ? _t - 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, // rue : _false; }. - 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, // ivec2 select(boo - 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, // l _cond, ivec2 _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, // true, ivec2 _fal - 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, // se) { return _co - 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, // nd ? _true : _fa - 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, // lse; }.ivec3 sel - 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, // ect(bool _cond, - 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, // ivec3 _true, ive - 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c3 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, // urn _cond ? _tru - 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, // e : _false; }.iv - 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, // ec4 select(bool - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, // _cond, ivec4 _tr - 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // ue, ivec4 _false - 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // ) { return _cond - 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // ? _true : _fals - 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // e; }.ivec2 selec - 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, // t(bvec2 _cond, i - 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // vec2 _true, ivec - 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // 2 _false) { retu - 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, // rn (ivec2(_cond) - 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, // * _true) + (ive - 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, // c2(not(_cond) ) - 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, // * _false); }.ive - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, // c3 select(bvec3 - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, // _cond, ivec3 _tr - 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // ue, ivec3 _false - 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, // ) { return (ivec - 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // 3(_cond) * _true - 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, // ) + (ivec3(not(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // cond) ) * _false - 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // ); }.ivec4 selec - 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, // t(bvec4 _cond, i - 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // vec4 _true, ivec - 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // 4 _false) { retu - 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, // rn (ivec4(_cond) - 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, // * _true) + (ive - 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, // c4(not(_cond) ) - 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x69, 0x6e, // * _false); }.uin - 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, // t select(bool _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // ond, uint _true, - 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, // uint _false) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, // return _cond ? _ - 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, // true : _false; } - 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, // .uvec2 select(bo - 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, // ol _cond, uvec2 - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, // _true, uvec2 _fa - 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, // lse) { return _c - 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, // ond ? _true : _f - 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, // alse; }.uvec3 se - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, // lect(bool _cond, - 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, // uvec3 _true, uv - 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, // ec3 _false) { re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, // turn _cond ? _tr - 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, // ue : _false; }.u - 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, // vec4 select(bool - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, // _cond, uvec4 _t - 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // rue, uvec4 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, // e) { return _con - 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, // d ? _true : _fal - 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, // se; }.uvec2 sele - 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, // ct(bvec2 _cond, - 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, // uvec2 _true, uve - 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c2 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // urn (uvec2(_cond - 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, // ) * _true) + (uv - 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, // ec2(not(_cond) ) - 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, // * _false); }.uv - 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, // ec3 select(bvec3 - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, // _cond, uvec3 _t - 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // rue, uvec3 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, // e) { return (uve - 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, // c3(_cond) * _tru - 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, // e) + (uvec3(not( - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // _cond) ) * _fals - 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, // e); }.uvec4 sele - 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, // ct(bvec4 _cond, - 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, // uvec4 _true, uve - 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c4 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // urn (uvec4(_cond - 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, // ) * _true) + (uv - 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, // ec4(not(_cond) ) - 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x6e, // * _false); }.un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, // iform vec4 u_vie - 0x77, 0x52, 0x65, 0x63, 0x74, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, // wRect;.uniform v - 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x3b, // ec4 u_viewTexel; - 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // .uniform mat4 u_ - 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, // view;.uniform ma - 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, // t4 u_invView;.un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x72, 0x6f, // iform mat4 u_pro - 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // j;.uniform mat4 - 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // u_invProj;.unifo - 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, // rm mat4 u_viewPr - 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, // oj;.uniform mat4 - 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, // u_invViewProj;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, // uniform mat4 u_m - 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // odelView;.unifor - 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x4d, 0x6f, 0x64, 0x65, // m mat4 u_invMode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, // lView;.uniform m - 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, // at4 u_modelViewP - 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, // roj;.uniform vec - 0x34, 0x20, 0x75, 0x5f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x52, 0x65, 0x66, 0x34, 0x3b, 0x0a, 0x75, // 4 u_alphaRef4;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, // niform mat4 u_mo - 0x64, 0x65, 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // del[1];.uniform - 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6e, 0x64, 0x63, 0x3b, 0x0a, 0x75, // vec4 bgfx_ndc;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, // niform vec4 bgfx - 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x41, 0x72, 0x67, 0x42, 0x61, 0x73, 0x65, // _indirectArgBase - 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, // ;.uniform sample - 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, // r2DArray bgfx_te - 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, // xMipSrc;.layout( - 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x30, // rgba8, binding=0 - 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, // ) writeonly unif - 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, // orm highp image2 - 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, // DArray s_imgMip1 - 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, // ;.layout(rgba8, - 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x31, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, // binding=1) write - 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, // only uniform hig - 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, // hp image2DArray - 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // s_imgMip2;.layou - 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, // t(rgba8, binding - 0x3d, 0x32, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, // =2) writeonly un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, // iform highp imag - 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, // e2DArray s_imgMi - 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, // p3;.layout(rgba8 - 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x33, 0x29, 0x20, 0x77, 0x72, 0x69, // , binding=3) wri - 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, // teonly uniform h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, // ighp image2DArra - 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // y s_imgMip4;.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, // form vec4 bgfx_m - 0x69, 0x70, 0x47, 0x65, 0x6e, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, // ipGen;.shared fl - 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, // oat gs_R[64];.sh - 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, // ared float gs_G[ - 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, // 64];.shared floa - 0x74, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, // t gs_B[64];.shar - 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, // ed float gs_A[64 - 0x5d, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, // ];.void storeCol - 0x6f, 0x72, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, // or(uint _index, - 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x0a, 0x7b, 0x0a, 0x67, // vec4 _color).{.g - 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, // s_R[_index] = _c - 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x69, 0x6e, // olor.x;.gs_G[_in - 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x3b, // dex] = _color.y; - 0x0a, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, // .gs_B[_index] = - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, // _color.z;.gs_A[_ - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, // index] = _color. - 0x77, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, // w;.}.vec4 loadCo - 0x6c, 0x6f, 0x72, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, // lor(uint _index) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, // .{.return vec4(g - 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, // s_R[_index], gs_ - 0x47, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, // G[_index], gs_B[ - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x69, // _index], gs_A[_i - 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // ndex]);.}.layout - 0x20, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, // (local_size_x = - 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, // 8, local_size_y - 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, // = 8, local_size - 0x5f, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, // _z = 1) in;.void - 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, // main().{.uint g - 0x69, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // i = gl_LocalInvo - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0a, 0x75, 0x76, 0x65, // cationIndex;.uve - 0x63, 0x33, 0x20, 0x64, 0x74, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, // c3 dtid = gl_Glo - 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x3b, // balInvocationID; - 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, // .uint srcMipLeve - 0x6c, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, // l = uint(bgfx_mi - 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x75, // pGen.x);.uint nu - 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, // mMipLevels = uin - 0x74, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, // t(bgfx_mipGen.y) - 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, // ;.vec2 texelSize + 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0b, 0x62, // CSH............b + 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, // gfx_mipGen...... + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, // .....bgfx_texMip + 0x53, 0x72, 0x63, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x11, 0x00, // Src............. + 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, // .layout(local_si + 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, // ze_x = 8, local_ + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, // size_y = 8, loca + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, // l_size_z = 1) in + 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ;..uniform vec4 + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // bgfx_mipGen;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, // form highp sampl + 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, // er2DArray bgfx_t + 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // exMipSrc;.layout + 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x62, // (location = 0, b + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, // inding = 0, rgba + 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, // 8) uniform write + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, // only highp image + 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, // 2DArray s_imgMip + 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, // 1;.layout(locati + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, // on = 1, binding + 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, // = 1, rgba8) unif + 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x68, 0x69, // orm writeonly hi + 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, // ghp image2DArray + 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // s_imgMip2;.layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x2c, // ut(location = 2, + 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x72, 0x67, // binding = 2, rg + 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, // ba8) uniform wri + 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, // teonly highp ima + 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, // ge2DArray s_imgM + 0x69, 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // ip3;.layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, // tion = 3, bindin + 0x67, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, // g = 3, rgba8) un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, // iform writeonly + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, // highp image2DArr + 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, 0x0a, 0x73, // ay s_imgMip4;..s + 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x52, // hared float gs_R + 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, // [64];.shared flo + 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, // at gs_G[64];.sha + 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x36, // red float gs_B[6 + 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // 4];.shared float + 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, // gs_A[64];..void + 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, // main().{. do + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, // . {. u + 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, // int _84 = uint(b + 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, // gfx_mipGen.y);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x31, 0x30, 0x33, // vec2 _103 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x7a, // = bgfx_mipGen.z - 0x77, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x3d, 0x20, // w;.uint slice = - 0x64, 0x74, 0x69, 0x64, 0x2e, 0x7a, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, // dtid.z;.vec4 src - 0x31, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, // 1;.vec2 uv1 = te - 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, // xelSize * (vec2( - 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, // dtid.xy) + vec2( - 0x30, 0x2e, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x65, // 0.25, 0.5) );.ve - 0x63, 0x32, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x53, 0x69, // c2 off = texelSi - 0x7a, 0x65, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, // ze * vec2(0.5, 0 - 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x20, // .0);.src1 = 0.5 - 0x2a, 0x20, 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, // * (texture2DArra - 0x79, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, // yLod(bgfx_texMip - 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x31, 0x2c, 0x20, 0x66, // Src, vec3(uv1, f - 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x66, // loat(slice) ), f - 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, // loat(srcMipLevel - 0x29, 0x20, 0x29, 0x0a, 0x2b, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, // ) ).+ texture2DA - 0x72, 0x72, 0x61, 0x79, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, // rrayLod(bgfx_tex - 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x31, // MipSrc, vec3(uv1 - 0x20, 0x2b, 0x20, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x6c, // + off, float(sl - 0x69, 0x63, 0x65, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x72, // ice) ), float(sr - 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, // cMipLevel) ) );. + 0x77, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, // w * (vec2(gl_Glo + 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, // balInvocationID. + 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x32, 0x35, 0x2c, // xy) + vec2(0.25, + 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 0.5));. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, // float _117 = flo + 0x61, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // at(gl_GlobalInvo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // cationID.z);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x20, // float _123 + 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, 0x67, 0x66, // = float(uint(bgf + 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x78, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // x_mipGen.x));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x20, // vec4 _138 + 0x3d, 0x20, 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, // = (textureLod(bg + 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, // fx_texMipSrc, ve + 0x63, 0x33, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x29, 0x2c, 0x20, // c3(_103, _117), + 0x5f, 0x31, 0x32, 0x33, 0x29, 0x20, 0x2b, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, // _123) + textureL + 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, // od(bgfx_texMipSr + 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x20, 0x2b, 0x20, 0x28, // c, vec3(_103 + ( + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x7a, 0x77, 0x20, 0x2a, // bgfx_mipGen.zw * + 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, // vec2(0.5, 0.0)) + 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x29, 0x29, 0x20, // , _117), _123)) + 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, // * 0.5;. i + 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, // nt _149 = int(gl + 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // _GlobalInvocatio + 0x6e, 0x49, 0x44, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // nID.z);. 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, // imageStore(s_img - 0x4d, 0x69, 0x70, 0x31, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, // Mip1, ivec3(dtid - 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, // .xy, slice), src - 0x31, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, // 1);.if (numMipLe - 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // vels == 1u).{.re - 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, // turn;.}.storeCol - 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x62, 0x61, // or(gi, src1);.ba - 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x20, 0x28, 0x67, // rrier();.if ( (g - 0x69, 0x20, 0x26, 0x20, 0x30, 0x78, 0x39, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, // i & 0x9u) == 0u) - 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x6c, // .{.vec4 src2 = l - 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, // oadColor(gi + 0x - 0x30, 0x31, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, // 01u);.vec4 src3 - 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, // = loadColor(gi + - 0x20, 0x30, 0x78, 0x30, 0x38, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, // 0x08u);.vec4 sr - 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, // c4 = loadColor(g - 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x39, 0x75, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, // i + 0x09u);.src1 - 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, 0x31, 0x20, // = 0.25 * (src1 - 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x2b, 0x20, // + src2 + src3 + - 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, // src4);.imageStor - 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x2c, 0x20, 0x69, 0x76, 0x65, // e(s_imgMip2, ive - 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x32, 0x75, 0x2c, // c3(dtid.xy / 2u, - 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, // slice), src1);. - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, // storeColor(gi, s - 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, // rc1);.}.if (numM - 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x75, 0x29, 0x0a, // ipLevels == 2u). - 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x62, 0x61, 0x72, 0x72, // {.return;.}.barr - 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x20, 0x28, 0x67, 0x69, 0x20, // ier();.if ( (gi - 0x26, 0x20, 0x30, 0x78, 0x31, 0x42, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, // & 0x1Bu) == 0u). - 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, // {.vec4 src2 = lo - 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, // adColor(gi + 0x0 - 0x32, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x3d, // 2u);.vec4 src3 = - 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, // loadColor(gi + - 0x30, 0x78, 0x31, 0x30, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, // 0x10u);.vec4 src - 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, // 4 = loadColor(gi - 0x20, 0x2b, 0x20, 0x30, 0x78, 0x31, 0x32, 0x75, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, // + 0x12u);.src1 - 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, // = 0.25 * (src1 + - 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x2b, 0x20, 0x73, // src2 + src3 + s - 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, // rc4);.imageStore + 0x4d, 0x69, 0x70, 0x31, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, // Mip1, ivec3(ivec + 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, // 2(gl_GlobalInvoc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x34, // ationID.xy), _14 + 0x39, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 9), _138);. + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x75, // if (_84 == 1u + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // ). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // gs_R[gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, // vocationIndex] = + 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _138.x;. + 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // gs_G[gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, // vocationIndex] = + 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _138.y;. + 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // gs_B[gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, // vocationIndex] = + 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _138.z;. + 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // gs_A[gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, // vocationIndex] = + 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _138.w;. + 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // barrier();. + 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x34, 0x32, 0x3b, 0x0a, 0x20, // vec4 _542;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x67, 0x6c, 0x5f, 0x4c, // if ((gl_L + 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, // ocalInvocationIn + 0x64, 0x65, 0x78, 0x20, 0x26, 0x20, 0x39, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, // dex & 9u) == 0u) + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x37, 0x35, // uint _175 + 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, // = gl_LocalInvoc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x75, 0x3b, // ationIndex + 1u; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // . flo + 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, // at _364 = gs_R[_ + 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 175];. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x67, // float _367 = g + 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // s_G[_175];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x37, // float _37 + 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, // 0 = gs_B[_175];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // floa + 0x74, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x31, // t _373 = gs_A[_1 + 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 75];. + 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, // uint _181 = gl_ + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // LocalInvocationI + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x38, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // ndex + 8u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x37, // float _37 + 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x31, 0x38, 0x31, 0x5d, 0x3b, 0x0a, // 9 = gs_R[_181];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // floa + 0x74, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x31, // t _382 = gs_G[_1 + 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 81];. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x67, 0x73, // float _385 = gs + 0x5f, 0x42, 0x5b, 0x5f, 0x31, 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _B[_181];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x38, 0x38, // float _388 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x31, 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, // = gs_A[_181];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, // uint + 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, // _186 = gl_LocalI + 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, // nvocationIndex + + 0x20, 0x39, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 9u;. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x67, 0x73, // float _394 = gs + 0x5f, 0x52, 0x5b, 0x5f, 0x31, 0x38, 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _R[_186];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x39, 0x37, // float _397 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x31, 0x38, 0x36, 0x5d, 0x3b, 0x0a, 0x20, // = gs_G[_186];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // float + 0x20, 0x5f, 0x34, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x31, 0x38, // _400 = gs_B[_18 + 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 6];. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, // float _403 = gs_ + 0x41, 0x5b, 0x5f, 0x31, 0x38, 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // A[_186];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x20, 0x3d, // vec4 _196 = + 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x38, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // (((_138 + vec4( + 0x5f, 0x33, 0x36, 0x34, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x37, 0x30, // _364, _367, _370 + 0x2c, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // , _373)) + vec4( + 0x5f, 0x33, 0x37, 0x39, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x35, // _379, _382, _385 + 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x38, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // , _388)) + vec4( + 0x5f, 0x33, 0x39, 0x34, 0x2c, 0x20, 0x5f, 0x33, 0x39, 0x37, 0x2c, 0x20, 0x5f, 0x34, 0x30, 0x30, // _394, _397, _400 + 0x2c, 0x20, 0x5f, 0x34, 0x30, 0x33, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x3b, // , _403)) * 0.25; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, // . ima + 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, // geStore(s_imgMip + 0x32, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, // 2, ivec3(ivec2(g + 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, // l_GlobalInvocati + 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, // onID.xy / uvec2( + 0x32, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x34, 0x39, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x39, // 2u)), _149), _19 + 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 6);. + 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, // gs_R[gl_LocalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, // ocationIndex] = + 0x5f, 0x31, 0x39, 0x36, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _196.x;. + 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, // gs_G[gl_Loca + 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, // lInvocationIndex + 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // ] = _196.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, // gs_B[gl_ + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // LocalInvocationI + 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x2e, 0x7a, 0x3b, 0x0a, // ndex] = _196.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, // gs_A + 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // [gl_LocalInvocat + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, // ionIndex] = _196 + 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // .w;. + 0x5f, 0x35, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, // _542 = _196;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, // }. e + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // lse. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x32, 0x20, 0x3d, // _542 = + 0x20, 0x5f, 0x31, 0x33, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // _138;. } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x38, 0x34, // . if (_84 + 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // == 2u). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, // {. br + 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, // eak;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, // barrier() + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // ;. vec4 _ + 0x35, 0x34, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, // 543;. if + 0x28, 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, // ((gl_LocalInvoca + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x20, 0x32, 0x37, 0x75, 0x29, // tionIndex & 27u) + 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // == 0u). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, // {. ui + 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, // nt _228 = gl_Loc + 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, // alInvocationInde + 0x78, 0x20, 0x2b, 0x20, 0x32, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // x + 2u;. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x36, 0x20, 0x3d, // float _426 = + 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // gs_R[_228];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x34, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, // 429 = gs_G[_228] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // ;. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, // oat _432 = gs_B[ + 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _228];. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x35, 0x20, 0x3d, 0x20, // float _435 = + 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // gs_A[_228];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x33, // uint _23 + 0x34, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // 4 = gl_LocalInvo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x36, // cationIndex + 16 + 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // u;. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, // loat _441 = gs_R + 0x5b, 0x5f, 0x32, 0x33, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // [_234];. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x34, 0x34, 0x20, 0x3d, // float _444 = + 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x33, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // gs_G[_234];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x34, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x33, 0x34, 0x5d, // 447 = gs_B[_234] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // ;. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, // oat _450 = gs_A[ + 0x5f, 0x32, 0x33, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _234];. + 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x67, // uint _240 = g + 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // l_LocalInvocatio + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x38, 0x75, 0x3b, 0x0a, 0x20, 0x20, // nIndex + 18u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // float + 0x5f, 0x34, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x34, 0x30, // _456 = gs_R[_240 + 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // ];. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, // loat _459 = gs_G + 0x5b, 0x5f, 0x32, 0x34, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // [_240];. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x36, 0x32, 0x20, 0x3d, // float _462 = + 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x34, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // gs_B[_240];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x34, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x34, 0x30, 0x5d, // 465 = gs_A[_240] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // ;. ve + 0x63, 0x34, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x35, 0x34, // c4 _250 = (((_54 + 0x32, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x32, 0x36, 0x2c, 0x20, 0x5f, // 2 + vec4(_426, _ + 0x34, 0x32, 0x39, 0x2c, 0x20, 0x5f, 0x34, 0x33, 0x32, 0x2c, 0x20, 0x5f, 0x34, 0x33, 0x35, 0x29, // 429, _432, _435) + 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x34, 0x31, 0x2c, 0x20, 0x5f, // ) + vec4(_441, _ + 0x34, 0x34, 0x34, 0x2c, 0x20, 0x5f, 0x34, 0x34, 0x37, 0x2c, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x29, // 444, _447, _450) + 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x35, 0x36, 0x2c, 0x20, 0x5f, // ) + vec4(_456, _ + 0x34, 0x35, 0x39, 0x2c, 0x20, 0x5f, 0x34, 0x36, 0x32, 0x2c, 0x20, 0x5f, 0x34, 0x36, 0x35, 0x29, // 459, _462, _465) + 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ) * 0.25;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, // imageStore 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x33, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // (s_imgMip3, ivec - 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x34, 0x75, 0x2c, 0x20, // 3(dtid.xy / 4u, - 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x73, // slice), src1);.s - 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, // toreColor(gi, sr - 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, 0x69, // c1);.}.if (numMi - 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x75, 0x29, 0x0a, 0x7b, // pLevels == 3u).{ - 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, // .return;.}.barri - 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x67, 0x69, 0x20, 0x3d, 0x3d, 0x20, // er();.if (gi == - 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, // 0u).{.vec4 src2 - 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, // = loadColor(gi + - 0x20, 0x30, 0x78, 0x30, 0x34, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, // 0x04u);.vec4 sr - 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, // c3 = loadColor(g - 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x32, 0x30, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, // i + 0x20u);.vec4 - 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, // src4 = loadColo - 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x32, 0x34, 0x75, 0x29, 0x3b, 0x0a, 0x73, // r(gi + 0x24u);.s - 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, // rc1 = 0.25 * (sr - 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, // c1 + src2 + src3 - 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, // + src4);.imageS - 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x2c, 0x20, // tore(s_imgMip4, - 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, // ivec3(dtid.xy / - 0x38, 0x75, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, // 8u, slice), src1 - 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x00, // );.}.}.. + 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, // 3(ivec2(gl_Globa + 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, // lInvocationID.xy + 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x34, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, // / uvec2(4u)), _ + 0x31, 0x34, 0x39, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 149), _250);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, // gs_R[gl + 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // _LocalInvocation + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2e, 0x78, 0x3b, // Index] = _250.x; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, // . gs_ + 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, // G[gl_LocalInvoca + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, // tionIndex] = _25 + 0x30, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 0.y;. + 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // gs_B[gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, // vocationIndex] = + 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _250.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, // gs_A[gl_Loc + 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, // alInvocationInde + 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, // x] = _250.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x20, 0x3d, 0x20, // _543 = + 0x5f, 0x32, 0x35, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // _250;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x32, 0x3b, 0x0a, // _543 = _542;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x75, 0x29, // if (_84 == 3u) + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // barrier();. + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, // if (gl_LocalI + 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, // nvocationIndex = + 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // = 0u). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, // uint + 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // _281 = gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, // InvocationIndex + 0x2b, 0x20, 0x34, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 4u;. + 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x6c, // uint _287 = gl + 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // _LocalInvocation + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x33, 0x32, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, // Index + 32u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, // uint _2 + 0x39, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, // 93 = gl_LocalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x33, // ocationIndex + 3 + 0x36, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 6u;. + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, // imageStore(s_img + 0x4d, 0x69, 0x70, 0x34, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, // Mip4, ivec3(ivec + 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, // 2(gl_GlobalInvoc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, // ationID.xy / uve + 0x63, 0x32, 0x28, 0x38, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x34, 0x39, 0x29, 0x2c, 0x20, // c2(8u)), _149), + 0x28, 0x28, 0x28, 0x5f, 0x35, 0x34, 0x33, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, // (((_543 + vec4(g + 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, // s_R[_281], gs_G[ + 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x38, 0x31, // _281], gs_B[_281 + 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x29, 0x29, 0x20, // ], gs_A[_281])) + 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x38, 0x37, // + vec4(gs_R[_287 + 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x2c, 0x20, 0x67, // ], gs_G[_287], g + 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, // s_B[_287], gs_A[ + 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, // _287])) + vec4(g + 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x39, 0x33, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, // s_R[_293], gs_G[ + 0x5f, 0x32, 0x39, 0x33, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x39, 0x33, // _293], gs_B[_293 + 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x39, 0x33, 0x5d, 0x29, 0x29, 0x20, // ], gs_A[_293])) + 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // * 0.25);. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, // }. break + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, // ;. } while(fa + 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lse);.}... }; static const uint8_t cs_mipgen_oddx_spv[6349] = { diff --git a/src/cs_mipgen_oddxy.bin.h b/src/cs_mipgen_oddxy.bin.h index 4ba2a5241..cb9861c13 100644 --- a/src/cs_mipgen_oddxy.bin.h +++ b/src/cs_mipgen_oddxy.bin.h @@ -1,820 +1,607 @@ -static const uint8_t cs_mipgen_oddxy_glsl[6620] = +static const uint8_t cs_mipgen_oddxy_glsl[4769] = { - 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc9, 0x19, // CSH............. - 0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x33, 0x30, 0x0a, 0x66, // ..#version 430.f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x63, 0x70, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // loat rcp(float _ - 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2e, 0x30, 0x2f, // a) { return 1.0/ - 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, // _a; }.vec2 rcp(v - 0x65, 0x63, 0x32, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // ec2 _a) { return - 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, // vec2(1.0)/_a; } - 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // .vec3 rcp(vec3 _ - 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, // a) { return vec3 - 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, // (1.0)/_a; }.vec4 - 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, // rcp(vec4 _a) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, // return vec4(1.0) - 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x65, 0x63, 0x32, // /_a; }.vec2 vec2 - 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, // _splat(float _x) - 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, // { return vec2(_ - 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // x, _x); }.vec3 v - 0x65, 0x63, 0x33, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // ec3_splat(float - 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, // _x) { return vec - 0x33, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, // 3(_x, _x, _x); } - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, // .vec4 vec4_splat - 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // (float _x) { ret - 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, // urn vec4(_x, _x, - 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, // _x, _x); }.uvec - 0x32, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, 0x69, // 2 uvec2_splat(ui - 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // nt _x) { return - 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, // uvec2(_x, _x); } - 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x5f, 0x73, 0x70, 0x6c, // .uvec3 uvec3_spl - 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, // at(uint _x) { re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, // turn uvec3(_x, _ - 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, // x, _x); }.uvec4 - 0x75, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, // uvec4_splat(uint - 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x76, // _x) { return uv - 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, // ec4(_x, _x, _x, - 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x46, // _x); }.mat4 mtxF - 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x30, 0x2c, // romRows(vec4 _0, - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // vec4 _1, vec4 _ - 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // 2, vec4 _3).{.re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, // turn transpose(m - 0x61, 0x74, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x2c, 0x20, // at4(_0, _1, _2, - 0x5f, 0x33, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x74, // _3) );.}.mat4 mt - 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // xFromCols(vec4 _ - 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, // 0, vec4 _1, vec4 - 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, 0x0a, 0x7b, 0x0a, // _2, vec4 _3).{. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, // return mat4(_0, - 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, // _1, _2, _3);.}.m - 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, // at3 mtxFromRows( - 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, // vec3 _0, vec3 _1 - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, // , vec3 _2).{.ret - 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, // urn transpose(ma - 0x74, 0x33, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, 0x20, 0x29, // t3(_0, _1, _2) ) - 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, // ;.}.mat3 mtxFrom - 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, // Cols(vec3 _0, ve - 0x63, 0x33, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x29, 0x0a, // c3 _1, vec3 _2). - 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x5f, 0x30, // {.return mat3(_0 - 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, // , _1, _2);.}.mat - 0x34, 0x78, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, // 4x3 mtxFromRows( - 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, // vec4 _0, vec4 _1 - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, // , vec4 _2).{.ret - 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, // urn transpose(ma - 0x74, 0x33, 0x78, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, // t3x4(_0, _1, _2) - 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, // );.}.vec3 mtxGe - 0x74, 0x52, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, // tRow(mat3 _mtx, - 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, // int _row).{.retu - 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, // rn vec3(_mtx[0][ - 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, // _row], _mtx[1][_ - 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, // row], _mtx[2][_r - 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, // ow]);.}.vec3 mtx - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, // GetColumn(mat3 _ - 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, // mtx, int _column - 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // ).{.return vec3( - 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, // _mtx[_column]);. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, // }.vec4 mtxGetRow - 0x28, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, // (mat4x3 _mtx, in - 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // t _row).{.return - 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, // vec4(_mtx[0][_r - 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, // ow], _mtx[1][_ro - 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, // w], _mtx[2][_row - 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x33, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, // ], _mtx[3][_row] - 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, // );.}.vec3 mtxGet - 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x6d, // Column(mat4x3 _m - 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, // tx, int _column) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, // .{.return vec3(_ - 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, // mtx[_column]);.} - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, 0x28, // .vec4 mtxGetRow( - 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, // mat4 _mtx, int _ - 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, // row).{.return ve - 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, // c4(_mtx[0][_row] - 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, // , _mtx[1][_row], - 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, // _mtx[2][_row], - 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x33, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, // _mtx[3][_row]);. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, // }.vec4 mtxGetCol - 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, // umn(mat4 _mtx, i - 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // nt _column).{.re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, // turn vec4(_mtx[_ - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, // column]);.}.floa - 0x74, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, // t mtxGetElement( - 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, // mat3 _mtx, int _ - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, // column, int _row - 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, // ).{.return _mtx[ - 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x3b, 0x0a, // _column][_row];. - 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x45, 0x6c, // }.float mtxGetEl - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, // ement(mat4 _mtx, - 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2c, 0x20, 0x69, 0x6e, // int _column, in - 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // t _row).{.return - 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, // _mtx[_column][_ - 0x72, 0x6f, 0x77, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x65, // row];.}.float se - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, // lect(bool _cond, - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x66, 0x6c, // float _true, fl - 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, // oat _false) { re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, // turn _cond ? _tr - 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, // ue : _false; }.v - 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, // ec2 select(bool - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, // _cond, vec2 _tru - 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // e, vec2 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, // { return _cond ? - 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, // _true : _false; - 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, // }.vec3 select(b - 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // ool _cond, vec3 - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, // _true, vec3 _fal - 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, // se) { return _co - 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, // nd ? _true : _fa - 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, // lse; }.vec4 sele - 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, // ct(bool _cond, v - 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ec4 _true, vec4 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, // _cond ? _true : - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, // _false; }.vec2 - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, // select(bvec2 _co - 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, // nd, vec2 _true, - 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, // vec2 _false) { r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, // eturn (vec2(_con - 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, // d) * _true) + (v - 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, // ec2(not(_cond) ) - 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, // * _false); }.ve - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, // c3 select(bvec3 - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, // _cond, vec3 _tru - 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // e, vec3 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, // { return (vec3(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, // cond) * _true) + - 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // (vec3(not(_cond - 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, // ) ) * _false); } - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, // .vec4 select(bve - 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // c4 _cond, vec4 _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // true, vec4 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, // e) { return (vec - 0x34, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // 4(_cond) * _true - 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, // ) + (vec4(not(_c - 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, // ond) ) * _false) - 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, // ; }.int select(b - 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, // ool _cond, int _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // true, int _false - 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // ) { return _cond - 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // ? _true : _fals - 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // e; }.ivec2 selec - 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, // t(bool _cond, iv - 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, // ec2 _true, ivec2 - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, // _false) { retur - 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, // n _cond ? _true - 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, // : _false; }.ivec - 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, // 3 select(bool _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // ond, ivec3 _true - 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // , ivec3 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, // { return _cond ? - 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, // _true : _false; - 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, // }.ivec4 select( - 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // bool _cond, ivec - 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // 4 _true, ivec4 _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // false) { return - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, // _cond ? _true : - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, // _false; }.ivec2 - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, // select(bvec2 _co - 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // nd, ivec2 _true, - 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, // ivec2 _false) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, // return (ivec2(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, // cond) * _true) + - 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, // (ivec2(not(_con - 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, // d) ) * _false); - 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, // }.ivec3 select(b - 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // vec3 _cond, ivec - 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // 3 _true, ivec3 _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // false) { return - 0x28, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, // (ivec3(_cond) * - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, // _true) + (ivec3( - 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, // not(_cond) ) * _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, // false); }.ivec4 - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, // select(bvec4 _co - 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // nd, ivec4 _true, - 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, // ivec4 _false) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, // return (ivec4(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, // cond) * _true) + - 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, // (ivec4(not(_con - 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, // d) ) * _false); - 0x7d, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, // }.uint select(bo - 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, // ol _cond, uint _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // true, uint _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, // e) { return _con - 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, // d ? _true : _fal - 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, // se; }.uvec2 sele - 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, // ct(bool _cond, u - 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, // vec2 _true, uvec - 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // 2 _false) { retu - 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // rn _cond ? _true - 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, // : _false; }.uve - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, // c3 select(bool _ - 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, // cond, uvec3 _tru - 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, // e, uvec3 _false) - 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, // { return _cond - 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // ? _true : _false - 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, // ; }.uvec4 select - 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, // (bool _cond, uve - 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, // c4 _true, uvec4 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, // _cond ? _true : - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, // _false; }.uvec2 - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, // select(bvec2 _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // ond, uvec2 _true - 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // , uvec2 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, // { return (uvec2( - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, // _cond) * _true) - 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, // + (uvec2(not(_co - 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, // nd) ) * _false); - 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, // }.uvec3 select( - 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, // bvec3 _cond, uve - 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, // c3 _true, uvec3 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, // (uvec3(_cond) * - 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x33, // _true) + (uvec3 - 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, // (not(_cond) ) * - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, // _false); }.uvec4 - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, // select(bvec4 _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // ond, uvec4 _true - 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // , uvec4 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, // { return (uvec4( - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, // _cond) * _true) - 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, // + (uvec4(not(_co - 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, // nd) ) * _false); - 0x20, 0x7d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // }.uniform vec4 - 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x63, 0x74, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // u_viewRect;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x54, // orm vec4 u_viewT - 0x65, 0x78, 0x65, 0x6c, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, // exel;.uniform ma - 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // t4 u_view;.unifo - 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, // rm mat4 u_invVie - 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // w;.uniform mat4 - 0x75, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // u_proj;.uniform - 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, // mat4 u_invProj;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, // uniform mat4 u_v - 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // iewProj;.uniform - 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, 0x77, 0x50, // mat4 u_invViewP - 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, // roj;.uniform mat - 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, // 4 u_modelView;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, // niform mat4 u_in - 0x76, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // vModelView;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, // orm mat4 u_model - 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // ViewProj;.unifor - 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x52, 0x65, // m vec4 u_alphaRe - 0x66, 0x34, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, // f4;.uniform mat4 - 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // u_model[1];.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6e, // form vec4 bgfx_n - 0x64, 0x63, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, // dc;.uniform vec4 - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x41, 0x72, // bgfx_indirectAr - 0x67, 0x42, 0x61, 0x73, 0x65, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, // gBase;.uniform s - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, // ampler2DArray bg - 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, // fx_texMipSrc;.la - 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, // yout(rgba8, bind - 0x69, 0x6e, 0x67, 0x3d, 0x30, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, // ing=0) writeonly - 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, // uniform image2D - 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, 0x3b, // Array s_imgMip1; - 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, // .layout(rgba8, b - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x31, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, // inding=1) writeo - 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, 0x6d, 0x61, 0x67, // nly uniform imag - 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, // e2DArray s_imgMi - 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, // p2;.layout(rgba8 - 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x32, 0x29, 0x20, 0x77, 0x72, 0x69, // , binding=2) wri - 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, // teonly uniform i + 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0b, 0x62, // CSH............b + 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, // gfx_mipGen...... + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, // .....bgfx_texMip + 0x53, 0x72, 0x63, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x12, 0x00, // Src.........._.. + 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, // .layout(local_si + 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, // ze_x = 8, local_ + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, // size_y = 8, loca + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, // l_size_z = 1) in + 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ;..uniform vec4 + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // bgfx_mipGen;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, // form sampler2DAr + 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, // ray bgfx_texMipS + 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, // rc;.layout(locat + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, // ion = 0, binding + 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, // = 0, rgba8) uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, // form writeonly i 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, // mage2DArray s_im - 0x67, 0x4d, 0x69, 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, // gMip3;.layout(rg - 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x33, 0x29, 0x20, // ba8, binding=3) - 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // writeonly unifor - 0x6d, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, // m image2DArray s - 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // _imgMip4;.unifor - 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, // m vec4 bgfx_mipG - 0x65, 0x6e, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // en;.shared float - 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, // gs_R[64];.share - 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x36, 0x34, 0x5d, // d float gs_G[64] - 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, // ;.shared float g - 0x73, 0x5f, 0x42, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, // s_B[64];.shared - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, // float gs_A[64];. - 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, // void storeColor( - 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x76, 0x65, 0x63, // uint _index, vec - 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x0a, 0x7b, 0x0a, 0x67, 0x73, 0x5f, 0x52, // 4 _color).{.gs_R - 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // [_index] = _colo - 0x72, 0x2e, 0x78, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, // r.x;.gs_G[_index - 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x3b, 0x0a, 0x67, 0x73, // ] = _color.y;.gs - 0x5f, 0x42, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, // _B[_index] = _co - 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x69, 0x6e, 0x64, // lor.z;.gs_A[_ind - 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x77, 0x3b, 0x0a, // ex] = _color.w;. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // }.vec4 loadColor - 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x0a, 0x7b, 0x0a, // (uint _index).{. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, // return vec4(gs_R - 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, // [_index], gs_G[_ - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x69, 0x6e, // index], gs_B[_in - 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, // dex], gs_A[_inde - 0x78, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x20, 0x28, 0x6c, // x]);.}.layout (l - 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, 0x20, 0x38, 0x2c, // ocal_size_x = 8, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, 0x20, 0x3d, 0x20, // local_size_y = - 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x7a, 0x20, // 8, local_size_z - 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // = 1) in;.void ma - 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x69, 0x20, 0x3d, // in().{.uint gi = - 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // gl_LocalInvocat - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, // ionIndex;.uvec3 - 0x64, 0x74, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, // dtid = gl_Global - 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x3b, 0x0a, 0x75, 0x69, // InvocationID;.ui - 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, // nt srcMipLevel = - 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, // uint(bgfx_mipGe - 0x6e, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x4d, 0x69, // n.x);.uint numMi - 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, // pLevels = uint(b - 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x76, // gfx_mipGen.y);.v - 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, // ec2 texelSize = - 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x7a, 0x77, 0x3b, 0x0a, // bgfx_mipGen.zw;. - 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x74, 0x69, // uint slice = dti - 0x64, 0x2e, 0x7a, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x31, 0x3b, 0x0a, // d.z;.vec4 src1;. - 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, // vec2 uv1 = texel - 0x53, 0x69, 0x7a, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x64, 0x74, 0x69, // Size * (vec2(dti - 0x64, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x32, // d.xy) + vec2(0.2 - 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x32, // 5, 0.25) );.vec2 - 0x20, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, // off = texelSize - 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x30, 0x2e, // * vec2_splat(0. - 0x35, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, // 5);.src1 = textu - 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, // re2DArrayLod(bgf + 0x67, 0x4d, 0x69, 0x70, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, // gMip1;.layout(lo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, // cation = 1, bind + 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, // ing = 1, rgba8) + 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, // uniform writeonl + 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, // y image2DArray s + 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // _imgMip2;.layout + 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x62, // (location = 2, b + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, // inding = 2, rgba + 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, // 8) uniform write + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, // only image2DArra + 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, // y s_imgMip3;.lay + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, // out(location = 3 + 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x72, // , binding = 3, r + 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, // gba8) uniform wr + 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, // iteonly image2DA + 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, // rray s_imgMip4;. + 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, // .shared float gs + 0x5f, 0x52, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, // _R[64];.shared f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, // loat gs_G[64];.s + 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x42, // hared float gs_B + 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, // [64];.shared flo + 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, // at gs_A[64];..vo + 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // id main().{. + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // do. {. + 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, // uint _93 = uint + 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, 0x3b, // (bgfx_mipGen.y); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x31, // . vec2 _1 + 0x31, 0x30, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, // 10 = bgfx_mipGen + 0x2e, 0x7a, 0x77, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, // .zw * (vec2(gl_G + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // lobalInvocationI + 0x44, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x32, // D.xy) + vec2(0.2 + 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, // 5));. vec + 0x32, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, // 2 _116 = bgfx_mi + 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x7a, 0x77, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, // pGen.zw * vec2(0 + 0x2e, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // .5);. flo + 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, // at _125 = float( + 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // gl_GlobalInvocat + 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ionID.z);. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x66, // float _131 = f + 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, // loat(uint(bgfx_m + 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x78, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // ipGen.x));. + 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x28, // vec4 _185 = ( + 0x28, 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, // ((textureLod(bgf 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, // x_texMipSrc, vec - 0x33, 0x28, 0x75, 0x76, 0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x6c, 0x69, // 3(uv1, float(sli - 0x63, 0x65, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x72, 0x63, // ce) ), float(src - 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, // MipLevel) );.src - 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, // 1 += texture2DAr - 0x72, 0x61, 0x79, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, // rayLod(bgfx_texM - 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x31, 0x20, // ipSrc, vec3(uv1 - 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6f, 0x66, 0x66, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, // + vec2(off.x, 0. - 0x30, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, // 0), float(slice) - 0x20, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, // ), float(srcMip - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, // Level) );.src1 + - 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, // = texture2DArray - 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, // Lod(bgfx_texMipS - 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x31, 0x20, 0x2b, 0x20, 0x76, // rc, vec3(uv1 + v - 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x2e, 0x79, 0x29, 0x2c, // ec2(0.0, off.y), - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x20, 0x29, 0x2c, // float(slice) ), - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, // float(srcMipLev - 0x65, 0x6c, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x74, // el) );.src1 += t - 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x4c, 0x6f, 0x64, // exture2DArrayLod - 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, // (bgfx_texMipSrc, - 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x31, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, // vec3(uv1 + vec2 - 0x28, 0x6f, 0x66, 0x66, 0x2e, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x2e, 0x79, 0x29, 0x2c, 0x20, // (off.x, off.y), - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x20, 0x29, 0x2c, 0x20, // float(slice) ), - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, // float(srcMipLeve - 0x6c, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2a, 0x3d, 0x20, 0x30, 0x2e, // l) );.src1 *= 0. - 0x32, 0x35, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, // 25;.imageStore(s - 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, // _imgMip1, ivec3( - 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, // dtid.xy, slice), - 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, // src1);.if (numM - 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x75, 0x29, 0x0a, // ipLevels == 1u). - 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x73, 0x74, 0x6f, 0x72, // {.return;.}.stor - 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, // eColor(gi, src1) - 0x3b, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, // ;.barrier();.if - 0x28, 0x20, 0x28, 0x67, 0x69, 0x20, 0x26, 0x20, 0x30, 0x78, 0x39, 0x75, 0x29, 0x20, 0x3d, 0x3d, // ( (gi & 0x9u) == - 0x20, 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, // 0u).{.vec4 src2 - 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, // = loadColor(gi - 0x2b, 0x20, 0x30, 0x78, 0x30, 0x31, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, // + 0x01u);.vec4 s - 0x72, 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, // rc3 = loadColor( - 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x38, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, // gi + 0x08u);.vec - 0x34, 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, // 4 src4 = loadCol - 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x39, 0x75, 0x29, 0x3b, 0x0a, // or(gi + 0x09u);. - 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, // src1 = 0.25 * (s - 0x72, 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, // rc1 + src2 + src - 0x33, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, // 3 + src4);.image - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x2c, // Store(s_imgMip2, - 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, // ivec3(dtid.xy / - 0x20, 0x32, 0x75, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, // 2u, slice), src - 0x31, 0x29, 0x3b, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, // 1);.storeColor(g - 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x20, 0x28, // i, src1);.}.if ( - 0x6e, 0x75, 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, // numMipLevels == - 0x32, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, // 2u).{.return;.}. - 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x20, // barrier();.if ( - 0x28, 0x67, 0x69, 0x20, 0x26, 0x20, 0x30, 0x78, 0x31, 0x42, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, // (gi & 0x1Bu) == - 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, // 0u).{.vec4 src2 - 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, // = loadColor(gi + - 0x20, 0x30, 0x78, 0x30, 0x32, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, // 0x02u);.vec4 sr - 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, // c3 = loadColor(g - 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x31, 0x30, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, // i + 0x10u);.vec4 - 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, // src4 = loadColo - 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x31, 0x32, 0x75, 0x29, 0x3b, 0x0a, 0x73, // r(gi + 0x12u);.s - 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, // rc1 = 0.25 * (sr - 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, // c1 + src2 + src3 - 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, // + src4);.imageS - 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x33, 0x2c, 0x20, // tore(s_imgMip3, - 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, // ivec3(dtid.xy / - 0x34, 0x75, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, // 4u, slice), src1 - 0x29, 0x3b, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, // );.storeColor(gi - 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, // , src1);.}.if (n - 0x75, 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x33, // umMipLevels == 3 - 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x62, // u).{.return;.}.b - 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x67, 0x69, // arrier();.if (gi - 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, // == 0u).{.vec4 s - 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, // rc2 = loadColor( - 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x34, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, // gi + 0x04u);.vec - 0x34, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, // 4 src3 = loadCol - 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x32, 0x30, 0x75, 0x29, 0x3b, 0x0a, // or(gi + 0x20u);. - 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, // vec4 src4 = load - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x32, 0x34, 0x75, // Color(gi + 0x24u - 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, // );.src1 = 0.25 * - 0x20, 0x28, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, // (src1 + src2 + - 0x73, 0x72, 0x63, 0x33, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, // src3 + src4);.im - 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, // ageStore(s_imgMi - 0x70, 0x34, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, // p4, ivec3(dtid.x - 0x79, 0x20, 0x2f, 0x20, 0x38, 0x75, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, // y / 8u, slice), - 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x00, // src1);.}.}.. -}; -static const uint8_t cs_mipgen_oddxy_essl[6367] = -{ - 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x18, // CSH............. - 0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x31, 0x30, 0x20, 0x65, // ..#version 310 e - 0x73, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x63, 0x70, 0x28, 0x66, 0x6c, 0x6f, 0x61, // s.float rcp(floa - 0x74, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, // t _a) { return 1 - 0x2e, 0x30, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x63, // .0/_a; }.vec2 rc - 0x70, 0x28, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // p(vec2 _a) { ret - 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, // urn vec2(1.0)/_a - 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, // ; }.vec3 rcp(vec - 0x33, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, // 3 _a) { return v - 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, // ec3(1.0)/_a; }.v - 0x65, 0x63, 0x34, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x61, 0x29, // ec4 rcp(vec4 _a) - 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, // { return vec4(1 - 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, // .0)/_a; }.vec2 v - 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // ec2_splat(float - 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, // _x) { return vec - 0x32, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, // 2(_x, _x); }.vec - 0x33, 0x20, 0x76, 0x65, 0x63, 0x33, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, // 3 vec3_splat(flo - 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // at _x) { return - 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, // vec3(_x, _x, _x) - 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, // ; }.vec4 vec4_sp - 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, // lat(float _x) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, // return vec4(_x, - 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, // _x, _x, _x); }.u - 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, // vec2 uvec2_splat - 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // (uint _x) { retu - 0x72, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, // rn uvec2(_x, _x) - 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x5f, // ; }.uvec3 uvec3_ - 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, // splat(uint _x) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x78, // return uvec3(_x - 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, // , _x, _x); }.uve - 0x63, 0x34, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, // c4 uvec4_splat(u - 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // int _x) { return - 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, // uvec4(_x, _x, _ - 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6d, // x, _x); }.mat4 m - 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, // txFromRows(vec4 - 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, // _0, vec4 _1, vec - 0x34, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, 0x0a, 0x7b, // 4 _2, vec4 _3).{ - 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, // .return transpos - 0x65, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, // e(mat4(_0, _1, _ - 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, // 2, _3) );.}.mat4 - 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, // mtxFromCols(vec - 0x34, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, // 4 _0, vec4 _1, v - 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, // ec4 _2, vec4 _3) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x5f, // .{.return mat4(_ - 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x29, 0x3b, 0x0a, // 0, _1, _2, _3);. - 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, // }.mat3 mtxFromRo - 0x77, 0x73, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // ws(vec3 _0, vec3 - 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x29, 0x0a, 0x7b, 0x0a, // _1, vec3 _2).{. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, // return transpose - 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, // (mat3(_0, _1, _2 - 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, // ) );.}.mat3 mtxF - 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, // romCols(vec3 _0, - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // vec3 _1, vec3 _ - 0x32, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x33, // 2).{.return mat3 - 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, // (_0, _1, _2);.}. - 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, 0x28, 0x6d, // vec3 mtxGetRow(m - 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, // at3 _mtx, int _r - 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, // ow).{.return vec - 0x33, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, // 3(_mtx[0][_row], - 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, // _mtx[1][_row], - 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, // _mtx[2][_row]);. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, // }.vec3 mtxGetCol - 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, // umn(mat3 _mtx, i - 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // nt _column).{.re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, // turn vec3(_mtx[_ - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, // column]);.}.vec4 - 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, // mtxGetRow(mat4 - 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, // _mtx, int _row). - 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, // {.return vec4(_m - 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, // tx[0][_row], _mt - 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, // x[1][_row], _mtx - 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, // [2][_row], _mtx[ - 0x33, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, // 3][_row]);.}.vec - 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x6d, // 4 mtxGetColumn(m - 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, // at4 _mtx, int _c - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // olumn).{.return - 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, // vec4(_mtx[_colum - 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x74, 0x78, // n]);.}.float mtx - 0x47, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, // GetElement(mat3 - 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, // _mtx, int _colum - 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, // n, int _row).{.r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, // eturn _mtx[_colu - 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, // mn][_row];.}.flo - 0x61, 0x74, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, // at mtxGetElement - 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, // (mat4 _mtx, int - 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, // _column, int _ro - 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x78, // w).{.return _mtx - 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x3b, // [_column][_row]; - 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, // .}.float select( - 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, // bool _cond, floa - 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // t _true, float _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // false) { return - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, // _cond ? _true : - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, // _false; }.vec2 s - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // elect(bool _cond - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, // , vec2 _true, ve - 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c2 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, // urn _cond ? _tru - 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, // e : _false; }.ve - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, // c3 select(bool _ - 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // cond, vec3 _true - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, // , vec3 _false) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, // return _cond ? - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, // _true : _false; - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, // }.vec4 select(bo - 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // ol _cond, vec4 _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // true, vec4 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, // e) { return _con - 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, // d ? _true : _fal - 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // se; }.vec2 selec - 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, // t(bvec2 _cond, v - 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // ec2 _true, vec2 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, // (vec2(_cond) * - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6e, // _true) + (vec2(n - 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, // ot(_cond) ) * _f - 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, // alse); }.vec3 se - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // lect(bvec3 _cond - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, // , vec3 _true, ve - 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c3 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, // urn (vec3(_cond) - 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, // * _true) + (vec - 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, // 3(not(_cond) ) * - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, // _false); }.vec4 - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, // select(bvec4 _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // ond, vec4 _true, - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, // vec4 _false) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x63, 0x6f, // return (vec4(_co - 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, // nd) * _true) + ( - 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, // vec4(not(_cond) - 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, // ) * _false); }.i - 0x6e, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, // nt select(bool _ - 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // cond, int _true, - 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, // int _false) { r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, // eturn _cond ? _t - 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, // rue : _false; }. - 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, // ivec2 select(boo - 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, // l _cond, ivec2 _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, // true, ivec2 _fal - 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, // se) { return _co - 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, // nd ? _true : _fa - 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, // lse; }.ivec3 sel - 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, // ect(bool _cond, - 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, // ivec3 _true, ive - 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c3 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, // urn _cond ? _tru - 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, // e : _false; }.iv - 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, // ec4 select(bool - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, // _cond, ivec4 _tr - 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // ue, ivec4 _false - 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // ) { return _cond - 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // ? _true : _fals - 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // e; }.ivec2 selec - 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, // t(bvec2 _cond, i - 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // vec2 _true, ivec - 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // 2 _false) { retu - 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, // rn (ivec2(_cond) - 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, // * _true) + (ive - 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, // c2(not(_cond) ) - 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, // * _false); }.ive - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, // c3 select(bvec3 - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, // _cond, ivec3 _tr - 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // ue, ivec3 _false - 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, // ) { return (ivec - 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // 3(_cond) * _true - 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, // ) + (ivec3(not(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // cond) ) * _false - 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // ); }.ivec4 selec - 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, // t(bvec4 _cond, i - 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // vec4 _true, ivec - 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // 4 _false) { retu - 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, // rn (ivec4(_cond) - 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, // * _true) + (ive - 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, // c4(not(_cond) ) - 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x69, 0x6e, // * _false); }.uin - 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, // t select(bool _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // ond, uint _true, - 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, // uint _false) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, // return _cond ? _ - 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, // true : _false; } - 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, // .uvec2 select(bo - 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, // ol _cond, uvec2 - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, // _true, uvec2 _fa - 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, // lse) { return _c - 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, // ond ? _true : _f - 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, // alse; }.uvec3 se - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, // lect(bool _cond, - 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, // uvec3 _true, uv - 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, // ec3 _false) { re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, // turn _cond ? _tr - 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, // ue : _false; }.u - 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, // vec4 select(bool - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, // _cond, uvec4 _t - 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // rue, uvec4 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, // e) { return _con - 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, // d ? _true : _fal - 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, // se; }.uvec2 sele - 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, // ct(bvec2 _cond, - 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, // uvec2 _true, uve - 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c2 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // urn (uvec2(_cond - 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, // ) * _true) + (uv - 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, // ec2(not(_cond) ) - 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, // * _false); }.uv - 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, // ec3 select(bvec3 - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, // _cond, uvec3 _t - 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // rue, uvec3 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, // e) { return (uve - 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, // c3(_cond) * _tru - 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, // e) + (uvec3(not( - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // _cond) ) * _fals - 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, // e); }.uvec4 sele - 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, // ct(bvec4 _cond, - 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, // uvec4 _true, uve - 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c4 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // urn (uvec4(_cond - 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, // ) * _true) + (uv - 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, // ec4(not(_cond) ) - 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x6e, // * _false); }.un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, // iform vec4 u_vie - 0x77, 0x52, 0x65, 0x63, 0x74, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, // wRect;.uniform v - 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x3b, // ec4 u_viewTexel; - 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // .uniform mat4 u_ - 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, // view;.uniform ma - 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, // t4 u_invView;.un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x72, 0x6f, // iform mat4 u_pro - 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // j;.uniform mat4 - 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // u_invProj;.unifo - 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, // rm mat4 u_viewPr - 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, // oj;.uniform mat4 - 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, // u_invViewProj;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, // uniform mat4 u_m - 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // odelView;.unifor - 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x4d, 0x6f, 0x64, 0x65, // m mat4 u_invMode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, // lView;.uniform m - 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, // at4 u_modelViewP - 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, // roj;.uniform vec - 0x34, 0x20, 0x75, 0x5f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x52, 0x65, 0x66, 0x34, 0x3b, 0x0a, 0x75, // 4 u_alphaRef4;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, // niform mat4 u_mo - 0x64, 0x65, 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // del[1];.uniform - 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6e, 0x64, 0x63, 0x3b, 0x0a, 0x75, // vec4 bgfx_ndc;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, // niform vec4 bgfx - 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x41, 0x72, 0x67, 0x42, 0x61, 0x73, 0x65, // _indirectArgBase - 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, // ;.uniform sample - 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, // r2DArray bgfx_te - 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, // xMipSrc;.layout( - 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x30, // rgba8, binding=0 - 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, // ) writeonly unif - 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, // orm highp image2 - 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, // DArray s_imgMip1 - 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, // ;.layout(rgba8, - 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x31, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, // binding=1) write - 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, // only uniform hig - 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, // hp image2DArray - 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // s_imgMip2;.layou - 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, // t(rgba8, binding - 0x3d, 0x32, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, // =2) writeonly un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, // iform highp imag - 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, // e2DArray s_imgMi - 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, // p3;.layout(rgba8 - 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x33, 0x29, 0x20, 0x77, 0x72, 0x69, // , binding=3) wri - 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, // teonly uniform h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, // ighp image2DArra - 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // y s_imgMip4;.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, // form vec4 bgfx_m - 0x69, 0x70, 0x47, 0x65, 0x6e, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, // ipGen;.shared fl - 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, // oat gs_R[64];.sh - 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, // ared float gs_G[ - 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, // 64];.shared floa - 0x74, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, // t gs_B[64];.shar - 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, // ed float gs_A[64 - 0x5d, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, // ];.void storeCol - 0x6f, 0x72, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, // or(uint _index, - 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x0a, 0x7b, 0x0a, 0x67, // vec4 _color).{.g - 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, // s_R[_index] = _c - 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x69, 0x6e, // olor.x;.gs_G[_in - 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x3b, // dex] = _color.y; - 0x0a, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, // .gs_B[_index] = - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, // _color.z;.gs_A[_ - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, // index] = _color. - 0x77, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, // w;.}.vec4 loadCo - 0x6c, 0x6f, 0x72, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, // lor(uint _index) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, // .{.return vec4(g - 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, // s_R[_index], gs_ - 0x47, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, // G[_index], gs_B[ - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x69, // _index], gs_A[_i - 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // ndex]);.}.layout - 0x20, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, // (local_size_x = - 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, // 8, local_size_y - 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, // = 8, local_size - 0x5f, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, // _z = 1) in;.void - 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, // main().{.uint g - 0x69, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // i = gl_LocalInvo - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0a, 0x75, 0x76, 0x65, // cationIndex;.uve - 0x63, 0x33, 0x20, 0x64, 0x74, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, // c3 dtid = gl_Glo - 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x3b, // balInvocationID; - 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, // .uint srcMipLeve - 0x6c, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, // l = uint(bgfx_mi - 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x75, // pGen.x);.uint nu - 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, // mMipLevels = uin - 0x74, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, // t(bgfx_mipGen.y) - 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, // ;.vec2 texelSize - 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x7a, // = bgfx_mipGen.z - 0x77, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x3d, 0x20, // w;.uint slice = - 0x64, 0x74, 0x69, 0x64, 0x2e, 0x7a, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, // dtid.z;.vec4 src - 0x31, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, // 1;.vec2 uv1 = te - 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, // xelSize * (vec2( - 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, // dtid.xy) + vec2( - 0x30, 0x2e, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x76, // 0.25, 0.25) );.v - 0x65, 0x63, 0x32, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x53, // ec2 off = texelS - 0x69, 0x7a, 0x65, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, // ize * vec2_splat - 0x28, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, // (0.5);.src1 = te - 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x4c, 0x6f, 0x64, 0x28, // xture2DArrayLod( - 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, // bgfx_texMipSrc, - 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, // vec3(uv1, float( - 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, // slice) ), float( - 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x20, 0x29, 0x3b, 0x0a, // srcMipLevel) );. - 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, // src1 += texture2 - 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, // DArrayLod(bgfx_t - 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, // exMipSrc, vec3(u - 0x76, 0x31, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6f, 0x66, 0x66, 0x2e, 0x78, 0x2c, // v1 + vec2(off.x, - 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x6c, 0x69, // 0.0), float(sli - 0x63, 0x65, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x72, 0x63, // ce) ), float(src - 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, // MipLevel) );.src - 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, // 1 += texture2DAr - 0x72, 0x61, 0x79, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, // rayLod(bgfx_texM - 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x31, 0x20, // ipSrc, vec3(uv1 - 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x2e, // + vec2(0.0, off. - 0x79, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, // y), float(slice) - 0x20, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, // ), float(srcMip - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, // Level) );.src1 + - 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, // = texture2DArray - 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, // Lod(bgfx_texMipS - 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x31, 0x20, 0x2b, 0x20, 0x76, // rc, vec3(uv1 + v - 0x65, 0x63, 0x32, 0x28, 0x6f, 0x66, 0x66, 0x2e, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x2e, 0x79, // ec2(off.x, off.y - 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x20, // ), float(slice) - 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, // ), float(srcMipL - 0x65, 0x76, 0x65, 0x6c, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2a, 0x3d, // evel) );.src1 *= - 0x20, 0x30, 0x2e, 0x32, 0x35, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, // 0.25;.imageStor + 0x33, 0x28, 0x5f, 0x31, 0x31, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x5f, // 3(_110, _125), _ + 0x31, 0x33, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, // 131) + textureLo + 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, // d(bgfx_texMipSrc + 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x31, 0x31, 0x30, 0x20, 0x2b, 0x20, 0x76, 0x65, // , vec3(_110 + ve + 0x63, 0x32, 0x28, 0x5f, 0x31, 0x31, 0x36, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, // c2(_116.x, 0.0), + 0x20, 0x5f, 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x33, 0x31, 0x29, 0x29, 0x20, 0x2b, // _125), _131)) + + 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, // textureLod(bgfx + 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // _texMipSrc, vec3 + 0x28, 0x5f, 0x31, 0x31, 0x30, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, // (_110 + vec2(0.0 + 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x29, // , _116.y), _125) + 0x2c, 0x20, 0x5f, 0x31, 0x33, 0x31, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, // , _131)) + textu + 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, // reLod(bgfx_texMi + 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x31, 0x31, 0x30, 0x20, // pSrc, vec3(_110 + 0x2b, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x5f, // + _116, _125), _ + 0x31, 0x33, 0x31, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, // 131)) * 0.25;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x20, 0x3d, // int _196 = + 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, // int(gl_GlobalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, // vocationID.z);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, // imageStor 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, 0x2c, 0x20, 0x69, 0x76, 0x65, // e(s_imgMip1, ive - 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, // c3(dtid.xy, slic - 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, // e), src1);.if (n - 0x75, 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, // umMipLevels == 1 - 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x73, // u).{.return;.}.s - 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, // toreColor(gi, sr - 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, // c1);.barrier();. - 0x69, 0x66, 0x20, 0x28, 0x20, 0x28, 0x67, 0x69, 0x20, 0x26, 0x20, 0x30, 0x78, 0x39, 0x75, 0x29, // if ( (gi & 0x9u) - 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, // == 0u).{.vec4 s - 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, // rc2 = loadColor( - 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x31, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, // gi + 0x01u);.vec - 0x34, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, // 4 src3 = loadCol - 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x38, 0x75, 0x29, 0x3b, 0x0a, // or(gi + 0x08u);. - 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, // vec4 src4 = load - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x39, 0x75, // Color(gi + 0x09u - 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, // );.src1 = 0.25 * - 0x20, 0x28, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, // (src1 + src2 + - 0x73, 0x72, 0x63, 0x33, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, // src3 + src4);.im - 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, // ageStore(s_imgMi - 0x70, 0x32, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, // p2, ivec3(dtid.x - 0x79, 0x20, 0x2f, 0x20, 0x32, 0x75, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, // y / 2u, slice), - 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, // src1);.storeColo - 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, // r(gi, src1);.}.i - 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, // f (numMipLevels - 0x3d, 0x3d, 0x20, 0x32, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, // == 2u).{.return; - 0x0a, 0x7d, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, // .}.barrier();.if - 0x20, 0x28, 0x20, 0x28, 0x67, 0x69, 0x20, 0x26, 0x20, 0x30, 0x78, 0x31, 0x42, 0x75, 0x29, 0x20, // ( (gi & 0x1Bu) - 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, // == 0u).{.vec4 sr - 0x63, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, // c2 = loadColor(g - 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x32, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, // i + 0x02u);.vec4 - 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, // src3 = loadColo - 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x31, 0x30, 0x75, 0x29, 0x3b, 0x0a, 0x76, // r(gi + 0x10u);.v - 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, // ec4 src4 = loadC - 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x31, 0x32, 0x75, 0x29, // olor(gi + 0x12u) - 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, // ;.src1 = 0.25 * - 0x28, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, // (src1 + src2 + s - 0x72, 0x63, 0x33, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, // rc3 + src4);.ima + 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, // c3(ivec2(gl_Glob + 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, // alInvocationID.x + 0x79, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x29, // y), _196), _185) + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x39, // ;. if (_9 + 0x33, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 3 == 1u). + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, // {. b + 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // reak;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, // gs_R[gl_ + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // LocalInvocationI + 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x2e, 0x78, 0x3b, 0x0a, // ndex] = _185.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, // gs_G[gl_ + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // LocalInvocationI + 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x2e, 0x79, 0x3b, 0x0a, // ndex] = _185.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, // gs_B[gl_ + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // LocalInvocationI + 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x2e, 0x7a, 0x3b, 0x0a, // ndex] = _185.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, // gs_A[gl_ + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // LocalInvocationI + 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x2e, 0x77, 0x3b, 0x0a, // ndex] = _185.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, // barrier( + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // );. vec4 + 0x5f, 0x35, 0x39, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, // _597;. if + 0x20, 0x28, 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, // ((gl_LocalInvoc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x20, 0x39, 0x75, 0x29, // ationIndex & 9u) + 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // == 0u). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, // {. ui + 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, // nt _222 = gl_Loc + 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, // alInvocationInde + 0x78, 0x20, 0x2b, 0x20, 0x31, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // x + 1u;. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x31, 0x35, 0x20, 0x3d, // float _415 = + 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x32, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // gs_R[_222];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x34, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x32, 0x32, 0x5d, // 418 = gs_G[_222] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // ;. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, // oat _421 = gs_B[ + 0x5f, 0x32, 0x32, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _222];. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x34, 0x20, 0x3d, 0x20, // float _424 = + 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x32, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // gs_A[_222];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x32, // uint _22 + 0x38, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // 8 = gl_LocalInvo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x38, 0x75, // cationIndex + 8u + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // ;. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, // oat _430 = gs_R[ + 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _228];. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x33, 0x20, 0x3d, 0x20, // float _433 = + 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // gs_G[_228];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, // float _4 + 0x33, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, // 36 = gs_B[_228]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // . flo + 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, // at _439 = gs_A[_ + 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 228];. + 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x6c, // uint _233 = gl + 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // _LocalInvocation + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x39, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // Index + 9u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, // float _4 + 0x34, 0x35, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x33, 0x33, 0x5d, 0x3b, // 45 = gs_R[_233]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // . flo + 0x61, 0x74, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, // at _448 = gs_G[_ + 0x32, 0x33, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 233];. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x67, // float _451 = g + 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x33, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // s_B[_233];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, // float _45 + 0x34, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x33, 0x33, 0x5d, 0x3b, 0x0a, // 4 = gs_A[_233];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // vec4 + 0x20, 0x5f, 0x32, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x38, 0x35, 0x20, // _243 = (((_185 + 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x31, 0x35, 0x2c, 0x20, 0x5f, 0x34, 0x31, // + vec4(_415, _41 + 0x38, 0x2c, 0x20, 0x5f, 0x34, 0x32, 0x31, 0x2c, 0x20, 0x5f, 0x34, 0x32, 0x34, 0x29, 0x29, 0x20, // 8, _421, _424)) + 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x33, 0x30, 0x2c, 0x20, 0x5f, 0x34, 0x33, // + vec4(_430, _43 + 0x33, 0x2c, 0x20, 0x5f, 0x34, 0x33, 0x36, 0x2c, 0x20, 0x5f, 0x34, 0x33, 0x39, 0x29, 0x29, 0x20, // 3, _436, _439)) + 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x34, 0x35, 0x2c, 0x20, 0x5f, 0x34, 0x34, // + vec4(_445, _44 + 0x38, 0x2c, 0x20, 0x5f, 0x34, 0x35, 0x31, 0x2c, 0x20, 0x5f, 0x34, 0x35, 0x34, 0x29, 0x29, 0x20, // 8, _451, _454)) + 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // * 0.25;. + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, // imageStore(s + 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, // _imgMip2, ivec3( + 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, // ivec2(gl_GlobalI + 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, 0x2f, // nvocationID.xy / + 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x32, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x39, // uvec2(2u)), _19 + 0x36, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 6), _243);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, // gs_R[gl_L + 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, // ocalInvocationIn + 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x33, 0x2e, 0x78, 0x3b, 0x0a, 0x20, // dex] = _243.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, // gs_G[ + 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, // gl_LocalInvocati + 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x33, 0x2e, // onIndex] = _243. + 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, // y;. g + 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // s_B[gl_LocalInvo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, // cationIndex] = _ + 0x32, 0x34, 0x33, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 243.z;. + 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // gs_A[gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, // InvocationIndex] + 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x33, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _243.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, // _597 = _2 + 0x34, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, // 43;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x5f, 0x35, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x3b, 0x0a, 0x20, 0x20, // _597 = _185;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x69, 0x66, 0x20, 0x28, 0x5f, 0x39, 0x33, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x75, 0x29, 0x0a, 0x20, // if (_93 == 2u). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, // }. ba + 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // rrier();. + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x39, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // vec4 _598;. + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, // if ((gl_Loca + 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, // lInvocationIndex + 0x20, 0x26, 0x20, 0x32, 0x37, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, // & 27u) == 0u). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x35, 0x20, 0x3d, // uint _275 = + 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // gl_LocalInvocat + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x32, 0x75, 0x3b, 0x0a, 0x20, // ionIndex + 2u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // float + 0x20, 0x5f, 0x34, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x37, // _477 = gs_R[_27 + 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 5];. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x38, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, // float _480 = gs_ + 0x47, 0x5b, 0x5f, 0x32, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // G[_275];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x38, 0x33, 0x20, // float _483 + 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // = gs_B[_275];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // float + 0x5f, 0x34, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x37, 0x35, // _486 = gs_A[_275 + 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, // ];. u + 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, // int _281 = gl_Lo + 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, // calInvocationInd + 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x36, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ex + 16u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x39, 0x32, // float _492 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, // = gs_R[_281];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // float + 0x20, 0x5f, 0x34, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x38, // _495 = gs_G[_28 + 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 1];. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, // float _498 = gs_ + 0x42, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // B[_281];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x30, 0x31, 0x20, // float _501 + 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // = gs_A[_281];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, // uint _ + 0x32, 0x38, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // 287 = gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, // vocationIndex + + 0x31, 0x38, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 18u;. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x73, // float _507 = gs + 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _R[_287];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x31, 0x30, // float _510 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x3b, 0x0a, 0x20, // = gs_G[_287];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // float + 0x20, 0x5f, 0x35, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x38, // _513 = gs_B[_28 + 0x37, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 7];. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, // float _516 = gs_ + 0x41, 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // A[_287];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x39, 0x37, 0x20, 0x3d, // vec4 _297 = + 0x20, 0x28, 0x28, 0x28, 0x5f, 0x35, 0x39, 0x37, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // (((_597 + vec4( + 0x5f, 0x34, 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x34, 0x38, 0x30, 0x2c, 0x20, 0x5f, 0x34, 0x38, 0x33, // _477, _480, _483 + 0x2c, 0x20, 0x5f, 0x34, 0x38, 0x36, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // , _486)) + vec4( + 0x5f, 0x34, 0x39, 0x32, 0x2c, 0x20, 0x5f, 0x34, 0x39, 0x35, 0x2c, 0x20, 0x5f, 0x34, 0x39, 0x38, // _492, _495, _498 + 0x2c, 0x20, 0x5f, 0x35, 0x30, 0x31, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // , _501)) + vec4( + 0x5f, 0x35, 0x30, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x31, 0x30, 0x2c, 0x20, 0x5f, 0x35, 0x31, 0x33, // _507, _510, _513 + 0x2c, 0x20, 0x5f, 0x35, 0x31, 0x36, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x3b, // , _516)) * 0.25; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, // . ima 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, // geStore(s_imgMip - 0x33, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, // 3, ivec3(dtid.xy - 0x20, 0x2f, 0x20, 0x34, 0x75, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, // / 4u, slice), s - 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // rc1);.storeColor - 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, // (gi, src1);.}.if - 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, // (numMipLevels = - 0x3d, 0x20, 0x33, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, // = 3u).{.return;. - 0x7d, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, // }.barrier();.if - 0x28, 0x67, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, // (gi == 0u).{.vec - 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, // 4 src2 = loadCol - 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x34, 0x75, 0x29, 0x3b, 0x0a, // or(gi + 0x04u);. - 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, // vec4 src3 = load - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x32, 0x30, 0x75, // Color(gi + 0x20u - 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, // );.vec4 src4 = l - 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, // oadColor(gi + 0x - 0x32, 0x34, 0x75, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, // 24u);.src1 = 0.2 - 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, // 5 * (src1 + src2 - 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, // + src3 + src4); - 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, // .imageStore(s_im - 0x67, 0x4d, 0x69, 0x70, 0x34, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, // gMip4, ivec3(dti - 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x38, 0x75, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, // d.xy / 8u, slice - 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x00, // ), src1);.}.}.. + 0x33, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, // 3, ivec3(ivec2(g + 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, // l_GlobalInvocati + 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, // onID.xy / uvec2( + 0x34, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x39, // 4u)), _196), _29 + 0x37, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 7);. + 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, // gs_R[gl_LocalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, // ocationIndex] = + 0x5f, 0x32, 0x39, 0x37, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _297.x;. + 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, // gs_G[gl_Loca + 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, // lInvocationIndex + 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x37, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // ] = _297.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, // gs_B[gl_ + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // LocalInvocationI + 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x37, 0x2e, 0x7a, 0x3b, 0x0a, // ndex] = _297.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, // gs_A + 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // [gl_LocalInvocat + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x37, // ionIndex] = _297 + 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // .w;. + 0x5f, 0x35, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, // _598 = _297;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, // }. e + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // lse. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x39, 0x38, 0x20, 0x3d, // _598 = + 0x20, 0x5f, 0x35, 0x39, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // _597;. } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x39, 0x33, // . if (_93 + 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // == 3u). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, // {. br + 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, // eak;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, // barrier() + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x67, 0x6c, // ;. if (gl + 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // _LocalInvocation + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, // Index == 0u). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x67, // uint _328 = g + 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // l_LocalInvocatio + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x34, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, // nIndex + 4u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x33, // uint _3 + 0x33, 0x34, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, // 34 = gl_LocalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x33, // ocationIndex + 3 + 0x32, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 2u;. + 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, // uint _340 = gl_L + 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, // ocalInvocationIn + 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x33, 0x36, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // dex + 36u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, // imageStor + 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x2c, 0x20, 0x69, 0x76, 0x65, // e(s_imgMip4, ive + 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, // c3(ivec2(gl_Glob + 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, // alInvocationID.x + 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x38, 0x75, 0x29, 0x29, 0x2c, 0x20, // y / uvec2(8u)), + 0x5f, 0x31, 0x39, 0x36, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x35, 0x39, 0x38, 0x20, 0x2b, // _196), (((_598 + + 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x33, 0x32, 0x38, 0x5d, // vec4(gs_R[_328] + 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x33, 0x32, 0x38, 0x5d, 0x2c, 0x20, 0x67, 0x73, // , gs_G[_328], gs + 0x5f, 0x42, 0x5b, 0x5f, 0x33, 0x32, 0x38, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, // _B[_328], gs_A[_ + 0x33, 0x32, 0x38, 0x5d, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, // 328])) + vec4(gs + 0x5f, 0x52, 0x5b, 0x5f, 0x33, 0x33, 0x34, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, // _R[_334], gs_G[_ + 0x33, 0x33, 0x34, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x33, 0x33, 0x34, 0x5d, // 334], gs_B[_334] + 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x33, 0x33, 0x34, 0x5d, 0x29, 0x29, 0x20, 0x2b, // , gs_A[_334])) + + 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x33, 0x34, 0x30, 0x5d, // vec4(gs_R[_340] + 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x33, 0x34, 0x30, 0x5d, 0x2c, 0x20, 0x67, 0x73, // , gs_G[_340], gs + 0x5f, 0x42, 0x5b, 0x5f, 0x33, 0x34, 0x30, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, // _B[_340], gs_A[_ + 0x33, 0x34, 0x30, 0x5d, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x0a, // 340])) * 0.25);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, // break;. } w + 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, // hile(false);.}.. + 0x00, // . +}; +static const uint8_t cs_mipgen_oddxy_essl[4799] = +{ + 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0b, 0x62, // CSH............b + 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, // gfx_mipGen...... + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, // .....bgfx_texMip + 0x53, 0x72, 0x63, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x12, 0x00, // Src..........}.. + 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, // .layout(local_si + 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, // ze_x = 8, local_ + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, // size_y = 8, loca + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, // l_size_z = 1) in + 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ;..uniform vec4 + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // bgfx_mipGen;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, // form highp sampl + 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, // er2DArray bgfx_t + 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // exMipSrc;.layout + 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x62, // (location = 0, b + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, // inding = 0, rgba + 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, // 8) uniform write + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, // only highp image + 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, // 2DArray s_imgMip + 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, // 1;.layout(locati + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, // on = 1, binding + 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, // = 1, rgba8) unif + 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x68, 0x69, // orm writeonly hi + 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, // ghp image2DArray + 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // s_imgMip2;.layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x2c, // ut(location = 2, + 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x72, 0x67, // binding = 2, rg + 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, // ba8) uniform wri + 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, // teonly highp ima + 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, // ge2DArray s_imgM + 0x69, 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // ip3;.layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, // tion = 3, bindin + 0x67, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, // g = 3, rgba8) un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, // iform writeonly + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, // highp image2DArr + 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, 0x0a, 0x73, // ay s_imgMip4;..s + 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x52, // hared float gs_R + 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, // [64];.shared flo + 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, // at gs_G[64];.sha + 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x36, // red float gs_B[6 + 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // 4];.shared float + 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, // gs_A[64];..void + 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, // main().{. do + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, // . {. u + 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, // int _93 = uint(b + 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, // gfx_mipGen.y);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x31, 0x31, 0x30, // vec2 _110 + 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x7a, // = bgfx_mipGen.z + 0x77, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, // w * (vec2(gl_Glo + 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, // balInvocationID. + 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x32, 0x35, 0x29, // xy) + vec2(0.25) + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // );. vec2 + 0x5f, 0x31, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, // _116 = bgfx_mipG + 0x65, 0x6e, 0x2e, 0x7a, 0x77, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, // en.zw * vec2(0.5 + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // );. float + 0x20, 0x5f, 0x31, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x67, 0x6c, // _125 = float(gl + 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // _GlobalInvocatio + 0x6e, 0x49, 0x44, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // nID.z);. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, // float _131 = flo + 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, // at(uint(bgfx_mip + 0x47, 0x65, 0x6e, 0x2e, 0x78, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // Gen.x));. + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, // vec4 _185 = ((( + 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, // textureLod(bgfx_ + 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // texMipSrc, vec3( + 0x5f, 0x31, 0x31, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x33, // _110, _125), _13 + 0x31, 0x29, 0x20, 0x2b, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, // 1) + textureLod( + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, // bgfx_texMipSrc, + 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x31, 0x31, 0x30, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, // vec3(_110 + vec2 + 0x28, 0x5f, 0x31, 0x31, 0x36, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, // (_116.x, 0.0), _ + 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x33, 0x31, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x74, // 125), _131)) + t + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, // extureLod(bgfx_t + 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, // exMipSrc, vec3(_ + 0x31, 0x31, 0x30, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, // 110 + vec2(0.0, + 0x5f, 0x31, 0x31, 0x36, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, // _116.y), _125), + 0x5f, 0x31, 0x33, 0x31, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, // _131)) + texture + 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, // Lod(bgfx_texMipS + 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x31, 0x31, 0x30, 0x20, 0x2b, 0x20, // rc, vec3(_110 + + 0x5f, 0x31, 0x31, 0x36, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x33, // _116, _125), _13 + 0x31, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 1)) * 0.25;. + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x69, // int _196 = i + 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // nt(gl_GlobalInvo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // cationID.z);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, // imageStore( + 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, // s_imgMip1, ivec3 + 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, // (ivec2(gl_Global + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x29, // InvocationID.xy) + 0x2c, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x29, 0x3b, 0x0a, // , _196), _185);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x39, 0x33, 0x20, // if (_93 + 0x3d, 0x3d, 0x20, 0x31, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, // == 1u). { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, // . bre + 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, // ak;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, // gs_R[gl_Lo + 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, // calInvocationInd + 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, // ex] = _185.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, // gs_G[gl_Lo + 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, // calInvocationInd + 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, // ex] = _185.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, // gs_B[gl_Lo + 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, // calInvocationInd + 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, // ex] = _185.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, // gs_A[gl_Lo + 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, // calInvocationInd + 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, // ex] = _185.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, // barrier(); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, // . vec4 _5 + 0x39, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, // 97;. if ( + 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // (gl_LocalInvocat + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x20, 0x39, 0x75, 0x29, 0x20, 0x3d, // ionIndex & 9u) = + 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // = 0u). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, // uint + 0x20, 0x5f, 0x32, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // _222 = gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, // InvocationIndex + 0x2b, 0x20, 0x31, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 1u;. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x67, // float _415 = g + 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x32, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // s_R[_222];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x31, // float _41 + 0x38, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x32, 0x32, 0x5d, 0x3b, 0x0a, // 8 = gs_G[_222];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // floa + 0x74, 0x20, 0x5f, 0x34, 0x32, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, // t _421 = gs_B[_2 + 0x32, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 22];. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x67, 0x73, // float _424 = gs + 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x32, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _A[_222];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x38, 0x20, // uint _228 + 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, // = gl_LocalInvoca + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x38, 0x75, 0x3b, 0x0a, // tionIndex + 8u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // floa + 0x74, 0x20, 0x5f, 0x34, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, // t _430 = gs_R[_2 + 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 28];. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x73, // float _433 = gs + 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _G[_228];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x36, // float _436 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, // = gs_B[_228];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // float + 0x20, 0x5f, 0x34, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x32, // _439 = gs_A[_22 + 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 8];. + 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, // uint _233 = gl_L + 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, // ocalInvocationIn + 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x39, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // dex + 9u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x34, 0x35, // float _445 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x33, 0x33, 0x5d, 0x3b, 0x0a, 0x20, // = gs_R[_233];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // float + 0x20, 0x5f, 0x34, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x33, // _448 = gs_G[_23 + 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 3];. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, // float _451 = gs_ + 0x42, 0x5b, 0x5f, 0x32, 0x33, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // B[_233];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x34, 0x20, // float _454 + 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x33, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // = gs_A[_233];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // vec4 _ + 0x32, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x38, 0x35, 0x20, 0x2b, 0x20, // 243 = (((_185 + + 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x31, 0x35, 0x2c, 0x20, 0x5f, 0x34, 0x31, 0x38, 0x2c, // vec4(_415, _418, + 0x20, 0x5f, 0x34, 0x32, 0x31, 0x2c, 0x20, 0x5f, 0x34, 0x32, 0x34, 0x29, 0x29, 0x20, 0x2b, 0x20, // _421, _424)) + + 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x33, 0x30, 0x2c, 0x20, 0x5f, 0x34, 0x33, 0x33, 0x2c, // vec4(_430, _433, + 0x20, 0x5f, 0x34, 0x33, 0x36, 0x2c, 0x20, 0x5f, 0x34, 0x33, 0x39, 0x29, 0x29, 0x20, 0x2b, 0x20, // _436, _439)) + + 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x34, 0x35, 0x2c, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x2c, // vec4(_445, _448, + 0x20, 0x5f, 0x34, 0x35, 0x31, 0x2c, 0x20, 0x5f, 0x34, 0x35, 0x34, 0x29, 0x29, 0x20, 0x2a, 0x20, // _451, _454)) * + 0x30, 0x2e, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 0.25;. + 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, // imageStore(s_i + 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, // mgMip2, ivec3(iv + 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, // ec2(gl_GlobalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, // ocationID.xy / u + 0x76, 0x65, 0x63, 0x32, 0x28, 0x32, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x29, // vec2(2u)), _196) + 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // , _243);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, // gs_R[gl_Loc + 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, // alInvocationInde + 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x33, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, // x] = _243.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, // gs_G[gl + 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // _LocalInvocation + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x33, 0x2e, 0x79, 0x3b, // Index] = _243.y; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, // . gs_ + 0x42, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, // B[gl_LocalInvoca + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, // tionIndex] = _24 + 0x33, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 3.z;. + 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // gs_A[gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, // vocationIndex] = + 0x20, 0x5f, 0x32, 0x34, 0x33, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _243.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x33, // _597 = _243 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, // ;. }. + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, // {. _ + 0x35, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 597 = _185;. + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, // }. if + 0x20, 0x28, 0x5f, 0x39, 0x33, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, // (_93 == 2u). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, // }. barr + 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, // ier();. v + 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x39, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ec4 _598;. + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, // if ((gl_LocalI + 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, // nvocationIndex & + 0x20, 0x32, 0x37, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, // 27u) == 0u). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x35, 0x20, 0x3d, 0x20, 0x67, // uint _275 = g + 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // l_LocalInvocatio + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x32, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, // nIndex + 2u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x34, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x37, 0x35, 0x5d, // 477 = gs_R[_275] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // ;. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x38, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, // oat _480 = gs_G[ + 0x5f, 0x32, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _275];. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x38, 0x33, 0x20, 0x3d, 0x20, // float _483 = + 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // gs_B[_275];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, // float _4 + 0x38, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x37, 0x35, 0x5d, 0x3b, // 86 = gs_A[_275]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, // . uin + 0x74, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, // t _281 = gl_Loca + 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, // lInvocationIndex + 0x20, 0x2b, 0x20, 0x31, 0x36, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 16u;. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x39, 0x32, 0x20, 0x3d, // float _492 = + 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // gs_R[_281];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x34, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, // 495 = gs_G[_281] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // ;. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, // oat _498 = gs_B[ + 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _281];. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x30, 0x31, 0x20, 0x3d, 0x20, // float _501 = + 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // gs_A[_281];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x38, // uint _28 + 0x37, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // 7 = gl_LocalInvo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x38, // cationIndex + 18 + 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // u;. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, // loat _507 = gs_R + 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // [_287];. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x31, 0x30, 0x20, 0x3d, // float _510 = + 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // gs_G[_287];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x35, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, // 513 = gs_B[_287] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // ;. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, // oat _516 = gs_A[ + 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _287];. + 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x28, // vec4 _297 = ( + 0x28, 0x28, 0x5f, 0x35, 0x39, 0x37, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, // ((_597 + vec4(_4 + 0x37, 0x37, 0x2c, 0x20, 0x5f, 0x34, 0x38, 0x30, 0x2c, 0x20, 0x5f, 0x34, 0x38, 0x33, 0x2c, 0x20, // 77, _480, _483, + 0x5f, 0x34, 0x38, 0x36, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, // _486)) + vec4(_4 + 0x39, 0x32, 0x2c, 0x20, 0x5f, 0x34, 0x39, 0x35, 0x2c, 0x20, 0x5f, 0x34, 0x39, 0x38, 0x2c, 0x20, // 92, _495, _498, + 0x5f, 0x35, 0x30, 0x31, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x35, // _501)) + vec4(_5 + 0x30, 0x37, 0x2c, 0x20, 0x5f, 0x35, 0x31, 0x30, 0x2c, 0x20, 0x5f, 0x35, 0x31, 0x33, 0x2c, 0x20, // 07, _510, _513, + 0x5f, 0x35, 0x31, 0x36, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x3b, 0x0a, 0x20, // _516)) * 0.25;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, // image + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x33, 0x2c, // Store(s_imgMip3, + 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, // ivec3(ivec2(gl_ + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // GlobalInvocation + 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x34, 0x75, // ID.xy / uvec2(4u + 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x39, 0x37, 0x29, // )), _196), _297) + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, // ;. gs + 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, // _R[gl_LocalInvoc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, // ationIndex] = _2 + 0x39, 0x37, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 97.x;. + 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, // gs_G[gl_LocalI + 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, // nvocationIndex] + 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x37, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _297.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, // gs_B[gl_Lo + 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, // calInvocationInd + 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x37, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, // ex] = _297.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, // gs_A[g + 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // l_LocalInvocatio + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x37, 0x2e, 0x77, // nIndex] = _297.w + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, // ;. _5 + 0x39, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x39, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 98 = _297;. + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, // }. els + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // e. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x39, 0x38, 0x20, 0x3d, 0x20, 0x5f, // _598 = _ + 0x35, 0x39, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, // 597;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x39, 0x33, 0x20, 0x3d, // if (_93 = + 0x3d, 0x20, 0x33, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // = 3u). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, // brea + 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, // k;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, // barrier();. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x67, 0x6c, 0x5f, 0x4c, // if (gl_L + 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, // ocalInvocationIn + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // dex == 0u). + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x33, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, // uint _328 = gl_ + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // LocalInvocationI + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x34, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // ndex + 4u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x33, 0x33, 0x34, // uint _334 + 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, // = gl_LocalInvoc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x33, 0x32, 0x75, // ationIndex + 32u + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, // ;. ui + 0x6e, 0x74, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, // nt _340 = gl_Loc + 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, // alInvocationInde + 0x78, 0x20, 0x2b, 0x20, 0x33, 0x36, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // x + 36u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, // imageStore( + 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, // s_imgMip4, ivec3 + 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, // (ivec2(gl_Global + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, // InvocationID.xy + 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x38, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, // / uvec2(8u)), _1 + 0x39, 0x36, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x35, 0x39, 0x38, 0x20, 0x2b, 0x20, 0x76, // 96), (((_598 + v + 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x33, 0x32, 0x38, 0x5d, 0x2c, 0x20, // ec4(gs_R[_328], + 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x33, 0x32, 0x38, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, // gs_G[_328], gs_B + 0x5b, 0x5f, 0x33, 0x32, 0x38, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x33, 0x32, // [_328], gs_A[_32 + 0x38, 0x5d, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, // 8])) + vec4(gs_R + 0x5b, 0x5f, 0x33, 0x33, 0x34, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x33, 0x33, // [_334], gs_G[_33 + 0x34, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x33, 0x33, 0x34, 0x5d, 0x2c, 0x20, // 4], gs_B[_334], + 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x33, 0x33, 0x34, 0x5d, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, // gs_A[_334])) + v + 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x33, 0x34, 0x30, 0x5d, 0x2c, 0x20, // ec4(gs_R[_340], + 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x33, 0x34, 0x30, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, // gs_G[_340], gs_B + 0x5b, 0x5f, 0x33, 0x34, 0x30, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x33, 0x34, // [_340], gs_A[_34 + 0x30, 0x5d, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, // 0])) * 0.25);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, // break;. } whi + 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // le(false);.}... }; static const uint8_t cs_mipgen_oddxy_spv[6733] = { diff --git a/src/cs_mipgen_oddy.bin.h b/src/cs_mipgen_oddy.bin.h index e51cfdfeb..2e97d05a9 100644 --- a/src/cs_mipgen_oddy.bin.h +++ b/src/cs_mipgen_oddy.bin.h @@ -1,790 +1,586 @@ -static const uint8_t cs_mipgen_oddy_glsl[6373] = +static const uint8_t cs_mipgen_oddy_glsl[4604] = { - 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x18, // CSH............. - 0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x33, 0x30, 0x0a, 0x66, // ..#version 430.f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x63, 0x70, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // loat rcp(float _ - 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2e, 0x30, 0x2f, // a) { return 1.0/ - 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, // _a; }.vec2 rcp(v - 0x65, 0x63, 0x32, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // ec2 _a) { return - 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, // vec2(1.0)/_a; } - 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // .vec3 rcp(vec3 _ - 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, // a) { return vec3 - 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, // (1.0)/_a; }.vec4 - 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, // rcp(vec4 _a) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, // return vec4(1.0) - 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x65, 0x63, 0x32, // /_a; }.vec2 vec2 - 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, // _splat(float _x) - 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, // { return vec2(_ - 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // x, _x); }.vec3 v - 0x65, 0x63, 0x33, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // ec3_splat(float - 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, // _x) { return vec - 0x33, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, // 3(_x, _x, _x); } - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, // .vec4 vec4_splat - 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // (float _x) { ret - 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, // urn vec4(_x, _x, - 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, // _x, _x); }.uvec - 0x32, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, 0x69, // 2 uvec2_splat(ui - 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // nt _x) { return - 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, // uvec2(_x, _x); } - 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x5f, 0x73, 0x70, 0x6c, // .uvec3 uvec3_spl - 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, // at(uint _x) { re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, // turn uvec3(_x, _ - 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, // x, _x); }.uvec4 - 0x75, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, // uvec4_splat(uint - 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x76, // _x) { return uv - 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, // ec4(_x, _x, _x, - 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x46, // _x); }.mat4 mtxF - 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x30, 0x2c, // romRows(vec4 _0, - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // vec4 _1, vec4 _ - 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // 2, vec4 _3).{.re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, // turn transpose(m - 0x61, 0x74, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x2c, 0x20, // at4(_0, _1, _2, - 0x5f, 0x33, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x74, // _3) );.}.mat4 mt - 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // xFromCols(vec4 _ - 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, // 0, vec4 _1, vec4 - 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, 0x0a, 0x7b, 0x0a, // _2, vec4 _3).{. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, // return mat4(_0, - 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, // _1, _2, _3);.}.m - 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, // at3 mtxFromRows( - 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, // vec3 _0, vec3 _1 - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, // , vec3 _2).{.ret - 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, // urn transpose(ma - 0x74, 0x33, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, 0x20, 0x29, // t3(_0, _1, _2) ) - 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, // ;.}.mat3 mtxFrom - 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, // Cols(vec3 _0, ve - 0x63, 0x33, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x29, 0x0a, // c3 _1, vec3 _2). - 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x5f, 0x30, // {.return mat3(_0 - 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, // , _1, _2);.}.mat - 0x34, 0x78, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, // 4x3 mtxFromRows( - 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, // vec4 _0, vec4 _1 - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, // , vec4 _2).{.ret - 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, // urn transpose(ma - 0x74, 0x33, 0x78, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, // t3x4(_0, _1, _2) - 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, // );.}.vec3 mtxGe - 0x74, 0x52, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, // tRow(mat3 _mtx, - 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, // int _row).{.retu - 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, // rn vec3(_mtx[0][ - 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, // _row], _mtx[1][_ - 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, // row], _mtx[2][_r - 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, // ow]);.}.vec3 mtx - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, // GetColumn(mat3 _ - 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, // mtx, int _column - 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // ).{.return vec3( - 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, // _mtx[_column]);. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, // }.vec4 mtxGetRow - 0x28, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, // (mat4x3 _mtx, in - 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // t _row).{.return - 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, // vec4(_mtx[0][_r - 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, // ow], _mtx[1][_ro - 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, // w], _mtx[2][_row - 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x33, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, // ], _mtx[3][_row] - 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, // );.}.vec3 mtxGet - 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x6d, // Column(mat4x3 _m - 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, // tx, int _column) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, // .{.return vec3(_ - 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, // mtx[_column]);.} - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, 0x28, // .vec4 mtxGetRow( - 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, // mat4 _mtx, int _ - 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, // row).{.return ve - 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, // c4(_mtx[0][_row] - 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, // , _mtx[1][_row], - 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, // _mtx[2][_row], - 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x33, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, // _mtx[3][_row]);. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, // }.vec4 mtxGetCol - 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, // umn(mat4 _mtx, i - 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // nt _column).{.re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, // turn vec4(_mtx[_ - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, // column]);.}.floa - 0x74, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, // t mtxGetElement( - 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, // mat3 _mtx, int _ - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, // column, int _row - 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, // ).{.return _mtx[ - 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x3b, 0x0a, // _column][_row];. - 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x45, 0x6c, // }.float mtxGetEl - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, // ement(mat4 _mtx, - 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2c, 0x20, 0x69, 0x6e, // int _column, in - 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // t _row).{.return - 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, // _mtx[_column][_ - 0x72, 0x6f, 0x77, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x65, // row];.}.float se - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, // lect(bool _cond, - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x66, 0x6c, // float _true, fl - 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, // oat _false) { re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, // turn _cond ? _tr - 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, // ue : _false; }.v - 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, // ec2 select(bool - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, // _cond, vec2 _tru - 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // e, vec2 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, // { return _cond ? - 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, // _true : _false; - 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, // }.vec3 select(b - 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // ool _cond, vec3 - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, // _true, vec3 _fal - 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, // se) { return _co - 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, // nd ? _true : _fa - 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, // lse; }.vec4 sele - 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, // ct(bool _cond, v - 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ec4 _true, vec4 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, // _cond ? _true : - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, // _false; }.vec2 - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, // select(bvec2 _co - 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, // nd, vec2 _true, - 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, // vec2 _false) { r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, // eturn (vec2(_con - 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, // d) * _true) + (v - 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, // ec2(not(_cond) ) - 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, // * _false); }.ve - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, // c3 select(bvec3 - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, // _cond, vec3 _tru - 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // e, vec3 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, // { return (vec3(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, // cond) * _true) + - 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // (vec3(not(_cond - 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, // ) ) * _false); } - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, // .vec4 select(bve - 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // c4 _cond, vec4 _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // true, vec4 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, // e) { return (vec - 0x34, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // 4(_cond) * _true - 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, // ) + (vec4(not(_c - 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, // ond) ) * _false) - 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, // ; }.int select(b - 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, // ool _cond, int _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // true, int _false - 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // ) { return _cond - 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // ? _true : _fals - 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // e; }.ivec2 selec - 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, // t(bool _cond, iv - 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, // ec2 _true, ivec2 - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, // _false) { retur - 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, // n _cond ? _true - 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, // : _false; }.ivec - 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, // 3 select(bool _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // ond, ivec3 _true - 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // , ivec3 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, // { return _cond ? - 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, // _true : _false; - 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, // }.ivec4 select( - 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // bool _cond, ivec - 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // 4 _true, ivec4 _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // false) { return - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, // _cond ? _true : - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, // _false; }.ivec2 - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, // select(bvec2 _co - 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // nd, ivec2 _true, - 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, // ivec2 _false) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, // return (ivec2(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, // cond) * _true) + - 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, // (ivec2(not(_con - 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, // d) ) * _false); - 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, // }.ivec3 select(b - 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // vec3 _cond, ivec - 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // 3 _true, ivec3 _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // false) { return - 0x28, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, // (ivec3(_cond) * - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, // _true) + (ivec3( - 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, // not(_cond) ) * _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, // false); }.ivec4 - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, // select(bvec4 _co - 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // nd, ivec4 _true, - 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, // ivec4 _false) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, // return (ivec4(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, // cond) * _true) + - 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, // (ivec4(not(_con - 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, // d) ) * _false); - 0x7d, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, // }.uint select(bo - 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, // ol _cond, uint _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // true, uint _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, // e) { return _con - 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, // d ? _true : _fal - 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, // se; }.uvec2 sele - 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, // ct(bool _cond, u - 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, // vec2 _true, uvec - 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // 2 _false) { retu - 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // rn _cond ? _true - 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, // : _false; }.uve - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, // c3 select(bool _ - 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, // cond, uvec3 _tru - 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, // e, uvec3 _false) - 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, // { return _cond - 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // ? _true : _false - 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, // ; }.uvec4 select - 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, // (bool _cond, uve - 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, // c4 _true, uvec4 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, // _cond ? _true : - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, // _false; }.uvec2 - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, // select(bvec2 _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // ond, uvec2 _true - 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // , uvec2 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, // { return (uvec2( - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, // _cond) * _true) - 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, // + (uvec2(not(_co - 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, // nd) ) * _false); - 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, // }.uvec3 select( - 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, // bvec3 _cond, uve - 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, // c3 _true, uvec3 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, // (uvec3(_cond) * - 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x33, // _true) + (uvec3 - 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, // (not(_cond) ) * - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, // _false); }.uvec4 - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, // select(bvec4 _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // ond, uvec4 _true - 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // , uvec4 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, // { return (uvec4( - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, // _cond) * _true) - 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, // + (uvec4(not(_co - 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, // nd) ) * _false); - 0x20, 0x7d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // }.uniform vec4 - 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x63, 0x74, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // u_viewRect;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x54, // orm vec4 u_viewT - 0x65, 0x78, 0x65, 0x6c, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, // exel;.uniform ma - 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // t4 u_view;.unifo - 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, // rm mat4 u_invVie - 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // w;.uniform mat4 - 0x75, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // u_proj;.uniform - 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, // mat4 u_invProj;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, // uniform mat4 u_v - 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // iewProj;.uniform - 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, 0x77, 0x50, // mat4 u_invViewP - 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, // roj;.uniform mat - 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, // 4 u_modelView;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, // niform mat4 u_in - 0x76, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // vModelView;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, // orm mat4 u_model - 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // ViewProj;.unifor - 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x52, 0x65, // m vec4 u_alphaRe - 0x66, 0x34, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, // f4;.uniform mat4 - 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // u_model[1];.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6e, // form vec4 bgfx_n - 0x64, 0x63, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, // dc;.uniform vec4 - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x41, 0x72, // bgfx_indirectAr - 0x67, 0x42, 0x61, 0x73, 0x65, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, // gBase;.uniform s - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, // ampler2DArray bg - 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, // fx_texMipSrc;.la - 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, // yout(rgba8, bind - 0x69, 0x6e, 0x67, 0x3d, 0x30, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, // ing=0) writeonly - 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, // uniform image2D - 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, 0x3b, // Array s_imgMip1; - 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, // .layout(rgba8, b - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x31, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, // inding=1) writeo - 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, 0x6d, 0x61, 0x67, // nly uniform imag - 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, // e2DArray s_imgMi - 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, // p2;.layout(rgba8 - 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x32, 0x29, 0x20, 0x77, 0x72, 0x69, // , binding=2) wri - 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, // teonly uniform i + 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0b, 0x62, // CSH............b + 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, // gfx_mipGen...... + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, // .....bgfx_texMip + 0x53, 0x72, 0x63, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x11, 0x00, // Src............. + 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, // .layout(local_si + 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, // ze_x = 8, local_ + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, // size_y = 8, loca + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, // l_size_z = 1) in + 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ;..uniform vec4 + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // bgfx_mipGen;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, // form sampler2DAr + 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, // ray bgfx_texMipS + 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, // rc;.layout(locat + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, // ion = 0, binding + 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, // = 0, rgba8) uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, // form writeonly i 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, // mage2DArray s_im - 0x67, 0x4d, 0x69, 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, // gMip3;.layout(rg - 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x33, 0x29, 0x20, // ba8, binding=3) - 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // writeonly unifor - 0x6d, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, // m image2DArray s - 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // _imgMip4;.unifor - 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, // m vec4 bgfx_mipG - 0x65, 0x6e, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // en;.shared float - 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, // gs_R[64];.share - 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x36, 0x34, 0x5d, // d float gs_G[64] - 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, // ;.shared float g - 0x73, 0x5f, 0x42, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, // s_B[64];.shared - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, // float gs_A[64];. - 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, // void storeColor( - 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x76, 0x65, 0x63, // uint _index, vec - 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x0a, 0x7b, 0x0a, 0x67, 0x73, 0x5f, 0x52, // 4 _color).{.gs_R - 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // [_index] = _colo - 0x72, 0x2e, 0x78, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, // r.x;.gs_G[_index - 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x3b, 0x0a, 0x67, 0x73, // ] = _color.y;.gs - 0x5f, 0x42, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, // _B[_index] = _co - 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x69, 0x6e, 0x64, // lor.z;.gs_A[_ind - 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x77, 0x3b, 0x0a, // ex] = _color.w;. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // }.vec4 loadColor - 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x0a, 0x7b, 0x0a, // (uint _index).{. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, // return vec4(gs_R - 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, // [_index], gs_G[_ - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x69, 0x6e, // index], gs_B[_in - 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, // dex], gs_A[_inde - 0x78, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x20, 0x28, 0x6c, // x]);.}.layout (l - 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, 0x20, 0x38, 0x2c, // ocal_size_x = 8, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, 0x20, 0x3d, 0x20, // local_size_y = - 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x7a, 0x20, // 8, local_size_z - 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // = 1) in;.void ma - 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x69, 0x20, 0x3d, // in().{.uint gi = + 0x67, 0x4d, 0x69, 0x70, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, // gMip1;.layout(lo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, // cation = 1, bind + 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, // ing = 1, rgba8) + 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, // uniform writeonl + 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, // y image2DArray s + 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // _imgMip2;.layout + 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x62, // (location = 2, b + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, // inding = 2, rgba + 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, // 8) uniform write + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, // only image2DArra + 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, // y s_imgMip3;.lay + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, // out(location = 3 + 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x72, // , binding = 3, r + 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, // gba8) uniform wr + 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, // iteonly image2DA + 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, // rray s_imgMip4;. + 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, // .shared float gs + 0x5f, 0x52, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, // _R[64];.shared f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, // loat gs_G[64];.s + 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x42, // hared float gs_B + 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, // [64];.shared flo + 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, // at gs_A[64];..vo + 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // id main().{. + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // do. {. + 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, // uint _84 = uint + 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, 0x3b, // (bgfx_mipGen.y); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x31, // . vec2 _1 + 0x30, 0x33, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, // 03 = bgfx_mipGen + 0x2e, 0x7a, 0x77, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, // .zw * (vec2(gl_G + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // lobalInvocationI + 0x44, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, // D.xy) + vec2(0.5 + 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // , 0.25));. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x66, // float _117 = f + 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, // loat(gl_GlobalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, // vocationID.z);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, // float _12 + 0x33, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, // 3 = float(uint(b + 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x78, 0x29, 0x29, 0x3b, 0x0a, // gfx_mipGen.x));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x33, // vec4 _13 + 0x38, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, // 8 = (textureLod( + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, // bgfx_texMipSrc, + 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x29, // vec3(_103, _117) + 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x29, 0x20, 0x2b, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, // , _123) + textur + 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, // eLod(bgfx_texMip + 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x20, 0x2b, // Src, vec3(_103 + + 0x20, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x7a, 0x77, // (bgfx_mipGen.zw + 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x35, // * vec2(0.0, 0.5 + 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x29, // )), _117), _123) + 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ) * 0.5;. + 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, // int _149 = int( + 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // gl_GlobalInvocat + 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ionID.z);. + 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, // imageStore(s_i + 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, // mgMip1, ivec3(iv + 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, // ec2(gl_GlobalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x5f, // ocationID.xy), _ + 0x31, 0x34, 0x39, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 149), _138);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x3d, 0x20, // if (_84 == + 0x31, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // 1u). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, // break; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . }. + 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // gs_R[gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, // InvocationIndex] + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _138.x;. + 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // gs_G[gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, // InvocationIndex] + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _138.y;. + 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // gs_B[gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, // InvocationIndex] + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _138.z;. + 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // gs_A[gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, // InvocationIndex] + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _138.w;. + 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, // barrier();. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x34, 0x32, 0x3b, // vec4 _542; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x67, 0x6c, // . if ((gl + 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // _LocalInvocation + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x20, 0x39, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, // Index & 9u) == 0 + 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // u). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, // uint _1 + 0x37, 0x35, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, // 75 = gl_LocalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, // ocationIndex + 1 + 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // u;. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, // loat _364 = gs_R + 0x5b, 0x5f, 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // [_175];. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x37, 0x20, 0x3d, // float _367 = + 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // gs_G[_175];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x33, 0x37, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x31, 0x37, 0x35, 0x5d, // 370 = gs_B[_175] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // ;. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, // oat _373 = gs_A[ + 0x5f, 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _175];. + 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x67, // uint _181 = g + 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // l_LocalInvocatio + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x38, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, // nIndex + 8u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x33, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x31, 0x38, 0x31, 0x5d, // 379 = gs_R[_181] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // ;. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, // oat _382 = gs_G[ + 0x5f, 0x31, 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _181];. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x38, 0x35, 0x20, 0x3d, 0x20, // float _385 = + 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x31, 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // gs_B[_181];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, // float _3 + 0x38, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x31, 0x38, 0x31, 0x5d, 0x3b, // 88 = gs_A[_181]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, // . uin + 0x74, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, // t _186 = gl_Loca + 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, // lInvocationIndex + 0x20, 0x2b, 0x20, 0x39, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 9u;. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x20, 0x3d, 0x20, // float _394 = + 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x31, 0x38, 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // gs_R[_186];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, // float _3 + 0x39, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x31, 0x38, 0x36, 0x5d, 0x3b, // 97 = gs_G[_186]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // . flo + 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, // at _400 = gs_B[_ + 0x31, 0x38, 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 186];. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x67, // float _403 = g + 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x31, 0x38, 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // s_A[_186];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x39, 0x36, // vec4 _196 + 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x38, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, // = (((_138 + vec + 0x34, 0x28, 0x5f, 0x33, 0x36, 0x34, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x37, 0x2c, 0x20, 0x5f, 0x33, // 4(_364, _367, _3 + 0x37, 0x30, 0x2c, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, // 70, _373)) + vec + 0x34, 0x28, 0x5f, 0x33, 0x37, 0x39, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x2c, 0x20, 0x5f, 0x33, // 4(_379, _382, _3 + 0x38, 0x35, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x38, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, // 85, _388)) + vec + 0x34, 0x28, 0x5f, 0x33, 0x39, 0x34, 0x2c, 0x20, 0x5f, 0x33, 0x39, 0x37, 0x2c, 0x20, 0x5f, 0x34, // 4(_394, _397, _4 + 0x30, 0x30, 0x2c, 0x20, 0x5f, 0x34, 0x30, 0x33, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, // 00, _403)) * 0.2 + 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, // 5;. i + 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, // mageStore(s_imgM + 0x69, 0x70, 0x32, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, // ip2, ivec3(ivec2 + 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, // (gl_GlobalInvoca + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, // tionID.xy / uvec + 0x32, 0x28, 0x32, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x34, 0x39, 0x29, 0x2c, 0x20, 0x5f, // 2(2u)), _149), _ + 0x31, 0x39, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 196);. + 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, // gs_R[gl_LocalI + 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, // nvocationIndex] + 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _196.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, // gs_G[gl_Lo + 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, // calInvocationInd + 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, // ex] = _196.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, // gs_B[g + 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // l_LocalInvocatio + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x2e, 0x7a, // nIndex] = _196.z + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, // ;. gs + 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, // _A[gl_LocalInvoc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, // ationIndex] = _1 + 0x39, 0x36, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 96.w;. + 0x20, 0x20, 0x5f, 0x35, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x3b, 0x0a, 0x20, // _542 = _196;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // else. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x32, // _542 + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _138;. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, // }. if (_ + 0x38, 0x34, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 84 == 2u). + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // break;. } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, // . barrier + 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // ();. vec4 + 0x20, 0x5f, 0x35, 0x34, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, // _543;. i + 0x66, 0x20, 0x28, 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // f ((gl_LocalInvo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x20, 0x32, 0x37, // cationIndex & 27 + 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // u) == 0u). + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, // uint _228 = gl_L + 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, // ocalInvocationIn + 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x32, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // dex + 2u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x36, // float _426 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, // = gs_R[_228];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // float + 0x20, 0x5f, 0x34, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x32, // _429 = gs_G[_22 + 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 8];. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, // float _432 = gs_ + 0x42, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // B[_228];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x35, 0x20, // float _435 + 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // = gs_A[_228];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, // uint _ + 0x32, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // 234 = gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, // vocationIndex + + 0x31, 0x36, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 16u;. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x73, // float _441 = gs + 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x33, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _R[_234];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x34, 0x34, // float _444 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x33, 0x34, 0x5d, 0x3b, 0x0a, 0x20, // = gs_G[_234];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // float + 0x20, 0x5f, 0x34, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x33, // _447 = gs_B[_23 + 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 4];. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, // float _450 = gs_ + 0x41, 0x5b, 0x5f, 0x32, 0x33, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // A[_234];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x30, 0x20, 0x3d, // uint _240 = 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // gl_LocalInvocat - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, // ionIndex;.uvec3 - 0x64, 0x74, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, // dtid = gl_Global - 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x3b, 0x0a, 0x75, 0x69, // InvocationID;.ui - 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, // nt srcMipLevel = - 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, // uint(bgfx_mipGe - 0x6e, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x4d, 0x69, // n.x);.uint numMi - 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, // pLevels = uint(b - 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x76, // gfx_mipGen.y);.v - 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, // ec2 texelSize = - 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x7a, 0x77, 0x3b, 0x0a, // bgfx_mipGen.zw;. - 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x74, 0x69, // uint slice = dti - 0x64, 0x2e, 0x7a, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x31, 0x3b, 0x0a, // d.z;.vec4 src1;. - 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, // vec2 uv1 = texel - 0x53, 0x69, 0x7a, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x64, 0x74, 0x69, // Size * (vec2(dti - 0x64, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, // d.xy) + vec2(0.5 - 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, // , 0.25) );.vec2 - 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x20, // off = texelSize - 0x2a, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, // * vec2(0.0, 0.5) - 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2a, 0x20, 0x28, // ;.src1 = 0.5 * ( - 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x4c, 0x6f, // texture2DArrayLo - 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, // d(bgfx_texMipSrc - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, // , vec3(uv1, floa - 0x74, 0x28, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, // t(slice) ), floa - 0x74, 0x28, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x20, 0x29, // t(srcMipLevel) ) - 0x0a, 0x2b, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, // .+ texture2DArra - 0x79, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, // yLod(bgfx_texMip - 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x31, 0x20, 0x2b, 0x20, // Src, vec3(uv1 + - 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x6c, 0x69, 0x63, 0x65, // off, float(slice - 0x29, 0x20, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x72, 0x63, 0x4d, 0x69, // ) ), float(srcMi - 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, // pLevel) ) );.ima - 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, // geStore(s_imgMip - 0x31, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, // 1, ivec3(dtid.xy - 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, // , slice), src1); - 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, // .if (numMipLevel - 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, // s == 1u).{.retur - 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, // n;.}.storeColor( - 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, // gi, src1);.barri - 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x20, 0x28, 0x67, 0x69, 0x20, 0x26, // er();.if ( (gi & - 0x20, 0x30, 0x78, 0x39, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, // 0x9u) == 0u).{. - 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, // vec4 src2 = load - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x31, 0x75, // Color(gi + 0x01u - 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, // );.vec4 src3 = l - 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, // oadColor(gi + 0x - 0x30, 0x38, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, // 08u);.vec4 src4 - 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, // = loadColor(gi + - 0x20, 0x30, 0x78, 0x30, 0x39, 0x75, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, // 0x09u);.src1 = - 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, // 0.25 * (src1 + s - 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, // rc2 + src3 + src - 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, // 4);.imageStore(s - 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, // _imgMip2, ivec3( - 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x32, 0x75, 0x2c, 0x20, 0x73, 0x6c, // dtid.xy / 2u, sl - 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x73, 0x74, 0x6f, // ice), src1);.sto - 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, // reColor(gi, src1 - 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, 0x69, 0x70, 0x4c, // );.}.if (numMipL - 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x72, // evels == 2u).{.r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, // eturn;.}.barrier - 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x20, 0x28, 0x67, 0x69, 0x20, 0x26, 0x20, 0x30, // ();.if ( (gi & 0 - 0x78, 0x31, 0x42, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x76, // x1Bu) == 0u).{.v - 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, // ec4 src2 = loadC - 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x32, 0x75, 0x29, // olor(gi + 0x02u) - 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, // ;.vec4 src3 = lo - 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x31, // adColor(gi + 0x1 - 0x30, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, 0x3d, // 0u);.vec4 src4 = - 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, // loadColor(gi + - 0x30, 0x78, 0x31, 0x32, 0x75, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, // 0x12u);.src1 = 0 - 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x72, // .25 * (src1 + sr - 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x34, // c2 + src3 + src4 - 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, // );.imageStore(s_ - 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x33, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, // imgMip3, ivec3(d - 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x34, 0x75, 0x2c, 0x20, 0x73, 0x6c, 0x69, // tid.xy / 4u, sli - 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x73, 0x74, 0x6f, 0x72, // ce), src1);.stor - 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, // eColor(gi, src1) - 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, // ;.}.if (numMipLe - 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // vels == 3u).{.re - 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, // turn;.}.barrier( - 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x67, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, // );.if (gi == 0u) - 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x6c, // .{.vec4 src2 = l - 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, // oadColor(gi + 0x - 0x30, 0x34, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, // 04u);.vec4 src3 - 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, // = loadColor(gi + - 0x20, 0x30, 0x78, 0x32, 0x30, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, // 0x20u);.vec4 sr - 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, // c4 = loadColor(g - 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x32, 0x34, 0x75, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, // i + 0x24u);.src1 - 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, 0x31, 0x20, // = 0.25 * (src1 - 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x2b, 0x20, // + src2 + src3 + - 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, // src4);.imageStor - 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x2c, 0x20, 0x69, 0x76, 0x65, // e(s_imgMip4, ive - 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x38, 0x75, 0x2c, // c3(dtid.xy / 8u, - 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, // slice), src1);. - 0x7d, 0x0a, 0x7d, 0x0a, 0x00, // }.}.. + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x38, 0x75, 0x3b, 0x0a, // ionIndex + 18u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // floa + 0x74, 0x20, 0x5f, 0x34, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, // t _456 = gs_R[_2 + 0x34, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 40];. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, // float _459 = gs + 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x34, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _G[_240];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x36, 0x32, // float _462 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x34, 0x30, 0x5d, 0x3b, 0x0a, 0x20, // = gs_B[_240];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // float + 0x20, 0x5f, 0x34, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x34, // _465 = gs_A[_24 + 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 0];. + 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, // vec4 _250 = (((_ + 0x35, 0x34, 0x32, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x32, 0x36, 0x2c, // 542 + vec4(_426, + 0x20, 0x5f, 0x34, 0x32, 0x39, 0x2c, 0x20, 0x5f, 0x34, 0x33, 0x32, 0x2c, 0x20, 0x5f, 0x34, 0x33, // _429, _432, _43 + 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x34, 0x31, 0x2c, // 5)) + vec4(_441, + 0x20, 0x5f, 0x34, 0x34, 0x34, 0x2c, 0x20, 0x5f, 0x34, 0x34, 0x37, 0x2c, 0x20, 0x5f, 0x34, 0x35, // _444, _447, _45 + 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x35, 0x36, 0x2c, // 0)) + vec4(_456, + 0x20, 0x5f, 0x34, 0x35, 0x39, 0x2c, 0x20, 0x5f, 0x34, 0x36, 0x32, 0x2c, 0x20, 0x5f, 0x34, 0x36, // _459, _462, _46 + 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 5)) * 0.25;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, // imageSto + 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x33, 0x2c, 0x20, 0x69, 0x76, // re(s_imgMip3, iv + 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, // ec3(ivec2(gl_Glo + 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, // balInvocationID. + 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x34, 0x75, 0x29, 0x29, 0x2c, // xy / uvec2(4u)), + 0x20, 0x5f, 0x31, 0x34, 0x39, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x29, 0x3b, 0x0a, 0x20, // _149), _250);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, // gs_R[ + 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, // gl_LocalInvocati + 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2e, // onIndex] = _250. + 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, // x;. g + 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // s_G[gl_LocalInvo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, // cationIndex] = _ + 0x32, 0x35, 0x30, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 250.y;. + 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // gs_B[gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, // InvocationIndex] + 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _250.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, // gs_A[gl_L + 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, // ocalInvocationIn + 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2e, 0x77, 0x3b, 0x0a, 0x20, // dex] = _250.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x20, // _543 + 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _250;. + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, // }. else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x32, // _543 = _542 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, // ;. }. + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x3d, 0x20, 0x33, // if (_84 == 3 + 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // u). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // barrier();. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, // if (gl_Loca + 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, // lInvocationIndex + 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // == 0u). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, // {. ui + 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, // nt _281 = gl_Loc + 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, // alInvocationInde + 0x78, 0x20, 0x2b, 0x20, 0x34, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // x + 4u;. + 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x37, 0x20, 0x3d, 0x20, // uint _287 = + 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, // gl_LocalInvocati + 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x33, 0x32, 0x75, 0x3b, 0x0a, 0x20, // onIndex + 32u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, // uint + 0x5f, 0x32, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, // _293 = gl_LocalI + 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, // nvocationIndex + + 0x20, 0x33, 0x36, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 36u;. + 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, // imageStore(s_i + 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, // mgMip4, ivec3(iv + 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, // ec2(gl_GlobalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, // ocationID.xy / u + 0x76, 0x65, 0x63, 0x32, 0x28, 0x38, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x34, 0x39, 0x29, // vec2(8u)), _149) + 0x2c, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x35, 0x34, 0x33, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, // , (((_543 + vec4 + 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, // (gs_R[_281], gs_ + 0x47, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, // G[_281], gs_B[_2 + 0x38, 0x31, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x29, // 81], gs_A[_281]) + 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, // ) + vec4(gs_R[_2 + 0x38, 0x37, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x2c, // 87], gs_G[_287], + 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, // gs_B[_287], gs_ + 0x41, 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, // A[_287])) + vec4 + 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x39, 0x33, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, // (gs_R[_293], gs_ + 0x47, 0x5b, 0x5f, 0x32, 0x39, 0x33, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, // G[_293], gs_B[_2 + 0x39, 0x33, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x39, 0x33, 0x5d, 0x29, // 93], gs_A[_293]) + 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // ) * 0.25);. + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, // }. bre + 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, // ak;. } while( + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // false);.}... }; -static const uint8_t cs_mipgen_oddy_essl[6120] = +static const uint8_t cs_mipgen_oddy_essl[4634] = { - 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0x17, // CSH............. - 0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x31, 0x30, 0x20, 0x65, // ..#version 310 e - 0x73, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x63, 0x70, 0x28, 0x66, 0x6c, 0x6f, 0x61, // s.float rcp(floa - 0x74, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, // t _a) { return 1 - 0x2e, 0x30, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x63, // .0/_a; }.vec2 rc - 0x70, 0x28, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // p(vec2 _a) { ret - 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, // urn vec2(1.0)/_a - 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, // ; }.vec3 rcp(vec - 0x33, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, // 3 _a) { return v - 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, // ec3(1.0)/_a; }.v - 0x65, 0x63, 0x34, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x61, 0x29, // ec4 rcp(vec4 _a) - 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, // { return vec4(1 - 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, // .0)/_a; }.vec2 v - 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // ec2_splat(float - 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, // _x) { return vec - 0x32, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, // 2(_x, _x); }.vec - 0x33, 0x20, 0x76, 0x65, 0x63, 0x33, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, // 3 vec3_splat(flo - 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // at _x) { return - 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, // vec3(_x, _x, _x) - 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, // ; }.vec4 vec4_sp - 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, // lat(float _x) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, // return vec4(_x, - 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, // _x, _x, _x); }.u - 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, // vec2 uvec2_splat - 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // (uint _x) { retu - 0x72, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, // rn uvec2(_x, _x) - 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x5f, // ; }.uvec3 uvec3_ - 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, // splat(uint _x) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x78, // return uvec3(_x - 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, // , _x, _x); }.uve - 0x63, 0x34, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, // c4 uvec4_splat(u - 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // int _x) { return - 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, // uvec4(_x, _x, _ - 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6d, // x, _x); }.mat4 m - 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, // txFromRows(vec4 - 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, // _0, vec4 _1, vec - 0x34, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, 0x0a, 0x7b, // 4 _2, vec4 _3).{ - 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, // .return transpos - 0x65, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, // e(mat4(_0, _1, _ - 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, // 2, _3) );.}.mat4 - 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, // mtxFromCols(vec - 0x34, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, // 4 _0, vec4 _1, v - 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, // ec4 _2, vec4 _3) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x5f, // .{.return mat4(_ - 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x29, 0x3b, 0x0a, // 0, _1, _2, _3);. - 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, // }.mat3 mtxFromRo - 0x77, 0x73, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // ws(vec3 _0, vec3 - 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x29, 0x0a, 0x7b, 0x0a, // _1, vec3 _2).{. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, // return transpose - 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, // (mat3(_0, _1, _2 - 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, // ) );.}.mat3 mtxF - 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, // romCols(vec3 _0, - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // vec3 _1, vec3 _ - 0x32, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x33, // 2).{.return mat3 - 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, // (_0, _1, _2);.}. - 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, 0x28, 0x6d, // vec3 mtxGetRow(m - 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, // at3 _mtx, int _r - 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, // ow).{.return vec - 0x33, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, // 3(_mtx[0][_row], - 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, // _mtx[1][_row], - 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, // _mtx[2][_row]);. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, // }.vec3 mtxGetCol - 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, // umn(mat3 _mtx, i - 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // nt _column).{.re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, // turn vec3(_mtx[_ - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, // column]);.}.vec4 - 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, // mtxGetRow(mat4 - 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, // _mtx, int _row). - 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, // {.return vec4(_m - 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, // tx[0][_row], _mt - 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, // x[1][_row], _mtx - 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, // [2][_row], _mtx[ - 0x33, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, // 3][_row]);.}.vec - 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x6d, // 4 mtxGetColumn(m - 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, // at4 _mtx, int _c - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // olumn).{.return - 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, // vec4(_mtx[_colum - 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x74, 0x78, // n]);.}.float mtx - 0x47, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, // GetElement(mat3 - 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, // _mtx, int _colum - 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, // n, int _row).{.r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, // eturn _mtx[_colu - 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, // mn][_row];.}.flo - 0x61, 0x74, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, // at mtxGetElement - 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, // (mat4 _mtx, int - 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, // _column, int _ro - 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x78, // w).{.return _mtx - 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x3b, // [_column][_row]; - 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, // .}.float select( - 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, // bool _cond, floa - 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // t _true, float _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // false) { return - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, // _cond ? _true : - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, // _false; }.vec2 s - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // elect(bool _cond - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, // , vec2 _true, ve - 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c2 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, // urn _cond ? _tru - 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, // e : _false; }.ve - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, // c3 select(bool _ - 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // cond, vec3 _true - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, // , vec3 _false) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, // return _cond ? - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, // _true : _false; - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, // }.vec4 select(bo - 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // ol _cond, vec4 _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // true, vec4 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, // e) { return _con - 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, // d ? _true : _fal - 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // se; }.vec2 selec - 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, // t(bvec2 _cond, v - 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // ec2 _true, vec2 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, // (vec2(_cond) * - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6e, // _true) + (vec2(n - 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, // ot(_cond) ) * _f - 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, // alse); }.vec3 se - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // lect(bvec3 _cond - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, // , vec3 _true, ve - 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c3 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, // urn (vec3(_cond) - 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, // * _true) + (vec - 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, // 3(not(_cond) ) * - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, // _false); }.vec4 - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, // select(bvec4 _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // ond, vec4 _true, - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, // vec4 _false) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x63, 0x6f, // return (vec4(_co - 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, // nd) * _true) + ( - 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, // vec4(not(_cond) - 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, // ) * _false); }.i - 0x6e, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, // nt select(bool _ - 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // cond, int _true, - 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, // int _false) { r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, // eturn _cond ? _t - 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, // rue : _false; }. - 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, // ivec2 select(boo - 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, // l _cond, ivec2 _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, // true, ivec2 _fal - 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, // se) { return _co - 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, // nd ? _true : _fa - 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, // lse; }.ivec3 sel - 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, // ect(bool _cond, - 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, // ivec3 _true, ive - 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c3 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, // urn _cond ? _tru - 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, // e : _false; }.iv - 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, // ec4 select(bool - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, // _cond, ivec4 _tr - 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // ue, ivec4 _false - 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // ) { return _cond - 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // ? _true : _fals - 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // e; }.ivec2 selec - 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, // t(bvec2 _cond, i - 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // vec2 _true, ivec - 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // 2 _false) { retu - 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, // rn (ivec2(_cond) - 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, // * _true) + (ive - 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, // c2(not(_cond) ) - 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, // * _false); }.ive - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, // c3 select(bvec3 - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, // _cond, ivec3 _tr - 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // ue, ivec3 _false - 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, // ) { return (ivec - 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // 3(_cond) * _true - 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, // ) + (ivec3(not(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // cond) ) * _false - 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // ); }.ivec4 selec - 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, // t(bvec4 _cond, i - 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // vec4 _true, ivec - 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // 4 _false) { retu - 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, // rn (ivec4(_cond) - 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, // * _true) + (ive - 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, // c4(not(_cond) ) - 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x69, 0x6e, // * _false); }.uin - 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, // t select(bool _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // ond, uint _true, - 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, // uint _false) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, // return _cond ? _ - 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, // true : _false; } - 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, // .uvec2 select(bo - 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, // ol _cond, uvec2 - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, // _true, uvec2 _fa - 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, // lse) { return _c - 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, // ond ? _true : _f - 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, // alse; }.uvec3 se - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, // lect(bool _cond, - 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, // uvec3 _true, uv - 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, // ec3 _false) { re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, // turn _cond ? _tr - 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, // ue : _false; }.u - 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, // vec4 select(bool - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, // _cond, uvec4 _t - 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // rue, uvec4 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, // e) { return _con - 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, // d ? _true : _fal - 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, // se; }.uvec2 sele - 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, // ct(bvec2 _cond, - 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, // uvec2 _true, uve - 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c2 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // urn (uvec2(_cond - 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, // ) * _true) + (uv - 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, // ec2(not(_cond) ) - 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, // * _false); }.uv - 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, // ec3 select(bvec3 - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, // _cond, uvec3 _t - 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // rue, uvec3 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, // e) { return (uve - 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, // c3(_cond) * _tru - 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, // e) + (uvec3(not( - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // _cond) ) * _fals - 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, // e); }.uvec4 sele - 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, // ct(bvec4 _cond, - 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, // uvec4 _true, uve - 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c4 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // urn (uvec4(_cond - 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, // ) * _true) + (uv - 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, // ec4(not(_cond) ) - 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x6e, // * _false); }.un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, // iform vec4 u_vie - 0x77, 0x52, 0x65, 0x63, 0x74, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, // wRect;.uniform v - 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x3b, // ec4 u_viewTexel; - 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // .uniform mat4 u_ - 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, // view;.uniform ma - 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, // t4 u_invView;.un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x72, 0x6f, // iform mat4 u_pro - 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // j;.uniform mat4 - 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // u_invProj;.unifo - 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, // rm mat4 u_viewPr - 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, // oj;.uniform mat4 - 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, // u_invViewProj;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, // uniform mat4 u_m - 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // odelView;.unifor - 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x4d, 0x6f, 0x64, 0x65, // m mat4 u_invMode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, // lView;.uniform m - 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, // at4 u_modelViewP - 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, // roj;.uniform vec - 0x34, 0x20, 0x75, 0x5f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x52, 0x65, 0x66, 0x34, 0x3b, 0x0a, 0x75, // 4 u_alphaRef4;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, // niform mat4 u_mo - 0x64, 0x65, 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // del[1];.uniform - 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6e, 0x64, 0x63, 0x3b, 0x0a, 0x75, // vec4 bgfx_ndc;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, // niform vec4 bgfx - 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x41, 0x72, 0x67, 0x42, 0x61, 0x73, 0x65, // _indirectArgBase - 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, // ;.uniform sample - 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, // r2DArray bgfx_te - 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, // xMipSrc;.layout( - 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x30, // rgba8, binding=0 - 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, // ) writeonly unif - 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, // orm highp image2 - 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, // DArray s_imgMip1 - 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, // ;.layout(rgba8, - 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x31, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, // binding=1) write - 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, // only uniform hig - 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, // hp image2DArray - 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // s_imgMip2;.layou - 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, // t(rgba8, binding - 0x3d, 0x32, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, // =2) writeonly un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, // iform highp imag - 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, // e2DArray s_imgMi - 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, // p3;.layout(rgba8 - 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x33, 0x29, 0x20, 0x77, 0x72, 0x69, // , binding=3) wri - 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, // teonly uniform h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, // ighp image2DArra - 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // y s_imgMip4;.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, // form vec4 bgfx_m - 0x69, 0x70, 0x47, 0x65, 0x6e, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, // ipGen;.shared fl - 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, // oat gs_R[64];.sh - 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, // ared float gs_G[ - 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, // 64];.shared floa - 0x74, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, // t gs_B[64];.shar - 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, // ed float gs_A[64 - 0x5d, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, // ];.void storeCol - 0x6f, 0x72, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, // or(uint _index, - 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x0a, 0x7b, 0x0a, 0x67, // vec4 _color).{.g - 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, // s_R[_index] = _c - 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x69, 0x6e, // olor.x;.gs_G[_in - 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x3b, // dex] = _color.y; - 0x0a, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, // .gs_B[_index] = - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, // _color.z;.gs_A[_ - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, // index] = _color. - 0x77, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, // w;.}.vec4 loadCo - 0x6c, 0x6f, 0x72, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, // lor(uint _index) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, // .{.return vec4(g - 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, // s_R[_index], gs_ - 0x47, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, // G[_index], gs_B[ - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x69, // _index], gs_A[_i - 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // ndex]);.}.layout - 0x20, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, // (local_size_x = - 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, // 8, local_size_y - 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, // = 8, local_size - 0x5f, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, // _z = 1) in;.void - 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, // main().{.uint g - 0x69, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // i = gl_LocalInvo - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0a, 0x75, 0x76, 0x65, // cationIndex;.uve - 0x63, 0x33, 0x20, 0x64, 0x74, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, // c3 dtid = gl_Glo - 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x3b, // balInvocationID; - 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, // .uint srcMipLeve - 0x6c, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, // l = uint(bgfx_mi - 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x75, // pGen.x);.uint nu - 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, // mMipLevels = uin - 0x74, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, // t(bgfx_mipGen.y) - 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, // ;.vec2 texelSize + 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0b, 0x62, // CSH............b + 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, // gfx_mipGen...... + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, // .....bgfx_texMip + 0x53, 0x72, 0x63, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x11, 0x00, // Src............. + 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, // .layout(local_si + 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, // ze_x = 8, local_ + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, // size_y = 8, loca + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, // l_size_z = 1) in + 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ;..uniform vec4 + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // bgfx_mipGen;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, // form highp sampl + 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, // er2DArray bgfx_t + 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // exMipSrc;.layout + 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x62, // (location = 0, b + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, // inding = 0, rgba + 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, // 8) uniform write + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, // only highp image + 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, // 2DArray s_imgMip + 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, // 1;.layout(locati + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, // on = 1, binding + 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, // = 1, rgba8) unif + 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x68, 0x69, // orm writeonly hi + 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, // ghp image2DArray + 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // s_imgMip2;.layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x2c, // ut(location = 2, + 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x72, 0x67, // binding = 2, rg + 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, // ba8) uniform wri + 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, // teonly highp ima + 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, // ge2DArray s_imgM + 0x69, 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // ip3;.layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, // tion = 3, bindin + 0x67, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, // g = 3, rgba8) un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, // iform writeonly + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, // highp image2DArr + 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, 0x0a, 0x73, // ay s_imgMip4;..s + 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x52, // hared float gs_R + 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, // [64];.shared flo + 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, // at gs_G[64];.sha + 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x36, // red float gs_B[6 + 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // 4];.shared float + 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, // gs_A[64];..void + 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, // main().{. do + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, // . {. u + 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, // int _84 = uint(b + 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, // gfx_mipGen.y);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x31, 0x30, 0x33, // vec2 _103 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x7a, // = bgfx_mipGen.z - 0x77, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x3d, 0x20, // w;.uint slice = - 0x64, 0x74, 0x69, 0x64, 0x2e, 0x7a, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, // dtid.z;.vec4 src - 0x31, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, // 1;.vec2 uv1 = te - 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, // xelSize * (vec2( - 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, // dtid.xy) + vec2( - 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x65, // 0.5, 0.25) );.ve - 0x63, 0x32, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x53, 0x69, // c2 off = texelSi - 0x7a, 0x65, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, // ze * vec2(0.0, 0 - 0x2e, 0x35, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x20, // .5);.src1 = 0.5 - 0x2a, 0x20, 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, // * (texture2DArra - 0x79, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, // yLod(bgfx_texMip - 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x31, 0x2c, 0x20, 0x66, // Src, vec3(uv1, f - 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x66, // loat(slice) ), f - 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, // loat(srcMipLevel - 0x29, 0x20, 0x29, 0x0a, 0x2b, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, // ) ).+ texture2DA - 0x72, 0x72, 0x61, 0x79, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, // rrayLod(bgfx_tex - 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x31, // MipSrc, vec3(uv1 - 0x20, 0x2b, 0x20, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x6c, // + off, float(sl - 0x69, 0x63, 0x65, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x72, // ice) ), float(sr - 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, // cMipLevel) ) );. + 0x77, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, // w * (vec2(gl_Glo + 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, // balInvocationID. + 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x2c, 0x20, // xy) + vec2(0.5, + 0x30, 0x2e, 0x32, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 0.25));. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, // float _117 = flo + 0x61, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // at(gl_GlobalInvo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // cationID.z);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x20, // float _123 + 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, 0x67, 0x66, // = float(uint(bgf + 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x78, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // x_mipGen.x));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x20, // vec4 _138 + 0x3d, 0x20, 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, // = (textureLod(bg + 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, // fx_texMipSrc, ve + 0x63, 0x33, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x29, 0x2c, 0x20, // c3(_103, _117), + 0x5f, 0x31, 0x32, 0x33, 0x29, 0x20, 0x2b, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, // _123) + textureL + 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, // od(bgfx_texMipSr + 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x31, 0x30, 0x33, 0x20, 0x2b, 0x20, 0x28, // c, vec3(_103 + ( + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x7a, 0x77, 0x20, 0x2a, // bgfx_mipGen.zw * + 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, // vec2(0.0, 0.5)) + 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x37, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x29, 0x29, 0x20, // , _117), _123)) + 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, // * 0.5;. i + 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, // nt _149 = int(gl + 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // _GlobalInvocatio + 0x6e, 0x49, 0x44, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // nID.z);. 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, // imageStore(s_img - 0x4d, 0x69, 0x70, 0x31, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, // Mip1, ivec3(dtid - 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, // .xy, slice), src - 0x31, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, // 1);.if (numMipLe - 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // vels == 1u).{.re - 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, // turn;.}.storeCol - 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x62, 0x61, // or(gi, src1);.ba - 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x20, 0x28, 0x67, // rrier();.if ( (g - 0x69, 0x20, 0x26, 0x20, 0x30, 0x78, 0x39, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, // i & 0x9u) == 0u) - 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x6c, // .{.vec4 src2 = l - 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, // oadColor(gi + 0x - 0x30, 0x31, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, // 01u);.vec4 src3 - 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, // = loadColor(gi + - 0x20, 0x30, 0x78, 0x30, 0x38, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, // 0x08u);.vec4 sr - 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, // c4 = loadColor(g - 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x39, 0x75, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, // i + 0x09u);.src1 - 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, 0x31, 0x20, // = 0.25 * (src1 - 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x2b, 0x20, // + src2 + src3 + - 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, // src4);.imageStor - 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x2c, 0x20, 0x69, 0x76, 0x65, // e(s_imgMip2, ive - 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x32, 0x75, 0x2c, // c3(dtid.xy / 2u, - 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, // slice), src1);. - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, // storeColor(gi, s - 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, // rc1);.}.if (numM - 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x75, 0x29, 0x0a, // ipLevels == 2u). - 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x62, 0x61, 0x72, 0x72, // {.return;.}.barr - 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x20, 0x28, 0x67, 0x69, 0x20, // ier();.if ( (gi - 0x26, 0x20, 0x30, 0x78, 0x31, 0x42, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, // & 0x1Bu) == 0u). - 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, // {.vec4 src2 = lo - 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, // adColor(gi + 0x0 - 0x32, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x3d, // 2u);.vec4 src3 = - 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, // loadColor(gi + - 0x30, 0x78, 0x31, 0x30, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, // 0x10u);.vec4 src - 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, // 4 = loadColor(gi - 0x20, 0x2b, 0x20, 0x30, 0x78, 0x31, 0x32, 0x75, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, // + 0x12u);.src1 - 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, // = 0.25 * (src1 + - 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x2b, 0x20, 0x73, // src2 + src3 + s - 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, // rc4);.imageStore + 0x4d, 0x69, 0x70, 0x31, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, // Mip1, ivec3(ivec + 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, // 2(gl_GlobalInvoc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x34, // ationID.xy), _14 + 0x39, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 9), _138);. + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x75, // if (_84 == 1u + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // ). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // gs_R[gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, // vocationIndex] = + 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _138.x;. + 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // gs_G[gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, // vocationIndex] = + 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _138.y;. + 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // gs_B[gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, // vocationIndex] = + 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _138.z;. + 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // gs_A[gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, // vocationIndex] = + 0x20, 0x5f, 0x31, 0x33, 0x38, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _138.w;. + 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // barrier();. + 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x34, 0x32, 0x3b, 0x0a, 0x20, // vec4 _542;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x67, 0x6c, 0x5f, 0x4c, // if ((gl_L + 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, // ocalInvocationIn + 0x64, 0x65, 0x78, 0x20, 0x26, 0x20, 0x39, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, // dex & 9u) == 0u) + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x37, 0x35, // uint _175 + 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, // = gl_LocalInvoc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x75, 0x3b, // ationIndex + 1u; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // . flo + 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, // at _364 = gs_R[_ + 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 175];. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x67, // float _367 = g + 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // s_G[_175];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x37, // float _37 + 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, // 0 = gs_B[_175];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // floa + 0x74, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x31, // t _373 = gs_A[_1 + 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 75];. + 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, // uint _181 = gl_ + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // LocalInvocationI + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x38, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // ndex + 8u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x37, // float _37 + 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x31, 0x38, 0x31, 0x5d, 0x3b, 0x0a, // 9 = gs_R[_181];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // floa + 0x74, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x31, // t _382 = gs_G[_1 + 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 81];. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x67, 0x73, // float _385 = gs + 0x5f, 0x42, 0x5b, 0x5f, 0x31, 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _B[_181];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x38, 0x38, // float _388 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x31, 0x38, 0x31, 0x5d, 0x3b, 0x0a, 0x20, // = gs_A[_181];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, // uint + 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, // _186 = gl_LocalI + 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, // nvocationIndex + + 0x20, 0x39, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 9u;. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x67, 0x73, // float _394 = gs + 0x5f, 0x52, 0x5b, 0x5f, 0x31, 0x38, 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _R[_186];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x39, 0x37, // float _397 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x31, 0x38, 0x36, 0x5d, 0x3b, 0x0a, 0x20, // = gs_G[_186];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // float + 0x20, 0x5f, 0x34, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x31, 0x38, // _400 = gs_B[_18 + 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 6];. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, // float _403 = gs_ + 0x41, 0x5b, 0x5f, 0x31, 0x38, 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // A[_186];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x20, 0x3d, // vec4 _196 = + 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x33, 0x38, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // (((_138 + vec4( + 0x5f, 0x33, 0x36, 0x34, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x37, 0x2c, 0x20, 0x5f, 0x33, 0x37, 0x30, // _364, _367, _370 + 0x2c, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // , _373)) + vec4( + 0x5f, 0x33, 0x37, 0x39, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x35, // _379, _382, _385 + 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x38, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // , _388)) + vec4( + 0x5f, 0x33, 0x39, 0x34, 0x2c, 0x20, 0x5f, 0x33, 0x39, 0x37, 0x2c, 0x20, 0x5f, 0x34, 0x30, 0x30, // _394, _397, _400 + 0x2c, 0x20, 0x5f, 0x34, 0x30, 0x33, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x3b, // , _403)) * 0.25; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, // . ima + 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, // geStore(s_imgMip + 0x32, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, // 2, ivec3(ivec2(g + 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, // l_GlobalInvocati + 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, // onID.xy / uvec2( + 0x32, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x34, 0x39, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x39, // 2u)), _149), _19 + 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 6);. + 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, // gs_R[gl_LocalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, // ocationIndex] = + 0x5f, 0x31, 0x39, 0x36, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _196.x;. + 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, // gs_G[gl_Loca + 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, // lInvocationIndex + 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // ] = _196.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, // gs_B[gl_ + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // LocalInvocationI + 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x2e, 0x7a, 0x3b, 0x0a, // ndex] = _196.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, // gs_A + 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // [gl_LocalInvocat + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, // ionIndex] = _196 + 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // .w;. + 0x5f, 0x35, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, // _542 = _196;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, // }. e + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // lse. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x32, 0x20, 0x3d, // _542 = + 0x20, 0x5f, 0x31, 0x33, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // _138;. } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x38, 0x34, // . if (_84 + 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // == 2u). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, // {. br + 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, // eak;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, // barrier() + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // ;. vec4 _ + 0x35, 0x34, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, // 543;. if + 0x28, 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, // ((gl_LocalInvoca + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x20, 0x32, 0x37, 0x75, 0x29, // tionIndex & 27u) + 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // == 0u). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, // {. ui + 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, // nt _228 = gl_Loc + 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, // alInvocationInde + 0x78, 0x20, 0x2b, 0x20, 0x32, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // x + 2u;. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x36, 0x20, 0x3d, // float _426 = + 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // gs_R[_228];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x34, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, // 429 = gs_G[_228] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // ;. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, // oat _432 = gs_B[ + 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _228];. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x35, 0x20, 0x3d, 0x20, // float _435 = + 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x32, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // gs_A[_228];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x33, // uint _23 + 0x34, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // 4 = gl_LocalInvo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x36, // cationIndex + 16 + 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // u;. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, // loat _441 = gs_R + 0x5b, 0x5f, 0x32, 0x33, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // [_234];. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x34, 0x34, 0x20, 0x3d, // float _444 = + 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x33, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // gs_G[_234];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x34, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x33, 0x34, 0x5d, // 447 = gs_B[_234] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // ;. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, // oat _450 = gs_A[ + 0x5f, 0x32, 0x33, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _234];. + 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x67, // uint _240 = g + 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // l_LocalInvocatio + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x38, 0x75, 0x3b, 0x0a, 0x20, 0x20, // nIndex + 18u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // float + 0x5f, 0x34, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x34, 0x30, // _456 = gs_R[_240 + 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // ];. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, // loat _459 = gs_G + 0x5b, 0x5f, 0x32, 0x34, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // [_240];. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x36, 0x32, 0x20, 0x3d, // float _462 = + 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x34, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // gs_B[_240];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x34, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x34, 0x30, 0x5d, // 465 = gs_A[_240] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // ;. ve + 0x63, 0x34, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x35, 0x34, // c4 _250 = (((_54 + 0x32, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x32, 0x36, 0x2c, 0x20, 0x5f, // 2 + vec4(_426, _ + 0x34, 0x32, 0x39, 0x2c, 0x20, 0x5f, 0x34, 0x33, 0x32, 0x2c, 0x20, 0x5f, 0x34, 0x33, 0x35, 0x29, // 429, _432, _435) + 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x34, 0x31, 0x2c, 0x20, 0x5f, // ) + vec4(_441, _ + 0x34, 0x34, 0x34, 0x2c, 0x20, 0x5f, 0x34, 0x34, 0x37, 0x2c, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x29, // 444, _447, _450) + 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x35, 0x36, 0x2c, 0x20, 0x5f, // ) + vec4(_456, _ + 0x34, 0x35, 0x39, 0x2c, 0x20, 0x5f, 0x34, 0x36, 0x32, 0x2c, 0x20, 0x5f, 0x34, 0x36, 0x35, 0x29, // 459, _462, _465) + 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ) * 0.25;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, // imageStore 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x33, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // (s_imgMip3, ivec - 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x34, 0x75, 0x2c, 0x20, // 3(dtid.xy / 4u, - 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x73, // slice), src1);.s - 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, // toreColor(gi, sr - 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, 0x69, // c1);.}.if (numMi - 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x75, 0x29, 0x0a, 0x7b, // pLevels == 3u).{ - 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, // .return;.}.barri - 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x67, 0x69, 0x20, 0x3d, 0x3d, 0x20, // er();.if (gi == - 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, // 0u).{.vec4 src2 - 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, // = loadColor(gi + - 0x20, 0x30, 0x78, 0x30, 0x34, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, // 0x04u);.vec4 sr - 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, // c3 = loadColor(g - 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x32, 0x30, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, // i + 0x20u);.vec4 - 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, // src4 = loadColo - 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x32, 0x34, 0x75, 0x29, 0x3b, 0x0a, 0x73, // r(gi + 0x24u);.s - 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, // rc1 = 0.25 * (sr - 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, // c1 + src2 + src3 - 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, // + src4);.imageS - 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x2c, 0x20, // tore(s_imgMip4, - 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, // ivec3(dtid.xy / - 0x38, 0x75, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, // 8u, slice), src1 - 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x00, // );.}.}.. + 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, // 3(ivec2(gl_Globa + 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, // lInvocationID.xy + 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x34, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, // / uvec2(4u)), _ + 0x31, 0x34, 0x39, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 149), _250);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, // gs_R[gl + 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // _LocalInvocation + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2e, 0x78, 0x3b, // Index] = _250.x; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, // . gs_ + 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, // G[gl_LocalInvoca + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, // tionIndex] = _25 + 0x30, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 0.y;. + 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // gs_B[gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, // vocationIndex] = + 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _250.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, // gs_A[gl_Loc + 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, // alInvocationInde + 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, // x] = _250.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x20, 0x3d, 0x20, // _543 = + 0x5f, 0x32, 0x35, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // _250;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x32, 0x3b, 0x0a, // _543 = _542;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x75, 0x29, // if (_84 == 3u) + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // barrier();. + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, // if (gl_LocalI + 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, // nvocationIndex = + 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // = 0u). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, // uint + 0x20, 0x5f, 0x32, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // _281 = gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, // InvocationIndex + 0x2b, 0x20, 0x34, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 4u;. + 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x6c, // uint _287 = gl + 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // _LocalInvocation + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x33, 0x32, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, // Index + 32u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, // uint _2 + 0x39, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, // 93 = gl_LocalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x33, // ocationIndex + 3 + 0x36, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 6u;. + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, // imageStore(s_img + 0x4d, 0x69, 0x70, 0x34, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, // Mip4, ivec3(ivec + 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, // 2(gl_GlobalInvoc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, // ationID.xy / uve + 0x63, 0x32, 0x28, 0x38, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x34, 0x39, 0x29, 0x2c, 0x20, // c2(8u)), _149), + 0x28, 0x28, 0x28, 0x5f, 0x35, 0x34, 0x33, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, // (((_543 + vec4(g + 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, // s_R[_281], gs_G[ + 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x38, 0x31, // _281], gs_B[_281 + 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x38, 0x31, 0x5d, 0x29, 0x29, 0x20, // ], gs_A[_281])) + 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x38, 0x37, // + vec4(gs_R[_287 + 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x2c, 0x20, 0x67, // ], gs_G[_287], g + 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, // s_B[_287], gs_A[ + 0x5f, 0x32, 0x38, 0x37, 0x5d, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, // _287])) + vec4(g + 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x39, 0x33, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, // s_R[_293], gs_G[ + 0x5f, 0x32, 0x39, 0x33, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x39, 0x33, // _293], gs_B[_293 + 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x39, 0x33, 0x5d, 0x29, 0x29, 0x20, // ], gs_A[_293])) + 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // * 0.25);. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, // }. break + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, // ;. } while(fa + 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lse);.}... }; static const uint8_t cs_mipgen_oddy_spv[6349] = { diff --git a/src/cs_mipgen_pow2.bin.h b/src/cs_mipgen_pow2.bin.h index f82a9a475..4055cf410 100644 --- a/src/cs_mipgen_pow2.bin.h +++ b/src/cs_mipgen_pow2.bin.h @@ -1,772 +1,564 @@ -static const uint8_t cs_mipgen_pow2_glsl[6234] = +static const uint8_t cs_mipgen_pow2_glsl[4421] = { - 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x18, // CSH...........G. - 0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x33, 0x30, 0x0a, 0x66, // ..#version 430.f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x63, 0x70, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // loat rcp(float _ - 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2e, 0x30, 0x2f, // a) { return 1.0/ - 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, // _a; }.vec2 rcp(v - 0x65, 0x63, 0x32, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // ec2 _a) { return - 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, // vec2(1.0)/_a; } - 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // .vec3 rcp(vec3 _ - 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, // a) { return vec3 - 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, // (1.0)/_a; }.vec4 - 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, // rcp(vec4 _a) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, // return vec4(1.0) - 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x65, 0x63, 0x32, // /_a; }.vec2 vec2 - 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, // _splat(float _x) - 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, // { return vec2(_ - 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // x, _x); }.vec3 v - 0x65, 0x63, 0x33, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // ec3_splat(float - 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, // _x) { return vec - 0x33, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, // 3(_x, _x, _x); } - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, // .vec4 vec4_splat - 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // (float _x) { ret - 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, // urn vec4(_x, _x, - 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, // _x, _x); }.uvec - 0x32, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, 0x69, // 2 uvec2_splat(ui - 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // nt _x) { return - 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, // uvec2(_x, _x); } - 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x5f, 0x73, 0x70, 0x6c, // .uvec3 uvec3_spl - 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, // at(uint _x) { re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, // turn uvec3(_x, _ - 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, // x, _x); }.uvec4 - 0x75, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, // uvec4_splat(uint - 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x76, // _x) { return uv - 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, // ec4(_x, _x, _x, - 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x46, // _x); }.mat4 mtxF - 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x30, 0x2c, // romRows(vec4 _0, - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // vec4 _1, vec4 _ - 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // 2, vec4 _3).{.re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, // turn transpose(m - 0x61, 0x74, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x2c, 0x20, // at4(_0, _1, _2, - 0x5f, 0x33, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x74, // _3) );.}.mat4 mt - 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // xFromCols(vec4 _ - 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, // 0, vec4 _1, vec4 - 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, 0x0a, 0x7b, 0x0a, // _2, vec4 _3).{. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, // return mat4(_0, - 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, // _1, _2, _3);.}.m - 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, // at3 mtxFromRows( - 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, // vec3 _0, vec3 _1 - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, // , vec3 _2).{.ret - 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, // urn transpose(ma - 0x74, 0x33, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, 0x20, 0x29, // t3(_0, _1, _2) ) - 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, // ;.}.mat3 mtxFrom - 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, // Cols(vec3 _0, ve - 0x63, 0x33, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x29, 0x0a, // c3 _1, vec3 _2). - 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x5f, 0x30, // {.return mat3(_0 - 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, // , _1, _2);.}.mat - 0x34, 0x78, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, // 4x3 mtxFromRows( - 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, // vec4 _0, vec4 _1 - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, // , vec4 _2).{.ret - 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, // urn transpose(ma - 0x74, 0x33, 0x78, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, // t3x4(_0, _1, _2) - 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, // );.}.vec3 mtxGe - 0x74, 0x52, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, // tRow(mat3 _mtx, - 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, // int _row).{.retu - 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, // rn vec3(_mtx[0][ - 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, // _row], _mtx[1][_ - 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, // row], _mtx[2][_r - 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, // ow]);.}.vec3 mtx - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, // GetColumn(mat3 _ - 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, // mtx, int _column - 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // ).{.return vec3( - 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, // _mtx[_column]);. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, // }.vec4 mtxGetRow - 0x28, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, // (mat4x3 _mtx, in - 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // t _row).{.return - 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, // vec4(_mtx[0][_r - 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, // ow], _mtx[1][_ro - 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, // w], _mtx[2][_row - 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x33, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, // ], _mtx[3][_row] - 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, // );.}.vec3 mtxGet - 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x6d, // Column(mat4x3 _m - 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, // tx, int _column) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, // .{.return vec3(_ - 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, // mtx[_column]);.} - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, 0x28, // .vec4 mtxGetRow( - 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, // mat4 _mtx, int _ - 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, // row).{.return ve - 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, // c4(_mtx[0][_row] - 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, // , _mtx[1][_row], - 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, // _mtx[2][_row], - 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x33, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, // _mtx[3][_row]);. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, // }.vec4 mtxGetCol - 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, // umn(mat4 _mtx, i - 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // nt _column).{.re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, // turn vec4(_mtx[_ - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, // column]);.}.floa - 0x74, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, // t mtxGetElement( - 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, // mat3 _mtx, int _ - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, // column, int _row - 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, // ).{.return _mtx[ - 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x3b, 0x0a, // _column][_row];. - 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x45, 0x6c, // }.float mtxGetEl - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, // ement(mat4 _mtx, - 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2c, 0x20, 0x69, 0x6e, // int _column, in - 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // t _row).{.return - 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, // _mtx[_column][_ - 0x72, 0x6f, 0x77, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x65, // row];.}.float se - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, // lect(bool _cond, - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x66, 0x6c, // float _true, fl - 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, // oat _false) { re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, // turn _cond ? _tr - 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, // ue : _false; }.v - 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, // ec2 select(bool - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, // _cond, vec2 _tru - 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // e, vec2 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, // { return _cond ? - 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, // _true : _false; - 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, // }.vec3 select(b - 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // ool _cond, vec3 - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, // _true, vec3 _fal - 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, // se) { return _co - 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, // nd ? _true : _fa - 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, // lse; }.vec4 sele - 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, // ct(bool _cond, v - 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ec4 _true, vec4 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, // _cond ? _true : - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, // _false; }.vec2 - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, // select(bvec2 _co - 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, // nd, vec2 _true, - 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, // vec2 _false) { r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, // eturn (vec2(_con - 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, // d) * _true) + (v - 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, // ec2(not(_cond) ) - 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, // * _false); }.ve - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, // c3 select(bvec3 - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, // _cond, vec3 _tru - 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // e, vec3 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, // { return (vec3(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, // cond) * _true) + - 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // (vec3(not(_cond - 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, // ) ) * _false); } - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, // .vec4 select(bve - 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // c4 _cond, vec4 _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // true, vec4 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, // e) { return (vec - 0x34, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // 4(_cond) * _true - 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, // ) + (vec4(not(_c - 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, // ond) ) * _false) - 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, // ; }.int select(b - 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, // ool _cond, int _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // true, int _false - 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // ) { return _cond - 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // ? _true : _fals - 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // e; }.ivec2 selec - 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, // t(bool _cond, iv - 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, // ec2 _true, ivec2 - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, // _false) { retur - 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, // n _cond ? _true - 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, // : _false; }.ivec - 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, // 3 select(bool _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // ond, ivec3 _true - 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // , ivec3 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, // { return _cond ? - 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, // _true : _false; - 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, // }.ivec4 select( - 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // bool _cond, ivec - 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // 4 _true, ivec4 _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // false) { return - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, // _cond ? _true : - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, // _false; }.ivec2 - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, // select(bvec2 _co - 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // nd, ivec2 _true, - 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, // ivec2 _false) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, // return (ivec2(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, // cond) * _true) + - 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, // (ivec2(not(_con - 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, // d) ) * _false); - 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, // }.ivec3 select(b - 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // vec3 _cond, ivec - 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // 3 _true, ivec3 _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // false) { return - 0x28, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, // (ivec3(_cond) * - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, // _true) + (ivec3( - 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, // not(_cond) ) * _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, // false); }.ivec4 - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, // select(bvec4 _co - 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // nd, ivec4 _true, - 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, // ivec4 _false) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, // return (ivec4(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, // cond) * _true) + - 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, // (ivec4(not(_con - 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, // d) ) * _false); - 0x7d, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, // }.uint select(bo - 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, // ol _cond, uint _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // true, uint _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, // e) { return _con - 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, // d ? _true : _fal - 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, // se; }.uvec2 sele - 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, // ct(bool _cond, u - 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, // vec2 _true, uvec - 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // 2 _false) { retu - 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // rn _cond ? _true - 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, // : _false; }.uve - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, // c3 select(bool _ - 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, // cond, uvec3 _tru - 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, // e, uvec3 _false) - 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, // { return _cond - 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // ? _true : _false - 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, // ; }.uvec4 select - 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, // (bool _cond, uve - 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, // c4 _true, uvec4 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, // _cond ? _true : - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, // _false; }.uvec2 - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, // select(bvec2 _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // ond, uvec2 _true - 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // , uvec2 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, // { return (uvec2( - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, // _cond) * _true) - 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, // + (uvec2(not(_co - 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, // nd) ) * _false); - 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, // }.uvec3 select( - 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, // bvec3 _cond, uve - 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, // c3 _true, uvec3 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, // (uvec3(_cond) * - 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x33, // _true) + (uvec3 - 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, // (not(_cond) ) * - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, // _false); }.uvec4 - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, // select(bvec4 _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // ond, uvec4 _true - 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // , uvec4 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, // { return (uvec4( - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, // _cond) * _true) - 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, // + (uvec4(not(_co - 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, // nd) ) * _false); - 0x20, 0x7d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // }.uniform vec4 - 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x63, 0x74, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // u_viewRect;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x54, // orm vec4 u_viewT - 0x65, 0x78, 0x65, 0x6c, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, // exel;.uniform ma - 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // t4 u_view;.unifo - 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, // rm mat4 u_invVie - 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // w;.uniform mat4 - 0x75, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // u_proj;.uniform - 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, // mat4 u_invProj;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, // uniform mat4 u_v - 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // iewProj;.uniform - 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, 0x77, 0x50, // mat4 u_invViewP - 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, // roj;.uniform mat - 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, // 4 u_modelView;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, // niform mat4 u_in - 0x76, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // vModelView;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, // orm mat4 u_model - 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // ViewProj;.unifor - 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x52, 0x65, // m vec4 u_alphaRe - 0x66, 0x34, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, // f4;.uniform mat4 - 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // u_model[1];.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6e, // form vec4 bgfx_n - 0x64, 0x63, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, // dc;.uniform vec4 - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x41, 0x72, // bgfx_indirectAr - 0x67, 0x42, 0x61, 0x73, 0x65, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, // gBase;.uniform s - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, // ampler2DArray bg - 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, // fx_texMipSrc;.la - 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, // yout(rgba8, bind - 0x69, 0x6e, 0x67, 0x3d, 0x30, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, // ing=0) writeonly - 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, // uniform image2D - 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, 0x3b, // Array s_imgMip1; - 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, // .layout(rgba8, b - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x31, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, // inding=1) writeo - 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, 0x6d, 0x61, 0x67, // nly uniform imag - 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, // e2DArray s_imgMi - 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, // p2;.layout(rgba8 - 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x32, 0x29, 0x20, 0x77, 0x72, 0x69, // , binding=2) wri - 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, // teonly uniform i + 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0b, 0x62, // CSH............b + 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, // gfx_mipGen...... + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, // .....bgfx_texMip + 0x53, 0x72, 0x63, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x11, 0x00, // Src............. + 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, // .layout(local_si + 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, // ze_x = 8, local_ + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, // size_y = 8, loca + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, // l_size_z = 1) in + 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ;..uniform vec4 + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // bgfx_mipGen;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, // form sampler2DAr + 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, // ray bgfx_texMipS + 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, // rc;.layout(locat + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, // ion = 0, binding + 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, // = 0, rgba8) uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, // form writeonly i 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, // mage2DArray s_im - 0x67, 0x4d, 0x69, 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, // gMip3;.layout(rg - 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x33, 0x29, 0x20, // ba8, binding=3) - 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // writeonly unifor - 0x6d, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, // m image2DArray s - 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // _imgMip4;.unifor - 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, // m vec4 bgfx_mipG - 0x65, 0x6e, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // en;.shared float - 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, // gs_R[64];.share - 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x36, 0x34, 0x5d, // d float gs_G[64] - 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, // ;.shared float g - 0x73, 0x5f, 0x42, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, // s_B[64];.shared - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, // float gs_A[64];. - 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, // void storeColor( - 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x76, 0x65, 0x63, // uint _index, vec - 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x0a, 0x7b, 0x0a, 0x67, 0x73, 0x5f, 0x52, // 4 _color).{.gs_R - 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // [_index] = _colo - 0x72, 0x2e, 0x78, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, // r.x;.gs_G[_index - 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x3b, 0x0a, 0x67, 0x73, // ] = _color.y;.gs - 0x5f, 0x42, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, // _B[_index] = _co - 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x69, 0x6e, 0x64, // lor.z;.gs_A[_ind - 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x77, 0x3b, 0x0a, // ex] = _color.w;. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // }.vec4 loadColor - 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x0a, 0x7b, 0x0a, // (uint _index).{. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, // return vec4(gs_R - 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, // [_index], gs_G[_ - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x69, 0x6e, // index], gs_B[_in - 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, // dex], gs_A[_inde - 0x78, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x20, 0x28, 0x6c, // x]);.}.layout (l - 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, 0x20, 0x38, 0x2c, // ocal_size_x = 8, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, 0x20, 0x3d, 0x20, // local_size_y = - 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x7a, 0x20, // 8, local_size_z - 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // = 1) in;.void ma - 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x69, 0x20, 0x3d, // in().{.uint gi = - 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // gl_LocalInvocat - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, // ionIndex;.uvec3 - 0x64, 0x74, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, // dtid = gl_Global - 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x3b, 0x0a, 0x75, 0x69, // InvocationID;.ui - 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, // nt srcMipLevel = - 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, // uint(bgfx_mipGe - 0x6e, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x4d, 0x69, // n.x);.uint numMi - 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, // pLevels = uint(b - 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x76, // gfx_mipGen.y);.v - 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, // ec2 texelSize = - 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x7a, 0x77, 0x3b, 0x0a, // bgfx_mipGen.zw;. - 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x74, 0x69, // uint slice = dti - 0x64, 0x2e, 0x7a, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x31, 0x3b, 0x0a, // d.z;.vec4 src1;. - 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x53, // vec2 uv = texelS - 0x69, 0x7a, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x64, 0x74, 0x69, 0x64, // ize * (vec2(dtid - 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, // .xy) + vec2_spla - 0x74, 0x28, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, // t(0.5) );.src1 = - 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x4c, // texture2DArrayL - 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, // od(bgfx_texMipSr - 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, // c, vec3(uv, floa - 0x74, 0x28, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, // t(slice) ), floa - 0x74, 0x28, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x20, 0x29, // t(srcMipLevel) ) - 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, // ;.imageStore(s_i - 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, // mgMip1, ivec3(dt - 0x69, 0x64, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, // id.xy, slice), s - 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4d, 0x69, 0x70, // rc1);.if (numMip - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x75, 0x29, 0x0a, 0x7b, 0x0a, // Levels == 1u).{. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, // return;.}.storeC - 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, // olor(gi, src1);. - 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x20, // barrier();.if ( - 0x28, 0x67, 0x69, 0x20, 0x26, 0x20, 0x30, 0x78, 0x39, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, // (gi & 0x9u) == 0 - 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x3d, // u).{.vec4 src2 = - 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, // loadColor(gi + - 0x30, 0x78, 0x30, 0x31, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, // 0x01u);.vec4 src - 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, // 3 = loadColor(gi - 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x38, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, // + 0x08u);.vec4 - 0x73, 0x72, 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // src4 = loadColor - 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x39, 0x75, 0x29, 0x3b, 0x0a, 0x73, 0x72, // (gi + 0x09u);.sr - 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, // c1 = 0.25 * (src - 0x31, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, // 1 + src2 + src3 - 0x2b, 0x20, 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, // + src4);.imageSt - 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x2c, 0x20, 0x69, // ore(s_imgMip2, i - 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x32, // vec3(dtid.xy / 2 - 0x75, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, // u, slice), src1) - 0x3b, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, // ;.storeColor(gi, - 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, // src1);.}.if (nu - 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x75, // mMipLevels == 2u - 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x62, 0x61, // ).{.return;.}.ba - 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x20, 0x28, 0x67, // rrier();.if ( (g - 0x69, 0x20, 0x26, 0x20, 0x30, 0x78, 0x31, 0x42, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, // i & 0x1Bu) == 0u - 0x29, 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, // ).{.vec4 src2 = - 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, // loadColor(gi + 0 - 0x78, 0x30, 0x32, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x33, // x02u);.vec4 src3 - 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, // = loadColor(gi - 0x2b, 0x20, 0x30, 0x78, 0x31, 0x30, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, // + 0x10u);.vec4 s - 0x72, 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, // rc4 = loadColor( - 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x31, 0x32, 0x75, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, // gi + 0x12u);.src - 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, 0x31, // 1 = 0.25 * (src1 - 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x2b, // + src2 + src3 + - 0x20, 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, // src4);.imageSto - 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x33, 0x2c, 0x20, 0x69, 0x76, // re(s_imgMip3, iv - 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x34, 0x75, // ec3(dtid.xy / 4u - 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, // , slice), src1); - 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, // .storeColor(gi, - 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, // src1);.}.if (num - 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x75, 0x29, // MipLevels == 3u) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x62, 0x61, 0x72, // .{.return;.}.bar - 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x67, 0x69, 0x20, 0x3d, // rier();.if (gi = - 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, // = 0u).{.vec4 src - 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, // 2 = loadColor(gi - 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x34, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, // + 0x04u);.vec4 - 0x73, 0x72, 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // src3 = loadColor - 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x32, 0x30, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, // (gi + 0x20u);.ve - 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, // c4 src4 = loadCo - 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x32, 0x34, 0x75, 0x29, 0x3b, // lor(gi + 0x24u); - 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, // .src1 = 0.25 * ( - 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, // src1 + src2 + sr - 0x63, 0x33, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, // c3 + src4);.imag - 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, // eStore(s_imgMip4 - 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, // , ivec3(dtid.xy - 0x2f, 0x20, 0x38, 0x75, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, // / 8u, slice), sr - 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x00, // c1);.}.}.. + 0x67, 0x4d, 0x69, 0x70, 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, // gMip1;.layout(lo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, // cation = 1, bind + 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, // ing = 1, rgba8) + 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, // uniform writeonl + 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, // y image2DArray s + 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // _imgMip2;.layout + 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x62, // (location = 2, b + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, // inding = 2, rgba + 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, // 8) uniform write + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, // only image2DArra + 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, // y s_imgMip3;.lay + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, // out(location = 3 + 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x72, // , binding = 3, r + 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, // gba8) uniform wr + 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, // iteonly image2DA + 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, // rray s_imgMip4;. + 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, // .shared float gs + 0x5f, 0x52, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, // _R[64];.shared f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, // loat gs_G[64];.s + 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x42, // hared float gs_B + 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, // [64];.shared flo + 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, // at gs_A[64];..vo + 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // id main().{. + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // do. {. + 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, // uint _93 = uint + 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, 0x3b, // (bgfx_mipGen.y); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, // . vec4 _1 + 0x32, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, // 27 = textureLod( + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, // bgfx_texMipSrc, + 0x76, 0x65, 0x63, 0x33, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, // vec3(bgfx_mipGen + 0x2e, 0x7a, 0x77, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, // .zw * (vec2(gl_G + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // lobalInvocationI + 0x44, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, // D.xy) + vec2(0.5 + 0x29, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, // )), float(gl_Glo + 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, // balInvocationID. + 0x7a, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x28, // z)), float(uint( + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x78, 0x29, 0x29, 0x29, // bgfx_mipGen.x))) + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, // ;. int _1 + 0x33, 0x38, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, // 38 = int(gl_Glob + 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x7a, // alInvocationID.z + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, // );. image + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, 0x2c, // Store(s_imgMip1, + 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, // ivec3(ivec2(gl_ + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // GlobalInvocation + 0x49, 0x44, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x29, 0x2c, 0x20, 0x5f, // ID.xy), _138), _ + 0x31, 0x32, 0x37, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, // 127);. if + 0x20, 0x28, 0x5f, 0x39, 0x33, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, // (_93 == 1u). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, // }. gs_R + 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // [gl_LocalInvocat + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x37, // ionIndex] = _127 + 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, // .x;. gs_G + 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // [gl_LocalInvocat + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x37, // ionIndex] = _127 + 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, // .y;. gs_B + 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // [gl_LocalInvocat + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x37, // ionIndex] = _127 + 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, // .z;. gs_A + 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // [gl_LocalInvocat + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x37, // ionIndex] = _127 + 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, // .w;. barr + 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, // ier();. v + 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x33, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ec4 _536;. + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, // if ((gl_LocalI + 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, // nvocationIndex & + 0x20, 0x39, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, // 9u) == 0u). + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x67, 0x6c, // uint _164 = gl + 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // _LocalInvocation + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // Index + 1u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, // float _3 + 0x35, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x31, 0x36, 0x34, 0x5d, 0x3b, // 58 = gs_R[_164]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // . flo + 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, // at _361 = gs_G[_ + 0x31, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 164];. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x67, // float _364 = g + 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x31, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // s_B[_164];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, // float _36 + 0x37, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x31, 0x36, 0x34, 0x5d, 0x3b, 0x0a, // 7 = gs_A[_164];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, // uint + 0x20, 0x5f, 0x31, 0x37, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // _170 = gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, // InvocationIndex + 0x2b, 0x20, 0x38, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 8u;. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x20, 0x3d, 0x20, 0x67, // float _373 = g + 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x31, 0x37, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // s_R[_170];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x37, // float _37 + 0x36, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x31, 0x37, 0x30, 0x5d, 0x3b, 0x0a, // 6 = gs_G[_170];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // floa + 0x74, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x31, // t _379 = gs_B[_1 + 0x37, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 70];. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x67, 0x73, // float _382 = gs + 0x5f, 0x41, 0x5b, 0x5f, 0x31, 0x37, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _A[_170];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x37, 0x35, 0x20, // uint _175 + 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, // = gl_LocalInvoca + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x39, 0x75, 0x3b, 0x0a, // tionIndex + 9u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // floa + 0x74, 0x20, 0x5f, 0x33, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x31, // t _388 = gs_R[_1 + 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 75];. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x39, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x73, // float _391 = gs + 0x5f, 0x47, 0x5b, 0x5f, 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _G[_175];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x39, 0x34, // float _394 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, // = gs_B[_175];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // float + 0x20, 0x5f, 0x33, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x31, 0x37, // _397 = gs_A[_17 + 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 5];. + 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, // vec4 _186 = (((_ + 0x31, 0x32, 0x37, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x33, 0x35, 0x38, 0x2c, // 127 + vec4(_358, + 0x20, 0x5f, 0x33, 0x36, 0x31, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x2c, 0x20, 0x5f, 0x33, 0x36, // _361, _364, _36 + 0x37, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x33, 0x37, 0x33, 0x2c, // 7)) + vec4(_373, + 0x20, 0x5f, 0x33, 0x37, 0x36, 0x2c, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x2c, 0x20, 0x5f, 0x33, 0x38, // _376, _379, _38 + 0x32, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x33, 0x38, 0x38, 0x2c, // 2)) + vec4(_388, + 0x20, 0x5f, 0x33, 0x39, 0x31, 0x2c, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x2c, 0x20, 0x5f, 0x33, 0x39, // _391, _394, _39 + 0x37, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 7)) * 0.25;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, // imageSto + 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x2c, 0x20, 0x69, 0x76, // re(s_imgMip2, iv + 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, // ec3(ivec2(gl_Glo + 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, // balInvocationID. + 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x32, 0x75, 0x29, 0x29, 0x2c, // xy / uvec2(2u)), + 0x20, 0x5f, 0x31, 0x33, 0x38, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x29, 0x3b, 0x0a, 0x20, // _138), _186);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, // gs_R[ + 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, // gl_LocalInvocati + 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x2e, // onIndex] = _186. + 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, // x;. g + 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // s_G[gl_LocalInvo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, // cationIndex] = _ + 0x31, 0x38, 0x36, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 186.y;. + 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // gs_B[gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, // InvocationIndex] + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _186.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, // gs_A[gl_L + 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, // ocalInvocationIn + 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x2e, 0x77, 0x3b, 0x0a, 0x20, // dex] = _186.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x33, 0x36, 0x20, // _536 + 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _186;. + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, // }. else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x37, // _536 = _127 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, // ;. }. + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x39, 0x33, 0x20, 0x3d, 0x3d, 0x20, 0x32, // if (_93 == 2 + 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // u). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // barrier();. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x33, 0x37, 0x3b, 0x0a, // vec4 _537;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x67, 0x6c, 0x5f, // if ((gl_ + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // LocalInvocationI + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x20, 0x32, 0x37, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, // ndex & 27u) == 0 + 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // u). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, // uint _2 + 0x31, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, // 18 = gl_LocalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x32, // ocationIndex + 2 + 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // u;. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, // loat _420 = gs_R + 0x5b, 0x5f, 0x32, 0x31, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // [_218];. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x33, 0x20, 0x3d, // float _423 = + 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x31, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // gs_G[_218];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x34, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x31, 0x38, 0x5d, // 426 = gs_B[_218] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // ;. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, // oat _429 = gs_A[ + 0x5f, 0x32, 0x31, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _218];. + 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x67, // uint _224 = g + 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // l_LocalInvocatio + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x36, 0x75, 0x3b, 0x0a, 0x20, 0x20, // nIndex + 16u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // float + 0x5f, 0x34, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x32, 0x34, // _435 = gs_R[_224 + 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // ];. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, // loat _438 = gs_G + 0x5b, 0x5f, 0x32, 0x32, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // [_224];. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x34, 0x31, 0x20, 0x3d, // float _441 = + 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x32, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // gs_B[_224];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x34, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x32, 0x34, 0x5d, // 444 = gs_A[_224] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, // ;. ui + 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, // nt _230 = gl_Loc + 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, // alInvocationInde + 0x78, 0x20, 0x2b, 0x20, 0x31, 0x38, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // x + 18u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x20, // float _450 + 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x33, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // = gs_R[_230];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // float + 0x5f, 0x34, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x33, 0x30, // _453 = gs_G[_230 + 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // ];. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, // loat _456 = gs_B + 0x5b, 0x5f, 0x32, 0x33, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // [_230];. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x39, 0x20, 0x3d, // float _459 = + 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x33, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // gs_A[_230];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, // vec4 _2 + 0x34, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x35, 0x33, 0x36, 0x20, 0x2b, 0x20, 0x76, // 40 = (((_536 + v + 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x32, 0x30, 0x2c, 0x20, 0x5f, 0x34, 0x32, 0x33, 0x2c, 0x20, // ec4(_420, _423, + 0x5f, 0x34, 0x32, 0x36, 0x2c, 0x20, 0x5f, 0x34, 0x32, 0x39, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, // _426, _429)) + v + 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x33, 0x35, 0x2c, 0x20, 0x5f, 0x34, 0x33, 0x38, 0x2c, 0x20, // ec4(_435, _438, + 0x5f, 0x34, 0x34, 0x31, 0x2c, 0x20, 0x5f, 0x34, 0x34, 0x34, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, // _441, _444)) + v + 0x65, 0x63, 0x34, 0x28, 0x5f, 0x34, 0x35, 0x30, 0x2c, 0x20, 0x5f, 0x34, 0x35, 0x33, 0x2c, 0x20, // ec4(_450, _453, + 0x5f, 0x34, 0x35, 0x36, 0x2c, 0x20, 0x5f, 0x34, 0x35, 0x39, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, // _456, _459)) * 0 + 0x2e, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // .25;. + 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, // imageStore(s_im + 0x67, 0x4d, 0x69, 0x70, 0x33, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, // gMip3, ivec3(ive + 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // c2(gl_GlobalInvo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, // cationID.xy / uv + 0x65, 0x63, 0x32, 0x28, 0x34, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x29, 0x2c, // ec2(4u)), _138), + 0x20, 0x5f, 0x32, 0x34, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _240);. + 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, // gs_R[gl_Loca + 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, // lInvocationIndex + 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x30, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // ] = _240.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, // gs_G[gl_ + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // LocalInvocationI + 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x30, 0x2e, 0x79, 0x3b, 0x0a, // ndex] = _240.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, // gs_B + 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // [gl_LocalInvocat + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x30, // ionIndex] = _240 + 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // .z;. + 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, // gs_A[gl_LocalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, // ocationIndex] = + 0x5f, 0x32, 0x34, 0x30, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _240.w;. + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x30, 0x3b, // _537 = _240; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . }. + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, // {. _5 + 0x33, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x33, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 37 = _536;. + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, // }. if + 0x28, 0x5f, 0x39, 0x33, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, // (_93 == 3u). + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, // }. barri + 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, // er();. if + 0x20, 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, // (gl_LocalInvoca + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, // tionIndex == 0u) + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x31, // uint _271 + 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, // = gl_LocalInvoc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x34, 0x75, 0x3b, // ationIndex + 4u; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, // . uin + 0x74, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, // t _277 = gl_Loca + 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, // lInvocationIndex + 0x20, 0x2b, 0x20, 0x33, 0x32, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 32u;. + 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x33, 0x20, 0x3d, 0x20, // uint _283 = + 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, // gl_LocalInvocati + 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x33, 0x36, 0x75, 0x3b, 0x0a, 0x20, // onIndex + 36u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, // image + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x2c, // Store(s_imgMip4, + 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, // ivec3(ivec2(gl_ + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // GlobalInvocation + 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x38, 0x75, // ID.xy / uvec2(8u + 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x35, // )), _138), (((_5 + 0x33, 0x37, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, // 37 + vec4(gs_R[_ + 0x32, 0x37, 0x31, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x37, 0x31, 0x5d, // 271], gs_G[_271] + 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x37, 0x31, 0x5d, 0x2c, 0x20, 0x67, 0x73, // , gs_B[_271], gs + 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x37, 0x31, 0x5d, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, // _A[_271])) + vec + 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x37, 0x37, 0x5d, 0x2c, 0x20, 0x67, 0x73, // 4(gs_R[_277], gs + 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x37, 0x37, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, // _G[_277], gs_B[_ + 0x32, 0x37, 0x37, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x37, 0x37, 0x5d, // 277], gs_A[_277] + 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, // )) + vec4(gs_R[_ + 0x32, 0x38, 0x33, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x38, 0x33, 0x5d, // 283], gs_G[_283] + 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x38, 0x33, 0x5d, 0x2c, 0x20, 0x67, 0x73, // , gs_B[_283], gs + 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x38, 0x33, 0x5d, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, // _A[_283])) * 0.2 + 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, // 5);. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, // break;. + 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, // } while(false); + 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... }; -static const uint8_t cs_mipgen_pow2_essl[5981] = +static const uint8_t cs_mipgen_pow2_essl[4451] = { - 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x17, // CSH...........J. - 0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x31, 0x30, 0x20, 0x65, // ..#version 310 e - 0x73, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x63, 0x70, 0x28, 0x66, 0x6c, 0x6f, 0x61, // s.float rcp(floa - 0x74, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, // t _a) { return 1 - 0x2e, 0x30, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x63, // .0/_a; }.vec2 rc - 0x70, 0x28, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // p(vec2 _a) { ret - 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, // urn vec2(1.0)/_a - 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, // ; }.vec3 rcp(vec - 0x33, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, // 3 _a) { return v - 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, // ec3(1.0)/_a; }.v - 0x65, 0x63, 0x34, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x61, 0x29, // ec4 rcp(vec4 _a) - 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, // { return vec4(1 - 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, // .0)/_a; }.vec2 v - 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // ec2_splat(float - 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, // _x) { return vec - 0x32, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, // 2(_x, _x); }.vec - 0x33, 0x20, 0x76, 0x65, 0x63, 0x33, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, // 3 vec3_splat(flo - 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // at _x) { return - 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, // vec3(_x, _x, _x) - 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, // ; }.vec4 vec4_sp - 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, // lat(float _x) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, // return vec4(_x, - 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, // _x, _x, _x); }.u - 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, // vec2 uvec2_splat - 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // (uint _x) { retu - 0x72, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, // rn uvec2(_x, _x) - 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x5f, // ; }.uvec3 uvec3_ - 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, // splat(uint _x) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x78, // return uvec3(_x - 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, // , _x, _x); }.uve - 0x63, 0x34, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, // c4 uvec4_splat(u - 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // int _x) { return - 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, // uvec4(_x, _x, _ - 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6d, // x, _x); }.mat4 m - 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, // txFromRows(vec4 - 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, // _0, vec4 _1, vec - 0x34, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, 0x0a, 0x7b, // 4 _2, vec4 _3).{ - 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, // .return transpos - 0x65, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, // e(mat4(_0, _1, _ - 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, // 2, _3) );.}.mat4 - 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, // mtxFromCols(vec - 0x34, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, // 4 _0, vec4 _1, v - 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, // ec4 _2, vec4 _3) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x5f, // .{.return mat4(_ - 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x29, 0x3b, 0x0a, // 0, _1, _2, _3);. - 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, // }.mat3 mtxFromRo - 0x77, 0x73, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // ws(vec3 _0, vec3 - 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x29, 0x0a, 0x7b, 0x0a, // _1, vec3 _2).{. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, // return transpose - 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, // (mat3(_0, _1, _2 - 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, // ) );.}.mat3 mtxF - 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, // romCols(vec3 _0, - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // vec3 _1, vec3 _ - 0x32, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x33, // 2).{.return mat3 - 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, // (_0, _1, _2);.}. - 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, 0x28, 0x6d, // vec3 mtxGetRow(m - 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, // at3 _mtx, int _r - 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, // ow).{.return vec - 0x33, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, // 3(_mtx[0][_row], - 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, // _mtx[1][_row], - 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, // _mtx[2][_row]);. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, // }.vec3 mtxGetCol - 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, // umn(mat3 _mtx, i - 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // nt _column).{.re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, // turn vec3(_mtx[_ - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, // column]);.}.vec4 - 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, // mtxGetRow(mat4 - 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, // _mtx, int _row). - 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, // {.return vec4(_m - 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, // tx[0][_row], _mt - 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, // x[1][_row], _mtx - 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, // [2][_row], _mtx[ - 0x33, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, // 3][_row]);.}.vec - 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x6d, // 4 mtxGetColumn(m - 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, // at4 _mtx, int _c - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // olumn).{.return - 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, // vec4(_mtx[_colum - 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x74, 0x78, // n]);.}.float mtx - 0x47, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, // GetElement(mat3 - 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, // _mtx, int _colum - 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, // n, int _row).{.r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, // eturn _mtx[_colu - 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, // mn][_row];.}.flo - 0x61, 0x74, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, // at mtxGetElement - 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, // (mat4 _mtx, int - 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, // _column, int _ro - 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x78, // w).{.return _mtx - 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x3b, // [_column][_row]; - 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, // .}.float select( - 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, // bool _cond, floa - 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // t _true, float _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // false) { return - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, // _cond ? _true : - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, // _false; }.vec2 s - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // elect(bool _cond - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, // , vec2 _true, ve - 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c2 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, // urn _cond ? _tru - 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, // e : _false; }.ve - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, // c3 select(bool _ - 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // cond, vec3 _true - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, // , vec3 _false) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, // return _cond ? - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, // _true : _false; - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, // }.vec4 select(bo - 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // ol _cond, vec4 _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // true, vec4 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, // e) { return _con - 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, // d ? _true : _fal - 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // se; }.vec2 selec - 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, // t(bvec2 _cond, v - 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // ec2 _true, vec2 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, // (vec2(_cond) * - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6e, // _true) + (vec2(n - 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, // ot(_cond) ) * _f - 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, // alse); }.vec3 se - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // lect(bvec3 _cond - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, // , vec3 _true, ve - 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c3 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, // urn (vec3(_cond) - 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, // * _true) + (vec - 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, // 3(not(_cond) ) * - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, // _false); }.vec4 - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, // select(bvec4 _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // ond, vec4 _true, - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, // vec4 _false) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x63, 0x6f, // return (vec4(_co - 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, // nd) * _true) + ( - 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, // vec4(not(_cond) - 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, // ) * _false); }.i - 0x6e, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, // nt select(bool _ - 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // cond, int _true, - 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, // int _false) { r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, // eturn _cond ? _t - 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, // rue : _false; }. - 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, // ivec2 select(boo - 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, // l _cond, ivec2 _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, // true, ivec2 _fal - 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, // se) { return _co - 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, // nd ? _true : _fa - 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, // lse; }.ivec3 sel - 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, // ect(bool _cond, - 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, // ivec3 _true, ive - 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c3 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, // urn _cond ? _tru - 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, // e : _false; }.iv - 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, // ec4 select(bool - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, // _cond, ivec4 _tr - 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // ue, ivec4 _false - 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // ) { return _cond - 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // ? _true : _fals - 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // e; }.ivec2 selec - 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, // t(bvec2 _cond, i - 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // vec2 _true, ivec - 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // 2 _false) { retu - 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, // rn (ivec2(_cond) - 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, // * _true) + (ive - 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, // c2(not(_cond) ) - 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, // * _false); }.ive - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, // c3 select(bvec3 - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, // _cond, ivec3 _tr - 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // ue, ivec3 _false - 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, // ) { return (ivec - 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // 3(_cond) * _true - 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, // ) + (ivec3(not(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // cond) ) * _false - 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // ); }.ivec4 selec - 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, // t(bvec4 _cond, i - 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // vec4 _true, ivec - 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // 4 _false) { retu - 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, // rn (ivec4(_cond) - 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, // * _true) + (ive - 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, // c4(not(_cond) ) - 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x69, 0x6e, // * _false); }.uin - 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, // t select(bool _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // ond, uint _true, - 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, // uint _false) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, // return _cond ? _ - 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, // true : _false; } - 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, // .uvec2 select(bo - 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, // ol _cond, uvec2 - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, // _true, uvec2 _fa - 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, // lse) { return _c - 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, // ond ? _true : _f - 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, // alse; }.uvec3 se - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, // lect(bool _cond, - 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, // uvec3 _true, uv - 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, // ec3 _false) { re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, // turn _cond ? _tr - 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, // ue : _false; }.u - 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, // vec4 select(bool - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, // _cond, uvec4 _t - 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // rue, uvec4 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, // e) { return _con - 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, // d ? _true : _fal - 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, // se; }.uvec2 sele - 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, // ct(bvec2 _cond, - 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, // uvec2 _true, uve - 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c2 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // urn (uvec2(_cond - 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, // ) * _true) + (uv - 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, // ec2(not(_cond) ) - 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, // * _false); }.uv - 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, // ec3 select(bvec3 - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, // _cond, uvec3 _t - 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // rue, uvec3 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, // e) { return (uve - 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, // c3(_cond) * _tru - 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, // e) + (uvec3(not( - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // _cond) ) * _fals - 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, // e); }.uvec4 sele - 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, // ct(bvec4 _cond, - 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, // uvec4 _true, uve - 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c4 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // urn (uvec4(_cond - 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, // ) * _true) + (uv - 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, // ec4(not(_cond) ) - 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x6e, // * _false); }.un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, // iform vec4 u_vie - 0x77, 0x52, 0x65, 0x63, 0x74, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, // wRect;.uniform v - 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x3b, // ec4 u_viewTexel; - 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // .uniform mat4 u_ - 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, // view;.uniform ma - 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, // t4 u_invView;.un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x72, 0x6f, // iform mat4 u_pro - 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // j;.uniform mat4 - 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // u_invProj;.unifo - 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, // rm mat4 u_viewPr - 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, // oj;.uniform mat4 - 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, // u_invViewProj;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, // uniform mat4 u_m - 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // odelView;.unifor - 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x4d, 0x6f, 0x64, 0x65, // m mat4 u_invMode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, // lView;.uniform m - 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, // at4 u_modelViewP - 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, // roj;.uniform vec - 0x34, 0x20, 0x75, 0x5f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x52, 0x65, 0x66, 0x34, 0x3b, 0x0a, 0x75, // 4 u_alphaRef4;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, // niform mat4 u_mo - 0x64, 0x65, 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // del[1];.uniform - 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6e, 0x64, 0x63, 0x3b, 0x0a, 0x75, // vec4 bgfx_ndc;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, // niform vec4 bgfx - 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x41, 0x72, 0x67, 0x42, 0x61, 0x73, 0x65, // _indirectArgBase - 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, // ;.uniform sample - 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, // r2DArray bgfx_te - 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, // xMipSrc;.layout( - 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x30, // rgba8, binding=0 - 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, // ) writeonly unif - 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, // orm highp image2 - 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, // DArray s_imgMip1 - 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, // ;.layout(rgba8, - 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x31, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, // binding=1) write - 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, // only uniform hig - 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, // hp image2DArray - 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // s_imgMip2;.layou - 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, // t(rgba8, binding - 0x3d, 0x32, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, // =2) writeonly un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, // iform highp imag - 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, // e2DArray s_imgMi - 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, // p3;.layout(rgba8 - 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x33, 0x29, 0x20, 0x77, 0x72, 0x69, // , binding=3) wri - 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, // teonly uniform h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, // ighp image2DArra - 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // y s_imgMip4;.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, // form vec4 bgfx_m - 0x69, 0x70, 0x47, 0x65, 0x6e, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, // ipGen;.shared fl - 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, // oat gs_R[64];.sh - 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, // ared float gs_G[ - 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, // 64];.shared floa - 0x74, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, // t gs_B[64];.shar - 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, // ed float gs_A[64 - 0x5d, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, // ];.void storeCol - 0x6f, 0x72, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, // or(uint _index, - 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x0a, 0x7b, 0x0a, 0x67, // vec4 _color).{.g - 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, // s_R[_index] = _c - 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x69, 0x6e, // olor.x;.gs_G[_in - 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x3b, // dex] = _color.y; - 0x0a, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, // .gs_B[_index] = - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x3b, 0x0a, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, // _color.z;.gs_A[_ - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, // index] = _color. - 0x77, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, // w;.}.vec4 loadCo - 0x6c, 0x6f, 0x72, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, // lor(uint _index) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, // .{.return vec4(g - 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, // s_R[_index], gs_ - 0x47, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, // G[_index], gs_B[ - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x69, // _index], gs_A[_i - 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // ndex]);.}.layout - 0x20, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, // (local_size_x = - 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, // 8, local_size_y - 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, // = 8, local_size - 0x5f, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, // _z = 1) in;.void - 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x67, // main().{.uint g - 0x69, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // i = gl_LocalInvo - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0a, 0x75, 0x76, 0x65, // cationIndex;.uve - 0x63, 0x33, 0x20, 0x64, 0x74, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, // c3 dtid = gl_Glo - 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x3b, // balInvocationID; - 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, // .uint srcMipLeve - 0x6c, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, // l = uint(bgfx_mi - 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x75, // pGen.x);.uint nu - 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, // mMipLevels = uin - 0x74, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, // t(bgfx_mipGen.y) - 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, // ;.vec2 texelSize - 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x7a, // = bgfx_mipGen.z - 0x77, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x3d, 0x20, // w;.uint slice = - 0x64, 0x74, 0x69, 0x64, 0x2e, 0x7a, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, // dtid.z;.vec4 src - 0x31, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, // 1;.vec2 uv = tex - 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x64, // elSize * (vec2(d - 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x5f, 0x73, // tid.xy) + vec2_s - 0x70, 0x6c, 0x61, 0x74, 0x28, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, // plat(0.5) );.src - 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, // 1 = texture2DArr - 0x61, 0x79, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, // ayLod(bgfx_texMi - 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x76, 0x2c, 0x20, 0x66, // pSrc, vec3(uv, f - 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x66, // loat(slice) ), f - 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x72, 0x63, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, // loat(srcMipLevel - 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, // ) );.imageStore( - 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, // s_imgMip1, ivec3 - 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, // (dtid.xy, slice) - 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, // , src1);.if (num - 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x75, 0x29, // MipLevels == 1u) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x73, 0x74, 0x6f, // .{.return;.}.sto - 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, // reColor(gi, src1 - 0x29, 0x3b, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, // );.barrier();.if - 0x20, 0x28, 0x20, 0x28, 0x67, 0x69, 0x20, 0x26, 0x20, 0x30, 0x78, 0x39, 0x75, 0x29, 0x20, 0x3d, // ( (gi & 0x9u) = - 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, // = 0u).{.vec4 src - 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, // 2 = loadColor(gi - 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x31, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, // + 0x01u);.vec4 - 0x73, 0x72, 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // src3 = loadColor - 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x38, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, // (gi + 0x08u);.ve - 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, // c4 src4 = loadCo - 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x39, 0x75, 0x29, 0x3b, // lor(gi + 0x09u); - 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, // .src1 = 0.25 * ( - 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, // src1 + src2 + sr - 0x63, 0x33, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, // c3 + src4);.imag - 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, // eStore(s_imgMip2 - 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, // , ivec3(dtid.xy - 0x2f, 0x20, 0x32, 0x75, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, // / 2u, slice), sr - 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, // c1);.storeColor( - 0x67, 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x20, // gi, src1);.}.if - 0x28, 0x6e, 0x75, 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, // (numMipLevels == - 0x20, 0x32, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, // 2u).{.return;.} - 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, // .barrier();.if ( - 0x20, 0x28, 0x67, 0x69, 0x20, 0x26, 0x20, 0x30, 0x78, 0x31, 0x42, 0x75, 0x29, 0x20, 0x3d, 0x3d, // (gi & 0x1Bu) == - 0x20, 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x32, // 0u).{.vec4 src2 - 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, // = loadColor(gi - 0x2b, 0x20, 0x30, 0x78, 0x30, 0x32, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, // + 0x02u);.vec4 s - 0x72, 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, // rc3 = loadColor( - 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x31, 0x30, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, 0x63, // gi + 0x10u);.vec - 0x34, 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, // 4 src4 = loadCol - 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x31, 0x32, 0x75, 0x29, 0x3b, 0x0a, // or(gi + 0x12u);. - 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x73, // src1 = 0.25 * (s - 0x72, 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, // rc1 + src2 + src - 0x33, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, // 3 + src4);.image - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x33, 0x2c, // Store(s_imgMip3, - 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x79, 0x20, 0x2f, // ivec3(dtid.xy / - 0x20, 0x34, 0x75, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, // 4u, slice), src - 0x31, 0x29, 0x3b, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, // 1);.storeColor(g - 0x69, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x20, 0x28, // i, src1);.}.if ( - 0x6e, 0x75, 0x6d, 0x4d, 0x69, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, // numMipLevels == - 0x33, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, // 3u).{.return;.}. - 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x67, // barrier();.if (g - 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x7b, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, // i == 0u).{.vec4 - 0x73, 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // src2 = loadColor - 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x30, 0x34, 0x75, 0x29, 0x3b, 0x0a, 0x76, 0x65, // (gi + 0x04u);.ve - 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, // c4 src3 = loadCo - 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x32, 0x30, 0x75, 0x29, 0x3b, // lor(gi + 0x20u); - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x72, 0x63, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, // .vec4 src4 = loa - 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x67, 0x69, 0x20, 0x2b, 0x20, 0x30, 0x78, 0x32, 0x34, // dColor(gi + 0x24 - 0x75, 0x29, 0x3b, 0x0a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, // u);.src1 = 0.25 - 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x32, 0x20, 0x2b, // * (src1 + src2 + - 0x20, 0x73, 0x72, 0x63, 0x33, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x69, // src3 + src4);.i + 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0b, 0x62, // CSH............b + 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, // gfx_mipGen...... + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, // .....bgfx_texMip + 0x53, 0x72, 0x63, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x11, 0x00, // Src..........!.. + 0x00, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, // .layout(local_si + 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, // ze_x = 8, local_ + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, // size_y = 8, loca + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, // l_size_z = 1) in + 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ;..uniform vec4 + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // bgfx_mipGen;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, // form highp sampl + 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, // er2DArray bgfx_t + 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, // exMipSrc;.layout + 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x62, // (location = 0, b + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, // inding = 0, rgba + 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, // 8) uniform write + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, // only highp image + 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, // 2DArray s_imgMip + 0x31, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, // 1;.layout(locati + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, // on = 1, binding + 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, // = 1, rgba8) unif + 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x68, 0x69, // orm writeonly hi + 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, // ghp image2DArray + 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // s_imgMip2;.layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x2c, // ut(location = 2, + 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x72, 0x67, // binding = 2, rg + 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, // ba8) uniform wri + 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, // teonly highp ima + 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, // ge2DArray s_imgM + 0x69, 0x70, 0x33, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // ip3;.layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, // tion = 3, bindin + 0x67, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, // g = 3, rgba8) un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, // iform writeonly + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, // highp image2DArr + 0x61, 0x79, 0x20, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x3b, 0x0a, 0x0a, 0x73, // ay s_imgMip4;..s + 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x52, // hared float gs_R + 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, // [64];.shared flo + 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, // at gs_G[64];.sha + 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x36, // red float gs_B[6 + 0x34, 0x5d, 0x3b, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // 4];.shared float + 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, // gs_A[64];..void + 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, // main().{. do + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, // . {. u + 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, // int _93 = uint(b + 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, // gfx_mipGen.y);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x32, 0x37, // vec4 _127 + 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, // = textureLod(bg + 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x4d, 0x69, 0x70, 0x53, 0x72, 0x63, 0x2c, 0x20, 0x76, 0x65, // fx_texMipSrc, ve + 0x63, 0x33, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x7a, // c3(bgfx_mipGen.z + 0x77, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, // w * (vec2(gl_Glo + 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, // balInvocationID. + 0x78, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x29, 0x29, // xy) + vec2(0.5)) + 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, // , float(gl_Globa + 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x7a, 0x29, // lInvocationID.z) + 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, 0x67, // ), float(uint(bg + 0x66, 0x78, 0x5f, 0x6d, 0x69, 0x70, 0x47, 0x65, 0x6e, 0x2e, 0x78, 0x29, 0x29, 0x29, 0x3b, 0x0a, // fx_mipGen.x)));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x33, 0x38, // int _138 + 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, // = int(gl_Global + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x7a, 0x29, 0x3b, // InvocationID.z); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, // . imageSt + 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x31, 0x2c, 0x20, 0x69, // ore(s_imgMip1, i + 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, // vec3(ivec2(gl_Gl + 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, // obalInvocationID + 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x32, // .xy), _138), _12 + 0x37, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, // 7);. if ( + 0x5f, 0x39, 0x33, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // _93 == 1u). + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, // }. gs_R[g + 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // l_LocalInvocatio + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x37, 0x2e, 0x78, // nIndex] = _127.x + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, // ;. gs_G[g + 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // l_LocalInvocatio + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x37, 0x2e, 0x79, // nIndex] = _127.y + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, // ;. gs_B[g + 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // l_LocalInvocatio + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x37, 0x2e, 0x7a, // nIndex] = _127.z + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, // ;. gs_A[g + 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // l_LocalInvocatio + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x37, 0x2e, 0x77, // nIndex] = _127.w + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, // ;. barrie + 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, // r();. vec + 0x34, 0x20, 0x5f, 0x35, 0x33, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 4 _536;. + 0x69, 0x66, 0x20, 0x28, 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, // if ((gl_LocalInv + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x20, 0x39, // ocationIndex & 9 + 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // u) == 0u). + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, // uint _164 = gl_L + 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, // ocalInvocationIn + 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // dex + 1u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x35, 0x38, // float _358 + 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x31, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x20, // = gs_R[_164];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // float + 0x20, 0x5f, 0x33, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x31, 0x36, // _361 = gs_G[_16 + 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 4];. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, // float _364 = gs_ + 0x42, 0x5b, 0x5f, 0x31, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // B[_164];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x37, 0x20, // float _367 + 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x31, 0x36, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // = gs_A[_164];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, // uint _ + 0x31, 0x37, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // 170 = gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, // vocationIndex + + 0x38, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 8u;. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x37, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, // float _373 = gs_ + 0x52, 0x5b, 0x5f, 0x31, 0x37, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // R[_170];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x20, // float _376 + 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x31, 0x37, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // = gs_G[_170];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // float + 0x5f, 0x33, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x31, 0x37, 0x30, // _379 = gs_B[_170 + 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // ];. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, // loat _382 = gs_A + 0x5b, 0x5f, 0x31, 0x37, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // [_170];. + 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x37, 0x35, 0x20, 0x3d, 0x20, // uint _175 = + 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, // gl_LocalInvocati + 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x39, 0x75, 0x3b, 0x0a, 0x20, 0x20, // onIndex + 9u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // float + 0x5f, 0x33, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x31, 0x37, 0x35, // _388 = gs_R[_175 + 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // ];. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x39, 0x31, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, // loat _391 = gs_G + 0x5b, 0x5f, 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // [_175];. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x20, 0x3d, // float _394 = + 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x31, 0x37, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, // gs_B[_175];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // float _ + 0x33, 0x39, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x31, 0x37, 0x35, 0x5d, // 397 = gs_A[_175] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // ;. ve + 0x63, 0x34, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x31, 0x32, // c4 _186 = (((_12 + 0x37, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x33, 0x35, 0x38, 0x2c, 0x20, 0x5f, // 7 + vec4(_358, _ + 0x33, 0x36, 0x31, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x34, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x37, 0x29, // 361, _364, _367) + 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x33, 0x37, 0x33, 0x2c, 0x20, 0x5f, // ) + vec4(_373, _ + 0x33, 0x37, 0x36, 0x2c, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x2c, 0x20, 0x5f, 0x33, 0x38, 0x32, 0x29, // 376, _379, _382) + 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x33, 0x38, 0x38, 0x2c, 0x20, 0x5f, // ) + vec4(_388, _ + 0x33, 0x39, 0x31, 0x2c, 0x20, 0x5f, 0x33, 0x39, 0x34, 0x2c, 0x20, 0x5f, 0x33, 0x39, 0x37, 0x29, // 391, _394, _397) + 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ) * 0.25;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, // imageStore + 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x32, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // (s_imgMip2, ivec + 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, // 3(ivec2(gl_Globa + 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, // lInvocationID.xy + 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x32, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, // / uvec2(2u)), _ + 0x31, 0x33, 0x38, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 138), _186);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, // gs_R[gl + 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // _LocalInvocation + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x2e, 0x78, 0x3b, // Index] = _186.x; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, // . gs_ + 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, // G[gl_LocalInvoca + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, // tionIndex] = _18 + 0x36, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 6.y;. + 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, // gs_B[gl_LocalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, // vocationIndex] = + 0x20, 0x5f, 0x31, 0x38, 0x36, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _186.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, // gs_A[gl_Loc + 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, // alInvocationInde + 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x36, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, // x] = _186.w;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x33, 0x36, 0x20, 0x3d, 0x20, // _536 = + 0x5f, 0x31, 0x38, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // _186;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x5f, 0x35, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x37, 0x3b, 0x0a, // _536 = _127;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x39, 0x33, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x75, 0x29, // if (_93 == 2u) + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // barrier();. + 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x33, 0x37, 0x3b, 0x0a, 0x20, 0x20, // vec4 _537;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, // if ((gl_Lo + 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, // calInvocationInd + 0x65, 0x78, 0x20, 0x26, 0x20, 0x32, 0x37, 0x75, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, // ex & 27u) == 0u) + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x31, 0x38, // uint _218 + 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, // = gl_LocalInvoc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x32, 0x75, 0x3b, // ationIndex + 2u; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // . flo + 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, // at _420 = gs_R[_ + 0x32, 0x31, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 218];. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x67, // float _423 = g + 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x31, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // s_G[_218];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, // float _42 + 0x36, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x31, 0x38, 0x5d, 0x3b, 0x0a, // 6 = gs_B[_218];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // floa + 0x74, 0x20, 0x5f, 0x34, 0x32, 0x39, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, // t _429 = gs_A[_2 + 0x31, 0x38, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 18];. + 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, // uint _224 = gl_ + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, // LocalInvocationI + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x36, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // ndex + 16u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, // float _4 + 0x33, 0x35, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x32, 0x34, 0x5d, 0x3b, // 35 = gs_R[_224]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // . flo + 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, // at _438 = gs_G[_ + 0x32, 0x32, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 224];. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x67, // float _441 = g + 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x32, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // s_B[_224];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x34, // float _44 + 0x34, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x32, 0x34, 0x5d, 0x3b, 0x0a, // 4 = gs_A[_224];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, // uint + 0x20, 0x5f, 0x32, 0x33, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, // _230 = gl_Local + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, // InvocationIndex + 0x2b, 0x20, 0x31, 0x38, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 18u;. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x20, 0x3d, 0x20, // float _450 = + 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x33, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // gs_R[_230];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, // float _4 + 0x35, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x33, 0x30, 0x5d, 0x3b, // 53 = gs_G[_230]; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // . flo + 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, // at _456 = gs_B[_ + 0x32, 0x33, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 230];. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x35, 0x39, 0x20, 0x3d, 0x20, 0x67, // float _459 = g + 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x33, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // s_A[_230];. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x34, 0x30, // vec4 _240 + 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x35, 0x33, 0x36, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, // = (((_536 + vec + 0x34, 0x28, 0x5f, 0x34, 0x32, 0x30, 0x2c, 0x20, 0x5f, 0x34, 0x32, 0x33, 0x2c, 0x20, 0x5f, 0x34, // 4(_420, _423, _4 + 0x32, 0x36, 0x2c, 0x20, 0x5f, 0x34, 0x32, 0x39, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, // 26, _429)) + vec + 0x34, 0x28, 0x5f, 0x34, 0x33, 0x35, 0x2c, 0x20, 0x5f, 0x34, 0x33, 0x38, 0x2c, 0x20, 0x5f, 0x34, // 4(_435, _438, _4 + 0x34, 0x31, 0x2c, 0x20, 0x5f, 0x34, 0x34, 0x34, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, // 41, _444)) + vec + 0x34, 0x28, 0x5f, 0x34, 0x35, 0x30, 0x2c, 0x20, 0x5f, 0x34, 0x35, 0x33, 0x2c, 0x20, 0x5f, 0x34, // 4(_450, _453, _4 + 0x35, 0x36, 0x2c, 0x20, 0x5f, 0x34, 0x35, 0x39, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, // 56, _459)) * 0.2 + 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, // 5;. i 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, // mageStore(s_imgM - 0x69, 0x70, 0x34, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x64, 0x74, 0x69, 0x64, 0x2e, // ip4, ivec3(dtid. - 0x78, 0x79, 0x20, 0x2f, 0x20, 0x38, 0x75, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x29, 0x2c, // xy / 8u, slice), - 0x20, 0x73, 0x72, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x00, // src1);.}.}.. + 0x69, 0x70, 0x33, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, // ip3, ivec3(ivec2 + 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, // (gl_GlobalInvoca + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, // tionID.xy / uvec + 0x32, 0x28, 0x34, 0x75, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x29, 0x2c, 0x20, 0x5f, // 2(4u)), _138), _ + 0x32, 0x34, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 240);. + 0x20, 0x20, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, // gs_R[gl_LocalI + 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, // nvocationIndex] + 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x30, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _240.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, // gs_G[gl_Lo + 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, // calInvocationInd + 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x30, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, // ex] = _240.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x67, // gs_B[g + 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // l_LocalInvocatio + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x30, 0x2e, 0x7a, // nIndex] = _240.z + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x73, // ;. gs + 0x5f, 0x41, 0x5b, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, // _A[gl_LocalInvoc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, // ationIndex] = _2 + 0x34, 0x30, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 40.w;. + 0x20, 0x20, 0x5f, 0x35, 0x33, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x30, 0x3b, 0x0a, 0x20, // _537 = _240;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // else. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x33, 0x37, // _537 + 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x33, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _536;. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, // }. if (_ + 0x39, 0x33, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x75, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 93 == 3u). + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // break;. } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, // . barrier + 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, // ();. if ( + 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, // gl_LocalInvocati + 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x75, 0x29, 0x0a, 0x20, // onIndex == 0u). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x31, 0x20, 0x3d, // uint _271 = + 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, // gl_LocalInvocat + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x34, 0x75, 0x3b, 0x0a, 0x20, // ionIndex + 4u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, // uint + 0x5f, 0x32, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, // _277 = gl_LocalI + 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, // nvocationIndex + + 0x20, 0x33, 0x32, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 32u;. + 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x33, 0x20, 0x3d, 0x20, 0x67, 0x6c, // uint _283 = gl + 0x5f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // _LocalInvocation + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x33, 0x36, 0x75, 0x3b, 0x0a, 0x20, 0x20, 0x20, // Index + 36u;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, // imageSt + 0x6f, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x69, 0x6d, 0x67, 0x4d, 0x69, 0x70, 0x34, 0x2c, 0x20, 0x69, // ore(s_imgMip4, i + 0x76, 0x65, 0x63, 0x33, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, // vec3(ivec2(gl_Gl + 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, // obalInvocationID + 0x2e, 0x78, 0x79, 0x20, 0x2f, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x38, 0x75, 0x29, 0x29, // .xy / uvec2(8u)) + 0x2c, 0x20, 0x5f, 0x31, 0x33, 0x38, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x35, 0x33, 0x37, // , _138), (((_537 + 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x37, // + vec4(gs_R[_27 + 0x31, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x37, 0x31, 0x5d, 0x2c, 0x20, // 1], gs_G[_271], + 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x37, 0x31, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, // gs_B[_271], gs_A + 0x5b, 0x5f, 0x32, 0x37, 0x31, 0x5d, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // [_271])) + vec4( + 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x37, 0x37, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, // gs_R[_277], gs_G + 0x5b, 0x5f, 0x32, 0x37, 0x37, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x37, // [_277], gs_B[_27 + 0x37, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, 0x5b, 0x5f, 0x32, 0x37, 0x37, 0x5d, 0x29, 0x29, // 7], gs_A[_277])) + 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x67, 0x73, 0x5f, 0x52, 0x5b, 0x5f, 0x32, 0x38, // + vec4(gs_R[_28 + 0x33, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x47, 0x5b, 0x5f, 0x32, 0x38, 0x33, 0x5d, 0x2c, 0x20, // 3], gs_G[_283], + 0x67, 0x73, 0x5f, 0x42, 0x5b, 0x5f, 0x32, 0x38, 0x33, 0x5d, 0x2c, 0x20, 0x67, 0x73, 0x5f, 0x41, // gs_B[_283], gs_A + 0x5b, 0x5f, 0x32, 0x38, 0x33, 0x5d, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, // [_283])) * 0.25) + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, // ;. }. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, // break;. } + 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x7d, // while(false);.} + 0x0a, 0x0a, 0x00, // ... }; static const uint8_t cs_mipgen_pow2_spv[6121] = { diff --git a/src/cs_yuv_to_rgb.bin.h b/src/cs_yuv_to_rgb.bin.h index 6bf5cadb3..1491309e1 100644 --- a/src/cs_yuv_to_rgb.bin.h +++ b/src/cs_yuv_to_rgb.bin.h @@ -1,620 +1,169 @@ -static const uint8_t cs_yuv_to_rgb_glsl[5024] = +static const uint8_t cs_yuv_to_rgb_glsl[1273] = { - 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x13, // CSH............. - 0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x33, 0x30, 0x0a, 0x66, // ..#version 430.f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x63, 0x70, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // loat rcp(float _ - 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2e, 0x30, 0x2f, // a) { return 1.0/ - 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, // _a; }.vec2 rcp(v - 0x65, 0x63, 0x32, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // ec2 _a) { return - 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, // vec2(1.0)/_a; } - 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // .vec3 rcp(vec3 _ - 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, // a) { return vec3 - 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, // (1.0)/_a; }.vec4 - 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, // rcp(vec4 _a) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, // return vec4(1.0) - 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x65, 0x63, 0x32, // /_a; }.vec2 vec2 - 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, // _splat(float _x) - 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, // { return vec2(_ - 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // x, _x); }.vec3 v - 0x65, 0x63, 0x33, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // ec3_splat(float - 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, // _x) { return vec - 0x33, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, // 3(_x, _x, _x); } - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, // .vec4 vec4_splat - 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // (float _x) { ret - 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, // urn vec4(_x, _x, - 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, // _x, _x); }.uvec - 0x32, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, 0x69, // 2 uvec2_splat(ui - 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // nt _x) { return - 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, // uvec2(_x, _x); } - 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x5f, 0x73, 0x70, 0x6c, // .uvec3 uvec3_spl - 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, // at(uint _x) { re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, // turn uvec3(_x, _ - 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, // x, _x); }.uvec4 - 0x75, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, // uvec4_splat(uint - 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x76, // _x) { return uv - 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, // ec4(_x, _x, _x, - 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x46, // _x); }.mat4 mtxF - 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x30, 0x2c, // romRows(vec4 _0, - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // vec4 _1, vec4 _ - 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // 2, vec4 _3).{.re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, // turn transpose(m - 0x61, 0x74, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x2c, 0x20, // at4(_0, _1, _2, - 0x5f, 0x33, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x74, // _3) );.}.mat4 mt - 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // xFromCols(vec4 _ - 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, // 0, vec4 _1, vec4 - 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, 0x0a, 0x7b, 0x0a, // _2, vec4 _3).{. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, // return mat4(_0, - 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, // _1, _2, _3);.}.m - 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, // at3 mtxFromRows( - 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, // vec3 _0, vec3 _1 - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, // , vec3 _2).{.ret - 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, // urn transpose(ma - 0x74, 0x33, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, 0x20, 0x29, // t3(_0, _1, _2) ) - 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, // ;.}.mat3 mtxFrom - 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, // Cols(vec3 _0, ve - 0x63, 0x33, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x29, 0x0a, // c3 _1, vec3 _2). - 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x5f, 0x30, // {.return mat3(_0 - 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, // , _1, _2);.}.mat - 0x34, 0x78, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, // 4x3 mtxFromRows( - 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, // vec4 _0, vec4 _1 - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, // , vec4 _2).{.ret - 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x61, // urn transpose(ma - 0x74, 0x33, 0x78, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, // t3x4(_0, _1, _2) - 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, // );.}.vec3 mtxGe - 0x74, 0x52, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, // tRow(mat3 _mtx, - 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, // int _row).{.retu - 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, // rn vec3(_mtx[0][ - 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, // _row], _mtx[1][_ - 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, // row], _mtx[2][_r - 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, // ow]);.}.vec3 mtx - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, // GetColumn(mat3 _ - 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, // mtx, int _column - 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // ).{.return vec3( - 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, // _mtx[_column]);. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, // }.vec4 mtxGetRow - 0x28, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, // (mat4x3 _mtx, in - 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // t _row).{.return - 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, // vec4(_mtx[0][_r - 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, // ow], _mtx[1][_ro - 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, // w], _mtx[2][_row - 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x33, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, // ], _mtx[3][_row] - 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, // );.}.vec3 mtxGet - 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x78, 0x33, 0x20, 0x5f, 0x6d, // Column(mat4x3 _m - 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, // tx, int _column) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, // .{.return vec3(_ - 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, // mtx[_column]);.} - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, 0x28, // .vec4 mtxGetRow( - 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, // mat4 _mtx, int _ - 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, // row).{.return ve - 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, // c4(_mtx[0][_row] - 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, // , _mtx[1][_row], - 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, // _mtx[2][_row], - 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x33, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, // _mtx[3][_row]);. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, // }.vec4 mtxGetCol - 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, // umn(mat4 _mtx, i - 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // nt _column).{.re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, // turn vec4(_mtx[_ - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, // column]);.}.floa - 0x74, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, // t mtxGetElement( - 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, // mat3 _mtx, int _ - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, // column, int _row - 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, // ).{.return _mtx[ - 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x3b, 0x0a, // _column][_row];. - 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x45, 0x6c, // }.float mtxGetEl - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, // ement(mat4 _mtx, - 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2c, 0x20, 0x69, 0x6e, // int _column, in - 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // t _row).{.return - 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, // _mtx[_column][_ - 0x72, 0x6f, 0x77, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x65, // row];.}.float se - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, // lect(bool _cond, - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x66, 0x6c, // float _true, fl - 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, // oat _false) { re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, // turn _cond ? _tr - 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, // ue : _false; }.v - 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, // ec2 select(bool - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, // _cond, vec2 _tru - 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // e, vec2 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, // { return _cond ? - 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, // _true : _false; - 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, // }.vec3 select(b - 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // ool _cond, vec3 - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, // _true, vec3 _fal - 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, // se) { return _co - 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, // nd ? _true : _fa - 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, // lse; }.vec4 sele - 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, // ct(bool _cond, v - 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ec4 _true, vec4 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, // _cond ? _true : - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, // _false; }.vec2 - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, // select(bvec2 _co - 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, // nd, vec2 _true, - 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, // vec2 _false) { r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, // eturn (vec2(_con - 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, // d) * _true) + (v - 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, // ec2(not(_cond) ) - 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, // * _false); }.ve - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, // c3 select(bvec3 - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, // _cond, vec3 _tru - 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // e, vec3 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, // { return (vec3(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, // cond) * _true) + - 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // (vec3(not(_cond - 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, // ) ) * _false); } - 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, // .vec4 select(bve - 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // c4 _cond, vec4 _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // true, vec4 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, // e) { return (vec - 0x34, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // 4(_cond) * _true - 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, // ) + (vec4(not(_c - 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, // ond) ) * _false) - 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, // ; }.int select(b - 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, // ool _cond, int _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // true, int _false - 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // ) { return _cond - 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // ? _true : _fals - 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // e; }.ivec2 selec - 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, // t(bool _cond, iv - 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, // ec2 _true, ivec2 - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, // _false) { retur - 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, // n _cond ? _true - 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, // : _false; }.ivec - 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, // 3 select(bool _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // ond, ivec3 _true - 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // , ivec3 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, // { return _cond ? - 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, // _true : _false; - 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, // }.ivec4 select( - 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // bool _cond, ivec - 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // 4 _true, ivec4 _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // false) { return - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, // _cond ? _true : - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, // _false; }.ivec2 - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, // select(bvec2 _co - 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // nd, ivec2 _true, - 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, // ivec2 _false) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, // return (ivec2(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, // cond) * _true) + - 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, // (ivec2(not(_con - 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, // d) ) * _false); - 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, // }.ivec3 select(b - 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // vec3 _cond, ivec - 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // 3 _true, ivec3 _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // false) { return - 0x28, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, // (ivec3(_cond) * - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, // _true) + (ivec3( - 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, // not(_cond) ) * _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, // false); }.ivec4 - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, // select(bvec4 _co - 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // nd, ivec4 _true, - 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, // ivec4 _false) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, // return (ivec4(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, // cond) * _true) + - 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, // (ivec4(not(_con - 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, // d) ) * _false); - 0x7d, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, // }.uint select(bo - 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, // ol _cond, uint _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // true, uint _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, // e) { return _con - 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, // d ? _true : _fal - 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, // se; }.uvec2 sele - 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, // ct(bool _cond, u - 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, // vec2 _true, uvec - 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // 2 _false) { retu - 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // rn _cond ? _true - 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, // : _false; }.uve - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, // c3 select(bool _ - 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, // cond, uvec3 _tru - 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, // e, uvec3 _false) - 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, // { return _cond - 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // ? _true : _false - 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, // ; }.uvec4 select - 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, // (bool _cond, uve - 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, // c4 _true, uvec4 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, // _cond ? _true : - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, // _false; }.uvec2 - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, // select(bvec2 _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // ond, uvec2 _true - 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // , uvec2 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, // { return (uvec2( - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, // _cond) * _true) - 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, // + (uvec2(not(_co - 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, // nd) ) * _false); - 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, // }.uvec3 select( - 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, // bvec3 _cond, uve - 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, // c3 _true, uvec3 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, // (uvec3(_cond) * - 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x33, // _true) + (uvec3 - 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, // (not(_cond) ) * - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, // _false); }.uvec4 - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, // select(bvec4 _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // ond, uvec4 _true - 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, // , uvec4 _false) - 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, // { return (uvec4( - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, // _cond) * _true) - 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, // + (uvec4(not(_co - 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, // nd) ) * _false); - 0x20, 0x7d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // }.uniform vec4 - 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x63, 0x74, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // u_viewRect;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x54, // orm vec4 u_viewT - 0x65, 0x78, 0x65, 0x6c, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, // exel;.uniform ma - 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // t4 u_view;.unifo - 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, // rm mat4 u_invVie - 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // w;.uniform mat4 - 0x75, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // u_proj;.uniform - 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, // mat4 u_invProj;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, // uniform mat4 u_v - 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // iewProj;.uniform - 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, 0x77, 0x50, // mat4 u_invViewP - 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, // roj;.uniform mat - 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, // 4 u_modelView;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, // niform mat4 u_in - 0x76, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // vModelView;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, // orm mat4 u_model - 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // ViewProj;.unifor - 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x52, 0x65, // m vec4 u_alphaRe - 0x66, 0x34, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, // f4;.uniform mat4 - 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // u_model[1];.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6e, // form vec4 bgfx_n - 0x64, 0x63, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, // dc;.uniform vec4 - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x41, 0x72, // bgfx_indirectAr - 0x67, 0x42, 0x61, 0x73, 0x65, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, // gBase;.uniform s - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, // ampler2D bgfx_te - 0x78, 0x59, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, // xY;.uniform samp - 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x62, // ler2D bgfx_texCb - 0x43, 0x72, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, // Cr;.layout(rgba8 - 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x30, 0x29, 0x20, 0x77, 0x72, 0x69, // , binding=0) wri - 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, // teonly uniform i - 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x69, 0x6d, 0x67, 0x52, // mage2D bgfx_imgR - 0x67, 0x62, 0x61, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x20, 0x28, 0x6c, 0x6f, 0x63, // gba;.layout (loc - 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, // al_size_x = 8, l - 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x38, 0x2c, // ocal_size_y = 8, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x7a, 0x20, 0x3d, 0x20, // local_size_z = - 0x31, 0x29, 0x20, 0x69, 0x6e, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // 1) in;.void main - 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, // ().{.ivec2 coord - 0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, // = ivec2(gl_Glob - 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, // alInvocationID.x - 0x79, 0x29, 0x3b, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, // y);.ivec2 size = - 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, // imageSize(bgfx_ - 0x69, 0x6d, 0x67, 0x52, 0x67, 0x62, 0x61, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, // imgRgba);.if (co - 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x20, 0x3e, 0x3d, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2e, 0x78, 0x0a, // ord.x >= size.x. - 0x7c, 0x7c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x20, 0x3e, 0x3d, 0x20, 0x73, 0x69, // || coord.y >= si - 0x7a, 0x65, 0x2e, 0x79, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, // ze.y).{.return;. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x69, 0x6e, 0x76, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3d, // }.vec2 invSize = - 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, // vec2(1.0, 1.0) - 0x2f, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x3b, 0x0a, 0x76, 0x65, // / vec2(size);.ve - 0x63, 0x32, 0x20, 0x75, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x63, 0x6f, // c2 uv = (vec2(co - 0x6f, 0x72, 0x64, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x2c, // ord) + vec2(0.5, - 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x76, 0x53, 0x69, 0x7a, // 0.5) ) * invSiz - 0x65, 0x3b, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, // e;.float y = tex - 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, // tureLod(bgfx_tex - 0x59, 0x2c, 0x20, 0x75, 0x76, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2e, 0x78, 0x3b, 0x0a, 0x76, // Y, uv, 0.0).x;.v - 0x65, 0x63, 0x32, 0x20, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, // ec2 cb = texture - 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x62, 0x43, 0x72, // Lod(bgfx_texCbCr - 0x2c, 0x20, 0x75, 0x76, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x66, // , uv, 0.0).xy;.f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x4c, 0x20, 0x3d, 0x20, 0x28, 0x79, 0x20, 0x2d, 0x20, 0x31, // loat yL = (y - 1 - 0x36, 0x2e, 0x30, 0x2f, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x32, 0x35, // 6.0/255.0) * (25 - 0x35, 0x2e, 0x30, 0x2f, 0x32, 0x31, 0x39, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x66, 0x6c, 0x6f, 0x61, // 5.0/219.0);.floa - 0x74, 0x20, 0x63, 0x62, 0x4c, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x62, 0x2e, 0x78, 0x20, 0x2d, 0x20, // t cbL = (cb.x - - 0x31, 0x32, 0x38, 0x2e, 0x30, 0x2f, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, // 128.0/255.0) * ( - 0x32, 0x35, 0x35, 0x2e, 0x30, 0x2f, 0x32, 0x32, 0x34, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x66, 0x6c, // 255.0/224.0);.fl - 0x6f, 0x61, 0x74, 0x20, 0x63, 0x72, 0x4c, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x62, 0x2e, 0x79, 0x20, // oat crL = (cb.y - 0x2d, 0x20, 0x31, 0x32, 0x38, 0x2e, 0x30, 0x2f, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x29, 0x20, 0x2a, // - 128.0/255.0) * - 0x20, 0x28, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x2f, 0x32, 0x32, 0x34, 0x2e, 0x30, 0x29, 0x3b, 0x0a, // (255.0/224.0);. - 0x76, 0x65, 0x63, 0x33, 0x20, 0x72, 0x67, 0x62, 0x3b, 0x0a, 0x72, 0x67, 0x62, 0x2e, 0x72, 0x20, // vec3 rgb;.rgb.r - 0x3d, 0x20, 0x79, 0x4c, 0x20, 0x2b, 0x20, 0x31, 0x2e, 0x35, 0x37, 0x34, 0x38, 0x20, 0x2a, 0x20, // = yL + 1.5748 * - 0x63, 0x72, 0x4c, 0x3b, 0x0a, 0x72, 0x67, 0x62, 0x2e, 0x67, 0x20, 0x3d, 0x20, 0x79, 0x4c, 0x20, // crL;.rgb.g = yL - 0x2d, 0x20, 0x30, 0x2e, 0x31, 0x38, 0x37, 0x33, 0x20, 0x2a, 0x20, 0x63, 0x62, 0x4c, 0x20, 0x2d, // - 0.1873 * cbL - - 0x20, 0x30, 0x2e, 0x34, 0x36, 0x38, 0x31, 0x20, 0x2a, 0x20, 0x63, 0x72, 0x4c, 0x3b, 0x0a, 0x72, // 0.4681 * crL;.r - 0x67, 0x62, 0x2e, 0x62, 0x20, 0x3d, 0x20, 0x79, 0x4c, 0x20, 0x2b, 0x20, 0x31, 0x2e, 0x38, 0x35, // gb.b = yL + 1.85 - 0x35, 0x36, 0x20, 0x2a, 0x20, 0x63, 0x62, 0x4c, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, // 56 * cbL;.imageS - 0x74, 0x6f, 0x72, 0x65, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x69, 0x6d, 0x67, 0x52, 0x67, 0x62, // tore(bgfx_imgRgb - 0x61, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, // a, coord, vec4(c - 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x72, 0x67, 0x62, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // lamp(rgb, 0.0, 1 - 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x00, // .0), 1.0) );.}.. -}; -static const uint8_t cs_yuv_to_rgb_essl[4753] = -{ - 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x12, // CSH...........~. - 0x00, 0x00, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x31, 0x30, 0x20, 0x65, // ..#version 310 e - 0x73, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x63, 0x70, 0x28, 0x66, 0x6c, 0x6f, 0x61, // s.float rcp(floa - 0x74, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, // t _a) { return 1 - 0x2e, 0x30, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x72, 0x63, // .0/_a; }.vec2 rc - 0x70, 0x28, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // p(vec2 _a) { ret - 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, // urn vec2(1.0)/_a - 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, // ; }.vec3 rcp(vec - 0x33, 0x20, 0x5f, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, // 3 _a) { return v - 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, // ec3(1.0)/_a; }.v - 0x65, 0x63, 0x34, 0x20, 0x72, 0x63, 0x70, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x61, 0x29, // ec4 rcp(vec4 _a) - 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, // { return vec4(1 - 0x2e, 0x30, 0x29, 0x2f, 0x5f, 0x61, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, // .0)/_a; }.vec2 v - 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // ec2_splat(float - 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, // _x) { return vec - 0x32, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, // 2(_x, _x); }.vec - 0x33, 0x20, 0x76, 0x65, 0x63, 0x33, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, // 3 vec3_splat(flo - 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // at _x) { return - 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, // vec3(_x, _x, _x) - 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, // ; }.vec4 vec4_sp - 0x6c, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, // lat(float _x) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, // return vec4(_x, - 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, // _x, _x, _x); }.u - 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, // vec2 uvec2_splat - 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // (uint _x) { retu - 0x72, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, // rn uvec2(_x, _x) - 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x5f, // ; }.uvec3 uvec3_ - 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, // splat(uint _x) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x78, // return uvec3(_x - 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, // , _x, _x); }.uve - 0x63, 0x34, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x5f, 0x73, 0x70, 0x6c, 0x61, 0x74, 0x28, 0x75, // c4 uvec4_splat(u - 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x78, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // int _x) { return - 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x2c, 0x20, 0x5f, // uvec4(_x, _x, _ - 0x78, 0x2c, 0x20, 0x5f, 0x78, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6d, // x, _x); }.mat4 m - 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, // txFromRows(vec4 - 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, // _0, vec4 _1, vec - 0x34, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, 0x0a, 0x7b, // 4 _2, vec4 _3).{ - 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, // .return transpos - 0x65, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, // e(mat4(_0, _1, _ - 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x34, // 2, _3) );.}.mat4 - 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, // mtxFromCols(vec - 0x34, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, // 4 _0, vec4 _1, v - 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x29, // ec4 _2, vec4 _3) - 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x5f, // .{.return mat4(_ - 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x2c, 0x20, 0x5f, 0x33, 0x29, 0x3b, 0x0a, // 0, _1, _2, _3);. - 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x6f, // }.mat3 mtxFromRo - 0x77, 0x73, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // ws(vec3 _0, vec3 - 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x29, 0x0a, 0x7b, 0x0a, // _1, vec3 _2).{. - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, // return transpose - 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, // (mat3(_0, _1, _2 - 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x46, // ) );.}.mat3 mtxF - 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6c, 0x73, 0x28, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x30, 0x2c, // romCols(vec3 _0, - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // vec3 _1, vec3 _ - 0x32, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x33, // 2).{.return mat3 - 0x28, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, // (_0, _1, _2);.}. - 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, 0x28, 0x6d, // vec3 mtxGetRow(m - 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, // at3 _mtx, int _r - 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, // ow).{.return vec - 0x33, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, // 3(_mtx[0][_row], - 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, // _mtx[1][_row], - 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, // _mtx[2][_row]);. - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, // }.vec3 mtxGetCol - 0x75, 0x6d, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, // umn(mat3 _mtx, i - 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, // nt _column).{.re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, // turn vec3(_mtx[_ - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, // column]);.}.vec4 - 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x77, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, // mtxGetRow(mat4 - 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, // _mtx, int _row). - 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, // {.return vec4(_m - 0x74, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, // tx[0][_row], _mt - 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, // x[1][_row], _mtx - 0x5b, 0x32, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x2c, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, // [2][_row], _mtx[ - 0x33, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, // 3][_row]);.}.vec - 0x34, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x6d, // 4 mtxGetColumn(m - 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, // at4 _mtx, int _c - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // olumn).{.return - 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, // vec4(_mtx[_colum - 0x6e, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x74, 0x78, // n]);.}.float mtx - 0x47, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x20, // GetElement(mat3 - 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, // _mtx, int _colum - 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, // n, int _row).{.r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, // eturn _mtx[_colu - 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, // mn][_row];.}.flo - 0x61, 0x74, 0x20, 0x6d, 0x74, 0x78, 0x47, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, // at mtxGetElement - 0x28, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x74, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, // (mat4 _mtx, int - 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x72, 0x6f, // _column, int _ro - 0x77, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x78, // w).{.return _mtx - 0x5b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5d, 0x5b, 0x5f, 0x72, 0x6f, 0x77, 0x5d, 0x3b, // [_column][_row]; - 0x0a, 0x7d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, // .}.float select( - 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, // bool _cond, floa - 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // t _true, float _ - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, // false) { return - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, // _cond ? _true : - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, // _false; }.vec2 s - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // elect(bool _cond - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, // , vec2 _true, ve - 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c2 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, // urn _cond ? _tru - 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, // e : _false; }.ve - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, // c3 select(bool _ - 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // cond, vec3 _true - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, // , vec3 _false) { - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, // return _cond ? - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, // _true : _false; - 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, // }.vec4 select(bo - 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // ol _cond, vec4 _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // true, vec4 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, // e) { return _con - 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, // d ? _true : _fal - 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // se; }.vec2 selec - 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, // t(bvec2 _cond, v - 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // ec2 _true, vec2 - 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, // _false) { return - 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, // (vec2(_cond) * - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x6e, // _true) + (vec2(n - 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, // ot(_cond) ) * _f - 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, // alse); }.vec3 se - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // lect(bvec3 _cond - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x76, 0x65, // , vec3 _true, ve - 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c3 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, // urn (vec3(_cond) - 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, // * _true) + (vec - 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, // 3(not(_cond) ) * - 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x34, // _false); }.vec4 - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, // select(bvec4 _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // ond, vec4 _true, - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, // vec4 _false) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x63, 0x6f, // return (vec4(_co - 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, // nd) * _true) + ( - 0x76, 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, // vec4(not(_cond) - 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, // ) * _false); }.i - 0x6e, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, // nt select(bool _ - 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // cond, int _true, - 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, // int _false) { r - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, // eturn _cond ? _t - 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, // rue : _false; }. - 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, // ivec2 select(boo - 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, // l _cond, ivec2 _ - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, // true, ivec2 _fal - 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, // se) { return _co - 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, // nd ? _true : _fa - 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, // lse; }.ivec3 sel - 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, // ect(bool _cond, - 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, // ivec3 _true, ive - 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c3 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, // urn _cond ? _tru - 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, // e : _false; }.iv - 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, // ec4 select(bool - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, // _cond, ivec4 _tr - 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // ue, ivec4 _false - 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // ) { return _cond - 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // ? _true : _fals - 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // e; }.ivec2 selec - 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, // t(bvec2 _cond, i - 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // vec2 _true, ivec - 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // 2 _false) { retu - 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, // rn (ivec2(_cond) - 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, // * _true) + (ive - 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, // c2(not(_cond) ) - 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, // * _false); }.ive - 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, 0x20, // c3 select(bvec3 - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, // _cond, ivec3 _tr - 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // ue, ivec3 _false - 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, // ) { return (ivec - 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, // 3(_cond) * _true - 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, // ) + (ivec3(not(_ - 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, // cond) ) * _false - 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, // ); }.ivec4 selec - 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, // t(bvec4 _cond, i - 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x76, 0x65, 0x63, // vec4 _true, ivec - 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, // 4 _false) { retu - 0x72, 0x6e, 0x20, 0x28, 0x69, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, // rn (ivec4(_cond) - 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x76, 0x65, // * _true) + (ive - 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, // c4(not(_cond) ) - 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x69, 0x6e, // * _false); }.uin - 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, // t select(bool _c - 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, // ond, uint _true, - 0x20, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, // uint _false) { - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, // return _cond ? _ - 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, // true : _false; } - 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, // .uvec2 select(bo - 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, // ol _cond, uvec2 - 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, // _true, uvec2 _fa - 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, // lse) { return _c - 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, // ond ? _true : _f - 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, // alse; }.uvec3 se - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, // lect(bool _cond, - 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, // uvec3 _true, uv - 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, // ec3 _false) { re - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, // turn _cond ? _tr - 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, // ue : _false; }.u - 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, // vec4 select(bool - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, // _cond, uvec4 _t - 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // rue, uvec4 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6f, 0x6e, // e) { return _con - 0x64, 0x20, 0x3f, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3a, 0x20, 0x5f, 0x66, 0x61, 0x6c, // d ? _true : _fal - 0x73, 0x65, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x65, 0x6c, 0x65, // se; }.uvec2 sele - 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, // ct(bvec2 _cond, - 0x75, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, // uvec2 _true, uve - 0x63, 0x32, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c2 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // urn (uvec2(_cond - 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, // ) * _true) + (uv - 0x65, 0x63, 0x32, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, // ec2(not(_cond) ) - 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, // * _false); }.uv - 0x65, 0x63, 0x33, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x33, // ec3 select(bvec3 - 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x74, // _cond, uvec3 _t - 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // rue, uvec3 _fals - 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, // e) { return (uve - 0x63, 0x33, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, // c3(_cond) * _tru - 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x6f, 0x74, 0x28, // e) + (uvec3(not( - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, // _cond) ) * _fals - 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x65, 0x6c, 0x65, // e); }.uvec4 sele - 0x63, 0x74, 0x28, 0x62, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, // ct(bvec4 _cond, - 0x75, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x76, 0x65, // uvec4 _true, uve - 0x63, 0x34, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, // c4 _false) { ret - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, // urn (uvec4(_cond - 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x75, 0x76, // ) * _true) + (uv - 0x65, 0x63, 0x34, 0x28, 0x6e, 0x6f, 0x74, 0x28, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x29, // ec4(not(_cond) ) - 0x20, 0x2a, 0x20, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x20, 0x7d, 0x0a, 0x75, 0x6e, // * _false); }.un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, // iform vec4 u_vie - 0x77, 0x52, 0x65, 0x63, 0x74, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, // wRect;.uniform v - 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x3b, // ec4 u_viewTexel; - 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // .uniform mat4 u_ - 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, // view;.uniform ma - 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, // t4 u_invView;.un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x72, 0x6f, // iform mat4 u_pro - 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // j;.uniform mat4 - 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // u_invProj;.unifo - 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, // rm mat4 u_viewPr - 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, // oj;.uniform mat4 - 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, // u_invViewProj;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, // uniform mat4 u_m - 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // odelView;.unifor - 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x69, 0x6e, 0x76, 0x4d, 0x6f, 0x64, 0x65, // m mat4 u_invMode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, // lView;.uniform m - 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, // at4 u_modelViewP - 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, // roj;.uniform vec - 0x34, 0x20, 0x75, 0x5f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x52, 0x65, 0x66, 0x34, 0x3b, 0x0a, 0x75, // 4 u_alphaRef4;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, // niform mat4 u_mo - 0x64, 0x65, 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // del[1];.uniform - 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x6e, 0x64, 0x63, 0x3b, 0x0a, 0x75, // vec4 bgfx_ndc;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, // niform vec4 bgfx - 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x41, 0x72, 0x67, 0x42, 0x61, 0x73, 0x65, // _indirectArgBase - 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, // ;.uniform sample - 0x72, 0x32, 0x44, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x59, 0x3b, 0x0a, 0x75, // r2D bgfx_texY;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, // niform sampler2D - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x62, 0x43, 0x72, 0x3b, 0x0a, 0x6c, // bgfx_texCbCr;.l - 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x72, 0x67, 0x62, 0x61, 0x38, 0x2c, 0x20, 0x62, 0x69, 0x6e, // ayout(rgba8, bin - 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x30, 0x29, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, // ding=0) writeonl - 0x79, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // y uniform highp - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x69, 0x6d, 0x67, // image2D bgfx_img - 0x52, 0x67, 0x62, 0x61, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x20, 0x28, 0x6c, 0x6f, // Rgba;.layout (lo - 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x78, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, // cal_size_x = 8, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x38, // local_size_y = 8 - 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x7a, 0x20, 0x3d, // , local_size_z = - 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, // 1) in;.void mai - 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x63, 0x6f, 0x6f, 0x72, // n().{.ivec2 coor - 0x64, 0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, // d = ivec2(gl_Glo - 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, // balInvocationID. - 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, // xy);.ivec2 size + 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x62, // CSH............b + 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x59, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // gfx_texY........ + 0x00, 0x00, 0x0c, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x62, 0x43, 0x72, 0x00, // ...bgfx_texCbCr. + 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x00, 0x00, 0x6c, 0x61, 0x79, // .............lay + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x78, // out(local_size_x + 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, // = 8, local_size + 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, // _y = 8, local_si + 0x7a, 0x65, 0x5f, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x3b, 0x0a, 0x0a, 0x6c, // ze_z = 1) in;..l + 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, // ayout(location = + 0x20, 0x30, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x30, 0x2c, // 0, binding = 0, + 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // rgba8) uniform + 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, // writeonly image2 + 0x44, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x69, 0x6d, 0x67, 0x52, 0x67, 0x62, 0x61, 0x3b, 0x0a, // D bgfx_imgRgba;. + 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, // uniform sampler2 + 0x44, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x59, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // D bgfx_texY;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x62, // form sampler2D b + 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x62, 0x43, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, // gfx_texCbCr;..vo + 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // id main().{. + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // do. {. + 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x69, 0x76, 0x65, // ivec2 _17 = ive + 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x6f, // c2(gl_GlobalInvo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, // cationID.xy);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, 0x34, 0x20, // ivec2 _24 0x3d, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x28, 0x62, 0x67, 0x66, 0x78, // = imageSize(bgfx - 0x5f, 0x69, 0x6d, 0x67, 0x52, 0x67, 0x62, 0x61, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x20, 0x28, 0x63, // _imgRgba);.if (c - 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x20, 0x3e, 0x3d, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2e, 0x78, // oord.x >= size.x - 0x0a, 0x7c, 0x7c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x20, 0x3e, 0x3d, 0x20, 0x73, // .|| coord.y >= s - 0x69, 0x7a, 0x65, 0x2e, 0x79, 0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, // ize.y).{.return; - 0x0a, 0x7d, 0x0a, 0x76, 0x65, 0x63, 0x32, 0x20, 0x69, 0x6e, 0x76, 0x53, 0x69, 0x7a, 0x65, 0x20, // .}.vec2 invSize - 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, // = vec2(1.0, 1.0) - 0x20, 0x2f, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x3b, 0x0a, 0x76, // / vec2(size);.v - 0x65, 0x63, 0x32, 0x20, 0x75, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x63, // ec2 uv = (vec2(c - 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, // oord) + vec2(0.5 - 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x76, 0x53, 0x69, // , 0.5) ) * invSi - 0x7a, 0x65, 0x3b, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x65, // ze;.float y = te - 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, // xtureLod(bgfx_te - 0x78, 0x59, 0x2c, 0x20, 0x75, 0x76, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2e, 0x78, 0x3b, 0x0a, // xY, uv, 0.0).x;. - 0x76, 0x65, 0x63, 0x32, 0x20, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, // vec2 cb = textur - 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x62, 0x43, // eLod(bgfx_texCbC - 0x72, 0x2c, 0x20, 0x75, 0x76, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x0a, // r, uv, 0.0).xy;. - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x4c, 0x20, 0x3d, 0x20, 0x28, 0x79, 0x20, 0x2d, 0x20, // float yL = (y - - 0x31, 0x36, 0x2e, 0x30, 0x2f, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x32, // 16.0/255.0) * (2 - 0x35, 0x35, 0x2e, 0x30, 0x2f, 0x32, 0x31, 0x39, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x66, 0x6c, 0x6f, // 55.0/219.0);.flo - 0x61, 0x74, 0x20, 0x63, 0x62, 0x4c, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x62, 0x2e, 0x78, 0x20, 0x2d, // at cbL = (cb.x - - 0x20, 0x31, 0x32, 0x38, 0x2e, 0x30, 0x2f, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, // 128.0/255.0) * - 0x28, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x2f, 0x32, 0x32, 0x34, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x66, // (255.0/224.0);.f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x72, 0x4c, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x62, 0x2e, 0x79, // loat crL = (cb.y - 0x20, 0x2d, 0x20, 0x31, 0x32, 0x38, 0x2e, 0x30, 0x2f, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x29, 0x20, // - 128.0/255.0) - 0x2a, 0x20, 0x28, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x2f, 0x32, 0x32, 0x34, 0x2e, 0x30, 0x29, 0x3b, // * (255.0/224.0); - 0x0a, 0x76, 0x65, 0x63, 0x33, 0x20, 0x72, 0x67, 0x62, 0x3b, 0x0a, 0x72, 0x67, 0x62, 0x2e, 0x72, // .vec3 rgb;.rgb.r - 0x20, 0x3d, 0x20, 0x79, 0x4c, 0x20, 0x2b, 0x20, 0x31, 0x2e, 0x35, 0x37, 0x34, 0x38, 0x20, 0x2a, // = yL + 1.5748 * - 0x20, 0x63, 0x72, 0x4c, 0x3b, 0x0a, 0x72, 0x67, 0x62, 0x2e, 0x67, 0x20, 0x3d, 0x20, 0x79, 0x4c, // crL;.rgb.g = yL - 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x31, 0x38, 0x37, 0x33, 0x20, 0x2a, 0x20, 0x63, 0x62, 0x4c, 0x20, // - 0.1873 * cbL - 0x2d, 0x20, 0x30, 0x2e, 0x34, 0x36, 0x38, 0x31, 0x20, 0x2a, 0x20, 0x63, 0x72, 0x4c, 0x3b, 0x0a, // - 0.4681 * crL;. - 0x72, 0x67, 0x62, 0x2e, 0x62, 0x20, 0x3d, 0x20, 0x79, 0x4c, 0x20, 0x2b, 0x20, 0x31, 0x2e, 0x38, // rgb.b = yL + 1.8 - 0x35, 0x35, 0x36, 0x20, 0x2a, 0x20, 0x63, 0x62, 0x4c, 0x3b, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, // 556 * cbL;.image - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x69, 0x6d, 0x67, 0x52, 0x67, // Store(bgfx_imgRg - 0x62, 0x61, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // ba, coord, vec4( - 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x72, 0x67, 0x62, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, // clamp(rgb, 0.0, - 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, // 1.0), 1.0) );.}. - 0x00, // . + 0x5f, 0x69, 0x6d, 0x67, 0x52, 0x67, 0x62, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // _imgRgba);. + 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, // bool _32 = _1 + 0x37, 0x2e, 0x78, 0x20, 0x3e, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, // 7.x >= _24.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x34, 0x32, 0x3b, 0x0a, // bool _42;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, 0x33, 0x32, // if (!_32 + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // ). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x31, // _42 = _1 + 0x37, 0x2e, 0x79, 0x20, 0x3e, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, // 7.y >= _24.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // else. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x32, 0x20, 0x3d, // _42 = + 0x20, 0x5f, 0x33, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // _32;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x32, 0x29, // if (_42) + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, // vec2 _61 = (vec2 + 0x28, 0x5f, 0x31, 0x37, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x35, // (_17) + vec2(0.5 + 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x20, // )) * (vec2(1.0) + 0x2f, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x32, 0x34, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // / vec2(_24));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x37, 0x38, 0x20, 0x3d, // vec4 _78 = + 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, // textureLod(bgfx + 0x5f, 0x74, 0x65, 0x78, 0x43, 0x62, 0x43, 0x72, 0x2c, 0x20, 0x5f, 0x36, 0x31, 0x2c, 0x20, 0x30, // _texCbCr, _61, 0 + 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // .0);. flo + 0x61, 0x74, 0x20, 0x5f, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, // at _85 = (textur + 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x59, 0x2c, 0x20, // eLod(bgfx_texY, + 0x5f, 0x36, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2e, 0x78, 0x20, 0x2d, 0x20, 0x30, 0x2e, // _61, 0.0).x - 0. + 0x30, 0x36, 0x32, 0x37, 0x34, 0x35, 0x31, 0x30, 0x31, 0x37, 0x34, 0x39, 0x38, 0x39, 0x37, 0x30, // 0627451017498970 + 0x30, 0x33, 0x31, 0x37, 0x33, 0x38, 0x32, 0x38, 0x31, 0x32, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x31, // 03173828125) * 1 + 0x2e, 0x31, 0x36, 0x34, 0x33, 0x38, 0x33, 0x35, 0x33, 0x30, 0x36, 0x31, 0x36, 0x37, 0x36, 0x30, // .164383530616760 + 0x32, 0x35, 0x33, 0x39, 0x30, 0x36, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 25390625;. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x37, // float _90 = _7 + 0x38, 0x2e, 0x78, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x35, 0x30, 0x31, 0x39, 0x36, 0x30, 0x38, 0x31, // 8.x - 0.50196081 + 0x33, 0x39, 0x39, 0x39, 0x31, 0x37, 0x36, 0x30, 0x32, 0x35, 0x33, 0x39, 0x30, 0x36, 0x32, 0x35, // 3999176025390625 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // ;. float + 0x5f, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x30, 0x2e, // _96 = _78.y - 0. + 0x35, 0x30, 0x31, 0x39, 0x36, 0x30, 0x38, 0x31, 0x33, 0x39, 0x39, 0x39, 0x31, 0x37, 0x36, 0x30, // 5019608139991760 + 0x32, 0x35, 0x33, 0x39, 0x30, 0x36, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 25390625;. + 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x62, 0x67, 0x66, // imageStore(bgf + 0x78, 0x5f, 0x69, 0x6d, 0x67, 0x52, 0x67, 0x62, 0x61, 0x2c, 0x20, 0x5f, 0x31, 0x37, 0x2c, 0x20, // x_imgRgba, _17, + 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, // vec4(clamp(vec3( + 0x5f, 0x38, 0x35, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x39, 0x36, 0x20, 0x2a, 0x20, 0x31, 0x2e, 0x37, // _85 + (_96 * 1.7 + 0x39, 0x32, 0x37, 0x34, 0x31, 0x30, 0x36, 0x30, 0x32, 0x35, 0x36, 0x39, 0x35, 0x38, 0x30, 0x30, // 9274106025695800 + 0x37, 0x38, 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x28, 0x5f, 0x38, 0x35, 0x20, 0x2d, 0x20, 0x28, // 78125), (_85 - ( + 0x5f, 0x39, 0x30, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x31, 0x33, 0x32, 0x32, 0x30, 0x39, 0x36, // _90 * 0.21322096 + 0x38, 0x38, 0x34, 0x32, 0x35, 0x30, 0x36, 0x34, 0x30, 0x38, 0x36, 0x39, 0x31, 0x34, 0x30, 0x36, // 8842506408691406 + 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x39, 0x36, 0x20, 0x2a, 0x20, 0x30, 0x2e, // 25)) - (_96 * 0. + 0x35, 0x33, 0x32, 0x38, 0x38, 0x31, 0x36, 0x37, 0x37, 0x31, 0x35, 0x30, 0x37, 0x32, 0x36, 0x33, // 5328816771507263 + 0x31, 0x38, 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, 0x29, 0x2c, 0x20, 0x5f, 0x38, 0x35, 0x20, 0x2b, // 18359375), _85 + + 0x20, 0x28, 0x5f, 0x39, 0x30, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x31, 0x31, 0x32, 0x34, 0x30, 0x31, // (_90 * 2.112401 + 0x37, 0x32, 0x33, 0x38, 0x36, 0x31, 0x36, 0x39, 0x34, 0x33, 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, // 7238616943359375 + 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, // )), vec3(0.0), v + 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, // ec3(1.0)), 1.0)) + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, // ;. break; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, // . } while(fal + 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // se);.}... +}; +static const uint8_t cs_yuv_to_rgb_essl[1291] = +{ + 0x43, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x62, // CSH............b + 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x59, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // gfx_texY........ + 0x00, 0x00, 0x0c, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x62, 0x43, 0x72, 0x00, // ...bgfx_texCbCr. + 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0x04, 0x00, 0x00, 0x6c, 0x61, 0x79, // .............lay + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x78, // out(local_size_x + 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, // = 8, local_size + 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x38, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, // _y = 8, local_si + 0x7a, 0x65, 0x5f, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x3b, 0x0a, 0x0a, 0x6c, // ze_z = 1) in;..l + 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, // ayout(location = + 0x20, 0x30, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x30, 0x2c, // 0, binding = 0, + 0x20, 0x72, 0x67, 0x62, 0x61, 0x38, 0x29, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // rgba8) uniform + 0x77, 0x72, 0x69, 0x74, 0x65, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // writeonly highp + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x44, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x69, 0x6d, 0x67, // image2D bgfx_img + 0x52, 0x67, 0x62, 0x61, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, // Rgba;.uniform hi + 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x62, 0x67, // ghp sampler2D bg + 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x59, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // fx_texY;.uniform + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, // highp sampler2D + 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x62, 0x43, 0x72, 0x3b, 0x0a, 0x0a, // bgfx_texCbCr;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // do. {. + 0x20, 0x20, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x69, // ivec2 _17 = i + 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x49, 0x6e, // vec2(gl_GlobalIn + 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, // vocationID.xy);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x32, // ivec2 _2 + 0x34, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x28, 0x62, 0x67, // 4 = imageSize(bg + 0x66, 0x78, 0x5f, 0x69, 0x6d, 0x67, 0x52, 0x67, 0x62, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // fx_imgRgba);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x33, 0x32, 0x20, 0x3d, 0x20, // bool _32 = + 0x5f, 0x31, 0x37, 0x2e, 0x78, 0x20, 0x3e, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x2e, 0x78, 0x3b, 0x0a, // _17.x >= _24.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x5f, 0x34, 0x32, // bool _42 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x5f, // ;. if (!_ + 0x33, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // 32). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x32, 0x20, 0x3d, 0x20, // _42 = + 0x5f, 0x31, 0x37, 0x2e, 0x79, 0x20, 0x3e, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x2e, 0x79, 0x3b, 0x0a, // _17.y >= _24.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, // else. { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x32, // . _42 + 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // = _32;. + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, // }. if (_4 + 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // 2). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x5f, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, // vec2 _61 = (ve + 0x63, 0x32, 0x28, 0x5f, 0x31, 0x37, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, // c2(_17) + vec2(0 + 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, // .5)) * (vec2(1.0 + 0x29, 0x20, 0x2f, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x5f, 0x32, 0x34, 0x29, 0x29, 0x3b, 0x0a, // ) / vec2(_24));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x37, 0x38, // vec4 _78 + 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, // = textureLod(bg + 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x62, 0x43, 0x72, 0x2c, 0x20, 0x5f, 0x36, 0x31, 0x2c, // fx_texCbCr, _61, + 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // 0.0);. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x38, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x65, 0x78, 0x74, // loat _85 = (text + 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x74, 0x65, 0x78, 0x59, // ureLod(bgfx_texY + 0x2c, 0x20, 0x5f, 0x36, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2e, 0x78, 0x20, 0x2d, 0x20, // , _61, 0.0).x - + 0x30, 0x2e, 0x30, 0x36, 0x32, 0x37, 0x34, 0x35, 0x31, 0x30, 0x31, 0x37, 0x34, 0x39, 0x38, 0x39, // 0.06274510174989 + 0x37, 0x30, 0x30, 0x33, 0x31, 0x37, 0x33, 0x38, 0x32, 0x38, 0x31, 0x32, 0x35, 0x29, 0x20, 0x2a, // 7003173828125) * + 0x20, 0x31, 0x2e, 0x31, 0x36, 0x34, 0x33, 0x38, 0x33, 0x35, 0x33, 0x30, 0x36, 0x31, 0x36, 0x37, // 1.1643835306167 + 0x36, 0x30, 0x32, 0x35, 0x33, 0x39, 0x30, 0x36, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 6025390625;. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x30, 0x20, 0x3d, 0x20, // float _90 = + 0x5f, 0x37, 0x38, 0x2e, 0x78, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x35, 0x30, 0x31, 0x39, 0x36, 0x30, // _78.x - 0.501960 + 0x38, 0x31, 0x33, 0x39, 0x39, 0x39, 0x31, 0x37, 0x36, 0x30, 0x32, 0x35, 0x33, 0x39, 0x30, 0x36, // 8139991760253906 + 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // 25;. floa + 0x74, 0x20, 0x5f, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x2e, 0x79, 0x20, 0x2d, 0x20, // t _96 = _78.y - + 0x30, 0x2e, 0x35, 0x30, 0x31, 0x39, 0x36, 0x30, 0x38, 0x31, 0x33, 0x39, 0x39, 0x39, 0x31, 0x37, // 0.50196081399917 + 0x36, 0x30, 0x32, 0x35, 0x33, 0x39, 0x30, 0x36, 0x32, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 6025390625;. + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x62, // imageStore(b + 0x67, 0x66, 0x78, 0x5f, 0x69, 0x6d, 0x67, 0x52, 0x67, 0x62, 0x61, 0x2c, 0x20, 0x5f, 0x31, 0x37, // gfx_imgRgba, _17 + 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x76, 0x65, 0x63, // , vec4(clamp(vec + 0x33, 0x28, 0x5f, 0x38, 0x35, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x39, 0x36, 0x20, 0x2a, 0x20, 0x31, // 3(_85 + (_96 * 1 + 0x2e, 0x37, 0x39, 0x32, 0x37, 0x34, 0x31, 0x30, 0x36, 0x30, 0x32, 0x35, 0x36, 0x39, 0x35, 0x38, // .792741060256958 + 0x30, 0x30, 0x37, 0x38, 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x28, 0x5f, 0x38, 0x35, 0x20, 0x2d, // 0078125), (_85 - + 0x20, 0x28, 0x5f, 0x39, 0x30, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x32, 0x31, 0x33, 0x32, 0x32, 0x30, // (_90 * 0.213220 + 0x39, 0x36, 0x38, 0x38, 0x34, 0x32, 0x35, 0x30, 0x36, 0x34, 0x30, 0x38, 0x36, 0x39, 0x31, 0x34, // 9688425064086914 + 0x30, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x39, 0x36, 0x20, 0x2a, 0x20, // 0625)) - (_96 * + 0x30, 0x2e, 0x35, 0x33, 0x32, 0x38, 0x38, 0x31, 0x36, 0x37, 0x37, 0x31, 0x35, 0x30, 0x37, 0x32, // 0.53288167715072 + 0x36, 0x33, 0x31, 0x38, 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, 0x29, 0x2c, 0x20, 0x5f, 0x38, 0x35, // 6318359375), _85 + 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x39, 0x30, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x31, 0x31, 0x32, 0x34, // + (_90 * 2.1124 + 0x30, 0x31, 0x37, 0x32, 0x33, 0x38, 0x36, 0x31, 0x36, 0x39, 0x34, 0x33, 0x33, 0x35, 0x39, 0x33, // 0172386169433593 + 0x37, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, // 75)), vec3(0.0), + 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, // vec3(1.0)), 1.0 + 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, // ));. brea + 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, // k;. } while(f + 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // alse);.}... }; static const uint8_t cs_yuv_to_rgb_spv[2372] = { diff --git a/src/fs_clear0.bin.h b/src/fs_clear0.bin.h index 018345631..a44039fa6 100644 --- a/src/fs_clear0.bin.h +++ b/src/fs_clear0.bin.h @@ -1,26 +1,36 @@ -static const uint8_t fs_clear0_glsl[136] = +static const uint8_t fs_clear0_glsl[188] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x69, // .........Z...uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x62, // gl_FragColor = b - 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ - 0x30, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 0];.}... + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, // ..............un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // iform vec4 bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, // clear_color[8];. + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // .layout(location + 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // = 0) out vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, // gfx_FragColor;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // bgfx_FragColor + 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, // = bgfx_clear_co + 0x6c, 0x6f, 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lor[0];.}... }; -static const uint8_t fs_clear0_essl[136] = +static const uint8_t fs_clear0_essl[246] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x69, // .........Z...uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x62, // gl_FragColor = b + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x70, 0x72, 0x65, // .............pre + 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, // cision mediump f + 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, // loat;.precision + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, // highp int;..unif + 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // orm highp vec4 b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ - 0x30, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 0];.}... + 0x38, 0x5d, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // 8];..layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, // tion = 0) out hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, // ghp vec4 bgfx_Fr + 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // agColor;..void m + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // ain().{. bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, // _FragColor = bgf + 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x30, 0x5d, // x_clear_color[0] + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... }; static const uint8_t fs_clear0_spv[673] = { diff --git a/src/fs_clear1.bin.h b/src/fs_clear1.bin.h index 2127bd2db..abb1eff23 100644 --- a/src/fs_clear1.bin.h +++ b/src/fs_clear1.bin.h @@ -1,32 +1,42 @@ -static const uint8_t fs_clear1_glsl[178] = +static const uint8_t fs_clear1_glsl[236] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x69, // .............uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // gl_FragData[0] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[0];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[1] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, // ear_color[1];.}. - 0x0a, 0x00, // .. + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, // ..............un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // iform vec4 bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, // clear_color[8];. + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // .layout(location + 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // = 0) out vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x3b, // gfx_FragData[2]; + 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, // ..void main().{. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, // bgfx_FragDat + 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, // a[0] = bgfx_clea + 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // r_color[0];. + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, // bgfx_FragData[1] + 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, // = bgfx_clear_co + 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lor[1];.}... }; -static const uint8_t fs_clear1_essl[178] = +static const uint8_t fs_clear1_essl[294] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x69, // .............uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // gl_FragData[0] = + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x70, 0x72, 0x65, // .............pre + 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, // cision mediump f + 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, // loat;.precision + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, // highp int;..unif + 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // orm highp vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ + 0x38, 0x5d, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // 8];..layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, // tion = 0) out hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, // ghp vec4 bgfx_Fr + 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, // agData[2];..void + 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, // main().{. bg + 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // fx_FragData[0] = 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[0];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[1] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, // ear_color[1];.}. - 0x0a, 0x00, // .. + 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // r[0];. bgfx_F + 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, // ragData[1] = bgf + 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, // x_clear_color[1] + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... }; static const uint8_t fs_clear1_spv[801] = { diff --git a/src/fs_clear2.bin.h b/src/fs_clear2.bin.h index 36bc16935..783c8c921 100644 --- a/src/fs_clear2.bin.h +++ b/src/fs_clear2.bin.h @@ -1,36 +1,48 @@ -static const uint8_t fs_clear2_glsl[218] = +static const uint8_t fs_clear2_glsl[280] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x69, // .............uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // gl_FragData[0] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[0];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[1] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[1];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, // gl_FragData[2] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r[2];.}... + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, // ..............un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // iform vec4 bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, // clear_color[8];. + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // .layout(location + 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // = 0) out vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x3b, // gfx_FragData[3]; + 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, // ..void main().{. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, // bgfx_FragDat + 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, // a[0] = bgfx_clea + 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // r_color[0];. + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, // bgfx_FragData[1] + 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, // = bgfx_clear_co + 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // lor[1];. bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x62, // _FragData[2] = b + 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ + 0x32, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 2];.}... }; -static const uint8_t fs_clear2_essl[218] = +static const uint8_t fs_clear2_essl[338] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x69, // .............uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // gl_FragData[0] = + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0x70, 0x72, 0x65, // .........$...pre + 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, // cision mediump f + 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, // loat;.precision + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, // highp int;..unif + 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // orm highp vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ + 0x38, 0x5d, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // 8];..layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, // tion = 0) out hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, // ghp vec4 bgfx_Fr + 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, // agData[3];..void + 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, // main().{. bg + 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // fx_FragData[0] = 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[0];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[1] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[1];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, // gl_FragData[2] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r[2];.}... + 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // r[0];. bgfx_F + 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, // ragData[1] = bgf + 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, // x_clear_color[1] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // ;. bgfx_FragD + 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[2] = bgfx_cl + 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, // ear_color[2];.}. + 0x0a, 0x00, // .. }; static const uint8_t fs_clear2_spv[929] = { diff --git a/src/fs_clear3.bin.h b/src/fs_clear3.bin.h index bfed7c8b1..d91fae40f 100644 --- a/src/fs_clear3.bin.h +++ b/src/fs_clear3.bin.h @@ -1,42 +1,53 @@ -static const uint8_t fs_clear3_glsl[258] = +static const uint8_t fs_clear3_glsl[324] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x69, // .............uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // gl_FragData[0] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[0];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[1] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[1];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, // gl_FragData[2] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[2];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[3] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, // ear_color[3];.}. - 0x0a, 0x00, // .. + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, // ..............un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // iform vec4 bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, // clear_color[8];. + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // .layout(location + 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // = 0) out vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x34, 0x5d, 0x3b, // gfx_FragData[4]; + 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, // ..void main().{. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, // bgfx_FragDat + 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, // a[0] = bgfx_clea + 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // r_color[0];. + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, // bgfx_FragData[1] + 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, // = bgfx_clear_co + 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // lor[1];. bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x62, // _FragData[2] = b + 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ + 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // 2];. bgfx_Fra + 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // gData[3] = bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, // clear_color[3];. + 0x7d, 0x0a, 0x0a, 0x00, // }... }; -static const uint8_t fs_clear3_essl[258] = +static const uint8_t fs_clear3_essl[382] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x69, // .............uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // gl_FragData[0] = + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x70, 0x72, 0x65, // .........P...pre + 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, // cision mediump f + 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, // loat;.precision + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, // highp int;..unif + 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // orm highp vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ + 0x38, 0x5d, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // 8];..layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, // tion = 0) out hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, // ghp vec4 bgfx_Fr + 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, // agData[4];..void + 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, // main().{. bg + 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // fx_FragData[0] = 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[0];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[1] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[1];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, // gl_FragData[2] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[2];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[3] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, // ear_color[3];.}. - 0x0a, 0x00, // .. + 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // r[0];. bgfx_F + 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, // ragData[1] = bgf + 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, // x_clear_color[1] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // ;. bgfx_FragD + 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[2] = bgfx_cl + 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[2];. + 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, // bgfx_FragData[ + 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, // 3] = bgfx_clear_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // color[3];.}... }; static const uint8_t fs_clear3_spv[1057] = { diff --git a/src/fs_clear4.bin.h b/src/fs_clear4.bin.h index 4c485aa13..fbf2b8413 100644 --- a/src/fs_clear4.bin.h +++ b/src/fs_clear4.bin.h @@ -1,44 +1,56 @@ -static const uint8_t fs_clear4_glsl[298] = +static const uint8_t fs_clear4_glsl[368] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x69, // .............uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // gl_FragData[0] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[0];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[1] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[1];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, // gl_FragData[2] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[2];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[3] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[3];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, // gl_FragData[4] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r[4];.}... + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, // .........B....un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // iform vec4 bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, // clear_color[8];. + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // .layout(location + 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // = 0) out vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x35, 0x5d, 0x3b, // gfx_FragData[5]; + 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, // ..void main().{. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, // bgfx_FragDat + 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, // a[0] = bgfx_clea + 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // r_color[0];. + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, // bgfx_FragData[1] + 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, // = bgfx_clear_co + 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // lor[1];. bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x62, // _FragData[2] = b + 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ + 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // 2];. bgfx_Fra + 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // gData[3] = bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, // clear_color[3];. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, // bgfx_FragDat + 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, // a[4] = bgfx_clea + 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r_color[4];.}... }; -static const uint8_t fs_clear4_essl[298] = +static const uint8_t fs_clear4_essl[426] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x69, // .............uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // gl_FragData[0] = + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x70, 0x72, 0x65, // .........|...pre + 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, // cision mediump f + 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, // loat;.precision + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, // highp int;..unif + 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // orm highp vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ + 0x38, 0x5d, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // 8];..layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, // tion = 0) out hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, // ghp vec4 bgfx_Fr + 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x35, 0x5d, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, // agData[5];..void + 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, // main().{. bg + 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // fx_FragData[0] = 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[0];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[1] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[1];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, // gl_FragData[2] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[2];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[3] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[3];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, // gl_FragData[4] = + 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // r[0];. bgfx_F + 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, // ragData[1] = bgf + 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, // x_clear_color[1] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // ;. bgfx_FragD + 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[2] = bgfx_cl + 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[2];. + 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, // bgfx_FragData[ + 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, // 3] = bgfx_clear_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, // color[3];. bg + 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, // fx_FragData[4] = 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo 0x72, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r[4];.}... }; diff --git a/src/fs_clear5.bin.h b/src/fs_clear5.bin.h index c5aabd30b..1a967fe78 100644 --- a/src/fs_clear5.bin.h +++ b/src/fs_clear5.bin.h @@ -1,52 +1,64 @@ -static const uint8_t fs_clear5_glsl[338] = +static const uint8_t fs_clear5_glsl[412] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0x75, 0x6e, 0x69, // .........$...uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // gl_FragData[0] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[0];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[1] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[1];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, // gl_FragData[2] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[2];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[3] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[3];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, // gl_FragData[4] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[4];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[5] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x35, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, // ear_color[5];.}. - 0x0a, 0x00, // .. + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, // .........n....un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // iform vec4 bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, // clear_color[8];. + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // .layout(location + 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // = 0) out vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x36, 0x5d, 0x3b, // gfx_FragData[6]; + 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, // ..void main().{. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, // bgfx_FragDat + 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, // a[0] = bgfx_clea + 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // r_color[0];. + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, // bgfx_FragData[1] + 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, // = bgfx_clear_co + 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // lor[1];. bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x62, // _FragData[2] = b + 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ + 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // 2];. bgfx_Fra + 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // gData[3] = bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, // clear_color[3];. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, // bgfx_FragDat + 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, // a[4] = bgfx_clea + 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // r_color[4];. + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x35, 0x5d, // bgfx_FragData[5] + 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, // = bgfx_clear_co + 0x6c, 0x6f, 0x72, 0x5b, 0x35, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lor[5];.}... }; -static const uint8_t fs_clear5_essl[338] = +static const uint8_t fs_clear5_essl[470] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0x75, 0x6e, 0x69, // .........$...uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // gl_FragData[0] = + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00, 0x70, 0x72, 0x65, // .............pre + 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, // cision mediump f + 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, // loat;.precision + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, // highp int;..unif + 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // orm highp vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ + 0x38, 0x5d, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // 8];..layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, // tion = 0) out hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, // ghp vec4 bgfx_Fr + 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x36, 0x5d, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, // agData[6];..void + 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, // main().{. bg + 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // fx_FragData[0] = 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[0];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[1] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[1];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, // gl_FragData[2] = + 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // r[0];. bgfx_F + 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, // ragData[1] = bgf + 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, // x_clear_color[1] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // ;. bgfx_FragD + 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[2] = bgfx_cl + 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[2];. + 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, // bgfx_FragData[ + 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, // 3] = bgfx_clear_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, // color[3];. bg + 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, // fx_FragData[4] = 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[2];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[3] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[3];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, // gl_FragData[4] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[4];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[5] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x35, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, // ear_color[5];.}. - 0x0a, 0x00, // .. + 0x72, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // r[4];. bgfx_F + 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, // ragData[5] = bgf + 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x35, 0x5d, // x_clear_color[5] + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... }; static const uint8_t fs_clear5_spv[1313] = { diff --git a/src/fs_clear6.bin.h b/src/fs_clear6.bin.h index ebcb1b5df..011ae4a65 100644 --- a/src/fs_clear6.bin.h +++ b/src/fs_clear6.bin.h @@ -1,56 +1,70 @@ -static const uint8_t fs_clear6_glsl[378] = +static const uint8_t fs_clear6_glsl[456] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x75, 0x6e, 0x69, // .........L...uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // gl_FragData[0] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[0];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[1] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[1];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, // gl_FragData[2] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[2];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[3] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[3];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, // gl_FragData[4] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[4];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[5] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[5];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x36, 0x5d, 0x20, 0x3d, // gl_FragData[6] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x36, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r[6];.}... + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, // ..............un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // iform vec4 bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, // clear_color[8];. + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // .layout(location + 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // = 0) out vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x37, 0x5d, 0x3b, // gfx_FragData[7]; + 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, // ..void main().{. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, // bgfx_FragDat + 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, // a[0] = bgfx_clea + 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // r_color[0];. + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, // bgfx_FragData[1] + 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, // = bgfx_clear_co + 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // lor[1];. bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x62, // _FragData[2] = b + 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ + 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // 2];. bgfx_Fra + 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // gData[3] = bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, // clear_color[3];. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, // bgfx_FragDat + 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, // a[4] = bgfx_clea + 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // r_color[4];. + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x35, 0x5d, // bgfx_FragData[5] + 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, // = bgfx_clear_co + 0x6c, 0x6f, 0x72, 0x5b, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // lor[5];. bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x36, 0x5d, 0x20, 0x3d, 0x20, 0x62, // _FragData[6] = b + 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ + 0x36, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 6];.}... }; -static const uint8_t fs_clear6_essl[378] = +static const uint8_t fs_clear6_essl[514] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x75, 0x6e, 0x69, // .........L...uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // gl_FragData[0] = + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00, 0x70, 0x72, 0x65, // .............pre + 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, // cision mediump f + 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, // loat;.precision + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, // highp int;..unif + 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // orm highp vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ + 0x38, 0x5d, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // 8];..layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, // tion = 0) out hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, // ghp vec4 bgfx_Fr + 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x37, 0x5d, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, // agData[7];..void + 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, // main().{. bg + 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // fx_FragData[0] = 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[0];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[1] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[1];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, // gl_FragData[2] = + 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // r[0];. bgfx_F + 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, // ragData[1] = bgf + 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, // x_clear_color[1] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // ;. bgfx_FragD + 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[2] = bgfx_cl + 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[2];. + 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, // bgfx_FragData[ + 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, // 3] = bgfx_clear_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, // color[3];. bg + 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, // fx_FragData[4] = 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[2];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[3] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[3];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, // gl_FragData[4] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[4];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[5] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[5];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x36, 0x5d, 0x20, 0x3d, // gl_FragData[6] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x36, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r[6];.}... + 0x72, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // r[4];. bgfx_F + 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, // ragData[5] = bgf + 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x35, 0x5d, // x_clear_color[5] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // ;. bgfx_FragD + 0x61, 0x74, 0x61, 0x5b, 0x36, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[6] = bgfx_cl + 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x36, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, // ear_color[6];.}. + 0x0a, 0x00, // .. }; static const uint8_t fs_clear6_spv[1441] = { diff --git a/src/fs_clear7.bin.h b/src/fs_clear7.bin.h index e283a09db..9e0548114 100644 --- a/src/fs_clear7.bin.h +++ b/src/fs_clear7.bin.h @@ -1,62 +1,75 @@ -static const uint8_t fs_clear7_glsl[418] = +static const uint8_t fs_clear7_glsl[500] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0x75, 0x6e, 0x69, // .........t...uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // gl_FragData[0] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[0];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[1] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[1];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, // gl_FragData[2] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[2];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[3] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[3];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, // gl_FragData[4] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[4];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[5] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[5];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x36, 0x5d, 0x20, 0x3d, // gl_FragData[6] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[6];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x37, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[7] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x37, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, // ear_color[7];.}. - 0x0a, 0x00, // .. + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, // ..............un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // iform vec4 bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, // clear_color[8];. + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, // .layout(location + 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // = 0) out vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x38, 0x5d, 0x3b, // gfx_FragData[8]; + 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, // ..void main().{. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, // bgfx_FragDat + 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, // a[0] = bgfx_clea + 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // r_color[0];. + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, // bgfx_FragData[1] + 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, // = bgfx_clear_co + 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // lor[1];. bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x62, // _FragData[2] = b + 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ + 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // 2];. bgfx_Fra + 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // gData[3] = bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, // clear_color[3];. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, // bgfx_FragDat + 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, // a[4] = bgfx_clea + 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // r_color[4];. + 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x35, 0x5d, // bgfx_FragData[5] + 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, // = bgfx_clear_co + 0x6c, 0x6f, 0x72, 0x5b, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // lor[5];. bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x36, 0x5d, 0x20, 0x3d, 0x20, 0x62, // _FragData[6] = b + 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ + 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // 6];. bgfx_Fra + 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x37, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // gData[7] = bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x37, 0x5d, 0x3b, 0x0a, // clear_color[7];. + 0x7d, 0x0a, 0x0a, 0x00, // }... }; -static const uint8_t fs_clear7_essl[418] = +static const uint8_t fs_clear7_essl[558] = { 0x46, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // FSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x02, // gfx_clear_color. - 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0x75, 0x6e, 0x69, // .........t...uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, // form vec4 bgfx_c - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x76, // lear_color[8];.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // gl_FragData[0] = + 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x70, 0x72, 0x65, // .............pre + 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, // cision mediump f + 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, // loat;.precision + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, // highp int;..unif + 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, // orm highp vec4 b + 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, // gfx_clear_color[ + 0x38, 0x5d, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // 8];..layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, // tion = 0) out hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, // ghp vec4 bgfx_Fr + 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x38, 0x5d, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, // agData[8];..void + 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, // main().{. bg + 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x3d, // fx_FragData[0] = 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[0];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[1] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[1];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, // gl_FragData[2] = + 0x72, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // r[0];. bgfx_F + 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, // ragData[1] = bgf + 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x31, 0x5d, // x_clear_color[1] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // ;. bgfx_FragD + 0x61, 0x74, 0x61, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[2] = bgfx_cl + 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[2];. + 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, // bgfx_FragData[ + 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, // 3] = bgfx_clear_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, // color[3];. bg + 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, // fx_FragData[4] = 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[2];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[3] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[3];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x34, 0x5d, 0x20, 0x3d, // gl_FragData[4] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[4];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[5] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x35, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[5];. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x36, 0x5d, 0x20, 0x3d, // gl_FragData[6] = - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // bgfx_clear_colo - 0x72, 0x5b, 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // r[6];. gl_FragD - 0x61, 0x74, 0x61, 0x5b, 0x37, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[7] = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x37, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, // ear_color[7];.}. - 0x0a, 0x00, // .. + 0x72, 0x5b, 0x34, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // r[4];. bgfx_F + 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, // ragData[5] = bgf + 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x35, 0x5d, // x_clear_color[5] + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, // ;. bgfx_FragD + 0x61, 0x74, 0x61, 0x5b, 0x36, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ata[6] = bgfx_cl + 0x65, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x36, 0x5d, 0x3b, 0x0a, 0x20, 0x20, // ear_color[6];. + 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5b, // bgfx_FragData[ + 0x37, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, // 7] = bgfx_clear_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5b, 0x37, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // color[7];.}... }; static const uint8_t fs_clear7_spv[1569] = { diff --git a/src/fs_debugfont.bin.h b/src/fs_debugfont.bin.h index 441f221ef..f15900088 100644 --- a/src/fs_debugfont.bin.h +++ b/src/fs_debugfont.bin.h @@ -1,53 +1,64 @@ -static const uint8_t fs_debugfont_glsl[339] = +static const uint8_t fs_debugfont_glsl[398] = { 0x46, 0x53, 0x48, 0x0b, 0xb8, 0xbe, 0x22, 0x66, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x73, // FSH..."f.......s 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x2b, 0x01, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, // ...+...varying v - 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, // ec4 v_color0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // rying vec4 v_col - 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, // or1;.varying vec - 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, // 2 v_texcoord0;.u - 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, // niform sampler2D - 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, // s_texColor;.voi - 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, // d main ().{. ve - 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, // c4 tmpvar_1;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x76, // mpvar_1 = mix (v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x2c, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // _color1, v_color - 0x30, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x20, 0x28, 0x73, 0x5f, // 0, texture2D (s_ - 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // texColor, v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x2e, 0x78, 0x78, 0x78, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, // oord0).xxxx);. - 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, // if ((tmpvar_1.w - 0x3c, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x39, 0x32, 0x31, 0x35, 0x36, 0x39, 0x29, 0x29, 0x20, // < 0.003921569)) - 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x3b, 0x0a, 0x20, // {. discard;. - 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, // };. gl_FragCol - 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x7d, // or = tmpvar_1;.} - 0x0a, 0x0a, 0x00, // ... + 0x00, 0x00, 0x00, 0x66, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // ...f....uniform + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // sampler2D s_texC + 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, // olor;..in vec4 v + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, // _color1;.in vec4 + 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, // v_color0;.in ve + 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, // c2 v_texcoord0;. + 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, // layout(location + 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, // = 0) out vec4 bg + 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, // fx_FragColor;..v + 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, // oid main().{. + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, // vec4 _24 = text + 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, // ure(s_texColor, + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // v_texcoord0);. + 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, // vec4 _26 = mix + 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x2c, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // (v_color1, v_col + 0x6f, 0x72, 0x30, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x2e, 0x78, 0x78, 0x78, 0x78, 0x29, 0x3b, 0x0a, // or0, _24.xxxx);. + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x32, 0x36, 0x2e, 0x77, 0x20, 0x3c, 0x20, // if (_26.w < + 0x30, 0x2e, 0x30, 0x30, 0x33, 0x39, 0x32, 0x31, 0x35, 0x36, 0x38, 0x38, 0x35, 0x39, 0x33, 0x36, // 0.00392156885936 + 0x38, 0x35, 0x36, 0x32, 0x36, 0x39, 0x38, 0x33, 0x36, 0x34, 0x32, 0x35, 0x37, 0x38, 0x31, 0x32, // 8562698364257812 + 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 5). {. + 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // discard;. }. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, // bgfx_FragCol + 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // or = _26;.}... }; -static const uint8_t fs_debugfont_essl[362] = +static const uint8_t fs_debugfont_essl[486] = { 0x46, 0x53, 0x48, 0x0b, 0xb8, 0xbe, 0x22, 0x66, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x73, // FSH..."f.......s 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, // _texColor....... - 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // ...B...varying h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ighp vec4 v_colo - 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, // r0;.varying high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, // p vec4 v_color1; - 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // .varying highp v - 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, // ec2 v_texcoord0; - 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, // .uniform sampler - 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, // 2D s_texColor;.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // lowp vec4 tmpvar - 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, // _1;. tmpvar_1 = - 0x20, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x2c, 0x20, // mix (v_color1, - 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, // v_color0, textur - 0x65, 0x32, 0x44, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, // e2D (s_texColor, - 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x2e, 0x78, 0x78, // v_texcoord0).xx - 0x78, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, // xx);. if ((tmpv - 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x39, 0x32, // ar_1.w < 0.00392 - 0x31, 0x35, 0x36, 0x39, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, // 1569)) {. dis - 0x63, 0x61, 0x72, 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, // card;. };. gl_ - 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // FragColor = tmpv - 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ar_1;.}... + 0x00, 0x00, 0x00, 0xbe, 0x01, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, // .......precision + 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, // mediump float;. + 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // precision highp + 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, // int;..uniform hi + 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, // ghp sampler2D s_ + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, // texColor;..in hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ghp vec4 v_color + 0x31, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // 1;.in highp vec4 + 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, // v_color0;.in hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // ghp vec2 v_texco + 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, // ord0;.layout(loc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, // ation = 0) out h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // ighp vec4 bgfx_F + 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // ragColor;..void + 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, // main().{. hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x65, // hp vec4 _24 = te + 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // xture(s_texColor + 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x3b, 0x0a, // , v_texcoord0);. + 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, // highp vec4 _ + 0x32, 0x36, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // 26 = mix(v_color + 0x31, 0x2c, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2c, 0x20, 0x5f, 0x32, 0x34, // 1, v_color0, _24 + 0x2e, 0x78, 0x78, 0x78, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, // .xxxx);. if ( + 0x5f, 0x32, 0x36, 0x2e, 0x77, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x39, 0x32, 0x31, // _26.w < 0.003921 + 0x35, 0x36, 0x38, 0x38, 0x35, 0x39, 0x33, 0x36, 0x38, 0x35, 0x36, 0x32, 0x36, 0x39, 0x38, 0x33, // 5688593685626983 + 0x36, 0x34, 0x32, 0x35, 0x37, 0x38, 0x31, 0x32, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, // 642578125). { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, // . discard + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // ;. }. bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, // _FragColor = _26 + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... }; static const uint8_t fs_debugfont_spv[1095] = { diff --git a/src/glcontext_egl.cpp b/src/glcontext_egl.cpp index 6ac4f4a9d..c3710dab3 100644 --- a/src/glcontext_egl.cpp +++ b/src/glcontext_egl.cpp @@ -419,7 +419,7 @@ WL_EGL_IMPORT attrs[numAttrs++] = EGL_RENDERABLE_TYPE; attrs[numAttrs++] = !!BGFX_CONFIG_RENDERER_OPENGL ? EGL_OPENGL_BIT - : (glVersion >= 30) ? EGL_OPENGL_ES3_BIT_KHR : EGL_OPENGL_ES2_BIT + : EGL_OPENGL_ES3_BIT_KHR ; attrs[numAttrs++] = EGL_SURFACE_TYPE; diff --git a/src/glcontext_html5.cpp b/src/glcontext_html5.cpp index a160f454d..2689c6348 100644 --- a/src/glcontext_html5.cpp +++ b/src/glcontext_html5.cpp @@ -88,7 +88,7 @@ namespace bgfx { namespace gl { if (emscripten_webgl_get_context_attributes(context, &s_attrs) >= 0) { - import(s_attrs.majorVersion); + import(); m_primary = BX_NEW(g_allocator, SwapChainGL)(context, canvas); } else @@ -147,29 +147,22 @@ namespace bgfx { namespace gl BX_UNUSED(_width, _height); const char* canvas = (const char*)_nwh; - int32_t error = 0; - for (int version = 2; version >= 1; --version) + s_attrs.majorVersion = 2; + EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context = emscripten_webgl_create_context(canvas, &s_attrs); + + if (context > 0) { - s_attrs.majorVersion = version; - EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context = emscripten_webgl_create_context(canvas, &s_attrs); + EMSCRIPTEN_CHECK(emscripten_webgl_make_context_current(context) ); - if (context > 0) - { - EMSCRIPTEN_CHECK(emscripten_webgl_make_context_current(context) ); + SwapChainGL* swapChain = BX_NEW(g_allocator, SwapChainGL)(context, canvas); - SwapChainGL* swapChain = BX_NEW(g_allocator, SwapChainGL)(context, canvas); + import(); - import(version); - - return swapChain; - } - - error = (int32_t)context; + return swapChain; } - BX_TRACE("Failed to create WebGL context. (Canvas handle: '%s', last attempt error %d)", canvas, error); - BX_UNUSED(error); + BX_TRACE("Failed to create WebGL 2 context. (Canvas handle: '%s', error %d)", canvas, (int32_t)context); return NULL; } @@ -209,10 +202,10 @@ namespace bgfx { namespace gl } template - static Fn getProcAddress(int _version, const char* _name) + static Fn getProcAddress(const char* _name) { Fn func = reinterpret_cast(emscripten_webgl1_get_proc_address(_name) ); - if (NULL == func && _version >= 2) + if (NULL == func) { func = reinterpret_cast(emscripten_webgl2_get_proc_address(_name) ); } @@ -220,7 +213,7 @@ namespace bgfx { namespace gl return func; } - void GlContext::import(int _webGLVersion) + void GlContext::import() { BX_TRACE("Import:"); @@ -228,7 +221,7 @@ namespace bgfx { namespace gl { \ if (NULL == _func) \ { \ - _func = getProcAddress<_proto>(_webGLVersion, #_import); \ + _func = getProcAddress<_proto>(#_import); \ BX_TRACE("\t%p " #_func " (" #_import ")", _func); \ BGFX_FATAL(_optional || NULL != _func, Fatal::UnableToInitialize \ , "Failed to create WebGL/OpenGLES context. GetProcAddress(\"%s\")" \ diff --git a/src/glcontext_html5.h b/src/glcontext_html5.h index e390b0719..b5de2380c 100644 --- a/src/glcontext_html5.h +++ b/src/glcontext_html5.h @@ -31,7 +31,7 @@ namespace bgfx { namespace gl void swap(SwapChainGL* _swapChain = NULL); void makeCurrent(SwapChainGL* _swapChain = NULL); - void import(int webGLVersion); + void import(); bool isValid() const { diff --git a/src/glcontext_wgl.cpp b/src/glcontext_wgl.cpp index 18f785539..1ecdec8b8 100644 --- a/src/glcontext_wgl.cpp +++ b/src/glcontext_wgl.cpp @@ -271,17 +271,10 @@ namespace bgfx { namespace gl BX_UNUSED(flags); int32_t contextAttrs[9] = { -#if BGFX_CONFIG_RENDERER_OPENGL >= 31 WGL_CONTEXT_MAJOR_VERSION_ARB, BGFX_CONFIG_RENDERER_OPENGL / 10, WGL_CONTEXT_MINOR_VERSION_ARB, BGFX_CONFIG_RENDERER_OPENGL % 10, WGL_CONTEXT_FLAGS_ARB, flags, WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, -#else - WGL_CONTEXT_MAJOR_VERSION_ARB, 2, - WGL_CONTEXT_MINOR_VERSION_ARB, 1, - 0, 0, - 0, 0, -#endif // BGFX_CONFIG_RENDERER_OPENGL >= 31 0 }; diff --git a/src/glimports.h b/src/glimports.h index 271f33415..d1c440408 100644 --- a/src/glimports.h +++ b/src/glimports.h @@ -29,7 +29,6 @@ #define GL_IMPORT_KHR__(_optional, _proto, _func) GL_EXTENSION(_optional, _proto, _func, _func ## KHR) #define GL_IMPORT_NV___(_optional, _proto, _func) GL_EXTENSION(_optional, _proto, _func, _func ## NV) #define GL_IMPORT_OES__(_optional, _proto, _func) GL_EXTENSION(_optional, _proto, _func, _func ## OES) -#define GL_IMPORT_IMG__(_optional, _proto, _func) GL_EXTENSION(_optional, _proto, _func, _func ## IMG) #define GL_IMPORT_WEBGL(_optional, _proto, _func) GL_EXTENSION(_optional, _proto, _func, _func ## WEBGL) #define GL_IMPORT_____x(_optional, _proto, _func) GL_EXTENSION(_optional, _proto, _func, _func ## XXXXX) @@ -362,15 +361,13 @@ GL_IMPORT______(false, PFNGLGETSHADERINFOLOGPROC, glGetShaderIn GL_IMPORT______(false, PFNGLGETSTRINGPROC, glGetString); GL_IMPORT______(false, PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation); -#if BGFX_CONFIG_RENDERER_OPENGL || !(BGFX_CONFIG_RENDERER_OPENGLES < 30) GL_IMPORT______(true, PFNGLGETSTRINGIPROC, glGetStringi); GL_IMPORT______(true, PFNGLINVALIDATEFRAMEBUFFERPROC, glInvalidateFramebuffer); -#endif // !(BGFX_CONFIG_RENDERER_OPENGLES < 30) -#if !(BGFX_CONFIG_RENDERER_OPENGLES < 30) +#if BGFX_CONFIG_RENDERER_OPENGLES GL_IMPORT______(true, PFNGLTEXIMAGE2DMULTISAMPLEPROC, glTexImage2DMultisample); GL_IMPORT______(true, PFNGLTEXIMAGE3DMULTISAMPLEPROC, glTexImage3DMultisample); -#endif // !(BGFX_CONFIG_RENDERER_OPENGLES < 30) +#endif // BGFX_CONFIG_RENDERER_OPENGLES GL_IMPORT______(false, PFNGLLINKPROGRAMPROC, glLinkProgram); GL_IMPORT______(true, PFNGLMEMORYBARRIERPROC, glMemoryBarrier); @@ -492,9 +489,6 @@ GL_IMPORT______(true, PFNGLTEXIMAGE3DMULTISAMPLEPROC, glTexImage3DM # else // GLES GL_IMPORT______(false, PFNGLCLEARDEPTHFPROC, glClearDepthf); GL_IMPORT_EXT__(true, PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample); -# if (BGFX_CONFIG_RENDERER_OPENGLES < 30) -GL_IMPORT_IMG__(true, PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample); -# endif // BGFX_CONFIG_RENDERER_OPENGLES < 30 # endif // BGFX_CONFIG_RENDERER_OPENGL GL_IMPORT______(true, PFNGLINSERTEVENTMARKEREXTPROC, glInsertEventMarker); @@ -539,103 +533,7 @@ GL_IMPORT______(true, PFNGLVERTEXATTRIBDIVISORPROC, glVertexAttri GL_IMPORT______(true, PFNGLDRAWARRAYSINSTANCEDPROC, glDrawArraysInstancedNV); GL_IMPORT______(true, PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstancedNV); -# if BGFX_CONFIG_RENDERER_OPENGLES && BGFX_CONFIG_RENDERER_OPENGLES < 30 -GL_IMPORT______(true, PFNGLGETSTRINGIPROC, glGetStringi); - -GL_IMPORT_OES__(true, PFNGLTEXIMAGE3DPROC, glTexImage3D); -GL_IMPORT_OES__(true, PFNGLTEXSUBIMAGE3DPROC, glTexSubImage3D); -GL_IMPORT_OES__(true, PFNGLCOMPRESSEDTEXIMAGE3DPROC, glCompressedTexImage3D); -GL_IMPORT_OES__(true, PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC, glCompressedTexSubImage3D); - -GL_IMPORT_EXT__(true, PFNGLTEXSTORAGE2DPROC, glTexStorage2D); -GL_IMPORT_EXT__(true, PFNGLTEXSTORAGE3DPROC, glTexStorage3D); -GL_IMPORT_EXT__(true, PFNGLCLEARTEXSUBIMAGEPROC, glClearTexSubImage); -GL_IMPORT_EXT__(true, PFNGLTEXTUREVIEWPROC, glTextureView); -GL_IMPORT______(true, PFNGLTEXIMAGE2DMULTISAMPLEPROC, glTexImage2DMultisample); - -GL_IMPORT_EXT__(true, PFNGLFRAMEBUFFERTEXTUREPROC, glFramebufferTexture); -GL_IMPORT_EXT__(true, PFNGLFRAMEBUFFERTEXTURELAYERPROC, glFramebufferTextureLayer); - -GL_IMPORT_EXT__(true, PFNGLINSERTEVENTMARKEREXTPROC, glInsertEventMarker); -GL_IMPORT_ARB__(true, PFNGLPROVOKINGVERTEXPROC, glProvokingVertex); -GL_IMPORT_ARB__(true, PFNGLPUSHDEBUGGROUPPROC, glPushDebugGroup); -GL_IMPORT_ARB__(true, PFNGLPOPDEBUGGROUPPROC, glPopDebugGroup); -GL_IMPORT_EXT__(true, PFNGLPUSHGROUPMARKEREXTPROC, glPushGroupMarker); -GL_IMPORT_EXT__(true, PFNGLPOPGROUPMARKEREXTPROC, glPopGroupMarker); -GL_IMPORT_EXT__(true, PFNGLOBJECTLABELPROC, glObjectLabel); - -GL_IMPORT_EXT__(true, PFNGLDRAWARRAYSINDIRECTPROC, glDrawArraysIndirect); -GL_IMPORT_EXT__(true, PFNGLDRAWELEMENTSINDIRECTPROC, glDrawElementsIndirect); -GL_IMPORT_EXT__(true, PFNGLMULTIDRAWARRAYSINDIRECTPROC, glMultiDrawArraysIndirect); -GL_IMPORT_EXT__(true, PFNGLMULTIDRAWELEMENTSINDIRECTPROC, glMultiDrawElementsIndirect); -GL_IMPORT_EXT__(true, PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC, glMultiDrawArraysIndirectCount); -GL_IMPORT_EXT__(true, PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC, glMultiDrawElementsIndirectCount); - -GL_IMPORT_OES__(true, PFNGLGETPROGRAMBINARYPROC, glGetProgramBinary); -GL_IMPORT_OES__(true, PFNGLPROGRAMBINARYPROC, glProgramBinary); - -#if BX_PLATFORM_EMSCRIPTEN -GL_IMPORT_ANGLE(true, PFNGLVERTEXATTRIBDIVISORPROC, glVertexAttribDivisor); -GL_IMPORT_ANGLE(true, PFNGLDRAWARRAYSINSTANCEDPROC, glDrawArraysInstanced); -GL_IMPORT_ANGLE(true, PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstanced); -#else -GL_IMPORT_OES__(true, PFNGLVERTEXATTRIBDIVISORPROC, glVertexAttribDivisor); -GL_IMPORT_OES__(true, PFNGLDRAWARRAYSINSTANCEDPROC, glDrawArraysInstanced); -GL_IMPORT_OES__(true, PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstanced); -#endif // BX_PLATFORM_EMSCRIPTEN - -GL_IMPORT_OES__(true, PFNGLBINDVERTEXARRAYPROC, glBindVertexArray); -GL_IMPORT_OES__(true, PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays); -GL_IMPORT_OES__(true, PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays); - -GL_IMPORT_____x(true, PFNGLCLIPCONTROLPROC, glClipControl); -GL_IMPORT_____x(true, PFNGLENABLEIPROC, glEnablei); -GL_IMPORT_____x(true, PFNGLDISABLEIPROC, glDisablei); -GL_IMPORT_____x(true, PFNGLBLENDEQUATIONIPROC, glBlendEquationi); -GL_IMPORT_____x(true, PFNGLBLENDEQUATIONSEPARATEIPROC, glBlendEquationSeparatei); -GL_IMPORT_____x(true, PFNGLBLENDFUNCIPROC, glBlendFunci); -GL_IMPORT_____x(true, PFNGLBLENDFUNCSEPARATEIPROC, glBlendFuncSeparatei); - -#if !BGFX_USE_GL_DYNAMIC_LIB -GL_IMPORT______(true, PFNGLDRAWBUFFERPROC, glDrawBuffer); -GL_IMPORT______(true, PFNGLREADBUFFERPROC, glReadBuffer); -GL_IMPORT______(true, PFNGLGENSAMPLERSPROC, glGenSamplers); -GL_IMPORT______(true, PFNGLDELETESAMPLERSPROC, glDeleteSamplers); -GL_IMPORT______(true, PFNGLBINDSAMPLERPROC, glBindSampler); -GL_IMPORT______(true, PFNGLSAMPLERPARAMETERFPROC, glSamplerParameterf); -GL_IMPORT______(true, PFNGLSAMPLERPARAMETERIPROC, glSamplerParameteri); -GL_IMPORT______(true, PFNGLSAMPLERPARAMETERFVPROC, glSamplerParameterfv); -#endif // !BGFX_USE_GL_DYNAMIC_LIB - -GL_IMPORT_____x(true, PFNGLBINDBUFFERBASEPROC, glBindBufferBase); -GL_IMPORT_____x(true, PFNGLBINDBUFFERRANGEPROC, glBindBufferRange); -GL_IMPORT_____x(true, PFNGLBINDIMAGETEXTUREPROC, glBindImageTexture); -GL_IMPORT_____x(true, PFNGLGETPROGRAMINTERFACEIVPROC, glGetProgramInterfaceiv); -GL_IMPORT_____x(true, PFNGLGETPROGRAMRESOURCEINDEXPROC, glGetProgramResourceIndex); -GL_IMPORT_____x(true, PFNGLGETPROGRAMRESOURCEIVPROC, glGetProgramResourceiv); -GL_IMPORT_____x(true, PFNGLGETPROGRAMRESOURCENAMEPROC, glGetProgramResourceName); -GL_IMPORT_____x(true, PFNGLGETPROGRAMRESOURCELOCATIONPROC, glGetProgramResourceLocation); -GL_IMPORT_____x(true, PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC, glGetProgramResourceLocationIndex); -GL_IMPORT_____x(true, PFNGLMEMORYBARRIERPROC, glMemoryBarrier); -GL_IMPORT_____x(true, PFNGLDISPATCHCOMPUTEPROC, glDispatchCompute); -GL_IMPORT_____x(true, PFNGLDISPATCHCOMPUTEINDIRECTPROC, glDispatchComputeIndirect); - -#if BX_PLATFORM_EMSCRIPTEN -GL_IMPORT_WEBGL(true, PFNGLDRAWBUFFERSPROC, glDrawBuffers); -#else -GL_IMPORT_NV___(true, PFNGLDRAWBUFFERSPROC, glDrawBuffers); -#endif -GL_IMPORT_NV___(true, PFNGLGENQUERIESPROC, glGenQueries); -GL_IMPORT_NV___(true, PFNGLDELETEQUERIESPROC, glDeleteQueries); -GL_IMPORT_NV___(true, PFNGLBEGINQUERYPROC, glBeginQuery); -GL_IMPORT_NV___(true, PFNGLENDQUERYPROC, glEndQuery); -GL_IMPORT_NV___(true, PFNGLGETQUERYOBJECTIVPROC, glGetQueryObjectiv); -GL_IMPORT_NV___(true, PFNGLGETQUERYOBJECTUI64VPROC, glGetQueryObjectui64v); -GL_IMPORT_NV___(true, PFNGLQUERYCOUNTERPROC, glQueryCounter); - -GL_IMPORT (true, PFNGLINVALIDATEFRAMEBUFFERPROC, glInvalidateFramebuffer, glDiscardFramebufferEXT); - -# elif !BGFX_USE_GL_DYNAMIC_LIB +# if !BGFX_USE_GL_DYNAMIC_LIB GL_IMPORT______(true, PFNGLCLIPCONTROLPROC, glClipControl); GL_IMPORT______(true, PFNGLGETSTRINGIPROC, glGetStringi); @@ -712,6 +610,7 @@ GL_IMPORT______(true, PFNGLDELETEQUERIESPROC, glDeleteQueri GL_IMPORT______(true, PFNGLBEGINQUERYPROC, glBeginQuery); GL_IMPORT______(true, PFNGLENDQUERYPROC, glEndQuery); GL_IMPORT______(true, PFNGLGETQUERYOBJECTIVPROC, glGetQueryObjectiv); +GL_IMPORT______(true, PFNGLGETQUERYOBJECTUIVPROC, glGetQueryObjectuiv); GL_IMPORT______(true, PFNGLGETQUERYOBJECTUI64VPROC, glGetQueryObjectui64v); GL_IMPORT______(true, PFNGLQUERYCOUNTERPROC, glQueryCounter); @@ -724,7 +623,7 @@ GL_IMPORT______(true, PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC, glMultiDrawEl GL_IMPORT______(true, PFNGLINVALIDATEFRAMEBUFFERPROC, glInvalidateFramebuffer); -# endif // BGFX_CONFIG_RENDERER_OPENGLES && BGFX_CONFIG_RENDERER_OPENGLES < 30 +# endif // !BGFX_USE_GL_DYNAMIC_LIB #endif // !BGFX_CONFIG_RENDERER_OPENGL #undef GL_IMPORT_TYPEDEFS @@ -736,5 +635,4 @@ GL_IMPORT______(true, PFNGLINVALIDATEFRAMEBUFFERPROC, glInvalidateF #undef GL_IMPORT_KHR__ #undef GL_IMPORT_NV___ #undef GL_IMPORT_OES__ -#undef GL_IMPORT_IMG__ #undef GL_IMPORT_____x diff --git a/src/makefile b/src/makefile index 8c8ccbd27..43723bb37 100644 --- a/src/makefile +++ b/src/makefile @@ -30,9 +30,9 @@ all: $(BIN) define shader-embedded @echo [$(<)] - $(SILENT) $(SHADERC) --type $(1) --platform linux -p 120 -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_glsl + $(SILENT) $(SHADERC) --type $(1) --platform linux -p 430 -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_glsl @cat "$(SHADER_TMP)" > $(@) - -$(SILENT) $(SHADERC) --type $(1) --platform android -p 100_es -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_essl + -$(SILENT) $(SHADERC) --type $(1) --platform android -p 300_es -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_essl -@cat "$(SHADER_TMP)" >> $(@) -$(SILENT) $(SHADERC) --type $(1) --platform linux -p spirv -f $(<) -o "$(SHADER_TMP)" --bin2c $(basename $(<))_spv -@cat "$(SHADER_TMP)" >> $(@) diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index e8a3a23e7..658026d74 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -216,19 +216,11 @@ namespace bgfx { namespace gl }; // In desktop OpenGL 4+ and OpenGL ES 3.0+, specific GL formats GL_x_INTEGER are used for integer textures. -// For older desktop OpenGL contexts, GL names without _INTEGER suffix were used. -// See http://docs.gl/gl4/glTexImage2D, http://docs.gl/gl3/glTexImage2D, http://docs.gl/es3/glTexImage2D -#if BGFX_CONFIG_RENDERER_OPENGL >= 40 || BGFX_CONFIG_RENDERER_OPENGLES -# define RED_INTEGER GL_RED_INTEGER -# define RG_INTEGER GL_RG_INTEGER -# define RGB_INTEGER GL_RGB_INTEGER -# define RGBA_INTEGER GL_RGBA_INTEGER -#else -# define RED_INTEGER GL_RED -# define RG_INTEGER GL_RG -# define RGB_INTEGER GL_RGB -# define RGBA_INTEGER GL_RGBA -#endif +// See http://docs.gl/gl4/glTexImage2D, http://docs.gl/es3/glTexImage2D +#define RED_INTEGER GL_RED_INTEGER +#define RG_INTEGER GL_RG_INTEGER +#define RGB_INTEGER GL_RGB_INTEGER +#define RGBA_INTEGER GL_RGBA_INTEGER static TextureFormatInfo s_textureFormat[] = { @@ -888,31 +880,31 @@ namespace bgfx { namespace gl { "EXT_blend_color", BGFX_CONFIG_RENDERER_OPENGL >= 31, true }, { "EXT_blend_minmax", BGFX_CONFIG_RENDERER_OPENGL >= 14, true }, { "EXT_blend_subtract", BGFX_CONFIG_RENDERER_OPENGL >= 14, true }, - { "EXT_color_buffer_half_float", false, true }, // GLES2 extension. - { "EXT_color_buffer_float", false, true }, // GLES2 extension. - { "EXT_copy_image", false, true }, // GLES2 extension. - { "EXT_compressed_ETC1_RGB8_sub_texture", false, true }, // GLES2 extension. + { "EXT_color_buffer_half_float", false, true }, // GLES extension. + { "EXT_color_buffer_float", false, true }, // GLES extension. + { "EXT_copy_image", false, true }, // GLES extension. + { "EXT_compressed_ETC1_RGB8_sub_texture", false, true }, // GLES extension. { "EXT_debug_label", false, true }, { "EXT_debug_marker", false, true }, { "EXT_debug_tool", false, true }, // RenderDoc extension. - { "EXT_discard_framebuffer", false, true }, // GLES2 extension. - { "EXT_disjoint_timer_query", false, true }, // GLES2 extension. - { "EXT_draw_buffers", false, true }, // GLES2 extension. - { "EXT_draw_instanced", false, true }, // GLES2 extension. - { "EXT_instanced_arrays", false, true }, // GLES2 extension. - { "EXT_frag_depth", false, true }, // GLES2 extension. + { "EXT_discard_framebuffer", false, true }, // GLES extension. + { "EXT_disjoint_timer_query", false, true }, // GLES extension. + { "EXT_draw_buffers", false, true }, // GLES extension. + { "EXT_draw_instanced", false, true }, // GLES extension. + { "EXT_instanced_arrays", false, true }, // GLES extension. + { "EXT_frag_depth", false, true }, // GLES extension. { "EXT_framebuffer_blit", BGFX_CONFIG_RENDERER_OPENGL >= 30, true }, { "EXT_framebuffer_object", BGFX_CONFIG_RENDERER_OPENGL >= 30, true }, { "EXT_framebuffer_sRGB", BGFX_CONFIG_RENDERER_OPENGL >= 30, true }, { "EXT_gpu_shader4", BGFX_CONFIG_RENDERER_OPENGL >= 31, true }, { "EXT_multi_draw_indirect", false, true }, // GLES3.1 extension. - { "EXT_occlusion_query_boolean", false, true }, // GLES2 extension. + { "EXT_occlusion_query_boolean", false, true }, // GLES extension. { "EXT_packed_float", BGFX_CONFIG_RENDERER_OPENGL >= 33, true }, { "EXT_read_format_bgra", false, true }, { "EXT_shader_image_load_store", false, true }, - { "EXT_shader_texture_lod", false, true }, // GLES2 extension. + { "EXT_shader_texture_lod", false, true }, // GLES extension. { "EXT_shadow_samplers", false, true }, - { "EXT_sRGB_write_control", false, true }, // GLES2 extension. + { "EXT_sRGB_write_control", false, true }, // GLES extension. { "EXT_texture_array", BGFX_CONFIG_RENDERER_OPENGL >= 30, true }, { "EXT_texture_compression_dxt1", false, true }, { "EXT_texture_compression_latc", false, true }, @@ -921,7 +913,7 @@ namespace bgfx { namespace gl { "EXT_texture_cube_map_array", false, true }, // GLES3.1 extension. { "EXT_texture_filter_anisotropic", false, true }, { "EXT_texture_format_BGRA8888", false, true }, - { "EXT_texture_rg", false, true }, // GLES2 extension. + { "EXT_texture_rg", false, true }, // GLES extension. { "EXT_texture_shared_exponent", false, true }, { "EXT_texture_snorm", BGFX_CONFIG_RENDERER_OPENGL >= 30, true }, { "EXT_texture_sRGB", false, true }, @@ -931,8 +923,8 @@ namespace bgfx { namespace gl { "EXT_texture_type_2_10_10_10_REV", false, true }, { "EXT_timer_query", BGFX_CONFIG_RENDERER_OPENGL >= 33, true }, { "EXT_unpack_subimage", false, true }, - { "EXT_sRGB", false, true }, // GLES2 extension. - { "EXT_multisampled_render_to_texture", false, true }, // GLES2 extension. + { "EXT_sRGB", false, true }, // GLES extension. + { "EXT_multisampled_render_to_texture", false, true }, // GLES extension. { "GOOGLE_depth_texture", false, true }, @@ -953,11 +945,11 @@ namespace bgfx { namespace gl { "NV_conservative_raster", false, true }, { "NV_copy_image", false, true }, - { "NV_draw_buffers", false, true }, // GLES2 extension. - { "NV_draw_instanced", false, true }, // GLES2 extension. - { "NV_instanced_arrays", false, true }, // GLES2 extension. + { "NV_draw_buffers", false, true }, // GLES extension. + { "NV_draw_instanced", false, true }, // GLES extension. + { "NV_instanced_arrays", false, true }, // GLES extension. { "NV_occlusion_query", false, true }, - { "NV_texture_border_clamp", false, true }, // GLES2 extension. + { "NV_texture_border_clamp", false, true }, // GLES extension. { "NVX_gpu_memory_info", false, true }, { "OES_copy_image", false, true }, @@ -1000,151 +992,6 @@ namespace bgfx { namespace gl }; static_assert(Extension::Count == BX_COUNTOF(s_extension) ); - static const char* s_ARB_shader_texture_lod[] = - { - "texture2DLod", - "texture2DArrayLod", // BK - interacts with ARB_texture_array. - "texture2DProjLod", - "texture2DGrad", - "texture2DProjGrad", - "texture3DLod", - "texture3DProjLod", - "texture3DGrad", - "texture3DProjGrad", - "textureCubeLod", - "textureCubeGrad", - "shadow2DLod", - "shadow2DProjLod", - NULL - // "texture1DLod", - // "texture1DProjLod", - // "shadow1DLod", - // "shadow1DProjLod", - }; - - static const char* s_EXT_shader_texture_lod[] = - { - "texture2DLod", - "texture2DProjLod", - "textureCubeLod", - "texture2DGrad", - "texture2DProjGrad", - "textureCubeGrad", - NULL - }; - - static const char* s_ARB_shader_viewport_layer_array[] = - { - "gl_ViewportIndex", - "gl_Layer", - NULL - }; - - static const char* s_EXT_shadow_samplers[] = - { - "shadow2D", - "shadow2DProj", - NULL - }; - - static const char* s_OES_standard_derivatives[] = - { - "dFdx", - "dFdy", - "fwidth", - NULL - }; - - static const char* s_uisamplers[] = - { - "isampler2D", - "usampler2D", - "isampler3D", - "usampler3D", - "isamplerCube", - "usamplerCube", - NULL - }; - - static const char* s_uint[] = - { - "uint", - "uvec2", - "uvec3", - "uvec4", - NULL - }; - - static const char* s_texelFetch[] = - { - "texture", - "textureLod", - "textureGrad", - "textureProj", - "textureProjLod", - "texelFetch", - "texelFetchOffset", - NULL - }; - - static const char* s_texture3D[] = - { - "sampler3D", - "sampler3DArray", - NULL - }; - - static const char* s_textureArray[] = - { - "sampler2DArray", - "sampler2DMSArray", - "samplerCubeArray", - "sampler2DArrayShadow", - NULL - }; - - static const char* s_ARB_texture_multisample[] = - { - "sampler2DMS", - "isampler2DMS", - "usampler2DMS", - NULL - }; - - static const char* s_EXT_gpu_shader4[] = - { - "gl_VertexID", - "gl_InstanceID", - "uint", - NULL - }; - - static const char* s_ARB_gpu_shader5[] = - { - "bitfieldReverse", - "floatBitsToInt", - "floatBitsToUint", - "intBitsToFloat", - "uintBitsToFloat", - NULL - }; - - static const char* s_ARB_shading_language_packing[] = - { - "packHalf2x16", - "unpackHalf2x16", - NULL - }; - - static const char* s_intepolationQualifier[] = - { - "flat", - "smooth", - "noperspective", - "centroid", - NULL - }; - static void GL_APIENTRY stubVertexAttribDivisor(GLuint /*_index*/, GLuint /*_divisor*/) { } @@ -1743,11 +1590,6 @@ namespace bgfx { namespace gl // console; instead examine the supported texture formats from the spec. EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx = emscripten_webgl_get_current_context(); - EmscriptenWebGLContextAttributes attrs; - EMSCRIPTEN_CHECK(emscripten_webgl_get_context_attributes(ctx, &attrs) ); - - const int glesVersion = attrs.majorVersion + 1; - switch(_format) { case TextureFormat::A8: @@ -1758,11 +1600,10 @@ namespace bgfx { namespace gl case TextureFormat::RGBA4: case TextureFormat::BGR5A1: case TextureFormat::RGB5A1: - // GLES2 formats without sRGB. return !_srgb; case TextureFormat::D16: - // GLES2 formats without sRGB, depth textures do not support mipmaps. + // Depth textures do not support mipmaps. return !_srgb && !_mipAutogen ; @@ -1774,10 +1615,7 @@ namespace bgfx { namespace gl case TextureFormat::RG32F: case TextureFormat::RGB10A2: case TextureFormat::RG11B10F: - // GLES3 formats without sRGB - return !_srgb - && glesVersion >= 3 - ; + return !_srgb; case TextureFormat::R8I: case TextureFormat::R8U: @@ -1805,41 +1643,33 @@ namespace bgfx { namespace gl case TextureFormat::RGB8S: case TextureFormat::RGBA8S: case TextureFormat::RGB9E5F: - // GLES3 formats without sRGB that are not texture filterable or color renderable. - return !_srgb && glesVersion >= 3 + // Not texture filterable or color renderable. + return !_srgb && !_mipAutogen ; case TextureFormat::D24: case TextureFormat::D24S8: case TextureFormat::D32: - // GLES3 formats without sRGB, depth textures do not support mipmaps. - return !_srgb && !_mipAutogen - && (glesVersion >= 3 || emscripten_webgl_enable_extension(ctx, "WEBGL_depth_texture") ) + // Depth textures do not support mipmaps. + return !_srgb + && !_mipAutogen ; case TextureFormat::D16F: case TextureFormat::D24F: - // GLES3 depth formats without sRGB, depth textures do not support mipmaps. + // Depth textures do not support mipmaps. return !_srgb && !_mipAutogen - && glesVersion >= 3 ; case TextureFormat::RGBA16F: case TextureFormat::RGBA32F: - // GLES3 formats without sRGB - return !_srgb - && (glesVersion >= 3 || emscripten_webgl_enable_extension(ctx, "OES_texture_half_float") ) - ; + return !_srgb; case TextureFormat::RGB8: case TextureFormat::RGBA8: - // sRGB formats - return !_srgb - || glesVersion >= 3 - || emscripten_webgl_enable_extension(ctx, "EXT_sRGB") - ; + return true; case TextureFormat::BC1: case TextureFormat::BC2: @@ -1999,14 +1829,8 @@ namespace bgfx { namespace gl // Avoid creating test textures for WebGL, that causes error noise in the browser console; instead examine the supported texture formats from the spec. EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx = emscripten_webgl_get_current_context(); - EmscriptenWebGLContextAttributes attrs; - EMSCRIPTEN_CHECK(emscripten_webgl_get_context_attributes(ctx, &attrs) ); - - const int glesVersion = attrs.majorVersion + 1; - switch(_format) { - // GLES2 textures case TextureFormat::B5G6R5: case TextureFormat::R5G6B5: case TextureFormat::BGRA4: @@ -2016,20 +1840,17 @@ namespace bgfx { namespace gl case TextureFormat::D16: return !_srgb; - // GLES2 renderbuffers not a texture in GLES3 + // Renderbuffer only. case TextureFormat::D0S8: return !_srgb && _writeOnly ; - // GLES2 textures that are not renderbuffers case TextureFormat::RGB8: case TextureFormat::RGBA8: - return !_srgb - && (!_writeOnly || glesVersion >= 3) - ; + return !_srgb; - // GLES3 EXT_color_buffer_float renderbuffer formats + // EXT_color_buffer_float renderbuffer formats case TextureFormat::R16F: case TextureFormat::RG16F: case TextureFormat::R32F: @@ -2040,9 +1861,8 @@ namespace bgfx { namespace gl return emscripten_webgl_enable_extension(ctx, "EXT_color_buffer_float"); } - return !_srgb && glesVersion >= 3; + return !_srgb; - // GLES2 float extension: case TextureFormat::RGBA16F: if (_writeOnly && emscripten_webgl_enable_extension(ctx, "EXT_color_buffer_half_float") ) { @@ -2056,26 +1876,17 @@ namespace bgfx { namespace gl return emscripten_webgl_enable_extension(ctx, "EXT_color_buffer_float") || emscripten_webgl_enable_extension(ctx, "WEBGL_color_buffer_float"); } - // GLES3 formats without sRGB - return !_srgb - && (glesVersion >= 3 || emscripten_webgl_enable_extension(ctx, "OES_texture_half_float") ) - ; + return !_srgb; case TextureFormat::D24: case TextureFormat::D24S8: - // GLES3 formats without sRGB, depth textures do not support mipmaps. - return !_srgb - && (glesVersion >= 3 || (!_writeOnly && emscripten_webgl_enable_extension(ctx, "WEBGL_depth_texture") ) ) - ; + return !_srgb; case TextureFormat::D32: - // GLES3 formats without sRGB, depth textures do not support mipmaps. return !_srgb && !_writeOnly - && (glesVersion >= 3 || emscripten_webgl_enable_extension(ctx, "WEBGL_depth_texture") ) ; - // GLES3 textures case TextureFormat::R8: case TextureFormat::RG8: case TextureFormat::R8I: @@ -2100,14 +1911,11 @@ namespace bgfx { namespace gl case TextureFormat::D16F: case TextureFormat::D24F: case TextureFormat::D32F: - return !_srgb - && glesVersion >= 3 - ; + return !_srgb; case TextureFormat::BGRA8: return !_srgb && _writeOnly - && glesVersion >= 3 ; default: @@ -2331,12 +2139,10 @@ namespace bgfx { namespace gl , m_readBackFboSupported(false) , m_vaoSupport(false) , m_samplerObjectSupport(false) - , m_shadowSamplersSupport(false) , m_srgbWriteControlSupport(BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) ) , m_borderColorSupport(BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) ) , m_programBinarySupport(false) , m_textureSwizzleSupport(false) - , m_depthTextureSupport(false) , m_timerQuerySupport(false) , m_occlusionQuerySupport(false) , m_atocSupport(false) @@ -2387,32 +2193,6 @@ namespace bgfx { namespace gl m_version = getGLString(GL_VERSION); m_glslVersion = getGLString(GL_SHADING_LANGUAGE_VERSION); - { - if (BX_ENABLED(BX_PLATFORM_EMSCRIPTEN) ) - { - int32_t majorGlVersion = 0; - int32_t minorGlVersion = 0; - const char* version = m_version; - - while (*version && !bx::isNumeric(*version) ) - { - ++version; - } - - bx::fromString(&majorGlVersion, version); - bx::fromString(&minorGlVersion, version + 2); - int32_t glVersion = majorGlVersion*10 + minorGlVersion; - - BX_TRACE("WebGL context version %d (%d.%d).", glVersion, majorGlVersion, minorGlVersion); - - m_gles3 = glVersion >= 30; - } - else - { - m_gles3 = BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 30); - } - } - for (uint32_t ii = 0; ii < BX_COUNTOF(s_vendorIds); ++ii) { const VendorId& vendorId = s_vendorIds[ii]; @@ -2458,15 +2238,9 @@ namespace bgfx { namespace gl { #define GL_GET(_pname, _min) BX_TRACE(" " #_pname " %d (min: %d)", glGet(_pname), _min) BX_TRACE("Defaults:"); -#if BGFX_CONFIG_RENDERER_OPENGL >= 41 || BGFX_CONFIG_RENDERER_OPENGLES GL_GET(GL_MAX_FRAGMENT_UNIFORM_VECTORS, 16); GL_GET(GL_MAX_VERTEX_UNIFORM_VECTORS, 128); GL_GET(GL_MAX_VARYING_VECTORS, 8); -#else - GL_GET(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, 16 * 4); - GL_GET(GL_MAX_VERTEX_UNIFORM_COMPONENTS, 128 * 4); - GL_GET(GL_MAX_VARYING_FLOATS, 8 * 4); -#endif // BGFX_CONFIG_RENDERER_OPENGL >= 41 || BGFX_CONFIG_RENDERER_OPENGLES GL_GET(GL_MAX_VERTEX_ATTRIBS, 8); GL_GET(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, 8); GL_GET(GL_MAX_CUBE_MAP_TEXTURE_SIZE, 16); @@ -2621,7 +2395,7 @@ namespace bgfx { namespace gl ; s_textureFormat[TextureFormat::ETC1].m_supported |= etc1Supported; - bool etc2Supported = !!(BGFX_CONFIG_RENDERER_OPENGLES >= 30) + bool etc2Supported = !!(BGFX_CONFIG_RENDERER_OPENGLES) || s_extension[Extension::ARB_ES3_compatibility].m_supported ; s_textureFormat[TextureFormat::ETC2 ].m_supported |= etc2Supported; @@ -2652,55 +2426,9 @@ namespace bgfx { namespace gl if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) ) { - if (m_gles3) - { - setTextureFormat(TextureFormat::R16F, GL_R16F, GL_RED, 0x140B /* == GL_HALF_FLOAT, but bgfx overwrites it globally with GL_HALF_FLOAT_OES */); - setTextureFormat(TextureFormat::RG16F, GL_RG16F, GL_RG, 0x140B /* == GL_HALF_FLOAT, but bgfx overwrites it globally with GL_HALF_FLOAT_OES */); - setTextureFormat(TextureFormat::RGBA16F, GL_RGBA16F, GL_RGBA, 0x140B /* == GL_HALF_FLOAT, but bgfx overwrites it globally with GL_HALF_FLOAT_OES */); - } - else - { - setTextureFormat(TextureFormat::RGBA16F, GL_RGBA, GL_RGBA, GL_HALF_FLOAT); // Note: this is actually GL_HALF_FLOAT_OES and not GL_HALF_FLOAT if compiling for GLES target. - setTextureFormat(TextureFormat::RGBA32F, GL_RGBA, GL_RGBA, GL_FLOAT); - // internalFormat and format must match: - // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml - setTextureFormat(TextureFormat::RGBA8, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE); - setTextureFormat(TextureFormat::B5G6R5, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_REV); - setTextureFormat(TextureFormat::R5G6B5, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_REV); - setTextureFormat(TextureFormat::BGRA4, GL_BGRA, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV); - setTextureFormat(TextureFormat::RGBA4, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4_REV); - setTextureFormat(TextureFormat::BGR5A1, GL_BGRA, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV); - setTextureFormat(TextureFormat::RGB5A1, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV); - - if (s_extension[Extension::EXT_sRGB].m_supported) - { - setTextureFormatSrgb(TextureFormat::RGBA8, GL_SRGB_ALPHA_EXT, GL_SRGB_ALPHA_EXT); - setTextureFormatSrgb(TextureFormat::RGB8, GL_SRGB_EXT, GL_SRGB_EXT); - } - - if (s_extension[Extension::EXT_texture_swizzle].m_supported) - { - s_textureFormat[TextureFormat::R5G6B5].m_mapping[0] = GL_BLUE; - s_textureFormat[TextureFormat::R5G6B5].m_mapping[2] = GL_RED; - } - - if (s_extension[Extension::OES_texture_half_float].m_supported - || s_extension[Extension::OES_texture_float ].m_supported) - { - // https://www.khronos.org/registry/gles/extensions/OES/OES_texture_float.txt - // When half/float is available via extensions texture will be marked as - // incomplete if it uses anything other than nearest filter. - const bool linear16F = s_extension[Extension::OES_texture_half_float_linear].m_supported; - const bool linear32F = s_extension[Extension::OES_texture_float_linear ].m_supported; - - s_textureFilter[TextureFormat::R16F] = linear16F; - s_textureFilter[TextureFormat::RG16F] = linear16F; - s_textureFilter[TextureFormat::RGBA16F] = linear16F; - s_textureFilter[TextureFormat::R32F] = linear32F; - s_textureFilter[TextureFormat::RG32F] = linear32F; - s_textureFilter[TextureFormat::RGBA32F] = linear32F; - } - } + setTextureFormat(TextureFormat::R16F, GL_R16F, GL_RED, 0x140B /* == GL_HALF_FLOAT, but bgfx overwrites it globally with GL_HALF_FLOAT_OES */); + setTextureFormat(TextureFormat::RG16F, GL_RG16F, GL_RG, 0x140B /* == GL_HALF_FLOAT, but bgfx overwrites it globally with GL_HALF_FLOAT_OES */); + setTextureFormat(TextureFormat::RGBA16F, GL_RGBA16F, GL_RGBA, 0x140B /* == GL_HALF_FLOAT, but bgfx overwrites it globally with GL_HALF_FLOAT_OES */); if (BX_ENABLED(BX_PLATFORM_EMSCRIPTEN) && (s_extension[Extension::WEBGL_depth_texture].m_supported @@ -2714,17 +2442,14 @@ namespace bgfx { namespace gl } // OpenGL ES 3.0 depth formats. - if (m_gles3) - { - setTextureFormat(TextureFormat::D16, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT); - setTextureFormat(TextureFormat::D24, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT); - setTextureFormat(TextureFormat::D32, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT); - setTextureFormat(TextureFormat::D24S8, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8); - setTextureFormat(TextureFormat::D16F, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT); // GLES 3.0 does not have D16F, overshoot to D32F - setTextureFormat(TextureFormat::D24F, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT); // GLES 3.0 does not have D24F, overshoot to D32F - setTextureFormat(TextureFormat::D32F, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT); - setTextureFormat(TextureFormat::D0S8, GL_STENCIL_INDEX8, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE); // Only works as renderbuffer, not as texture - } + setTextureFormat(TextureFormat::D16, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT); + setTextureFormat(TextureFormat::D24, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT); + setTextureFormat(TextureFormat::D32, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT); + setTextureFormat(TextureFormat::D24S8, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8); + setTextureFormat(TextureFormat::D16F, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT); // GLES 3.0 does not have D16F, overshoot to D32F + setTextureFormat(TextureFormat::D24F, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT); // GLES 3.0 does not have D24F, overshoot to D32F + setTextureFormat(TextureFormat::D32F, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT); + setTextureFormat(TextureFormat::D0S8, GL_STENCIL_INDEX8, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE); // Only works as renderbuffer, not as texture } else { @@ -2733,7 +2458,7 @@ namespace bgfx { namespace gl } if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) - || m_gles3) + || BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES)) { setTextureFormat(TextureFormat::R8I, GL_R8I, GL_RED_INTEGER, GL_BYTE); setTextureFormat(TextureFormat::R8U, GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE); @@ -2789,20 +2514,6 @@ namespace bgfx { namespace gl setTextureFormat(TextureFormat::RGB5A1, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1); setTextureFormat(TextureFormat::B5G6R5, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5); setTextureFormat(TextureFormat::R5G6B5, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5); - - if (!m_gles3) - { - // OpenGL ES 2.0 uses unsized internal formats. - s_textureFormat[TextureFormat::RGB8].m_internalFmt = GL_RGB; - - // OpenGL ES 2.0 does not have R8 texture format, only L8. Open GL ES 2.0 extension https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_rg.txt - // adds support for R8 to GLES 2.0 core contexts. For those use L8 instead. - if (!s_extension[Extension::EXT_texture_rg].m_supported) - { - s_textureFormat[TextureFormat::R8].m_internalFmt = GL_LUMINANCE; - s_textureFormat[TextureFormat::R8].m_fmt = GL_LUMINANCE; - } - } } for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii) @@ -2911,32 +2622,16 @@ namespace bgfx { namespace gl g_caps.formats[TextureFormat::BGRA8] |= BGFX_CAPS_FORMAT_TEXTURE_BACKBUFFER; - g_caps.supported |= !!(BGFX_CONFIG_RENDERER_OPENGL || m_gles3) - || s_extension[Extension::OES_texture_3D].m_supported - ? BGFX_CAPS_TEXTURE_3D - : 0 - ; - g_caps.supported |= !!(BGFX_CONFIG_RENDERER_OPENGL || m_gles3) - || s_extension[Extension::EXT_shadow_samplers].m_supported - ? BGFX_CAPS_TEXTURE_COMPARE_ALL - : 0 - ; - g_caps.supported |= !!(BGFX_CONFIG_RENDERER_OPENGL || m_gles3) - || s_extension[Extension::OES_vertex_half_float].m_supported - ? BGFX_CAPS_VERTEX_ATTRIB_HALF - : 0 - ; + g_caps.supported |= BGFX_CAPS_TEXTURE_3D; + g_caps.supported |= BGFX_CAPS_TEXTURE_COMPARE_ALL; + g_caps.supported |= BGFX_CAPS_VERTEX_ATTRIB_HALF; g_caps.supported |= false || s_extension[Extension::ARB_vertex_type_2_10_10_10_rev].m_supported || s_extension[Extension::OES_vertex_type_10_10_10_2].m_supported ? BGFX_CAPS_VERTEX_ATTRIB_UINT10 : 0 ; - g_caps.supported |= !!(BGFX_CONFIG_RENDERER_OPENGL || m_gles3) - || s_extension[Extension::EXT_frag_depth].m_supported - ? BGFX_CAPS_FRAGMENT_DEPTH - : 0 - ; + g_caps.supported |= BGFX_CAPS_FRAGMENT_DEPTH; g_caps.supported |= s_extension[Extension::ARB_draw_buffers_blend].m_supported ? BGFX_CAPS_BLEND_INDEPENDENT : 0 @@ -2945,17 +2640,17 @@ namespace bgfx { namespace gl ? BGFX_CAPS_FRAGMENT_ORDERING : 0 ; - g_caps.supported |= !!(BGFX_CONFIG_RENDERER_OPENGL || m_gles3) - || s_extension[Extension::OES_element_index_uint].m_supported - ? BGFX_CAPS_INDEX32 - : 0 - ; + g_caps.supported |= BGFX_CAPS_INDEX32; const bool drawIndirectSupported = false || s_extension[Extension::AMD_multi_draw_indirect].m_supported || s_extension[Extension::ARB_draw_indirect ].m_supported || s_extension[Extension::ARB_multi_draw_indirect].m_supported || s_extension[Extension::EXT_multi_draw_indirect].m_supported + || (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 31) // Core since ES 3.1. + && NULL != glDrawArraysIndirect + && NULL != glDrawElementsIndirect + ) ; if (drawIndirectSupported) @@ -3001,7 +2696,7 @@ namespace bgfx { namespace gl m_depthStencilTexturingSupported = false || s_extension[Extension::ARB_stencil_texturing].m_supported - || BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL >= 43) + || BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) || BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 31) ; @@ -3023,21 +2718,21 @@ namespace bgfx { namespace gl g_caps.supported |= false || s_extension[Extension::EXT_texture_array].m_supported || s_extension[Extension::EXT_gpu_shader4].m_supported - || (m_gles3 && !BX_ENABLED(BX_PLATFORM_EMSCRIPTEN) ) + || (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) && !BX_ENABLED(BX_PLATFORM_EMSCRIPTEN) ) ? BGFX_CAPS_TEXTURE_2D_ARRAY : 0 ; g_caps.supported |= false || s_extension[Extension::EXT_gpu_shader4].m_supported - || (m_gles3 && !BX_ENABLED(BX_PLATFORM_EMSCRIPTEN) ) + || (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) && !BX_ENABLED(BX_PLATFORM_EMSCRIPTEN) ) ? BGFX_CAPS_VERTEX_ID : 0 ; g_caps.supported |= false - || BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL >= 32) - || (m_gles3 && !BX_ENABLED(BX_PLATFORM_EMSCRIPTEN) && BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 32) ) + || BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) + || (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) && !BX_ENABLED(BX_PLATFORM_EMSCRIPTEN) && BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 32) ) ? BGFX_CAPS_PRIMITIVE_ID : 0 ; @@ -3050,14 +2745,14 @@ namespace bgfx { namespace gl ; g_caps.limits.maxTextureSize = uint32_t(glGet(GL_MAX_TEXTURE_SIZE) ); - g_caps.limits.maxTextureLayers = BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL >= 30) || BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 30) || s_extension[Extension::EXT_texture_array].m_supported ? uint16_t(bx::max(glGet(GL_MAX_ARRAY_TEXTURE_LAYERS), 1) ) : 1; + g_caps.limits.maxTextureLayers = uint16_t(bx::max(glGet(GL_MAX_ARRAY_TEXTURE_LAYERS), 1) ); g_caps.limits.maxComputeBindings = computeSupport ? BGFX_MAX_COMPUTE_BINDINGS : 0; g_caps.limits.maxVertexStreams = BGFX_CONFIG_MAX_VERTEX_STREAMS; g_caps.limits.maxVertexAttributes = uint32_t(glGet(GL_MAX_VERTEX_ATTRIBS) ); g_caps.limits.maxInstanceData = bx::min(g_caps.limits.maxInstanceData, g_caps.limits.maxVertexAttributes); if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) - || m_gles3 + || BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) || s_extension[Extension::EXT_draw_buffers ].m_supported || s_extension[Extension::WEBGL_draw_buffers].m_supported) { @@ -3075,7 +2770,7 @@ namespace bgfx { namespace gl } m_vaoSupport = !BX_ENABLED(BX_PLATFORM_EMSCRIPTEN) - && (m_gles3 + && (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) || s_extension[Extension::ARB_vertex_array_object].m_supported || s_extension[Extension::OES_vertex_array_object].m_supported ); @@ -3087,18 +2782,14 @@ namespace bgfx { namespace gl } m_samplerObjectSupport = false - || m_gles3 + || BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) || s_extension[Extension::ARB_sampler_objects].m_supported ; - m_shadowSamplersSupport = !!(BGFX_CONFIG_RENDERER_OPENGL || m_gles3) - || s_extension[Extension::EXT_shadow_samplers].m_supported - ; - GLint numFormats = 0; GL_CHECK(glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &numFormats) ); m_programBinarySupport = !BX_ENABLED(BX_PLATFORM_EMSCRIPTEN) - && (m_gles3 + && (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) || s_extension[Extension::ARB_get_program_binary].m_supported || s_extension[Extension::OES_get_program_binary].m_supported || s_extension[Extension::IMG_shader_binary ].m_supported @@ -3109,16 +2800,6 @@ namespace bgfx { namespace gl || s_extension[Extension::EXT_texture_swizzle].m_supported ; - m_depthTextureSupport = !!(BGFX_CONFIG_RENDERER_OPENGL || m_gles3) - || s_extension[Extension::ANGLE_depth_texture ].m_supported - || s_extension[Extension::CHROMIUM_depth_texture ].m_supported - || s_extension[Extension::GOOGLE_depth_texture ].m_supported - || s_extension[Extension::OES_depth_texture ].m_supported - || s_extension[Extension::MOZ_WEBGL_depth_texture ].m_supported - || s_extension[Extension::WEBGL_depth_texture ].m_supported - || s_extension[Extension::WEBKIT_WEBGL_depth_texture].m_supported - ; - m_timerQuerySupport = false || s_extension[Extension::ANGLE_timer_query ].m_supported || s_extension[Extension::ARB_timer_query ].m_supported @@ -3133,6 +2814,7 @@ namespace bgfx { namespace gl ; m_occlusionQuerySupport = false + || BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) // Core since ES 3.0. || s_extension[Extension::ARB_occlusion_query ].m_supported || s_extension[Extension::ARB_occlusion_query2 ].m_supported || s_extension[Extension::EXT_occlusion_query_boolean].m_supported @@ -3144,11 +2826,14 @@ namespace bgfx { namespace gl && NULL != glDeleteQueries && NULL != glBeginQuery && NULL != glEndQuery + && NULL != glGetQueryObjectuiv ; m_atocSupport = s_extension[Extension::ARB_multisample].m_supported; m_conservativeRasterSupport = s_extension[Extension::NV_conservative_raster].m_supported; + // Note: ES 3.1 has image load/store in core, but read-write + // images are limited to r32f, r32i, and r32ui formats. m_imageLoadStoreSupport = false || s_extension[Extension::ARB_shader_image_load_store].m_supported || s_extension[Extension::EXT_shader_image_load_store].m_supported @@ -3158,7 +2843,7 @@ namespace bgfx { namespace gl | (m_atocSupport ? BGFX_CAPS_ALPHA_TO_COVERAGE : 0) | (m_conservativeRasterSupport ? BGFX_CAPS_CONSERVATIVE_RASTER : 0) | (m_occlusionQuerySupport ? BGFX_CAPS_OCCLUSION_QUERY : 0) - | (m_depthTextureSupport ? BGFX_CAPS_TEXTURE_COMPARE_LEQUAL : 0) + | BGFX_CAPS_TEXTURE_COMPARE_LEQUAL | (computeSupport ? BGFX_CAPS_COMPUTE : 0) | (m_imageLoadStoreSupport ? BGFX_CAPS_IMAGE_RW : 0) ; @@ -3181,7 +2866,7 @@ namespace bgfx { namespace gl GL_CHECK(glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &m_maxAnisotropyDefault) ); } - if (m_gles3 + if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) || s_extension[Extension::ARB_texture_multisample].m_supported || s_extension[Extension::ANGLE_framebuffer_multisample].m_supported || s_extension[Extension::EXT_multisampled_render_to_texture].m_supported) @@ -3189,13 +2874,6 @@ namespace bgfx { namespace gl GL_CHECK(glGetIntegerv(GL_MAX_SAMPLES, &m_maxMsaa) ); } -#if BGFX_CONFIG_RENDERER_OPENGLES && (BGFX_CONFIG_RENDERER_OPENGLES < 30) - if (!m_maxMsaa && s_extension[Extension::IMG_multisampled_render_to_texture].m_supported) - { - GL_CHECK(glGetIntegerv(GL_MAX_SAMPLES_IMG, &m_maxMsaa) ); - } -#endif // BGFX_CONFIG_RENDERER_OPENGLES < 30 - if (s_extension[Extension::OES_read_format].m_supported && (s_extension[Extension::IMG_read_format].m_supported || s_extension[Extension::EXT_read_format_bgra].m_supported) ) { @@ -3206,7 +2884,7 @@ namespace bgfx { namespace gl m_readPixelsFmt = GL_RGBA; } - if (m_gles3) + if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES)) { g_caps.supported |= BGFX_CAPS_INSTANCING; } @@ -3305,7 +2983,7 @@ namespace bgfx { namespace gl glInsertEventMarker = stubInsertEventMarker; } - m_maxLabelLen = BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 32) || BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL >= 43) || s_extension[Extension::KHR_debug].m_supported ? uint16_t(glGet(GL_MAX_LABEL_LENGTH) ) : 0; + m_maxLabelLen = BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 32) || BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) || s_extension[Extension::KHR_debug].m_supported ? uint16_t(glGet(GL_MAX_LABEL_LENGTH) ) : 0; setGraphicsDebuggerPresent(false || s_extension[Extension::EXT_debug_tool].m_supported @@ -3649,10 +3327,7 @@ namespace bgfx { namespace gl ) ); } - if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) || m_gles3) - { - GL_CHECK(glReadBuffer(GL_COLOR_ATTACHMENT0) ); - } + GL_CHECK(glReadBuffer(GL_COLOR_ATTACHMENT0) ); if (GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatus(GL_FRAMEBUFFER) ) { @@ -4166,15 +3841,12 @@ namespace bgfx { namespace gl : GL_RGBA8 ; - GLenum attachment = BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) || m_gles3 - ? GL_DEPTH_STENCIL_ATTACHMENT - : GL_DEPTH_ATTACHMENT - ; + GLenum attachment = GL_DEPTH_STENCIL_ATTACHMENT; GL_CHECK(glGenFramebuffers(1, &m_msaaBackBufferFbo) ); GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, m_msaaBackBufferFbo) ); - if (m_gles3) + if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES)) { GL_CHECK(glGenTextures(BX_COUNTOF(m_msaaBackBufferTextures), m_msaaBackBufferTextures) ); GL_CHECK(glBindTexture(GL_TEXTURE_2D, m_msaaBackBufferTextures[0]) ); @@ -4340,7 +4012,7 @@ namespace bgfx { namespace gl GL_CHECK(glDeleteFramebuffers(1, &m_msaaBackBufferFbo) ); m_msaaBackBufferFbo = 0; - if (m_gles3) + if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES)) { if (0 != m_msaaBackBufferTextures[0]) { @@ -4378,12 +4050,12 @@ namespace bgfx { namespace gl const uint32_t width = m_resolution.width; const uint32_t height = m_resolution.height; - const GLenum filter = BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) || !m_gles3 + const GLenum filter = BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) ? GL_NEAREST : GL_LINEAR ; - if (m_gles3) + if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES)) { GL_CHECK(glUseProgram(m_msaaBlitProgram) ); GL_CHECK(glActiveTexture(GL_TEXTURE0) ); @@ -4524,19 +4196,15 @@ namespace bgfx { namespace gl GL_CHECK(glSamplerParameterf(sampler, GL_TEXTURE_MAX_ANISOTROPY_EXT, m_maxAnisotropy) ); } - if (m_gles3 - || m_shadowSamplersSupport) + const uint32_t cmpFunc = (_flags&BGFX_SAMPLER_COMPARE_MASK)>>BGFX_SAMPLER_COMPARE_SHIFT; + if (0 == cmpFunc) { - const uint32_t cmpFunc = (_flags&BGFX_SAMPLER_COMPARE_MASK)>>BGFX_SAMPLER_COMPARE_SHIFT; - if (0 == cmpFunc) - { - GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_COMPARE_MODE, GL_NONE) ); - } - else - { - GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE) ); - GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_COMPARE_FUNC, s_cmpFunc[cmpFunc]) ); - } + GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_COMPARE_MODE, GL_NONE) ); + } + else + { + GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE) ); + GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_COMPARE_FUNC, s_cmpFunc[cmpFunc]) ); } m_samplerStateCache.add(hash, SamplerGL{sampler}); @@ -5080,12 +4748,10 @@ namespace bgfx { namespace gl bool m_readBackFboSupported; bool m_vaoSupport; bool m_samplerObjectSupport; - bool m_shadowSamplersSupport; bool m_srgbWriteControlSupport; bool m_borderColorSupport; bool m_programBinarySupport; bool m_textureSwizzleSupport; - bool m_depthTextureSupport; bool m_timerQuerySupport; bool m_occlusionQuerySupport; bool m_atocSupport; @@ -5114,7 +4780,6 @@ namespace bgfx { namespace gl const char* m_renderer; const char* m_version; const char* m_glslVersion; - bool m_gles3; Workaround m_workaround; @@ -5423,9 +5088,9 @@ namespace bgfx { namespace gl GLint activeUniforms = 0; GLint activeBuffers = 0; -#if BGFX_CONFIG_RENDERER_OPENGL >= 31 +#if BGFX_CONFIG_RENDERER_OPENGL GL_CHECK(glBindFragDataLocation(m_id, 0, "bgfx_FragColor") ); -#endif // BGFX_CONFIG_RENDERER_OPENGL >= 31 +#endif // BGFX_CONFIG_RENDERER_OPENGL GLint max0, max1; @@ -5770,8 +5435,7 @@ namespace bgfx { namespace gl GL_CHECK(glVertexAttribDivisor(loc, 0) ); uint32_t baseVertex = _baseVertex*_layout.m_stride + _layout.m_offset[attr]; - if ( (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL >= 30) || s_renderGL->m_gles3) - && !isFloat(type) + if (!isFloat(type) && !normalized) { GL_CHECK(glVertexAttribIPointer(loc @@ -6007,7 +5671,7 @@ namespace bgfx { namespace gl , _height ) ); } - else if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) || s_renderGL->m_gles3) + else { GL_CHECK(glRenderbufferStorageMultisample(GL_RENDERBUFFER , msaaQuality @@ -6494,7 +6158,7 @@ namespace bgfx { namespace gl void TextureGL::setSamplerState(uint32_t _flags, const float _rgba[4]) { - if (!s_renderGL->m_gles3 + if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) && !s_textureFilter[m_textureFormat]) { // Force point sampling when texture format doesn't support linear sampling. @@ -6537,8 +6201,7 @@ namespace bgfx { namespace gl GL_CHECK(glTexParameteri(target, GL_TEXTURE_WRAP_S, s_textureAddress[(flags&BGFX_SAMPLER_U_MASK)>>BGFX_SAMPLER_U_SHIFT]) ); GL_CHECK(glTexParameteri(target, GL_TEXTURE_WRAP_T, s_textureAddress[(flags&BGFX_SAMPLER_V_MASK)>>BGFX_SAMPLER_V_SHIFT]) ); - if (1 < numMips - && (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) || s_renderGL->m_gles3 || s_extension[Extension::APPLE_texture_max_level].m_supported) ) + if (1 < numMips) { GL_CHECK(glTexParameteri(targetMsaa, GL_TEXTURE_MAX_LEVEL, numMips-1) ); m_maxLevel = -1; @@ -6572,19 +6235,15 @@ namespace bgfx { namespace gl GL_CHECK(glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, s_renderGL->m_maxAnisotropy) ); } - if (s_renderGL->m_gles3 - || s_renderGL->m_shadowSamplersSupport) + const uint32_t cmpFunc = (flags&BGFX_SAMPLER_COMPARE_MASK)>>BGFX_SAMPLER_COMPARE_SHIFT; + if (0 == cmpFunc) { - const uint32_t cmpFunc = (flags&BGFX_SAMPLER_COMPARE_MASK)>>BGFX_SAMPLER_COMPARE_SHIFT; - if (0 == cmpFunc) - { - GL_CHECK(glTexParameteri(target, GL_TEXTURE_COMPARE_MODE, GL_NONE) ); - } - else - { - GL_CHECK(glTexParameteri(target, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE) ); - GL_CHECK(glTexParameteri(target, GL_TEXTURE_COMPARE_FUNC, s_cmpFunc[cmpFunc]) ); - } + GL_CHECK(glTexParameteri(target, GL_TEXTURE_COMPARE_MODE, GL_NONE) ); + } + else + { + GL_CHECK(glTexParameteri(target, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE) ); + GL_CHECK(glTexParameteri(target, GL_TEXTURE_COMPARE_FUNC, s_cmpFunc[cmpFunc]) ); } m_currentSamplerHash = hash; @@ -6741,8 +6400,7 @@ namespace bgfx { namespace gl if (id == m_id && 1 < m_numMips - && GL_TEXTURE_2D_MULTISAMPLE != m_target - && (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL >= 30) || s_renderGL->m_gles3) ) + && GL_TEXTURE_2D_MULTISAMPLE != m_target) { const uint8_t firstMip = bx::min(_firstMip, uint8_t(m_numMips - 1) ); const uint8_t numMips = bx::min(_numMips, uint8_t(m_numMips - firstMip) ); @@ -6773,13 +6431,6 @@ namespace bgfx { namespace gl } } - void strins(char* _str, const char* _insert) - { - size_t len = bx::strLen(_insert); - bx::memMove(&_str[len], _str, bx::strLen(_str)+1); - bx::memCopy(_str, _insert, len); - } - static bx::StringView patchNdcConstant( const bx::StringView& _code , char* _temp @@ -7018,580 +6669,35 @@ namespace bgfx { namespace gl if (0 != m_id) { - if (GL_COMPUTE_SHADER != m_type - && 0 != bx::strCmp(code, "#version", 8) ) // #2000 + // Shaders are compiled without the #version directive, so that the + // same shader binary can be used with both GLSL, and ESSL. Shaders + // compiled with --raw keep whatever the author wrote. See #2000. + if (0 != bx::strCmp(code, "#version", 8) ) { - int32_t tempLen = code.getLength() + (4<<10); + const int32_t tempLen = code.getLength() + (4<<10); char* temp = (char*)BX_STACK_ALLOC(tempLen); bx::StaticMemoryBlockWriter writer(temp, tempLen); - if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) - && !s_renderGL->m_gles3) + if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) ) { - bx::write(&writer - , "#define centroid\n" - "#define flat\n" - "#define noperspective\n" - "#define smooth\n" - , &err - ); - - bool usesDerivatives = s_extension[Extension::OES_standard_derivatives].m_supported - && !bx::findIdentifierMatch(code, s_OES_standard_derivatives).isEmpty() + // Images, and storage buffers, require ESSL 3.10. Binding + // qualifier is not necessarily first in layout list, for + // example `layout(location = 0, binding = 2, rgba8)`. + const bool needsEssl310 = GL_COMPUTE_SHADER == m_type + || !bx::strFind(code, "binding = ").isEmpty() ; - const bool usesFragData = !bx::findIdentifierMatch(code, "gl_FragData").isEmpty(); - const bool usesFragDepth = !bx::findIdentifierMatch(code, "gl_FragDepth").isEmpty(); - const bool usesShadowSamplers = !bx::findIdentifierMatch(code, s_EXT_shadow_samplers).isEmpty(); - const bool usesTextureLod = !bx::findIdentifierMatch(code, s_EXT_shader_texture_lod).isEmpty(); - const bool usesFragmentOrdering = !bx::findIdentifierMatch(code, "beginFragmentShaderOrdering").isEmpty(); - - const bool usesTexture3D = true - && s_extension[Extension::OES_texture_3D].m_supported - && !bx::findIdentifierMatch(code, s_texture3D).isEmpty() - ; - - if (usesDerivatives) - { - bx::write(&writer, "#extension GL_OES_standard_derivatives : enable\n", &err); - } - - if (usesFragData) - { - BX_WARN(s_extension[Extension::EXT_draw_buffers ].m_supported - || s_extension[Extension::WEBGL_draw_buffers].m_supported - , "EXT_draw_buffers is used but not supported by GLES2 driver." - ); - bx::write(&writer, "#extension GL_EXT_draw_buffers : enable\n", &err); - } - - bool insertFragDepth = false; - if (usesFragDepth) - { - BX_WARN(s_extension[Extension::EXT_frag_depth].m_supported, "EXT_frag_depth is used but not supported by GLES2 driver."); - if (s_extension[Extension::EXT_frag_depth].m_supported) - { - bx::write(&writer - , "#extension GL_EXT_frag_depth : enable\n" - "#define bgfx_FragDepth gl_FragDepthEXT\n" - , &err - ); - - char str[128]; - bx::snprintf(str, BX_COUNTOF(str), "%s float gl_FragDepthEXT;\n" - , s_extension[Extension::OES_fragment_precision_high].m_supported ? "highp" : "mediump" - ); - bx::write(&writer, str, &err); - } - else - { - insertFragDepth = true; - } - } - - if (usesShadowSamplers) - { - if (s_renderGL->m_shadowSamplersSupport) - { - bx::write(&writer - , "#extension GL_EXT_shadow_samplers : enable\n" - "#define shadow2D shadow2DEXT\n" - "#define shadow2DProj shadow2DProjEXT\n" - , &err - ); - } - else - { - bx::write(&writer - , "#define sampler2DShadow sampler2D\n" - "#define shadow2D(_sampler, _coord) step(_coord.z, texture2D(_sampler, _coord.xy).x)\n" - "#define shadow2DProj(_sampler, _coord) step(_coord.z/_coord.w, texture2DProj(_sampler, _coord).x)\n" - , &err - ); - } - } - - if (usesTexture3D) - { - bx::write(&writer, "#extension GL_OES_texture_3D : enable\n", &err); - } - - if (usesTextureLod) - { - BX_WARN(s_extension[Extension::ARB_shader_texture_lod].m_supported - || s_extension[Extension::EXT_shader_texture_lod].m_supported - , "(ARB|EXT)_shader_texture_lod is used but not supported by GLES2 driver." - ); - - if (s_extension[Extension::ARB_shader_texture_lod].m_supported) - { - bx::write(&writer - , "#extension GL_ARB_shader_texture_lod : enable\n" - "#define texture2DLod texture2DLodARB\n" - "#define texture2DProjLod texture2DProjLodARB\n" - "#define textureCubeLod textureCubeLodARB\n" - "#define texture2DGrad texture2DGradARB\n" - "#define texture2DProjGrad texture2DProjGradARB\n" - "#define textureCubeGrad textureCubeGradARB\n" - , &err - ); - } - else - { - if (s_extension[Extension::EXT_shader_texture_lod].m_supported) - { - bx::write(&writer - , "#extension GL_EXT_shader_texture_lod : enable\n" - "#define texture2DLod texture2DLodEXT\n" - "#define texture2DProjLod texture2DProjLodEXT\n" - "#define textureCubeLod textureCubeLodEXT\n" - , &err - ); - } - else - { - bx::write(&writer - , "#define texture2DLod(_sampler, _coord, _level) texture2D(_sampler, _coord)\n" - "#define texture2DProjLod(_sampler, _coord, _level) texture2DProj(_sampler, _coord)\n" - "#define textureCubeLod(_sampler, _coord, _level) textureCube(_sampler, _coord)\n" - , &err - ); - } - } - } - - if (usesFragmentOrdering) - { - if (s_extension[Extension::INTEL_fragment_shader_ordering].m_supported) - { - bx::write(&writer, "#extension GL_INTEL_fragment_shader_ordering : enable\n", &err); - } - else - { - bx::write(&writer, "#define beginFragmentShaderOrdering()\n", &err); - } - } - - bx::write(&writer, &err, "precision %s float;\n" - , m_type == GL_FRAGMENT_SHADER ? "mediump" : "highp" - ); - - bx::write(&writer, code, &err); - bx::write(&writer, '\0', &err); - - if (insertFragDepth) - { - bx::StringView shader(temp); - bx::StringView entry = bx::strFind(shader, "void main ()"); - if (!entry.isEmpty() ) - { - entry.set(entry.getTerm(), shader.getTerm() ); - bx::StringView brace = bx::strFind(entry, "{"); - if (!brace.isEmpty() ) - { - bx::StringView block = bx::strFindBlock(bx::StringView(brace.getPtr(), shader.getTerm() ), '{', '}'); - if (!block.isEmpty() ) - { - strins(const_cast(brace.getPtr()+1), "\n float bgfx_FragDepth = 0.0;\n"); - } - } - } - } - - // Replace all instances of gl_FragDepth with bgfx_FragDepth. - for (bx::StringView fragDepth = bx::findIdentifierMatch(temp, "gl_FragDepth") - ; !fragDepth.isEmpty() - ; fragDepth = bx::findIdentifierMatch(fragDepth.getPtr(), "gl_FragDepth") - ) - { - char* insert = const_cast(fragDepth.getPtr() ); - strins(insert, "bg"); - bx::memCopy(insert + 2, "fx", 2); - } - } - else if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) - && BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL <= 21) ) - { - const bool usesTextureLod = true - && s_extension[Extension::ARB_shader_texture_lod].m_supported - && !bx::findIdentifierMatch(code, s_ARB_shader_texture_lod).isEmpty() - ; - - const bool usesVertexID = true - && !s_extension[Extension::EXT_gpu_shader4].m_supported - && !bx::findIdentifierMatch(code, "gl_VertexID").isEmpty() - ; - - const bool usesInstanceID = true - && !s_extension[Extension::EXT_gpu_shader4].m_supported - && !bx::findIdentifierMatch(code, "gl_InstanceID").isEmpty() - ; - - const bool usesGpuShader4 = true - && s_extension[Extension::EXT_gpu_shader4].m_supported - && !bx::findIdentifierMatch(code, s_EXT_gpu_shader4).isEmpty() - ; - - // GpuShader5 extension is not supported on the fragment shader! - const bool usesGpuShader5 = true - && m_type != GL_FRAGMENT_SHADER - && !bx::findIdentifierMatch(code, s_ARB_gpu_shader5).isEmpty() - ; - - const bool usesViewportLayerArray = true - && s_extension[Extension::ARB_shader_viewport_layer_array].m_supported - && !bx::findIdentifierMatch(code, s_ARB_shader_viewport_layer_array).isEmpty() - ; - - const bool usesIUsamplers = !bx::findIdentifierMatch(code, s_uisamplers).isEmpty(); - const bool usesUint = !bx::findIdentifierMatch(code, s_uint).isEmpty(); - const bool usesTexelFetch = !bx::findIdentifierMatch(code, s_texelFetch).isEmpty(); - const bool usesTextureArray = !bx::findIdentifierMatch(code, s_textureArray).isEmpty(); - const bool usesTexture3D = !bx::findIdentifierMatch(code, s_texture3D).isEmpty(); - const bool usesTextureMS = !bx::findIdentifierMatch(code, s_ARB_texture_multisample).isEmpty(); - const bool usesPacking = !bx::findIdentifierMatch(code, s_ARB_shading_language_packing).isEmpty(); - const bool usesInterpQ = !bx::findIdentifierMatch(code, s_intepolationQualifier).isEmpty(); - - uint32_t version = false - || usesTextureArray - || usesTexture3D - || usesIUsamplers - || usesVertexID - || usesUint - || usesTexelFetch - || usesGpuShader4 - || usesGpuShader5 - || usesInterpQ - ? 130 - : 120 - ; - - version = 0 == bx::strCmp(code, "#version 430", 12) ? 430 : version; - - bx::write(&writer, &err, "#version %d\n", version); - - if (430 > version && usesTextureLod) - { - if (m_type == GL_FRAGMENT_SHADER) - { - bx::write(&writer - , "#extension GL_ARB_shader_texture_lod : enable\n" - "#define texture2DGrad texture2DGradARB\n" - "#define texture2DProjGrad texture2DProjGradARB\n" - "#define textureCubeGrad textureCubeGradARB\n" - , &err - ); - } - } - - if (usesInstanceID) - { - bx::write(&writer, "#extension GL_ARB_draw_instanced : enable\n", &err); - } - - if (usesGpuShader4) - { - bx::write(&writer, "#extension GL_EXT_gpu_shader4 : enable\n", &err); - } - - if (usesGpuShader5) - { - bx::write(&writer, "#extension GL_ARB_gpu_shader5 : enable\n", &err); - } - - if (usesViewportLayerArray) - { - bx::write(&writer, "#extension GL_ARB_shader_viewport_layer_array : enable\n", &err); - } - - if (usesPacking) - { - bx::write(&writer, "#extension GL_ARB_shading_language_packing : enable\n", &err); - } - - if (usesTextureMS) - { - bx::write(&writer, "#extension GL_ARB_texture_multisample : enable\n", &err); - } - - if (usesTextureArray) - { - bx::write(&writer, "#extension GL_EXT_texture_array : enable\n", &err); - bx::write(&writer, "#define texture2DArrayLodEXT texture2DArrayLod\n", &err); - bx::write(&writer, "#define textureArray texture\n", &err); - } - - if (usesTexture3D) - { - bx::write(&writer, "#define texture3DEXT texture3D\n", &err); - bx::write(&writer, "#define texture3DLodEXT texture3DLod\n", &err); - } - - if (130 <= version) - { - if (430 > version) - { - if (m_type == GL_FRAGMENT_SHADER) - { - bx::write(&writer, "#define varying in\n", &err); - } - else - { - bx::write(&writer, "#define attribute in\n", &err); - bx::write(&writer, "#define varying out\n", &err); - } - } - - uint32_t fragData = 0; - - if (!bx::findIdentifierMatch(code, "gl_FragData").isEmpty() ) - { - for (uint32_t ii = 0, num = g_caps.limits.maxFBAttachments; ii < num; ++ii) - { - char tmpFragData[16]; - bx::snprintf(tmpFragData, BX_COUNTOF(tmpFragData), "gl_FragData[%d]", ii); - fragData = bx::max(fragData, bx::strFind(code, tmpFragData).isEmpty() ? 0 : ii+1); - } - - BGFX_FATAL(0 != fragData, Fatal::InvalidShader, "Unable to find and patch gl_FragData!"); - } - - if (0 != fragData) - { - bx::write(&writer, &err, "out vec4 bgfx_FragData[%d];\n", fragData); - bx::write(&writer, "#define gl_FragData bgfx_FragData\n", &err); - } - else if (!bx::findIdentifierMatch(code, "gl_FragColor").isEmpty() ) - { - bx::write(&writer - , "out vec4 bgfx_FragColor;\n" - "#define gl_FragColor bgfx_FragColor\n" - , &err - ); - } - } - else - { - if (m_type == GL_FRAGMENT_SHADER) - { - bx::write(&writer, "#define in varying\n", &err); - } - else - { - bx::write(&writer - , "#define in attribute\n" - "#define out varying\n" - , &err - ); - } - } - - bx::write(&writer - , "#define lowp\n" - "#define mediump\n" - "#define highp\n" - , &err - ); - - if (!usesInterpQ) - { - bx::write(&writer - , - "#define centroid\n" - "#define flat\n" - "#define noperspective\n" - "#define smooth\n" - , &err - ); - } - - if (version == 430) - { - int32_t verLen = bx::strLen("#version 430\n"); - bx::write(&writer, code.getPtr()+verLen, code.getLength()-verLen, &err); - } - else - { - bx::write(&writer, code, &err); - } - - bx::write(&writer, '\0', &err); - } - else if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL >= 31) - || s_renderGL->m_gles3) - { - if (s_renderGL->m_gles3) - { - bx::write(&writer, &err - , "#version 300 es\n" - "precision %s float;\n" - , m_type == GL_FRAGMENT_SHADER ? "mediump" : "highp" - ); - } - else - { - bx::write(&writer, "#version 140\n", &err); - } - - bx::write(&writer - , "#define texture2DLod textureLod\n" - "#define texture3DLod textureLod\n" - "#define textureCubeLod textureLod\n" - "#define texture2DGrad textureGrad\n" - "#define texture3DGrad textureGrad\n" - "#define textureCubeGrad textureGrad\n" - , &err - ); - - if (m_type == GL_FRAGMENT_SHADER) - { - bx::write(&writer - , "#define varying in\n" - "#define texture2D texture\n" - "#define texture2DArray texture\n" - "#define texture2DProj textureProj\n" - , &err - ); - - if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) ) - { - bx::write(&writer - , "#define shadow2D(_sampler, _coord) vec2(textureProj(_sampler, vec4(_coord, 1.0) ) )\n" - "#define shadow2DProj(_sampler, _coord) vec2(textureProj(_sampler, _coord) )\n" - , &err - ); - } - else - { - bx::write(&writer - , "#define shadow2D(_sampler, _coord) (textureProj(_sampler, vec4(_coord, 1.0) ) )\n" - "#define shadow2DProj(_sampler, _coord) (textureProj(_sampler, _coord) )\n" - , &err - ); - } - - bx::write(&writer - , "#define texture3D texture\n" - "#define textureCube texture\n" - , &err - ); - - uint32_t fragData = 0; - - bool patchedFragData = s_renderGL->m_gles3 && !bx::findIdentifierMatch(code, "bgfx_FragData").isEmpty(); - - if (!patchedFragData && !bx::findIdentifierMatch(code, "gl_FragData").isEmpty() ) - { - for (uint32_t ii = 0, num = g_caps.limits.maxFBAttachments; ii < num; ++ii) - { - char tmpFragData[16]; - bx::snprintf(tmpFragData, BX_COUNTOF(tmpFragData), "gl_FragData[%d]", ii); - fragData = bx::max(fragData, bx::strFind(code, tmpFragData).isEmpty() ? 0 : ii+1); - } - - BGFX_FATAL(0 != fragData, Fatal::InvalidShader, "Unable to find and patch gl_FragData!"); - } - - if (!bx::findIdentifierMatch(code, "beginFragmentShaderOrdering").isEmpty() ) - { - if (s_extension[Extension::INTEL_fragment_shader_ordering].m_supported) - { - bx::write(&writer, "#extension GL_INTEL_fragment_shader_ordering : enable\n", &err); - } - else - { - bx::write(&writer, "#define beginFragmentShaderOrdering()\n", &err); - } - } - - if (!bx::findIdentifierMatch(code, s_ARB_texture_multisample).isEmpty() ) - { - bx::write(&writer, "#extension GL_ARB_texture_multisample : enable\n", &err); - } - - if (0 != fragData) - { - if (!patchedFragData) - { - bx::write(&writer, &err, "out vec4 bgfx_FragData[%d];\n", fragData); - bx::write(&writer, "#define gl_FragData bgfx_FragData\n", &err); - } - } - else if (!patchedFragData) - { - if (bx::findIdentifierMatch(code, "bgfx_FragColor").isEmpty() ) - { - bx::write(&writer - , "out vec4 bgfx_FragColor;\n" - "#define gl_FragColor bgfx_FragColor\n" - , &err - ); - } - } - } - else - { - bx::write(&writer - , "#define attribute in\n" - "#define varying out\n" - , &err - ); - } - - if (!s_renderGL->m_gles3) - { - bx::write(&writer - , "#define lowp\n" - "#define mediump\n" - "#define highp\n" - , &err - ); - } - - bx::write(&writer, code.getPtr(), code.getLength(), &err); - bx::write(&writer, '\0', &err); - } - - code.set(temp); - } - else if (GL_COMPUTE_SHADER == m_type) - { - int32_t codeLen = (int32_t)bx::strLen(code); - int32_t tempLen = codeLen + (4<<10); - char* temp = (char*)BX_STACK_ALLOC(tempLen); - bx::StaticMemoryBlockWriter writer(temp, tempLen); - - int32_t verLen = 0; - if (s_renderGL->m_gles3) - { - const char* str = "#version 310 es\n"; - verLen = bx::strLen(str); - bx::write(&writer, &err, str); + bx::write(&writer, &err, "#version %d es\n", needsEssl310 ? 310 : 300); } else { - const char* str = "#version 430\n"; - verLen = bx::strLen(str); - bx::write(&writer, &err, str); + bx::write(&writer, &err, "#version %d\n", BGFX_CONFIG_RENDERER_OPENGL*10); } - bx::write(&writer - , "#define texture2DLod textureLod\n" - "#define texture2DLodOffset textureLodOffset\n" - "#define texture2DArrayLod textureLod\n" - "#define texture2DArrayLodOffset textureLodOffset\n" - "#define texture3DLod textureLod\n" - "#define textureCubeLod textureLod\n" - "#define texture2DGrad textureGrad\n" - "#define texture3DGrad textureGrad\n" - "#define textureCubeGrad textureGrad\n" - , &err - ); - - bx::write(&writer, code.getPtr()+verLen, codeLen-verLen, &err); + bx::write(&writer, code.getPtr(), code.getLength(), &err); bx::write(&writer, '\0', &err); - code = temp; + code.set(temp); } { @@ -7726,28 +6832,11 @@ namespace bgfx { namespace gl if (0 != texture.m_rbo) { - if (!(BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL >= 30) || s_renderGL->m_gles3) - && GL_DEPTH_STENCIL_ATTACHMENT == attachment) - { - GL_CHECK(glFramebufferRenderbuffer(GL_FRAMEBUFFER - , GL_DEPTH_ATTACHMENT - , GL_RENDERBUFFER - , texture.m_rbo - ) ); - GL_CHECK(glFramebufferRenderbuffer(GL_FRAMEBUFFER - , GL_STENCIL_ATTACHMENT - , GL_RENDERBUFFER - , texture.m_rbo - ) ); - } - else - { - GL_CHECK(glFramebufferRenderbuffer(GL_FRAMEBUFFER - , attachment - , GL_RENDERBUFFER - , texture.m_rbo - ) ); - } + GL_CHECK(glFramebufferRenderbuffer(GL_FRAMEBUFFER + , attachment + , GL_RENDERBUFFER + , texture.m_rbo + ) ); } else { @@ -7813,11 +6902,8 @@ namespace bgfx { namespace gl GL_CHECK(glDrawBuffers(colorIdx, buffers) ); } - if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) || s_renderGL->m_gles3) - { - // Disable read buffer to avoid GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER. - GL_CHECK(glReadBuffer(GL_NONE) ); - } + // Disable read buffer to avoid GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER. + GL_CHECK(glReadBuffer(GL_NONE) ); frameBufferValidate(); @@ -7990,10 +7076,7 @@ namespace bgfx { namespace gl GL_CHECK(glBindFramebuffer(GL_READ_FRAMEBUFFER, m_fbo[0]) ); - if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) || s_renderGL->m_gles3) - { - GL_CHECK(glReadBuffer(GL_NONE) ); - } + GL_CHECK(glReadBuffer(GL_NONE) ); GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, s_renderGL->m_msaaBackBufferFbo) ); } @@ -8029,7 +7112,7 @@ namespace bgfx { namespace gl uint32_t dsFlags = _flags & (BGFX_CLEAR_DISCARD_DEPTH|BGFX_CLEAR_DISCARD_STENCIL); if (BGFX_CLEAR_NONE != dsFlags) { - if (!BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) + if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) && (BGFX_CLEAR_DISCARD_DEPTH|BGFX_CLEAR_DISCARD_STENCIL) == dsFlags) { buffers[idx++] = GL_DEPTH_STENCIL_ATTACHMENT; @@ -8047,6 +7130,12 @@ namespace bgfx { namespace gl GL_CHECK(glInvalidateFramebuffer(GL_FRAMEBUFFER, idx, buffers) ); } + // OpenGL ES only supports boolean occlusion queries. + static constexpr GLenum s_occlusionQueryTarget = BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) + ? GL_ANY_SAMPLES_PASSED + : GL_SAMPLES_PASSED + ; + void OcclusionQueryGL::create() { for (uint32_t ii = 0; ii < BX_COUNTOF(m_query); ++ii) @@ -8055,7 +7144,6 @@ namespace bgfx { namespace gl GL_CHECK(glGenQueries(1, &query.m_id) ); } } - void OcclusionQueryGL::destroy() { for (uint32_t ii = 0; ii < BX_COUNTOF(m_query); ++ii) @@ -8073,13 +7161,13 @@ namespace bgfx { namespace gl } Query& query = m_query[m_control.m_current]; - GL_CHECK(glBeginQuery(GL_SAMPLES_PASSED, query.m_id) ); + GL_CHECK(glBeginQuery(s_occlusionQueryTarget, query.m_id) ); query.m_handle = _handle; } void OcclusionQueryGL::end() { - GL_CHECK(glEndQuery(GL_SAMPLES_PASSED) ); + GL_CHECK(glEndQuery(s_occlusionQueryTarget) ); m_control.commit(1); } @@ -8091,11 +7179,11 @@ namespace bgfx { namespace gl if (isValid(query.m_handle) ) { - int32_t result; + GLuint result; if (!_wait) { - GL_CHECK(glGetQueryObjectiv(query.m_id, GL_QUERY_RESULT_AVAILABLE, &result) ); + GL_CHECK(glGetQueryObjectuiv(query.m_id, GL_QUERY_RESULT_AVAILABLE, &result) ); if (!result) { @@ -8103,7 +7191,7 @@ namespace bgfx { namespace gl } } - GL_CHECK(glGetQueryObjectiv(query.m_id, GL_QUERY_RESULT, &result) ); + GL_CHECK(glGetQueryObjectuiv(query.m_id, GL_QUERY_RESULT, &result) ); _render->m_occlusion[query.m_handle.idx] = int32_t(result); } diff --git a/src/renderer_gl.h b/src/renderer_gl.h index 16c9eaa77..dcd243187 100644 --- a/src/renderer_gl.h +++ b/src/renderer_gl.h @@ -50,66 +50,19 @@ BX_MACRO_BLOCK_END #if BGFX_CONFIG_RENDERER_OPENGL -# if BGFX_CONFIG_RENDERER_OPENGL >= 31 -# include -# else -# if BX_PLATFORM_LINUX -# define GL_PROTOTYPES -# define GL_GLEXT_LEGACY -# include -# undef GL_PROTOTYPES -# elif BX_PLATFORM_WINDOWS -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif // WIN32_LEAN_AND_MEAN -# include -# include -# else -# include -# endif // BX_PLATFORM_ - -# include -# endif // BGFX_CONFIG_RENDERER_OPENGL >= 31 +# include #elif BGFX_CONFIG_RENDERER_OPENGLES typedef double GLdouble; -# if BGFX_CONFIG_RENDERER_OPENGLES < 30 -# include -# include -# include -typedef int64_t GLint64; -typedef uint64_t GLuint64; -# define GL_PROGRAM_BINARY_LENGTH GL_PROGRAM_BINARY_LENGTH_OES -# define GL_NUM_PROGRAM_BINARY_FORMATS GL_NUM_PROGRAM_BINARY_FORMATS_OES -# define GL_HALF_FLOAT GL_HALF_FLOAT_OES -# define GL_RGBA8 GL_RGBA8_OES -# define GL_UNSIGNED_INT_2_10_10_10_REV GL_UNSIGNED_INT_2_10_10_10_REV_EXT -# ifndef GL_TEXTURE_3D -# define GL_TEXTURE_3D GL_TEXTURE_3D_OES -# endif // GL_TEXTURE_3D -# define GL_SAMPLER_3D GL_SAMPLER_3D_OES -# define GL_TEXTURE_WRAP_R GL_TEXTURE_WRAP_R_OES -# ifndef GL_MIN -# define GL_MIN GL_MIN_EXT -# endif // GL_MIN -# ifndef GL_MAX -# define GL_MAX GL_MAX_EXT -# endif // GL_MAX -# define GL_DEPTH_COMPONENT24 GL_DEPTH_COMPONENT24_OES -# define GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_OES -# define GL_DEPTH_COMPONENT32 GL_DEPTH_COMPONENT32_OES -# define GL_UNSIGNED_INT_24_8 GL_UNSIGNED_INT_24_8_OES -# elif BGFX_CONFIG_RENDERER_OPENGLES >= 30 -# include -# if BGFX_CONFIG_RENDERER_OPENGLES >= 32 -# include -# elif BGFX_CONFIG_RENDERER_OPENGLES >= 31 -# include -# else -# include -# endif // BGFX_CONFIG_RENDERER_OPENGLES -# include -# endif // BGFX_CONFIG_RENDERER_ +# include +# if BGFX_CONFIG_RENDERER_OPENGLES >= 32 +# include +# elif BGFX_CONFIG_RENDERER_OPENGLES >= 31 +# include +# else +# include +# endif // BGFX_CONFIG_RENDERER_OPENGLES +# include #endif // BGFX_CONFIG_RENDERER_OPENGL diff --git a/src/vs_clear.bin.h b/src/vs_clear.bin.h index 8b1e0bf10..c8b73e5af 100644 --- a/src/vs_clear.bin.h +++ b/src/vs_clear.bin.h @@ -1,41 +1,34 @@ -static const uint8_t vs_clear_glsl[251] = +static const uint8_t vs_clear_glsl[202] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // VSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x02, // gfx_clear_depth. - 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0x61, 0x74, 0x74, // .............att - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, // ribute vec3 a_po - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // sition;.uniform - 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, // vec4 bgfx_clear_ - 0x64, 0x65, 0x70, 0x74, 0x68, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // depth;.void main - 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, // ().{. vec4 tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_1;. tmpvar_ - 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // 1.w = 1.0;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, // var_1.xy = a_pos - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // ition.xy;. tmpv - 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, // ar_1.z = bgfx_cl - 0x65, 0x61, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x67, // ear_depth.x;. g - 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // l_Position = tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // var_1;.}... + 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, // ..............un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // iform vec4 bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, // clear_depth;..la + 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // yout(location = + 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, // 0) in vec3 a_pos + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, // ition;..void mai + 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, // n().{. gl_Pos + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, // ition = vec4(a_p + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x62, 0x67, 0x66, 0x78, // osition.xy, bgfx + 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x2e, 0x78, 0x2c, 0x20, // _clear_depth.x, + 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 1.0);.}... }; -static const uint8_t vs_clear_essl[269] = +static const uint8_t vs_clear_essl[202] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x62, // VSH............b 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x02, // gfx_clear_depth. - 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x61, 0x74, 0x74, // .............att - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // ribute highp vec - 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x75, 0x6e, // 3 a_position;.un - 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // iform highp vec4 - 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x74, // bgfx_clear_dept - 0x68, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, // h;.void main (). - 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, // {. highp vec4 t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_1;. tmpva - 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, // r_1.w = 1.0;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, // mpvar_1.xy = a_p - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // osition.xy;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // pvar_1.z = bgfx_ - 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x2e, 0x78, 0x3b, 0x0a, 0x20, // clear_depth.x;. - 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, // gl_Position = t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // mpvar_1;.}... + 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x6e, // ..............un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // iform vec4 bgfx_ + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, // clear_depth;..la + 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // yout(location = + 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, // 0) in vec3 a_pos + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, // ition;..void mai + 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, // n().{. gl_Pos + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, // ition = vec4(a_p + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x62, 0x67, 0x66, 0x78, // osition.xy, bgfx + 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x2e, 0x78, 0x2c, 0x20, // _clear_depth.x, + 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 1.0);.}... }; static const uint8_t vs_clear_spv[835] = { diff --git a/src/vs_debugfont.bin.h b/src/vs_debugfont.bin.h index 4c1f826c1..e7b45c48a 100644 --- a/src/vs_debugfont.bin.h +++ b/src/vs_debugfont.bin.h @@ -1,69 +1,66 @@ -static const uint8_t vs_debugfont_glsl[457] = +static const uint8_t vs_debugfont_glsl[456] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xb8, 0xbe, 0x22, 0x66, 0x01, 0x00, 0x0f, 0x75, // VSH......."f...u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x61, 0x74, // ec4 a_color1;.at - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, // tribute vec3 a_p - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, // osition;.attribu - 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // te vec2 a_texcoo - 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, // rd0;.varying vec - 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // 4 v_color0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ing vec4 v_color - 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // 1;.varying vec2 - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // v_texcoord0;.uni + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // .............uni 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // lViewProj;.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // main ().{. vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, // var_1.w = 1.0;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, // tmpvar_1.xyz = - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, // a_position;. gl - 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, // _Position = (u_m - 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, // odelViewProj * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, // mpvar_1);. v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // xcoord0 = a_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // oord0;. v_color - 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, // 0 = a_color0;. - 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // v_color1 = a_col - 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // or1;.}... + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, // ut(location = 2) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, // ion;.out vec2 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x29, 0x20, // t(location = 3) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec2 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, // ut vec4 v_color1 + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // n = 1) in vec4 a + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // _color1;..void m + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, // ain().{. gl_P + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // osition = u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, // lViewProj * vec4 + 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, // (a_position, 1.0 + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // );. v_texcoor + 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // d0 = a_texcoord0 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, // ;. v_color0 = + 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, // a_color0;. v + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // _color1 = a_colo + 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r1;.}... }; -static const uint8_t vs_debugfont_essl[511] = +static const uint8_t vs_debugfont_essl[456] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xb8, 0xbe, 0x22, 0x66, 0x01, 0x00, 0x0f, 0x75, // VSH......."f...u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // bute highp vec4 - 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, // a_color1;.attrib - 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, // ute highp vec3 a - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // _position;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // bute highp vec2 - 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, // a_texcoord0;.var - 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // ying highp vec4 - 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // v_color0;.varyin - 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, // g highp vec4 v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // olor1;.varying h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // ighp vec2 v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, // oord0;.uniform h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // ighp mat4 u_mode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // lViewProj;.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, // main ().{. high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, // p vec4 tmpvar_1; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, // . tmpvar_1.w = - 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // 1.0;. tmpvar_1. - 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, // xyz = a_position - 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, // ;. gl_Position - 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, // = (u_modelViewPr - 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, // oj * tmpvar_1);. - 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, // v_texcoord0 = - 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, // a_texcoord0;. v - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // _color0 = a_colo - 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, // r0;. v_color1 = - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // a_color1;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // .............uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, // ut(location = 2) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, // ion;.out vec2 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x33, 0x29, 0x20, // t(location = 3) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec2 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6f, // vec4 a_color0;.o + 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, // ut vec4 v_color1 + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // n = 1) in vec4 a + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // _color1;..void m + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, // ain().{. gl_P + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // osition = u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, // lViewProj * vec4 + 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, // (a_position, 1.0 + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // );. v_texcoor + 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // d0 = a_texcoord0 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, // ;. v_color0 = + 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, // a_color0;. v + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // _color1 = a_colo + 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r1;.}... }; static const uint8_t vs_debugfont_spv[1428] = { diff --git a/tools/geometryv/fs_mesh.bin.h b/tools/geometryv/fs_mesh.bin.h index 2aa554324..e9ec34d86 100644 --- a/tools/geometryv/fs_mesh.bin.h +++ b/tools/geometryv/fs_mesh.bin.h @@ -1,137 +1,247 @@ -static const uint8_t fs_mesh_glsl[1011] = +static const uint8_t fs_mesh_glsl[1862] = { - 0x46, 0x53, 0x48, 0x0b, 0xe3, 0xc2, 0x5c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, // FSH....e........ - 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // ..varying vec3 v - 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // _normal;.void ma - 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, // in ().{. vec3 t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_1;. tmpva - 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, // r_1 = normalize( - 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, // v_normal);. vec - 0x33, 0x20, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x5f, 0x32, // 3 rgb_2;. rgb_2 - 0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x32, 0x37, 0x32, 0x39, 0x39, // = (vec3(0.27299 - 0x39, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x37, 0x35, 0x34, 0x37, 0x30, 0x31, 0x2c, 0x20, 0x30, // 92, 0.2754701, 0 - 0x2e, 0x32, 0x35, 0x31, 0x34, 0x30, 0x38, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x76, 0x65, 0x63, // .251408) + ((vec - 0x33, 0x28, 0x30, 0x2e, 0x33, 0x37, 0x35, 0x34, 0x30, 0x36, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x34, // 3(0.3754065, 0.4 - 0x31, 0x33, 0x38, 0x33, 0x38, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x35, 0x38, 0x33, 0x32, // 138388, 0.415832 - 0x37, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x29, // 7) * tmpvar_1.x) - 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x5f, // / 2.5));. rgb_ - 0x32, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x76, // 2 = (rgb_2 + ((v - 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x36, 0x33, 0x31, 0x39, 0x31, 0x2c, 0x20, // ec3(0.05463191, - 0x30, 0x2e, 0x30, 0x35, 0x35, 0x33, 0x33, 0x36, 0x36, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x36, // 0.05533662, 0.06 - 0x38, 0x33, 0x37, 0x34, 0x39, 0x38, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // 837498) * tmpvar - 0x5f, 0x31, 0x2e, 0x79, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, // _1.y) / 2.5));. - 0x20, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, // rgb_2 = (rgb_2 - 0x2b, 0x20, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x31, 0x31, 0x38, 0x32, // + ((vec3(-0.1182 - 0x32, 0x37, 0x33, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x31, 0x36, 0x35, 0x37, 0x38, 0x36, 0x2c, // 273, -0.1165786, - 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x31, 0x34, 0x34, 0x34, 0x32, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x74, // -0.1144424) * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x35, // mpvar_1.z) / 2.5 - 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x72, // ));. rgb_2 = (r - 0x67, 0x62, 0x5f, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // gb_2 + ((tmpvar_ - 0x31, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, // 1.x * . (vec3 - 0x28, 0x2d, 0x30, 0x2e, 0x31, 0x39, 0x33, 0x30, 0x36, 0x36, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, // (-0.193066, -0.1 - 0x38, 0x36, 0x30, 0x39, 0x35, 0x33, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x36, 0x35, 0x33, 0x35, // 860953, -0.16535 - 0x31, 0x38, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, // 18) * tmpvar_1.z - 0x29, 0x0a, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, // ). ) / 2.5));. - 0x20, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, // rgb_2 = (rgb_2 - 0x2b, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x20, 0x2a, // + ((tmpvar_1.x * - 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x36, 0x38, 0x31, 0x31, 0x30, 0x36, 0x33, // vec3(0.06811063 - 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x36, 0x35, 0x31, 0x39, 0x32, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x30, // , 0.0651928, 0.0 - 0x35, 0x32, 0x36, 0x30, 0x36, 0x34, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // 526064)) * tmpva - 0x72, 0x5f, 0x31, 0x2e, 0x79, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x5f, 0x32, // r_1.y));. rgb_2 - 0x20, 0x3d, 0x20, 0x28, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, // = (rgb_2 + (vec - 0x33, 0x28, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x32, 0x39, 0x32, 0x31, 0x31, 0x32, 0x33, 0x2c, 0x20, // 3(0.0002921123, - 0x2d, 0x30, 0x2e, 0x30, 0x30, 0x35, 0x31, 0x33, 0x39, 0x37, 0x34, 0x35, 0x2c, 0x20, 0x2d, 0x30, // -0.005139745, -0 - 0x2e, 0x30, 0x31, 0x33, 0x39, 0x30, 0x39, 0x34, 0x38, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x0a, 0x20, // .01390948) * (. - 0x20, 0x20, 0x20, 0x28, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ((3.0 * tmpva - 0x72, 0x5f, 0x31, 0x2e, 0x79, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // r_1.y) * tmpvar_ - 0x31, 0x2e, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, // 1.y). - 1.0))) - 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x67, 0x62, // ;. rgb_2 = (rgb - 0x5f, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // _2 + ((tmpvar_1. - 0x7a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x31, 0x36, 0x31, 0x38, // z * vec3(-0.1618 - 0x39, 0x36, 0x38, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x35, 0x33, 0x36, 0x34, 0x39, 0x38, 0x2c, // 968, -0.1536498, - 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x33, 0x32, 0x39, 0x32, 0x33, 0x39, 0x29, 0x29, 0x20, 0x2a, 0x20, // -0.1329239)) * - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x79, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // tmpvar_1.y));. - 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x2b, // rgb_2 = (rgb_2 + - 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x30, 0x32, 0x31, 0x38, 0x30, 0x33, // (vec3(-0.021803 - 0x36, 0x33, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x32, 0x39, 0x38, 0x36, 0x35, 0x30, 0x37, 0x2c, // 63, -0.02986507, - 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, 0x32, 0x39, 0x33, 0x39, 0x35, 0x38, 0x29, 0x20, 0x2a, 0x20, // -0.04293958) * - 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // (. (tmpvar_1. - 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x29, 0x0a, // z * tmpvar_1.z). - 0x20, 0x20, 0x20, 0x2d, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // - . (tmpva - 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // r_1.x * tmpvar_1 - 0x2e, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, // .x). )));. gl_ - 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, // FragColor.xyz = - 0x72, 0x67, 0x62, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, // rgb_2;. gl_Frag - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x7d, // Color.w = 1.0;.} - 0x0a, 0x0a, 0x00, // ... -}; -static const uint8_t fs_mesh_essl[1029] = -{ - 0x46, 0x53, 0x48, 0x0b, 0xe3, 0xc2, 0x5c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x03, // FSH....e........ - 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // ..varying highp - 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x76, // vec3 v_normal;.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // highp vec3 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, // r_1;. tmpvar_1 + 0x46, 0x53, 0x48, 0x0b, 0xe3, 0xc2, 0x5c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x07, // FSH....e......3. + 0x00, 0x00, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, // ...in vec3 v_nor + 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, // mal;.layout(loca + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, // tion = 0) out ve + 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, // c4 bgfx_FragColo + 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, // r;..void main(). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x20, // {. vec3 _250 0x3d, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x5f, 0x6e, 0x6f, // = normalize(v_no - 0x72, 0x6d, 0x61, 0x6c, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // rmal);. highp v - 0x65, 0x63, 0x33, 0x20, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, // ec3 rgb_2;. rgb - 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x32, 0x37, 0x32, // _2 = (vec3(0.272 - 0x39, 0x39, 0x39, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x37, 0x35, 0x34, 0x37, 0x30, 0x31, 0x2c, // 9992, 0.2754701, - 0x20, 0x30, 0x2e, 0x32, 0x35, 0x31, 0x34, 0x30, 0x38, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x76, // 0.251408) + ((v - 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x33, 0x37, 0x35, 0x34, 0x30, 0x36, 0x35, 0x2c, 0x20, 0x30, // ec3(0.3754065, 0 - 0x2e, 0x34, 0x31, 0x33, 0x38, 0x33, 0x38, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x35, 0x38, // .4138388, 0.4158 - 0x33, 0x32, 0x37, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // 327) * tmpvar_1. - 0x78, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, // x) / 2.5));. rg - 0x62, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x2b, 0x20, 0x28, // b_2 = (rgb_2 + ( - 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x36, 0x33, 0x31, 0x39, 0x31, // (vec3(0.05463191 - 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x33, 0x33, 0x36, 0x36, 0x32, 0x2c, 0x20, 0x30, 0x2e, // , 0.05533662, 0. - 0x30, 0x36, 0x38, 0x33, 0x37, 0x34, 0x39, 0x38, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, // 06837498) * tmpv - 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x79, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x35, 0x29, 0x29, 0x3b, // ar_1.y) / 2.5)); - 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x67, 0x62, 0x5f, // . rgb_2 = (rgb_ - 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x31, 0x31, // 2 + ((vec3(-0.11 - 0x38, 0x32, 0x32, 0x37, 0x33, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x31, 0x36, 0x35, 0x37, 0x38, // 82273, -0.116578 - 0x36, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x31, 0x34, 0x34, 0x34, 0x32, 0x34, 0x29, 0x20, 0x2a, // 6, -0.1144424) * - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x32, // tmpvar_1.z) / 2 - 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x3d, 0x20, // .5));. rgb_2 = - 0x28, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // (rgb_2 + ((tmpva - 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x65, // r_1.x * . (ve - 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x31, 0x39, 0x33, 0x30, 0x36, 0x36, 0x2c, 0x20, 0x2d, 0x30, // c3(-0.193066, -0 - 0x2e, 0x31, 0x38, 0x36, 0x30, 0x39, 0x35, 0x33, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x36, 0x35, // .1860953, -0.165 - 0x33, 0x35, 0x31, 0x38, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // 3518) * tmpvar_1 - 0x2e, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x35, 0x29, 0x29, 0x3b, // .z). ) / 2.5)); - 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x67, 0x62, 0x5f, // . rgb_2 = (rgb_ - 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, // 2 + ((tmpvar_1.x - 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x36, 0x38, 0x31, 0x31, 0x30, // * vec3(0.068110 - 0x36, 0x33, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x36, 0x35, 0x31, 0x39, 0x32, 0x38, 0x2c, 0x20, 0x30, // 63, 0.0651928, 0 - 0x2e, 0x30, 0x35, 0x32, 0x36, 0x30, 0x36, 0x34, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, // .0526064)) * tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x79, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, // var_1.y));. rgb - 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x76, // _2 = (rgb_2 + (v - 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x32, 0x39, 0x32, 0x31, 0x31, 0x32, 0x33, // ec3(0.0002921123 - 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x30, 0x35, 0x31, 0x33, 0x39, 0x37, 0x34, 0x35, 0x2c, 0x20, // , -0.005139745, - 0x2d, 0x30, 0x2e, 0x30, 0x31, 0x33, 0x39, 0x30, 0x39, 0x34, 0x38, 0x29, 0x20, 0x2a, 0x20, 0x28, // -0.01390948) * ( - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, // . ((3.0 * tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x79, 0x29, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // var_1.y) * tmpva - 0x72, 0x5f, 0x31, 0x2e, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, // r_1.y). - 1.0) - 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x72, // ));. rgb_2 = (r - 0x67, 0x62, 0x5f, 0x32, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // gb_2 + ((tmpvar_ - 0x31, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x31, 0x36, // 1.z * vec3(-0.16 - 0x31, 0x38, 0x39, 0x36, 0x38, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x35, 0x33, 0x36, 0x34, 0x39, // 18968, -0.153649 - 0x38, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x33, 0x32, 0x39, 0x32, 0x33, 0x39, 0x29, 0x29, 0x20, // 8, -0.1329239)) - 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x79, 0x29, 0x29, 0x3b, 0x0a, // * tmpvar_1.y));. - 0x20, 0x20, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x67, 0x62, 0x5f, 0x32, // rgb_2 = (rgb_2 - 0x20, 0x2b, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x30, 0x32, 0x31, 0x38, // + (vec3(-0.0218 - 0x30, 0x33, 0x36, 0x33, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x32, 0x39, 0x38, 0x36, 0x35, 0x30, // 0363, -0.0298650 - 0x37, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, 0x32, 0x39, 0x33, 0x39, 0x35, 0x38, 0x29, 0x20, // 7, -0.04293958) - 0x2a, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // * (. (tmpvar_ - 0x31, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, // 1.z * tmpvar_1.z - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6d, 0x70, // ). - . (tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // var_1.x * tmpvar - 0x5f, 0x31, 0x2e, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, // _1.x). )));. g - 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x79, 0x7a, 0x20, // l_FragColor.xyz - 0x3d, 0x20, 0x72, 0x67, 0x62, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, // = rgb_2;. gl_Fr - 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, // agColor.w = 1.0; - 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... + 0x72, 0x6d, 0x61, 0x6c, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // rmal);. float + 0x20, 0x5f, 0x33, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2e, 0x78, 0x3b, 0x0a, // _305 = _250.x;. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x20, 0x3d, // float _309 = + 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // _250.y;. flo + 0x61, 0x74, 0x20, 0x5f, 0x33, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x2e, 0x7a, // at _313 = _250.z + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x34, 0x33, 0x39, 0x20, // ;. vec3 _439 + 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, // = (((((((vec3(0. + 0x32, 0x37, 0x32, 0x39, 0x39, 0x39, 0x32, 0x32, 0x37, 0x30, 0x34, 0x36, 0x39, 0x36, 0x36, 0x35, // 2729992270469665 + 0x35, 0x32, 0x37, 0x33, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x37, 0x35, 0x34, // 52734375, 0.2754 + 0x37, 0x30, 0x31, 0x30, 0x37, 0x37, 0x39, 0x33, 0x38, 0x30, 0x37, 0x39, 0x38, 0x33, 0x33, 0x39, // 7010779380798339 + 0x38, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x31, 0x34, 0x30, 0x38, 0x30, // 84375, 0.2514080 + 0x34, 0x30, 0x35, 0x32, 0x33, 0x35, 0x32, 0x39, 0x30, 0x35, 0x32, 0x37, 0x33, 0x34, 0x33, 0x37, // 4052352905273437 + 0x35, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, // 5) + (((vec3(-0. + 0x33, 0x38, 0x34, 0x31, 0x36, 0x33, 0x34, 0x39, 0x38, 0x38, 0x37, 0x38, 0x34, 0x37, 0x39, 0x30, // 3841634988784790 + 0x30, 0x33, 0x39, 0x30, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x34, 0x32, 0x33, 0x34, // 0390625, -0.4234 + 0x39, 0x32, 0x32, 0x38, 0x32, 0x36, 0x32, 0x39, 0x30, 0x31, 0x33, 0x30, 0x36, 0x31, 0x35, 0x32, // 9228262901306152 + 0x33, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x34, 0x32, 0x35, 0x35, 0x33, 0x32, // 34375, -0.425532 + 0x37, 0x32, 0x38, 0x34, 0x33, 0x33, 0x36, 0x30, 0x39, 0x30, 0x30, 0x38, 0x37, 0x38, 0x39, 0x30, // 7284336090087890 + 0x36, 0x32, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x2d, 0x30, 0x2e, 0x34, 0x38, 0x38, 0x36, // 625) * ((-0.4886 + 0x30, 0x32, 0x35, 0x31, 0x39, 0x30, 0x33, 0x35, 0x33, 0x33, 0x39, 0x33, 0x35, 0x35, 0x34, 0x36, // 0251903533935546 + 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, // 875) * _305)) * + 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x30, // 2.0) * vec3(0.40 + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x35, 0x39, 0x36, 0x30, 0x34, 0x36, 0x34, 0x34, 0x37, 0x37, // 0000005960464477 + 0x35, 0x33, 0x39, 0x30, 0x36, 0x32, 0x35, 0x29, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, // 5390625))) + ((( + 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x39, 0x30, 0x36, 0x32, 0x39, 0x35, // vec3(0.055906295 + 0x37, 0x37, 0x36, 0x33, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x35, // 7763671875, 0.05 + 0x36, 0x36, 0x32, 0x37, 0x34, 0x33, 0x37, 0x34, 0x37, 0x32, 0x33, 0x34, 0x33, 0x34, 0x34, 0x34, // 6627437472343444 + 0x38, 0x32, 0x34, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x36, 0x39, 0x39, // 82421875, 0.0699 + 0x36, 0x39, 0x39, 0x33, 0x37, 0x32, 0x30, 0x35, 0x33, 0x31, 0x34, 0x36, 0x33, 0x36, 0x32, 0x33, // 6993720531463623 + 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x30, 0x2e, 0x34, 0x38, 0x38, // 046875) * (0.488 + 0x36, 0x30, 0x32, 0x35, 0x31, 0x39, 0x30, 0x33, 0x35, 0x33, 0x33, 0x39, 0x33, 0x35, 0x35, 0x34, // 6025190353393554 + 0x36, 0x38, 0x37, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x29, 0x29, 0x20, 0x2a, 0x20, // 6875 * _309)) * + 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x30, // 2.0) * vec3(0.40 + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x35, 0x39, 0x36, 0x30, 0x34, 0x36, 0x34, 0x34, 0x37, 0x37, // 0000005960464477 + 0x35, 0x33, 0x39, 0x30, 0x36, 0x32, 0x35, 0x29, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, // 5390625))) + ((( + 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x31, 0x32, 0x30, 0x39, 0x38, 0x35, 0x31, 0x35, 0x37, // vec3(0.120985157 + 0x37, 0x38, 0x37, 0x37, 0x39, 0x39, 0x38, 0x33, 0x35, 0x32, 0x30, 0x35, 0x30, 0x37, 0x38, 0x31, // 7877998352050781 + 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x31, 0x39, 0x32, 0x39, 0x37, 0x39, 0x39, 0x36, 0x31, // 25, 0.1192979961 + 0x36, 0x33, 0x33, 0x36, 0x38, 0x32, 0x32, 0x35, 0x30, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, // 6336822509765625 + 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x31, 0x37, 0x31, 0x31, 0x31, 0x39, 0x36, 0x36, 0x30, 0x31, 0x33, // , 0.117111966013 + 0x39, 0x30, 0x38, 0x33, 0x38, 0x36, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x29, 0x20, // 90838623046875) + 0x2a, 0x20, 0x28, 0x28, 0x2d, 0x30, 0x2e, 0x34, 0x38, 0x38, 0x36, 0x30, 0x32, 0x35, 0x31, 0x39, // * ((-0.488602519 + 0x30, 0x33, 0x35, 0x33, 0x33, 0x39, 0x33, 0x35, 0x35, 0x34, 0x36, 0x38, 0x37, 0x35, 0x29, 0x20, // 03533935546875) + 0x2a, 0x20, 0x5f, 0x33, 0x31, 0x33, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, // * _313)) * 2.0) + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, // * vec3(0.4000000 + 0x30, 0x35, 0x39, 0x36, 0x30, 0x34, 0x36, 0x34, 0x34, 0x37, 0x37, 0x35, 0x33, 0x39, 0x30, 0x36, // 0596046447753906 + 0x32, 0x35, 0x29, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, // 25))) + (((vec3( + 0x2d, 0x30, 0x2e, 0x31, 0x37, 0x36, 0x37, 0x31, 0x31, 0x36, 0x33, 0x33, 0x38, 0x30, 0x31, 0x34, // -0.1767116338014 + 0x36, 0x30, 0x32, 0x36, 0x36, 0x31, 0x31, 0x33, 0x32, 0x38, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, // 6026611328125, - + 0x30, 0x2e, 0x31, 0x37, 0x30, 0x33, 0x33, 0x31, 0x34, 0x30, 0x33, 0x36, 0x31, 0x33, 0x30, 0x39, // 0.17033140361309 + 0x30, 0x35, 0x31, 0x35, 0x31, 0x33, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, // 051513671875, -0 + 0x2e, 0x31, 0x35, 0x31, 0x33, 0x34, 0x35, 0x30, 0x31, 0x34, 0x35, 0x37, 0x32, 0x31, 0x34, 0x33, // .151345014572143 + 0x35, 0x35, 0x34, 0x36, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, // 5546875) * ((1.0 + 0x39, 0x32, 0x35, 0x34, 0x38, 0x34, 0x38, 0x39, 0x35, 0x37, 0x30, 0x36, 0x31, 0x37, 0x36, 0x37, // 9254848957061767 + 0x35, 0x37, 0x38, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x35, 0x29, 0x20, 0x2a, // 578125 * _305) * + 0x20, 0x5f, 0x33, 0x31, 0x33, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2a, // _313)) * 1.0) * + 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, // vec3(0.40000000 + 0x35, 0x39, 0x36, 0x30, 0x34, 0x36, 0x34, 0x34, 0x37, 0x37, 0x35, 0x33, 0x39, 0x30, 0x36, 0x32, // 5960464477539062 + 0x35, 0x29, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, // 5))) + ((vec3(-0 + 0x2e, 0x31, 0x32, 0x34, 0x36, 0x38, 0x32, 0x31, 0x31, 0x33, 0x35, 0x32, 0x38, 0x32, 0x35, 0x31, // .124682113528251 + 0x36, 0x34, 0x37, 0x39, 0x34, 0x39, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, // 64794921875, -0. + 0x31, 0x31, 0x39, 0x33, 0x34, 0x30, 0x37, 0x38, 0x34, 0x38, 0x34, 0x37, 0x37, 0x33, 0x36, 0x33, // 1193407848477363 + 0x35, 0x38, 0x36, 0x34, 0x32, 0x35, 0x37, 0x38, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, // 58642578125, -0. + 0x30, 0x39, 0x36, 0x33, 0x30, 0x30, 0x33, 0x35, 0x36, 0x30, 0x39, 0x30, 0x30, 0x36, 0x38, 0x38, // 0963003560900688 + 0x31, 0x37, 0x31, 0x33, 0x38, 0x36, 0x37, 0x31, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x28, // 17138671875) * ( + 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x39, 0x32, 0x35, 0x34, 0x38, 0x34, 0x38, 0x39, 0x35, 0x37, // ((-1.09254848957 + 0x30, 0x36, 0x31, 0x37, 0x36, 0x37, 0x35, 0x37, 0x38, 0x31, 0x32, 0x35, 0x29, 0x20, 0x2a, 0x20, // 061767578125) * + 0x5f, 0x33, 0x30, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x29, 0x29, 0x20, 0x2a, // _305) * _309)) * + 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, // 0.5)) + ((vec3( + 0x30, 0x2e, 0x30, 0x30, 0x31, 0x38, 0x35, 0x32, 0x33, 0x37, 0x38, 0x35, 0x39, 0x38, 0x34, 0x31, // 0.00185237859841 + 0x34, 0x33, 0x36, 0x31, 0x34, 0x37, 0x36, 0x38, 0x39, 0x38, 0x31, 0x39, 0x33, 0x33, 0x35, 0x39, // 4361476898193359 + 0x33, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x33, 0x32, 0x35, 0x39, 0x32, 0x37, 0x38, // 375, -0.03259278 + 0x34, 0x36, 0x31, 0x33, 0x33, 0x37, 0x30, 0x38, 0x39, 0x35, 0x33, 0x38, 0x35, 0x37, 0x34, 0x32, // 4613370895385742 + 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x38, 0x38, 0x32, 0x30, 0x34, 0x34, // 1875, -0.0882044 + 0x39, 0x35, 0x36, 0x30, 0x38, 0x38, 0x30, 0x36, 0x36, 0x31, 0x30, 0x31, 0x30, 0x37, 0x34, 0x32, // 9560880661010742 + 0x31, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x30, 0x2e, 0x33, 0x31, 0x35, 0x33, 0x39, // 1875) * (0.31539 + 0x31, 0x35, 0x37, 0x30, 0x33, 0x32, 0x39, 0x36, 0x36, 0x36, 0x31, 0x33, 0x37, 0x36, 0x39, 0x35, // 1570329666137695 + 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2a, 0x20, // 3125 * (((3.0 * + 0x5f, 0x33, 0x30, 0x39, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x29, 0x20, 0x2d, 0x20, // _309) * _309) - + 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2b, // 1.0))) * 0.5)) + + 0x20, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x32, 0x39, 0x36, 0x33, 0x36, 0x35, // ((vec3(0.296365 + 0x34, 0x36, 0x39, 0x36, 0x39, 0x34, 0x31, 0x33, 0x37, 0x35, 0x37, 0x33, 0x32, 0x34, 0x32, 0x31, // 4696941375732421 + 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x38, 0x31, 0x32, 0x36, 0x38, 0x36, 0x38, 0x36, // 875, 0.281268686 + 0x30, 0x35, 0x36, 0x31, 0x33, 0x37, 0x30, 0x38, 0x34, 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, // 0561370849609375 + 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x34, 0x33, 0x33, 0x32, 0x38, 0x32, 0x32, 0x38, 0x35, 0x39, 0x32, // , 0.243328228592 + 0x38, 0x37, 0x32, 0x36, 0x31, 0x39, 0x36, 0x32, 0x38, 0x39, 0x30, 0x36, 0x32, 0x35, 0x29, 0x20, // 87261962890625) + 0x2a, 0x20, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x39, 0x32, 0x35, 0x34, 0x38, 0x34, 0x38, // * (((-1.09254848 + 0x39, 0x35, 0x37, 0x30, 0x36, 0x31, 0x37, 0x36, 0x37, 0x35, 0x37, 0x38, 0x31, 0x32, 0x35, 0x29, // 957061767578125) + 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x31, 0x33, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x29, // * _313) * _309) + 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x76, 0x65, // ) * 0.5)) + ((ve + 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x30, 0x37, 0x39, 0x38, 0x32, 0x36, 0x36, 0x36, 0x37, 0x39, // c3(-0.0798266679 + 0x30, 0x34, 0x38, 0x35, 0x33, 0x38, 0x32, 0x30, 0x38, 0x30, 0x30, 0x37, 0x38, 0x31, 0x32, 0x35, // 0485382080078125 + 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x30, 0x39, 0x33, 0x34, 0x30, 0x39, 0x35, 0x38, 0x32, 0x39, // , -0.10934095829 + 0x37, 0x32, 0x35, 0x32, 0x36, 0x35, 0x35, 0x30, 0x32, 0x39, 0x32, 0x39, 0x36, 0x38, 0x37, 0x35, // 7252655029296875 + 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x35, 0x37, 0x32, 0x30, 0x38, 0x38, 0x35, 0x39, 0x39, 0x32, // , -0.15720885992 + 0x30, 0x35, 0x30, 0x31, 0x37, 0x30, 0x38, 0x39, 0x38, 0x34, 0x33, 0x37, 0x35, 0x29, 0x20, 0x2a, // 0501708984375) * + 0x20, 0x28, 0x30, 0x2e, 0x35, 0x34, 0x36, 0x32, 0x37, 0x34, 0x32, 0x34, 0x34, 0x37, 0x38, 0x35, // (0.546274244785 + 0x33, 0x30, 0x38, 0x38, 0x33, 0x37, 0x38, 0x39, 0x30, 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, // 308837890625 * ( + 0x28, 0x5f, 0x33, 0x31, 0x33, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x31, 0x33, 0x29, 0x20, 0x2d, 0x20, // (_313 * _313) - + 0x28, 0x5f, 0x33, 0x30, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x35, 0x29, 0x29, 0x29, 0x29, // (_305 * _305)))) + 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, // * 0.5);. bgf + 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, // x_FragColor.x = + 0x5f, 0x34, 0x33, 0x39, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, // _439.x;. bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, // _FragColor.y = _ + 0x34, 0x33, 0x39, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // 439.y;. bgfx_ + 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, // FragColor.z = _4 + 0x33, 0x39, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // 39.z;. bgfx_F + 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, // ragColor.w = 1.0 + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... +}; +static const uint8_t fs_mesh_essl[1950] = +{ + 0x46, 0x53, 0x48, 0x0b, 0xe3, 0xc2, 0x5c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x07, // FSH....e........ + 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, // ..precision medi + 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, // ump float;.preci + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, // sion highp int;. + 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // .in highp vec3 v + 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, // _normal;.layout( + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, // location = 0) ou + 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, // t highp vec4 bgf + 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, // x_FragColor;..vo + 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // id main().{. + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x35, 0x30, 0x20, // highp vec3 _250 + 0x3d, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x76, 0x5f, 0x6e, 0x6f, // = normalize(v_no + 0x72, 0x6d, 0x61, 0x6c, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // rmal);. highp + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x32, // float _305 = _2 + 0x35, 0x30, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // 50.x;. highp + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, // float _309 = _25 + 0x30, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, // 0.y;. highp f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x30, // loat _313 = _250 + 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // .z;. highp ve + 0x63, 0x33, 0x20, 0x5f, 0x34, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, // c3 _439 = (((((( + 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x32, 0x37, 0x32, 0x39, 0x39, 0x39, 0x32, 0x32, // (vec3(0.27299922 + 0x37, 0x30, 0x34, 0x36, 0x39, 0x36, 0x36, 0x35, 0x35, 0x32, 0x37, 0x33, 0x34, 0x33, 0x37, 0x35, // 7046966552734375 + 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x37, 0x35, 0x34, 0x37, 0x30, 0x31, 0x30, 0x37, 0x37, 0x39, 0x33, // , 0.275470107793 + 0x38, 0x30, 0x37, 0x39, 0x38, 0x33, 0x33, 0x39, 0x38, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, // 8079833984375, 0 + 0x2e, 0x32, 0x35, 0x31, 0x34, 0x30, 0x38, 0x30, 0x34, 0x30, 0x35, 0x32, 0x33, 0x35, 0x32, 0x39, // .251408040523529 + 0x30, 0x35, 0x32, 0x37, 0x33, 0x34, 0x33, 0x37, 0x35, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, // 052734375) + ((( + 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x33, 0x38, 0x34, 0x31, 0x36, 0x33, 0x34, 0x39, // vec3(-0.38416349 + 0x38, 0x38, 0x37, 0x38, 0x34, 0x37, 0x39, 0x30, 0x30, 0x33, 0x39, 0x30, 0x36, 0x32, 0x35, 0x2c, // 887847900390625, + 0x20, 0x2d, 0x30, 0x2e, 0x34, 0x32, 0x33, 0x34, 0x39, 0x32, 0x32, 0x38, 0x32, 0x36, 0x32, 0x39, // -0.423492282629 + 0x30, 0x31, 0x33, 0x30, 0x36, 0x31, 0x35, 0x32, 0x33, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x2d, // 0130615234375, - + 0x30, 0x2e, 0x34, 0x32, 0x35, 0x35, 0x33, 0x32, 0x37, 0x32, 0x38, 0x34, 0x33, 0x33, 0x36, 0x30, // 0.42553272843360 + 0x39, 0x30, 0x30, 0x38, 0x37, 0x38, 0x39, 0x30, 0x36, 0x32, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x28, // 90087890625) * ( + 0x28, 0x2d, 0x30, 0x2e, 0x34, 0x38, 0x38, 0x36, 0x30, 0x32, 0x35, 0x31, 0x39, 0x30, 0x33, 0x35, // (-0.488602519035 + 0x33, 0x33, 0x39, 0x33, 0x35, 0x35, 0x34, 0x36, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, // 33935546875) * _ + 0x33, 0x30, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x76, // 305)) * 2.0) * v + 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x35, 0x39, // ec3(0.4000000059 + 0x36, 0x30, 0x34, 0x36, 0x34, 0x34, 0x37, 0x37, 0x35, 0x33, 0x39, 0x30, 0x36, 0x32, 0x35, 0x29, // 604644775390625) + 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, // )) + (((vec3(0.0 + 0x35, 0x35, 0x39, 0x30, 0x36, 0x32, 0x39, 0x35, 0x37, 0x37, 0x36, 0x33, 0x36, 0x37, 0x31, 0x38, // 5590629577636718 + 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x36, 0x36, 0x32, 0x37, 0x34, 0x33, 0x37, 0x34, // 75, 0.0566274374 + 0x37, 0x32, 0x33, 0x34, 0x33, 0x34, 0x34, 0x34, 0x38, 0x32, 0x34, 0x32, 0x31, 0x38, 0x37, 0x35, // 7234344482421875 + 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x36, 0x39, 0x39, 0x36, 0x39, 0x39, 0x33, 0x37, 0x32, 0x30, 0x35, // , 0.069969937205 + 0x33, 0x31, 0x34, 0x36, 0x33, 0x36, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x29, 0x20, // 31463623046875) + 0x2a, 0x20, 0x28, 0x30, 0x2e, 0x34, 0x38, 0x38, 0x36, 0x30, 0x32, 0x35, 0x31, 0x39, 0x30, 0x33, // * (0.48860251903 + 0x35, 0x33, 0x33, 0x39, 0x33, 0x35, 0x35, 0x34, 0x36, 0x38, 0x37, 0x35, 0x20, 0x2a, 0x20, 0x5f, // 533935546875 * _ + 0x33, 0x30, 0x39, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x76, // 309)) * 2.0) * v + 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x35, 0x39, // ec3(0.4000000059 + 0x36, 0x30, 0x34, 0x36, 0x34, 0x34, 0x37, 0x37, 0x35, 0x33, 0x39, 0x30, 0x36, 0x32, 0x35, 0x29, // 604644775390625) + 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x31, // )) + (((vec3(0.1 + 0x32, 0x30, 0x39, 0x38, 0x35, 0x31, 0x35, 0x37, 0x37, 0x38, 0x37, 0x37, 0x39, 0x39, 0x38, 0x33, // 2098515778779983 + 0x35, 0x32, 0x30, 0x35, 0x30, 0x37, 0x38, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x31, // 5205078125, 0.11 + 0x39, 0x32, 0x39, 0x37, 0x39, 0x39, 0x36, 0x31, 0x36, 0x33, 0x33, 0x36, 0x38, 0x32, 0x32, 0x35, // 9297996163368225 + 0x30, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x31, 0x37, 0x31, // 09765625, 0.1171 + 0x31, 0x31, 0x39, 0x36, 0x36, 0x30, 0x31, 0x33, 0x39, 0x30, 0x38, 0x33, 0x38, 0x36, 0x32, 0x33, // 1196601390838623 + 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x2d, 0x30, 0x2e, 0x34, // 046875) * ((-0.4 + 0x38, 0x38, 0x36, 0x30, 0x32, 0x35, 0x31, 0x39, 0x30, 0x33, 0x35, 0x33, 0x33, 0x39, 0x33, 0x35, // 8860251903533935 + 0x35, 0x34, 0x36, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x31, 0x33, 0x29, 0x29, // 546875) * _313)) + 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, // * 2.0) * vec3(0 + 0x2e, 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x35, 0x39, 0x36, 0x30, 0x34, 0x36, 0x34, // .400000005960464 + 0x34, 0x37, 0x37, 0x35, 0x33, 0x39, 0x30, 0x36, 0x32, 0x35, 0x29, 0x29, 0x29, 0x20, 0x2b, 0x20, // 4775390625))) + + 0x28, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x31, 0x37, 0x36, 0x37, 0x31, // (((vec3(-0.17671 + 0x31, 0x36, 0x33, 0x33, 0x38, 0x30, 0x31, 0x34, 0x36, 0x30, 0x32, 0x36, 0x36, 0x31, 0x31, 0x33, // 1633801460266113 + 0x32, 0x38, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x37, 0x30, 0x33, 0x33, 0x31, // 28125, -0.170331 + 0x34, 0x30, 0x33, 0x36, 0x31, 0x33, 0x30, 0x39, 0x30, 0x35, 0x31, 0x35, 0x31, 0x33, 0x36, 0x37, // 4036130905151367 + 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x35, 0x31, 0x33, 0x34, 0x35, 0x30, // 1875, -0.1513450 + 0x31, 0x34, 0x35, 0x37, 0x32, 0x31, 0x34, 0x33, 0x35, 0x35, 0x34, 0x36, 0x38, 0x37, 0x35, 0x29, // 145721435546875) + 0x20, 0x2a, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x39, 0x32, 0x35, 0x34, 0x38, 0x34, 0x38, 0x39, // * ((1.092548489 + 0x35, 0x37, 0x30, 0x36, 0x31, 0x37, 0x36, 0x37, 0x35, 0x37, 0x38, 0x31, 0x32, 0x35, 0x20, 0x2a, // 57061767578125 * + 0x20, 0x5f, 0x33, 0x30, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x31, 0x33, 0x29, 0x29, 0x20, // _305) * _313)) + 0x2a, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, // * 1.0) * vec3(0. + 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x35, 0x39, 0x36, 0x30, 0x34, 0x36, 0x34, 0x34, // 4000000059604644 + 0x37, 0x37, 0x35, 0x33, 0x39, 0x30, 0x36, 0x32, 0x35, 0x29, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, // 775390625))) + ( + 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x31, 0x32, 0x34, 0x36, 0x38, 0x32, 0x31, // (vec3(-0.1246821 + 0x31, 0x33, 0x35, 0x32, 0x38, 0x32, 0x35, 0x31, 0x36, 0x34, 0x37, 0x39, 0x34, 0x39, 0x32, 0x31, // 1352825164794921 + 0x38, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x31, 0x39, 0x33, 0x34, 0x30, 0x37, 0x38, // 875, -0.11934078 + 0x34, 0x38, 0x34, 0x37, 0x37, 0x33, 0x36, 0x33, 0x35, 0x38, 0x36, 0x34, 0x32, 0x35, 0x37, 0x38, // 4847736358642578 + 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x39, 0x36, 0x33, 0x30, 0x30, 0x33, 0x35, // 125, -0.09630035 + 0x36, 0x30, 0x39, 0x30, 0x30, 0x36, 0x38, 0x38, 0x31, 0x37, 0x31, 0x33, 0x38, 0x36, 0x37, 0x31, // 6090068817138671 + 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x39, 0x32, // 875) * (((-1.092 + 0x35, 0x34, 0x38, 0x34, 0x38, 0x39, 0x35, 0x37, 0x30, 0x36, 0x31, 0x37, 0x36, 0x37, 0x35, 0x37, // 5484895706176757 + 0x38, 0x31, 0x32, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x35, 0x29, 0x20, 0x2a, 0x20, // 8125) * _305) * + 0x5f, 0x33, 0x30, 0x39, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2b, // _309)) * 0.5)) + + 0x20, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x38, 0x35, 0x32, // ((vec3(0.001852 + 0x33, 0x37, 0x38, 0x35, 0x39, 0x38, 0x34, 0x31, 0x34, 0x33, 0x36, 0x31, 0x34, 0x37, 0x36, 0x38, // 3785984143614768 + 0x39, 0x38, 0x31, 0x39, 0x33, 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, // 98193359375, -0. + 0x30, 0x33, 0x32, 0x35, 0x39, 0x32, 0x37, 0x38, 0x34, 0x36, 0x31, 0x33, 0x33, 0x37, 0x30, 0x38, // 0325927846133708 + 0x39, 0x35, 0x33, 0x38, 0x35, 0x37, 0x34, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, // 953857421875, -0 + 0x2e, 0x30, 0x38, 0x38, 0x32, 0x30, 0x34, 0x34, 0x39, 0x35, 0x36, 0x30, 0x38, 0x38, 0x30, 0x36, // .088204495608806 + 0x36, 0x31, 0x30, 0x31, 0x30, 0x37, 0x34, 0x32, 0x31, 0x38, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, // 610107421875) * + 0x28, 0x30, 0x2e, 0x33, 0x31, 0x35, 0x33, 0x39, 0x31, 0x35, 0x37, 0x30, 0x33, 0x32, 0x39, 0x36, // (0.3153915703296 + 0x36, 0x36, 0x31, 0x33, 0x37, 0x36, 0x39, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, // 661376953125 * ( + 0x28, 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x29, 0x20, 0x2a, 0x20, // ((3.0 * _309) * + 0x5f, 0x33, 0x30, 0x39, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x20, 0x2a, // _309) - 1.0))) * + 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, // 0.5)) + ((vec3( + 0x30, 0x2e, 0x32, 0x39, 0x36, 0x33, 0x36, 0x35, 0x34, 0x36, 0x39, 0x36, 0x39, 0x34, 0x31, 0x33, // 0.29636546969413 + 0x37, 0x35, 0x37, 0x33, 0x32, 0x34, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, // 75732421875, 0.2 + 0x38, 0x31, 0x32, 0x36, 0x38, 0x36, 0x38, 0x36, 0x30, 0x35, 0x36, 0x31, 0x33, 0x37, 0x30, 0x38, // 8126868605613708 + 0x34, 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x34, 0x33, 0x33, // 49609375, 0.2433 + 0x32, 0x38, 0x32, 0x32, 0x38, 0x35, 0x39, 0x32, 0x38, 0x37, 0x32, 0x36, 0x31, 0x39, 0x36, 0x32, // 2822859287261962 + 0x38, 0x39, 0x30, 0x36, 0x32, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, // 890625) * (((-1. + 0x30, 0x39, 0x32, 0x35, 0x34, 0x38, 0x34, 0x38, 0x39, 0x35, 0x37, 0x30, 0x36, 0x31, 0x37, 0x36, // 0925484895706176 + 0x37, 0x35, 0x37, 0x38, 0x31, 0x32, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x31, 0x33, 0x29, // 7578125) * _313) + 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x39, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, // * _309)) * 0.5) + 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x30, 0x37, // ) + ((vec3(-0.07 + 0x39, 0x38, 0x32, 0x36, 0x36, 0x36, 0x37, 0x39, 0x30, 0x34, 0x38, 0x35, 0x33, 0x38, 0x32, 0x30, // 9826667904853820 + 0x38, 0x30, 0x30, 0x37, 0x38, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x30, 0x39, // 80078125, -0.109 + 0x33, 0x34, 0x30, 0x39, 0x35, 0x38, 0x32, 0x39, 0x37, 0x32, 0x35, 0x32, 0x36, 0x35, 0x35, 0x30, // 3409582972526550 + 0x32, 0x39, 0x32, 0x39, 0x36, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x35, 0x37, // 29296875, -0.157 + 0x32, 0x30, 0x38, 0x38, 0x35, 0x39, 0x39, 0x32, 0x30, 0x35, 0x30, 0x31, 0x37, 0x30, 0x38, 0x39, // 2088599205017089 + 0x38, 0x34, 0x33, 0x37, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x34, 0x36, 0x32, // 84375) * (0.5462 + 0x37, 0x34, 0x32, 0x34, 0x34, 0x37, 0x38, 0x35, 0x33, 0x30, 0x38, 0x38, 0x33, 0x37, 0x38, 0x39, // 7424478530883789 + 0x30, 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x31, 0x33, 0x20, 0x2a, 0x20, // 0625 * ((_313 * + 0x5f, 0x33, 0x31, 0x33, 0x29, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x33, 0x30, 0x35, 0x20, 0x2a, 0x20, // _313) - (_305 * + 0x5f, 0x33, 0x30, 0x35, 0x29, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x3b, // _305)))) * 0.5); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // . bgfx_FragCo + 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x33, 0x39, 0x2e, 0x78, 0x3b, 0x0a, // lor.x = _439.x;. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, // bgfx_FragCol + 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x33, 0x39, 0x2e, 0x79, 0x3b, 0x0a, 0x20, // or.y = _439.y;. + 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, // bgfx_FragColo + 0x72, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x33, 0x39, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, // r.z = _439.z;. + 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // bgfx_FragColor + 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .w = 1.0;.}... }; static const uint8_t fs_mesh_spv[2342] = { diff --git a/tools/geometryv/vs_mesh.bin.h b/tools/geometryv/vs_mesh.bin.h index f21811402..ac8cb5b32 100644 --- a/tools/geometryv/vs_mesh.bin.h +++ b/tools/geometryv/vs_mesh.bin.h @@ -1,67 +1,56 @@ -static const uint8_t vs_mesh_glsl[445] = +static const uint8_t vs_mesh_glsl[371] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xe3, 0xc2, 0x5c, 0x65, 0x02, 0x00, 0x0f, 0x75, // VSH........e...u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, // .........u_model - 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x01, 0x00, 0x00, 0x61, 0x74, // ..........~...at - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x6e, // tribute vec3 a_n - 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, // ormal;.attribute - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, // vec3 a_position - 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // ;.varying vec3 v - 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // _normal;.uniform - 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, // mat4 u_modelVie - 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, // wProj;.uniform m - 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, // at4 u_model[1];. - 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, // void main ().{. - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, // vec4 tmpvar_1;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, // tmpvar_1.w = 1 - 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, // .0;. tmpvar_1.x - 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, // yz = a_position; - 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, // . gl_Position = - 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, // (u_modelViewPro - 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, // j * tmpvar_1);. - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, // vec4 tmpvar_2;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x30, // tmpvar_2.w = 0 - 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, // .0;. tmpvar_2.x - 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x61, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, // yz = ((a_normal - 0x2a, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, // * 2.0) - 1.0);. - 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, // v_normal = (u_m - 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // odel[0] * tmpvar - 0x5f, 0x32, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _2).xyz;.}... -}; -static const uint8_t vs_mesh_essl[481] = -{ - 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xe3, 0xc2, 0x5c, 0x65, 0x02, 0x00, 0x0f, 0x75, // VSH........e...u - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, // .........u_model - 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x01, 0x00, 0x00, 0x61, 0x74, // ..............at - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // tribute highp ve - 0x63, 0x33, 0x20, 0x61, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x61, 0x74, 0x74, // c3 a_normal;.att - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // ribute highp vec - 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x76, 0x61, // 3 a_position;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, // rying highp vec3 - 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // v_normal;.unifo - 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // rm highp mat4 u_ - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, // modelViewProj;.u + 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x0a, 0x75, // ..........4....u 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, // niform mat4 u_mo - 0x64, 0x65, 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, // del[1];.void mai - 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // n ().{. highp v - 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, // ec4 tmpvar_1;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, // tmpvar_1.w = 1.0 - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, // ;. tmpvar_1.xyz - 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, // = a_position;. - 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, // gl_Position = ( - 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj - 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, // * tmpvar_1);. h - 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ighp vec4 tmpvar - 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, // _2;. tmpvar_2.w - 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // = 0.0;. tmpvar - 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x61, 0x5f, 0x6e, 0x6f, 0x72, // _2.xyz = ((a_nor - 0x6d, 0x61, 0x6c, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, // mal * 2.0) - 1.0 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x3d, 0x20, // );. v_normal = - 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x74, 0x6d, // (u_model[0] * tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, // pvar_2).xyz;.}.. - 0x00, // . + 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // delViewProj;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, // l[1];..layout(lo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, // cation = 1) in v + 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec3 a_position;. + 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, // layout(location + 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x6e, // = 0) in vec3 a_n + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // ormal;.out vec3 + 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // v_normal;..void + 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, // main().{. gl_ + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // Position = u_mod + 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, // elViewProj * vec + 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x2e, // 4(a_position, 1. + 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, // 0);. v_normal + 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x30, 0x5d, 0x20, 0x2a, // = (u_model[0] * + 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x28, 0x61, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, // vec4((a_normal + 0x2a, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, // * 2.0) - vec3(1. + 0x30, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x7d, // 0), 0.0)).xyz;.} + 0x0a, 0x0a, 0x00, // ... +}; +static const uint8_t vs_mesh_essl[371] = +{ + 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xe3, 0xc2, 0x5c, 0x65, 0x02, 0x00, 0x0f, 0x75, // VSH........e...u + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, // .........u_model + 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x0a, 0x75, // ..........4....u + 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, // niform mat4 u_mo + 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // delViewProj;.uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, // l[1];..layout(lo + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, // cation = 1) in v + 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec3 a_position;. + 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, // layout(location + 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x6e, // = 0) in vec3 a_n + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // ormal;.out vec3 + 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // v_normal;..void + 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, // main().{. gl_ + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // Position = u_mod + 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, // elViewProj * vec + 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x2e, // 4(a_position, 1. + 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, // 0);. v_normal + 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5b, 0x30, 0x5d, 0x20, 0x2a, // = (u_model[0] * + 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x28, 0x61, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, // vec4((a_normal + 0x2a, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, // * 2.0) - vec3(1. + 0x30, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x7d, // 0), 0.0)).xyz;.} + 0x0a, 0x0a, 0x00, // ... }; static const uint8_t vs_mesh_spv[1514] = { diff --git a/tools/shaderc/shaderc.cpp b/tools/shaderc/shaderc.cpp index 38c353cb6..4b6d88e03 100644 --- a/tools/shaderc/shaderc.cpp +++ b/tools/shaderc/shaderc.cpp @@ -70,10 +70,6 @@ namespace bgfx // v - vertex // // OpenGL #version Features Direct3D Features Shader Model - // 2.1 120 vf 9.0 vf 2.0 - // 3.0 130 - // 3.1 140 - // 3.2 150 vgf // 3.3 330 10.0 vgf 4.0 // 4.0 400 vhdgf // 4.1 410 @@ -119,7 +115,6 @@ namespace bgfx static const Profile s_profiles[] = { - { ShadingLang::ESSL, 100, "100_es" }, { ShadingLang::ESSL, 300, "300_es" }, { ShadingLang::ESSL, 310, "310_es" }, { ShadingLang::ESSL, 320, "320_es" }, @@ -153,10 +148,6 @@ namespace bgfx { ShadingLang::SpirV, 1411, "spirv14-11" }, { ShadingLang::SpirV, 1512, "spirv15-12" }, { ShadingLang::SpirV, 1613, "spirv16-13" }, - { ShadingLang::GLSL, 120, "120" }, - { ShadingLang::GLSL, 130, "130" }, - { ShadingLang::GLSL, 140, "140" }, - { ShadingLang::GLSL, 150, "150" }, { ShadingLang::GLSL, 330, "330" }, { ShadingLang::GLSL, 400, "400" }, { ShadingLang::GLSL, 410, "410" }, @@ -166,72 +157,6 @@ namespace bgfx { ShadingLang::WGSL, 1010, "wgsl" }, }; - static const char* s_ARB_shader_texture_lod[] = - { - "texture2DLod", - "texture2DArrayLod", // BK - interacts with ARB_texture_array. - "texture2DProjLod", - "texture2DGrad", - "texture2DProjGrad", - "texture3DLod", - "texture3DProjLod", - "texture3DGrad", - "texture3DProjGrad", - "textureCubeLod", - "textureCubeGrad", - "shadow2DLod", - "shadow2DProjLod", - NULL - // "texture1DLod", - // "texture1DProjLod", - // "shadow1DLod", - // "shadow1DProjLod", - }; - - static const char* s_EXT_shader_texture_lod[] = - { - "texture2DLod", - "texture2DProjLod", - "textureCubeLod", - "texture2DGrad", - "texture2DProjGrad", - "textureCubeGrad", - NULL - }; - - static const char* s_EXT_shadow_samplers[] = - { - "shadow2D", - "shadow2DProj", - "sampler2DShadow", - NULL - }; - - static const char* s_OES_standard_derivatives[] = - { - "dFdx", - "dFdy", - "fwidth", - NULL - }; - - static const char* s_OES_texture_3D[] = - { - "texture3D", - "texture3DProj", - "texture3DLod", - "texture3DProjLod", - NULL - }; - - static const char* s_EXT_gpu_shader4[] = - { - "gl_VertexID", - "gl_InstanceID", - "texture2DLodOffset", - NULL - }; - // To be use from vertex program require: // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_viewport_layer_array.txt // DX11 11_1 feature level @@ -259,46 +184,6 @@ namespace bgfx NULL }; - static const char* s_130[] = - { - "uint", - "uint2", - "uint3", - "uint4", - "isampler2D", - "usampler2D", - "isampler3D", - "usampler3D", - "isamplerCube", - "usamplerCube", - "textureSize", - NULL - }; - - static const char* s_textureArray[] = - { - "sampler2DArray", - "texture2DArray", - "texture2DArrayLod", - "shadow2DArray", - NULL - }; - - static const char* s_ARB_texture_multisample[] = - { - "sampler2DMS", - "isampler2DMS", - "usampler2DMS", - NULL - }; - - static const char* s_texelFetch[] = - { - "texelFetch", - "texelFetchOffset", - NULL - }; - static const char* s_bitsToEncoders[] = { "floatBitsToUint", @@ -308,17 +193,6 @@ namespace bgfx NULL }; - static const char* s_integerVecs[] = - { - "ivec2", - "uvec2", - "ivec3", - "uvec3", - "ivec4", - "uvec4", - NULL - }; - static const char* s_allowedVertexShaderInputs[] = { "a_position", @@ -1191,7 +1065,7 @@ namespace bgfx { '\0', "preprocess", 0, NULL, "Only pre-process." }, { '\0', "keepcomments", 0, NULL, "Do not discard comments." }, { '\0', "define", 1, "", "Add defines to preprocessor. (Semicolon-separated)" }, - { '\0', "raw", 0, NULL, "Do not process shader. No preprocessor, and no glsl-optimizer. (GLSL only)" }, + { '\0', "raw", 0, NULL, "Do not process shader. No preprocessor. (GLSL only)" }, { '\0', "type", 1, "", "Shader type. Can be 'vertex', 'fragment, or 'compute'." }, { '\0', "varyingdef", 1, "", "varying.def.sc's file path." }, { '\0', "verbose", 0, NULL, "Be verbose." }, @@ -1302,7 +1176,32 @@ namespace bgfx const Profile* profile = &s_profiles[profileId]; - Preprocessor preprocessor(_options.inputFilePath.c_str(), profile->lang == ShadingLang::ESSL, _messageWriter); + // ESSL is compiled as desktop GLSL, and cross-compiled back down to the + // requested ESSL version by SPIR-V Cross. glslang's ESSL front-end is + // far stricter than the desktop one, and ESSL below 3.10 can't be + // translated to SPIR-V at all. + uint32_t esslVersion = 0; + + if (profile->lang == ShadingLang::ESSL) + { + // Compute requires ESSL 3.10, or above. + esslVersion = 'c' == _options.shaderType + ? bx::max(profile->id, 310) + : profile->id + ; + + for (uint32_t ii = 0; ii < BX_COUNTOF(s_profiles); ++ii) + { + if (ShadingLang::GLSL == s_profiles[ii].lang + && 430 == s_profiles[ii].id) + { + profile = &s_profiles[ii]; + break; + } + } + } + + Preprocessor preprocessor(_options.inputFilePath.c_str(), 0 != esslVersion, _messageWriter); for (size_t ii = 0; ii < _options.includeDirs.size(); ++ii) { @@ -1347,19 +1246,19 @@ namespace bgfx char hlslDefine[128] = { '\0' }; char dxilDefine[128] = { '\0' }; - if (profile->lang == ShadingLang::GLSL - || profile->lang == ShadingLang::ESSL) + if (profile->lang == ShadingLang::GLSL) { bx::snprintf(glslDefine, BX_COUNTOF(glslDefine) , "BGFX_SHADER_LANGUAGE_GLSL=%d" , profile->id ); - if (profile->lang == ShadingLang::ESSL) + if (0 != esslVersion) { + // Compiled as desktop GLSL, but still targeting ESSL. bx::snprintf(esslDefine, BX_COUNTOF(esslDefine) , "BGFX_SHADER_LANGUAGE_ESSL=%d" - , profile->id + , esslVersion ); } } @@ -1465,8 +1364,7 @@ namespace bgfx preprocessor.setDefine(hlslDefine); preprocessor.setDefine(dxilDefine); } - else if (profile->lang == ShadingLang::GLSL - || profile->lang == ShadingLang::ESSL) + else if (profile->lang == ShadingLang::GLSL) { preprocessor.setDefine(glslDefine); preprocessor.setDefine(esslDefine); @@ -1494,8 +1392,7 @@ namespace bgfx preprocessor.setDefine(hlslDefine); preprocessor.setDefine(dxilDefine); } - else if (profile->lang == ShadingLang::GLSL - || profile->lang == ShadingLang::ESSL) + else if (profile->lang == ShadingLang::GLSL) { preprocessor.setDefine(glslDefine); preprocessor.setDefine(esslDefine); @@ -1537,7 +1434,6 @@ namespace bgfx bx::StringView parse(_varying); bx::StringView term(parse); - bool usesInterpolationQualifiers = false; while (!parse.isEmpty() ) { @@ -1595,7 +1491,6 @@ namespace bgfx || 0 == bx::strCmp(typen, "centroid", 8) ) { interpolation = typen; - usesInterpolationQualifiers = true; typen = nextWord(parse); } @@ -1805,8 +1700,7 @@ namespace bgfx } else { - if (profile->lang == ShadingLang::GLSL - || profile->lang == ShadingLang::ESSL) + if (profile->lang == ShadingLang::GLSL) { } else @@ -1904,32 +1798,22 @@ namespace bgfx bx::write(_shaderWriter, uint32_t(0), &err); bx::write(_shaderWriter, outputHash, &err); - if (profile->lang == ShadingLang::GLSL - || profile->lang == ShadingLang::ESSL) + if (profile->lang == ShadingLang::GLSL) { - if (profile->lang == ShadingLang::ESSL) - { - bx::stringPrintf(code, "#version 310 es\n"); - } - else - { - bx::stringPrintf( - code - , "#version %d\n" - , (profile->lang != ShadingLang::GLSL) ? 430 : profile->id - ); - } + // Compute requires GLSL 4.30. + const uint32_t glsl_profile = bx::max(profile->id, 430); + bx::stringPrintf(code, "#version %d\n", glsl_profile); + + code += _comment; code += preprocessor.m_preprocessed; - bx::write(_shaderWriter, uint16_t(0), &err); - - uint32_t shaderSize = (uint32_t)code.size(); - bx::write(_shaderWriter, shaderSize, &err); - bx::write(_shaderWriter, code.c_str(), shaderSize, &err); - bx::write(_shaderWriter, uint8_t(0), &err); - - compiled = true; + compiled = compileGLSLShader(_options + , 0 != esslVersion ? (esslVersion | 0x80000000) : glsl_profile + , code + , _shaderWriter + , _messageWriter + ); } else { @@ -1990,44 +1874,14 @@ namespace bgfx } else { - if (profile->lang == ShadingLang::GLSL - || profile->lang == ShadingLang::ESSL) + if (profile->lang == ShadingLang::GLSL) { - if (profile->lang != ShadingLang::ESSL) - { - // bgfx shadow2D/Proj behave like EXT_shadow_samplers - // not as GLSL language 1.2 specs shadow2D/Proj. - preprocessor.writef( - "#define shadow2D(_sampler, _coord) bgfxShadow2D(_sampler, _coord).x\n" - "#define shadow2DProj(_sampler, _coord) bgfxShadow2DProj(_sampler, _coord).x\n" - ); - } - - // gl_FragColor and gl_FragData are deprecated for essl > 300 - if (profile->lang == ShadingLang::ESSL - && profile->id >= 300) - { - const bool hasFragColor = !strFindUncommented(_options.keepComments, input, "gl_FragColor").isEmpty(); - bool hasFragData[8] = {}; - uint32_t numFragData = 0; - for (uint32_t ii = 0; ii < BX_COUNTOF(hasFragData); ++ii) - { - char temp[32]; - bx::snprintf(temp, BX_COUNTOF(temp), "gl_FragData[%d]", ii); - hasFragData[ii] = !strFindUncommented(_options.keepComments, input, temp).isEmpty(); - numFragData += hasFragData[ii]; - } - if (hasFragColor) - { - preprocessor.writef("#define gl_FragColor bgfx_FragColor\n"); - preprocessor.writef("out mediump vec4 bgfx_FragColor;\n"); - } - else if (numFragData) - { - preprocessor.writef("#define gl_FragData bgfx_FragData\n"); - preprocessor.writef("out mediump vec4 bgfx_FragData[gl_MaxDrawBuffers];\n"); - } - } + // bgfx shadow2D/Proj behave like EXT_shadow_samplers + // not as GLSL language 1.2 specs shadow2D/Proj. + preprocessor.writef( + "#define shadow2D(_sampler, _coord) bgfxShadow2D(_sampler, _coord).x\n" + "#define shadow2DProj(_sampler, _coord) bgfxShadow2DProj(_sampler, _coord).x\n" + ); for (InOut::const_iterator it = shaderInputs.begin(), itEnd = shaderInputs.end(); it != itEnd; ++it) { @@ -2450,8 +2304,7 @@ namespace bgfx bx::write(_shaderWriter, outputHash, &err); } - if (profile->lang == ShadingLang::GLSL - || profile->lang == ShadingLang::ESSL) + if (profile->lang == ShadingLang::GLSL) { const bx::StringView preprocessedInput(preprocessor.m_preprocessed.c_str() ); uint32_t glsl_profile = profile->id; @@ -2465,363 +2318,109 @@ namespace bgfx || !bx::strFind(preprocessedInput, "image2D").isEmpty() || usesBitsToEncoders) { - if (profile->lang == ShadingLang::GLSL - && glsl_profile < 430) + if (glsl_profile < 430) { glsl_profile = 430; } - else if (glsl_profile < 310) + + // Images, and storage buffers, require ESSL 3.10. + if (0 != esslVersion) { - glsl_profile = 310; + esslVersion = bx::max(esslVersion, 310); } } + bx::stringPrintf(code, "#version %d\n", glsl_profile); + if (glsl_profile < 400) { - const bool usesTextureLod = false - || !bx::findIdentifierMatch(input, s_ARB_shader_texture_lod).isEmpty() - || !bx::findIdentifierMatch(input, s_EXT_shader_texture_lod).isEmpty() - ; - const bool usesGpuShader5 = true && _options.shaderType != 'f' && !bx::findIdentifierMatch(input, s_ARB_gpu_shader5).isEmpty() ; - const bool usesInstanceID = !bx::findIdentifierMatch(input, "gl_InstanceID").isEmpty(); - const bool usesGpuShader4 = !bx::findIdentifierMatch(input, s_EXT_gpu_shader4).isEmpty(); - const bool usesTexelFetch = !bx::findIdentifierMatch(input, s_texelFetch).isEmpty(); - const bool usesTextureMS = !bx::findIdentifierMatch(input, s_ARB_texture_multisample).isEmpty(); - const bool usesTextureArray = !bx::findIdentifierMatch(input, s_textureArray).isEmpty(); - const bool usesPacking = !bx::findIdentifierMatch(input, s_ARB_shading_language_packing).isEmpty(); - const bool usesViewportLayerArray = !bx::findIdentifierMatch(input, s_ARB_shader_viewport_layer_array).isEmpty(); - const bool usesIntegerVecs = !bx::findIdentifierMatch(preprocessedInput, s_integerVecs).isEmpty(); + const bool usesPacking = !bx::findIdentifierMatch(input, s_ARB_shading_language_packing).isEmpty(); - if (profile->lang != ShadingLang::ESSL) + if (usesGpuShader5) { - const bool need130 = (120 == glsl_profile && (false - || !bx::findIdentifierMatch(input, s_130).isEmpty() - || usesInterpolationQualifiers - || usesTexelFetch - || usesIntegerVecs - ) ); - - bx::stringPrintf(code, "#version %d\n", need130 ? 130 : glsl_profile); - - if (need130 - || glsl_profile >= 130) - { - bx::stringPrintf(code, "#define attribute in\n"); - bx::stringPrintf(code, "#define varying %s\n" - , 'f' == _options.shaderType ? "in" : "out" - ); - bx::stringPrintf(code - , "#define bgfxShadow2D(_sampler, _coord) vec4_splat(texture(_sampler, _coord) )\n" - "#define bgfxShadow2DProj(_sampler, _coord) vec4_splat(textureProj(_sampler, _coord) )\n" - ); - } - else - { - bx::stringPrintf(code - , "#define bgfxShadow2D shadow2D\n" - "#define bgfxShadow2DProj shader2DProj\n" - ); - } - - if (usesInstanceID) - { - bx::stringPrintf(code - , "#extension GL_ARB_draw_instanced : enable\n" - ); - } - - if (usesViewportLayerArray) - { - bx::stringPrintf(code - , "#extension GL_ARB_shader_viewport_layer_array : enable\n" - ); - } - - if (usesGpuShader4) - { - bx::stringPrintf(code - , "#extension GL_EXT_gpu_shader4 : enable\n" - ); - } - - if (usesGpuShader5) - { - bx::stringPrintf(code - , "#extension GL_ARB_gpu_shader5 : enable\n" - ); - } - - if (usesPacking) - { - bx::stringPrintf(code - , "#extension GL_ARB_shading_language_packing : enable\n" - ); - } - - bool ARB_shader_texture_lod = false; - bool EXT_shader_texture_lod = false; - - if (usesTextureLod) - { - if ('f' == _options.shaderType) - { - ARB_shader_texture_lod = true; - bx::stringPrintf(code - , "#extension GL_ARB_shader_texture_lod : enable\n" - ); - } - else - { - EXT_shader_texture_lod = true; - bx::stringPrintf(code - , "#extension GL_EXT_shader_texture_lod : enable\n" - ); - } - } - - if (usesTextureMS) - { - bx::stringPrintf(code - , "#extension GL_ARB_texture_multisample : enable\n" - ); - } - - if (usesTextureArray) - { - bx::stringPrintf(code - , "#extension GL_EXT_texture_array : enable\n" - ); - } - - if (ARB_shader_texture_lod) - { - bx::stringPrintf(code, - "#define texture2DProjLod texture2DProjLodARB\n" - "#define texture2DGrad texture2DGradARB\n" - "#define texture2DProjGrad texture2DProjGradARB\n" - "#define textureCubeGrad textureCubeGradARB\n" - ); - } - else if (EXT_shader_texture_lod) - { - bx::stringPrintf(code, - "#define texture2DProjLod texture2DProjLodEXT\n" - "#define texture2DGrad texture2DGradEXT\n" - "#define texture2DProjGrad texture2DProjGradEXT\n" - "#define textureCubeGrad textureCubeGradEXT\n" - ); - } + bx::stringPrintf(code + , "#extension GL_ARB_gpu_shader5 : enable\n" + ); } - else + + if (usesPacking) { - if (glsl_profile < 300 - && usesIntegerVecs) - { - glsl_profile = 300; - } - - if (glsl_profile > 100) - { - bx::stringPrintf(code, "#version %d es\n", glsl_profile); - bx::stringPrintf(code, "#define attribute in\n"); - bx::stringPrintf(code, "#define varying %s\n" - , 'f' == _options.shaderType ? "in" : "out" - ); - bx::stringPrintf(code, "precision highp float;\n"); - bx::stringPrintf(code, "precision highp int;\n"); - } - - if (glsl_profile >= 300 && usesTextureArray) - { - bx::stringPrintf(code, "precision highp sampler2DArray;\n"); - } - - // Pretend that all extensions are available. - // This will be stripped later. - if (usesTextureLod) - { - bx::stringPrintf(code - , "#extension GL_EXT_shader_texture_lod : enable\n" - "#define texture2DLod texture2DLodEXT\n" - "#define texture2DGrad texture2DGradEXT\n" - "#define texture2DProjLod texture2DProjLodEXT\n" - "#define texture2DProjGrad texture2DProjGradEXT\n" - "#define textureCubeLod textureCubeLodEXT\n" - "#define textureCubeGrad textureCubeGradEXT\n" - ); - } - - if (!bx::findIdentifierMatch(input, s_OES_standard_derivatives).isEmpty() ) - { - bx::stringPrintf(code, "#extension GL_OES_standard_derivatives : enable\n"); - } - - if (!bx::findIdentifierMatch(input, s_OES_texture_3D).isEmpty() ) - { - bx::stringPrintf(code, "#extension GL_OES_texture_3D : enable\n"); - } - - if (glsl_profile < 300 - && !bx::findIdentifierMatch(input, s_EXT_shadow_samplers).isEmpty() ) - { - bx::stringPrintf(code - , "#extension GL_EXT_shadow_samplers : enable\n" - "#define shadow2D shadow2DEXT\n" - "#define shadow2DProj shadow2DProjEXT\n" - ); - } - else - { - bx::stringPrintf(code - , "#define shadow2D(_sampler, _coord) texture(_sampler, _coord)\n" - "#define shadow2DProj(_sampler, _coord) textureProj(_sampler, _coord)\n" - ); - } - - if (usesGpuShader5) - { - bx::stringPrintf(code - , "#extension GL_ARB_gpu_shader5 : enable\n" - ); - } - - if (usesPacking) - { - bx::stringPrintf(code - , "#extension GL_ARB_shading_language_packing : enable\n" - ); - } - - if (glsl_profile < 300 - && !bx::findIdentifierMatch(input, "gl_FragDepth").isEmpty() ) - { - bx::stringPrintf(code - , "#extension GL_EXT_frag_depth : enable\n" - "#define gl_FragDepth gl_FragDepthEXT\n" - ); - } - - if (usesTextureArray) - { - bx::stringPrintf(code - , "#extension GL_EXT_texture_array : enable\n" - ); - } - - if (glsl_profile == 100) - { - code += - "mat2 transpose(mat2 _mtx)\n" - "{\n" - " vec2 v0 = _mtx[0];\n" - " vec2 v1 = _mtx[1];\n" - "\n" - " return mat2(\n" - " vec2(v0.x, v1.x)\n" - " , vec2(v0.y, v1.y)\n" - " );\n" - "}\n" - "\n" - "mat3 transpose(mat3 _mtx)\n" - "{\n" - " vec3 v0 = _mtx[0];\n" - " vec3 v1 = _mtx[1];\n" - " vec3 v2 = _mtx[2];\n" - "\n" - " return mat3(\n" - " vec3(v0.x, v1.x, v2.x)\n" - " , vec3(v0.y, v1.y, v2.y)\n" - " , vec3(v0.z, v1.z, v2.z)\n" - " );\n" - "}\n" - "\n" - "mat4 transpose(mat4 _mtx)\n" - "{\n" - " vec4 v0 = _mtx[0];\n" - " vec4 v1 = _mtx[1];\n" - " vec4 v2 = _mtx[2];\n" - " vec4 v3 = _mtx[3];\n" - "\n" - " return mat4(\n" - " vec4(v0.x, v1.x, v2.x, v3.x)\n" - " , vec4(v0.y, v1.y, v2.y, v3.y)\n" - " , vec4(v0.z, v1.z, v2.z, v3.z)\n" - " , vec4(v0.w, v1.w, v2.w, v3.w)\n" - " );\n" - "}\n" - ; - } + bx::stringPrintf(code + , "#extension GL_ARB_shading_language_packing : enable\n" + ); } } - else - { - bx::stringPrintf(code, "#version %d\n", glsl_profile); - if (120 < glsl_profile) + if (!bx::findIdentifierMatch(input, s_ARB_shader_viewport_layer_array).isEmpty() ) + { + bx::stringPrintf(code + , "#extension GL_ARB_shader_viewport_layer_array : enable\n" + ); + } + + if (!bx::findIdentifierMatch(input, "gl_FragColor").isEmpty() ) + { + bx::stringPrintf(code + , "out vec4 bgfx_FragColor;\n" + "#define gl_FragColor bgfx_FragColor\n" + ); + } + else if (!bx::findIdentifierMatch(input, "gl_FragData").isEmpty() ) + { + // gl_MaxDrawBuffers is not used here, because it can be + // larger than what the driver reports as GL_MAX_DRAW_BUFFERS. + uint32_t numFragData = 0; + + for (uint32_t ii = 0; ii < 8; ++ii) { - if (!bx::findIdentifierMatch(input, "gl_FragColor").isEmpty() ) - { - bx::stringPrintf(code - , "out vec4 bgfx_FragColor;\n" - "#define gl_FragColor bgfx_FragColor\n" - ); - } + char temp[32]; + bx::snprintf(temp, BX_COUNTOF(temp), "gl_FragData[%d]", ii); + numFragData = bx::strFind(input, temp).isEmpty() ? numFragData : ii+1; } bx::stringPrintf(code - , "#define texture2D texture\n" - "#define texture2DLod textureLod\n" - "#define texture2DGrad textureGrad\n" - "#define texture2DProjLod textureProjLod\n" - "#define texture2DProjGrad textureProjGrad\n" - "#define textureCubeLod textureLod\n" - "#define textureCubeGrad textureGrad\n" - "#define texture3D texture\n" - "#define texture2DLodOffset textureLodOffset\n" - ); - - bx::stringPrintf(code, "#define attribute in\n"); - bx::stringPrintf(code, "#define varying %s\n" - , 'f' == _options.shaderType ? "in" : "out" - ); - - bx::stringPrintf(code - , "#define bgfxShadow2D(_sampler, _coord) vec4_splat(texture(_sampler, _coord) )\n" - "#define bgfxShadow2DProj(_sampler, _coord) vec4_splat(textureProj(_sampler, _coord) )\n" + , "out vec4 bgfx_FragData[%d];\n" + "#define gl_FragData bgfx_FragData\n" + , bx::max(numFragData, 1) ); } - if ( (profile->lang == ShadingLang::GLSL && glsl_profile > 400) - || (profile->lang == ShadingLang::ESSL && glsl_profile > 300) ) - { - code += preprocessor.m_preprocessed; + bx::stringPrintf(code + , "#define texture2D texture\n" + "#define texture2DLod textureLod\n" + "#define texture2DGrad textureGrad\n" + "#define texture2DProjLod textureProjLod\n" + "#define texture2DProjGrad textureProjGrad\n" + "#define textureCubeLod textureLod\n" + "#define textureCubeGrad textureGrad\n" + "#define texture3D texture\n" + "#define texture2DLodOffset textureLodOffset\n" + ); - bx::write(_shaderWriter, uint16_t(0), &err); + bx::stringPrintf(code, "#define attribute in\n"); + bx::stringPrintf(code, "#define varying %s\n" + , 'f' == _options.shaderType ? "in" : "out" + ); - uint32_t shaderSize = (uint32_t)code.size(); - bx::write(_shaderWriter, shaderSize, &err); - bx::write(_shaderWriter, code.c_str(), shaderSize, &err); - bx::write(_shaderWriter, uint8_t(0), &err); + bx::stringPrintf(code + , "#define bgfxShadow2D(_sampler, _coord) vec4_splat(texture(_sampler, _coord) )\n" + "#define bgfxShadow2DProj(_sampler, _coord) vec4_splat(textureProj(_sampler, _coord) )\n" + ); - compiled = true; - } - else - { - code += _comment; - code += preprocessor.m_preprocessed; + code += _comment; + code += preprocessor.m_preprocessed; - if (profile->lang == ShadingLang::ESSL) - { - glsl_profile |= 0x80000000; - } - - compiled = compileGLSLShader(_options, glsl_profile, code, _shaderWriter, _messageWriter); - } + compiled = compileGLSLShader(_options + , 0 != esslVersion ? (esslVersion | 0x80000000) : glsl_profile + , code + , _shaderWriter + , _messageWriter + ); } else { diff --git a/tools/shaderc/shaderc.h b/tools/shaderc/shaderc.h index f396a913a..69c4eae6d 100644 --- a/tools/shaderc/shaderc.h +++ b/tools/shaderc/shaderc.h @@ -60,14 +60,6 @@ namespace bgfx # endif #endif -#ifndef SHADERC_CONFIG_HAS_GLSL_OPTIMIZER -# if __has_include("glsl_optimizer.h") -# define SHADERC_CONFIG_HAS_GLSL_OPTIMIZER 1 -# else -# define SHADERC_CONFIG_HAS_GLSL_OPTIMIZER 0 -# endif -#endif - #include #include #include diff --git a/tools/shaderc/shaderc_glsl.cpp b/tools/shaderc/shaderc_glsl.cpp index aa3cc8286..1bf923412 100644 --- a/tools/shaderc/shaderc_glsl.cpp +++ b/tools/shaderc/shaderc_glsl.cpp @@ -5,422 +5,408 @@ #include "shaderc.h" -#if SHADERC_CONFIG_HAS_GLSL_OPTIMIZER -#include "glsl_optimizer.h" +#if SHADERC_CONFIG_HAS_GLSLANG + +BX_PRAGMA_DIAGNOSTIC_PUSH() +BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4100) // error C4100: 'inclusionDepth' : unreferenced formal parameter +BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4265) // error C4265: 'spv::spirvbin_t': class has virtual functions, but destructor is not virtual +BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wattributes") // warning: attribute ignored +BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wdeprecated-declarations") +BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wtype-limits") +BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wshadow") +#define SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS +#include +#include + +#define ENABLE_OPT 1 +#include +#include +#include +#include +BX_PRAGMA_DIAGNOSTIC_POP() namespace bgfx { namespace glsl { - static bool compile(const Options& _options, uint32_t _version, const std::string& _code, bx::WriterI* _shaderWriter, bx::WriterI* _messageWriter) + static EShLanguage getLang(char _p) + { + switch (_p) + { + case 'c': return EShLangCompute; + case 'f': return EShLangFragment; + case 'v': return EShLangVertex; + default: break; + } + + return EShLangCount; + } + + static UniformType::Enum getUniformType(const spirv_cross::SPIRType& _type) + { + if (spirv_cross::SPIRType::Float != _type.basetype) + { + return UniformType::Count; + } + + if (4 == _type.columns + && 4 == _type.vecsize) + { + return UniformType::Mat4; + } + + if (3 == _type.columns + && 3 == _type.vecsize) + { + return UniformType::Mat3; + } + + if (1 == _type.columns + && 4 == _type.vecsize) + { + return UniformType::Vec4; + } + + return UniformType::Count; + } + + static bool isDesktopOnlyFormat(spv::ImageFormat _format) + { + switch (_format) + { + case spv::ImageFormatR11fG11fB10f: + case spv::ImageFormatR16f: + case spv::ImageFormatRgb10A2: + case spv::ImageFormatR8: + case spv::ImageFormatRg8: + case spv::ImageFormatR16: + case spv::ImageFormatRg16: + case spv::ImageFormatRgba16: + case spv::ImageFormatR16Snorm: + case spv::ImageFormatRg16Snorm: + case spv::ImageFormatRgba16Snorm: + case spv::ImageFormatR8Snorm: + case spv::ImageFormatRg8Snorm: + case spv::ImageFormatR8ui: + case spv::ImageFormatRg8ui: + case spv::ImageFormatR16ui: + case spv::ImageFormatRgb10a2ui: + case spv::ImageFormatR8i: + case spv::ImageFormatRg8i: + case spv::ImageFormatR16i: + return true; + + default: + break; + } + + return false; + } + + static bool compileSpirvCross(const Options& _options, uint32_t _version, const std::string& _code, bx::WriterI* _shaderWriter, bx::WriterI* _messageWriter) { bx::ErrorAssert messageErr; - char ch = _options.shaderType; - const glslopt_shader_type type = ch == 'f' - ? kGlslOptShaderFragment - : (ch == 'c' ? kGlslOptShaderCompute : kGlslOptShaderVertex); + const bool es = 0 != (_version & 0x80000000); + const uint32_t version = _version & ~0x80000000; - glslopt_target target = kGlslTargetOpenGL; - if(_version == BX_MAKEFOURCC('M', 'T', 'L', 0)) + const EShLanguage stage = getLang(_options.shaderType); + + if (EShLangCount == stage) { - target = kGlslTargetMetal; - } else if(_version < 0x80000000) { - target = kGlslTargetOpenGL; - } - else { - _version &= ~0x80000000; - target = (_version >= 300) ? kGlslTargetOpenGLES30 : kGlslTargetOpenGLES20; - } - - glslopt_ctx* ctx = glslopt_initialize(target); - - glslopt_shader* shader = glslopt_optimize(ctx, type, _code.c_str(), 0); - - if (!glslopt_get_status(shader) ) - { - const char* log = glslopt_get_log(shader); - int32_t source = 0; - int32_t line = 0; - int32_t column = 0; - int32_t start = 0; - int32_t end = INT32_MAX; - - bool found = false - || 3 == sscanf(log, "%u:%u(%u):", &source, &line, &column) - || 2 == sscanf(log, "(%u,%u):", &line, &column) - ; - - if (found - && 0 != line) - { - start = bx::max(1, line-10); - end = start + 20; - } - - printCode(_code.c_str(), line, start, end, column); - bx::write(_messageWriter, &messageErr, "Error: %s\n", log); - glslopt_shader_delete(shader); - glslopt_cleanup(ctx); + bx::write(_messageWriter, &messageErr, "Error: Unknown shader type '%c'.\n", _options.shaderType); return false; } - const char* optimizedShader = glslopt_get_output(shader); + glslang::InitializeProcess(); - std::string out; - // Trim all directives. - while ('#' == *optimizedShader) + glslang::TProgram* program = new glslang::TProgram; + glslang::TShader* shader = new glslang::TShader(stage); + + const EShMessages messages = EShMessages(0 + | EShMsgDefault + | EShMsgSpvRules + ); + + shader->setEntryPoint("main"); + shader->setAutoMapBindings(true); + shader->setAutoMapLocations(true); + shader->setEnvInput(glslang::EShSourceGlsl, stage, glslang::EShClientOpenGL, 100); + shader->setEnvClient(glslang::EShClientOpenGL, glslang::EShTargetOpenGL_450); + shader->setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_0); + + const char* shaderStrings[] = { _code.c_str() }; + shader->setStrings( + shaderStrings + , BX_COUNTOF(shaderStrings) + ); + + bool compiled = shader->parse(GetDefaultResources() + , 110 + , false + , messages + ); + bool linked = false; + bool result = false; + + if (!compiled) { - optimizedShader = bx::strFindNl(optimizedShader).getPtr(); - } + const char* log = shader->getInfoLog(); - out.append(optimizedShader, strlen(optimizedShader)); - optimizedShader = out.c_str(); - - { - char* code = const_cast(optimizedShader); - strReplace(code, "gl_FragDepthEXT", "gl_FragDepth"); - - strReplace(code, "textureLodEXT", "texture2DLod"); - strReplace(code, "textureGradEXT", "texture2DGrad"); - - strReplace(code, "texture2DLodARB", "texture2DLod"); - strReplace(code, "texture2DLodEXT", "texture2DLod"); - strReplace(code, "texture2DGradARB", "texture2DGrad"); - strReplace(code, "texture2DGradEXT", "texture2DGrad"); - - strReplace(code, "textureCubeLodARB", "textureCubeLod"); - strReplace(code, "textureCubeLodEXT", "textureCubeLod"); - strReplace(code, "textureCubeGradARB", "textureCubeGrad"); - strReplace(code, "textureCubeGradEXT", "textureCubeGrad"); - - strReplace(code, "texture2DProjLodARB", "texture2DProjLod"); - strReplace(code, "texture2DProjLodEXT", "texture2DProjLod"); - strReplace(code, "texture2DProjGradARB", "texture2DProjGrad"); - strReplace(code, "texture2DProjGradEXT", "texture2DProjGrad"); - - strReplace(code, "shadow2DARB", "shadow2D"); - strReplace(code, "shadow2DEXT", "shadow2D"); - strReplace(code, "shadow2DProjARB", "shadow2DProj"); - strReplace(code, "shadow2DProjEXT", "shadow2DProj"); - } - - UniformArray uniforms; - - if (target != kGlslTargetMetal) - { - bx::StringView parse(optimizedShader); - - while (!parse.isEmpty() ) + if (NULL != log) { - parse = bx::strLTrimSpace(parse); - bx::StringView eol = bx::strFind(parse, ';'); - if (!eol.isEmpty() ) + int32_t source = 0; + int32_t line = 0; + int32_t start = 0; + int32_t end = INT32_MAX; + + const bx::StringView err = bx::strFind(log, "ERROR:"); + + if (!err.isEmpty() + && 2 == sscanf(err.getPtr(), "ERROR: %u:%u: '", &source, &line) ) { - bx::StringView qualifier = nextWord(parse); - - if (0 == bx::strCmp(qualifier, "precision", 9) ) - { - // skip precision - parse.set(eol.getPtr() + 1, parse.getTerm() ); - continue; - } - - if (0 == bx::strCmp(qualifier, "attribute", 9) - || 0 == bx::strCmp(qualifier, "varying", 7) - || 0 == bx::strCmp(qualifier, "in", 2) - || 0 == bx::strCmp(qualifier, "out", 3) - ) - { - // skip attributes and varyings. - parse.set(eol.getPtr() + 1, parse.getTerm() ); - continue; - } - - if (0 == bx::strCmp(qualifier, "flat", 4) - || 0 == bx::strCmp(qualifier, "smooth", 6) - || 0 == bx::strCmp(qualifier, "noperspective", 13) - || 0 == bx::strCmp(qualifier, "centroid", 8) - ) - { - // skip interpolation qualifiers - parse.set(eol.getPtr() + 1, parse.getTerm() ); - continue; - } - - if (0 == bx::strCmp(parse, "tmpvar", 6) ) - { - // skip temporaries - parse.set(eol.getPtr() + 1, parse.getTerm() ); - continue; - } - - if (0 != bx::strCmp(qualifier, "uniform", 7) ) - { - // end if there is no uniform keyword. - parse.clear(); - continue; - } - - bx::StringView precision; - bx::StringView typen = nextWord(parse); - - if (0 == bx::strCmp(typen, "lowp", 4) - || 0 == bx::strCmp(typen, "mediump", 7) - || 0 == bx::strCmp(typen, "highp", 5) ) - { - precision = typen; - typen = nextWord(parse); - } - - BX_UNUSED(precision); - - char uniformType[256]; - - if (0 == bx::strCmp(typen, "sampler", 7) - || 0 == bx::strCmp(typen, "isampler", 8) - || 0 == bx::strCmp(typen, "usampler", 8) ) - { - bx::strCopy(uniformType, BX_COUNTOF(uniformType), "int"); - } - else - { - bx::strCopy(uniformType, BX_COUNTOF(uniformType), typen); - } - - bx::StringView name = nextWord(parse); - - uint8_t num = 1; - bx::StringView array = bx::strSubstr(parse, 0, 1); - if (0 == bx::strCmp(array, "[", 1) ) - { - parse = bx::strLTrimSpace(bx::StringView(parse.getPtr() + 1, parse.getTerm() ) ); - - uint32_t tmp; - bx::fromString(&tmp, parse); - num = uint8_t(tmp); - } - - Uniform un; - un.type = nameToUniformTypeEnum(uniformType); - - if (0 == bx::strCmp(name, "bgfx_ndc") ) - { - un.type = UniformType::Count; - } - - if (UniformType::Count != un.type) - { - un.name.assign(name.getPtr(), name.getTerm()); - - BX_TRACE("name: %s (type %d, num %d)", un.name.c_str(), un.type, num); - - un.num = num; - un.regIndex = 0; - un.regCount = num; - switch (un.type) - { - case UniformType::Mat3: - un.regCount *= 3; - break; - case UniformType::Mat4: - un.regCount *= 4; - break; - default: - break; - } - - uniforms.push_back(un); - } - - parse = bx::strLTrimSpace(bx::strFindNl(bx::StringView(eol.getPtr(), parse.getTerm() ) ) ); + start = bx::max(1, line-10); + end = start + 20; } + + printCode(_code.c_str(), line, start, end, -1); + + bx::write(_messageWriter, &messageErr, "%s\n", log); } } else { - const bx::StringView optShader(optimizedShader); - bx::StringView parse = bx::strFind(optimizedShader, "struct xlatMtlShaderUniform {"); - bx::StringView end = parse; - if (!parse.isEmpty() ) - { - parse.set(parse.getPtr() + bx::strLen("struct xlatMtlShaderUniform {"), optShader.getTerm() ); - end = bx::strFind(parse, "};"); - } + program->addShader(shader); - while ( parse.getPtr() < end.getPtr() - && !parse.isEmpty() ) + linked = true + && program->link(messages) + && program->mapIO() + ; + + if (!linked) { - parse.set(bx::strLTrimSpace(parse).getPtr(), optShader.getTerm() ); - const bx::StringView eol = bx::strFind(parse, ';'); - if (!eol.isEmpty() ) + const char* log = program->getInfoLog(); + + if (NULL != log) { - const char* typen = parse.getPtr(); - - char uniformType[256]; - parse = bx::strWord(parse); - bx::strCopy(uniformType, parse.getLength()+1, typen); - parse.set(parse.getPtr()+parse.getLength(),optShader.getTerm()); - const char* name = bx::strLTrimSpace(parse).getPtr(); - parse.set(name, optShader.getTerm() ); - - char uniformName[256]; - uint8_t num = 1; - bx::StringView array = bx::strFind(bx::StringView(name, int32_t(eol.getPtr()-parse.getPtr() ) ), "["); - if (!array.isEmpty() ) - { - bx::strCopy(uniformName, int32_t(array.getPtr()-name+1), name); - - char arraySize[32]; - bx::StringView arrayEnd = bx::strFind(bx::StringView(array.getPtr(), int32_t(eol.getPtr()-array.getPtr() ) ), "]"); - bx::strCopy(arraySize, int32_t(arrayEnd.getPtr()-array.getPtr() ), array.getPtr()+1); - uint32_t tmp; - bx::fromString(&tmp, arraySize); - num = uint8_t(tmp); - } - else - { - bx::strCopy(uniformName, int32_t(eol.getPtr()-name+1), name); - } - - Uniform un; - un.type = nameToUniformTypeEnum(uniformType); - - if (UniformType::Count != un.type) - { - BX_TRACE("name: %s (type %d, num %d)", uniformName, un.type, num); - - un.name = uniformName; - un.num = num; - un.regIndex = 0; - un.regCount = num; - uniforms.push_back(un); - } - - parse = eol.getPtr() + 1; - } - } - - bx::StringView mainEntry("xlatMtlShaderOutput xlatMtlMain ("); - parse = bx::strFind(optimizedShader, mainEntry); - end = parse; - if (!parse.isEmpty()) - { - parse.set(parse.getPtr() + mainEntry.getLength(), optShader.getTerm()); - end = bx::strFind(parse, "{"); - } - - while (parse.getPtr() < end.getPtr() - && !parse.isEmpty()) - { - parse.set(bx::strLTrimSpace(parse).getPtr(), optShader.getTerm()); - const bx::StringView textureNameMark("[[texture("); - const bx::StringView textureName = bx::strFind(parse, textureNameMark); - - if (!textureName.isEmpty()) - { - Uniform un; - un.type = nameToUniformTypeEnum("int"); // int for sampler - const char* varNameEnd = textureName.getPtr() - 1; - parse.set(parse.getPtr(), varNameEnd - 1); - const char* varNameBeg = parse.getPtr(); - for (int ii = parse.getLength() - 1; 0 <= ii; --ii) - { - if (varNameBeg[ii] == ' ') - { - parse.set(varNameBeg + ii + 1, varNameEnd); - break; - } - } - char uniformName[256]; - bx::strCopy(uniformName, parse.getLength() + 1, parse); - un.name = uniformName; - const char* regIndexBeg = textureName.getPtr() + textureNameMark.getLength(); - bx::StringView regIndex = bx::strFind(regIndexBeg, ")"); - - regIndex.set(regIndexBeg, regIndex.getPtr()); - uint32_t tmp; - bx::fromString(&tmp, regIndex); - un.regIndex = uint16_t(tmp); - un.num = 1; - un.regCount = 1; - - uniforms.push_back(un); - - parse = regIndex.getPtr() + 1; - } - else - { - parse = textureName; + bx::write(_messageWriter, &messageErr, "%s\n", log); } } } - bx::ErrorAssert err; - - uint16_t count = (uint16_t)uniforms.size(); - bx::write(_shaderWriter, count, &err); - - for (UniformArray::const_iterator it = uniforms.begin(); it != uniforms.end(); ++it) + if (linked) { - const Uniform& un = *it; - uint8_t nameSize = (uint8_t)un.name.size(); - bx::write(_shaderWriter, nameSize, &err); - bx::write(_shaderWriter, un.name.c_str(), nameSize, &err); - uint8_t uniformType = uint8_t(un.type); - bx::write(_shaderWriter, uniformType, &err); - bx::write(_shaderWriter, un.num, &err); - bx::write(_shaderWriter, un.regIndex, &err); - bx::write(_shaderWriter, un.regCount, &err); - bx::write(_shaderWriter, un.texComponent, &err); - bx::write(_shaderWriter, un.texDimension, &err); - bx::write(_shaderWriter, un.texFormat, &err); + std::vector spirv; - BX_TRACE("%s, %s, %d, %d, %d" - , un.name.c_str() - , getUniformTypeName(un.type) - , un.num - , un.regIndex - , un.regCount - ); + glslang::SpvOptions spvOptions; + spvOptions.disableOptimizer = true; + + glslang::GlslangToSpv(*program->getIntermediate(stage), spirv, &spvOptions); + + spvtools::Optimizer opt(SPV_ENV_OPENGL_4_5); + + opt.SetMessageConsumer( + [_messageWriter, &messageErr](spv_message_level_t, const char*, const spv_position_t&, const char* _message) + { + bx::write(_messageWriter, &messageErr, "%s\n", _message); + }); + + opt.RegisterPerformancePasses(); + + std::vector optimized; + + if (opt.Run(spirv.data(), spirv.size(), &optimized) ) + { + spirv = std::move(optimized); + } + + spirv_cross::CompilerGLSL compiler(std::move(spirv) ); + + spirv_cross::CompilerGLSL::Options compilerOptions = compiler.get_common_options(); + compilerOptions.version = version; + compilerOptions.es = es; + compilerOptions.vulkan_semantics = false; + compilerOptions.enable_420pack_extension = false; + compilerOptions.emit_uniform_buffer_as_plain_uniforms = true; + compiler.set_common_options(compilerOptions); + + spirv_cross::ShaderResources resources = compiler.get_shader_resources(); + + for (const spirv_cross::Resource& resource : resources.gl_plain_uniforms) + { + compiler.unset_decoration(resource.id, spv::DecorationLocation); + } + + for (const spirv_cross::Resource& resource : resources.sampled_images) + { + compiler.unset_decoration(resource.id, spv::DecorationLocation); + compiler.unset_decoration(resource.id, spv::DecorationBinding); + } + + if ('v' == _options.shaderType) + { + for (const spirv_cross::Resource& resource : resources.stage_outputs) + { + compiler.unset_decoration(resource.id, spv::DecorationLocation); + } + } + else if ('f' == _options.shaderType) + { + for (const spirv_cross::Resource& resource : resources.stage_inputs) + { + compiler.unset_decoration(resource.id, spv::DecorationLocation); + } + } + + if (es) + { + bool unsupported = false; + + for (const spirv_cross::Resource& resource : resources.storage_images) + { + const spirv_cross::SPIRType& type = compiler.get_type(resource.type_id); + + if (isDesktopOnlyFormat(type.image.format) ) + { + bx::write(_messageWriter, &messageErr + , "Error: Image '%s' uses a format that's not supported by ESSL.\n" + , resource.name.c_str() + ); + unsupported = true; + } + } + + if (unsupported) + { + delete program; + delete shader; + glslang::FinalizeProcess(); + return false; + } + } + + std::string source = compiler.compile(); + + if (0 == source.compare(0, 8, "#version") ) + { + const size_t eol = source.find('\n'); + source.erase(0, std::string::npos == eol ? source.size() : eol+1); + } + + UniformArray uniforms; + + for (const spirv_cross::Resource& resource : resources.gl_plain_uniforms) + { + const spirv_cross::SPIRType& type = compiler.get_type(resource.type_id); + + Uniform un; + un.name = compiler.get_name(resource.id); + un.type = getUniformType(type); + + if (0 == bx::strCmp(un.name.c_str(), "bgfx_ndc") ) + { + continue; + } + + if (UniformType::Count == un.type) + { + continue; + } + + un.num = uint8_t(type.array.empty() ? 1 : type.array[0]); + un.regIndex = 0; + un.regCount = un.num; + + switch (un.type) + { + case UniformType::Mat3: + un.regCount *= 3; + break; + + case UniformType::Mat4: + un.regCount *= 4; + break; + + default: + break; + } + + BX_TRACE("name: %s (type %d, num %d)", un.name.c_str(), un.type, un.num); + + uniforms.push_back(un); + } + + for (const spirv_cross::Resource& resource : resources.sampled_images) + { + Uniform un; + un.name = compiler.get_name(resource.id); + un.type = UniformType::Sampler; + un.num = 1; + un.regIndex = 0; + un.regCount = 1; + + uniforms.push_back(un); + } + + bx::ErrorAssert err; + + uint16_t count = uint16_t(uniforms.size() ); + bx::write(_shaderWriter, count, &err); + + for (UniformArray::const_iterator it = uniforms.begin(); it != uniforms.end(); ++it) + { + const Uniform& un = *it; + uint8_t nameSize = (uint8_t)un.name.size(); + bx::write(_shaderWriter, nameSize, &err); + bx::write(_shaderWriter, un.name.c_str(), nameSize, &err); + uint8_t uniformType = uint8_t(un.type); + bx::write(_shaderWriter, uniformType, &err); + bx::write(_shaderWriter, un.num, &err); + bx::write(_shaderWriter, un.regIndex, &err); + bx::write(_shaderWriter, un.regCount, &err); + bx::write(_shaderWriter, un.texComponent, &err); + bx::write(_shaderWriter, un.texDimension, &err); + bx::write(_shaderWriter, un.texFormat, &err); + } + + uint32_t shaderSize = uint32_t(source.size() ); + bx::write(_shaderWriter, shaderSize, &err); + bx::write(_shaderWriter, source.c_str(), shaderSize, &err); + uint8_t nul = 0; + bx::write(_shaderWriter, nul, &err); + + if (_options.disasm) + { + std::string disasmfp = _options.outputFilePath + ".disasm"; + writeFile(disasmfp.c_str(), source.c_str(), shaderSize); + } + + result = true; } - uint32_t shaderSize = (uint32_t)bx::strLen(optimizedShader); - bx::write(_shaderWriter, shaderSize, &err); - bx::write(_shaderWriter, optimizedShader, shaderSize, &err); - uint8_t nul = 0; - bx::write(_shaderWriter, nul, &err); + delete program; + delete shader; - if (_options.disasm ) - { - std::string disasmfp = _options.outputFilePath + ".disasm"; - writeFile(disasmfp.c_str(), optimizedShader, shaderSize); - } + glslang::FinalizeProcess(); - glslopt_shader_delete(shader); - glslopt_cleanup(ctx); - - return true; + return result; } } // namespace glsl - - bool compileGLSLShader(const Options& _options, uint32_t _version, const std::string& _code, bx::WriterI* _shaderWriter, bx::WriterI* _messageWriter) - { - return glsl::compile(_options, _version, _code, _shaderWriter, _messageWriter); - } - } // namespace bgfx -#else // SHADERC_CONFIG_HAS_GLSL_OPTIMIZER +#endif // SHADERC_CONFIG_HAS_GLSLANG namespace bgfx { - bool compileSPIRVShader(const Options& _options, uint32_t _version, const std::string& _code, bx::WriterI* _shaderWriter, bx::WriterI* _messageWriter) + bool compileGLSLShader(const Options& _options, uint32_t _version, const std::string& _code, bx::WriterI* _shaderWriter, bx::WriterI* _messageWriter) { +#if SHADERC_CONFIG_HAS_GLSLANG + return glsl::compileSpirvCross(_options, _version, _code, _shaderWriter, _messageWriter); +#else BX_UNUSED(_options, _version, _code, _shaderWriter); - bx::Error messageErr; - bx::write(_messageWriter, &messageErr, "GLSL optimizer compiler is not compiled in.\n"); + bx::ErrorAssert messageErr; + bx::write(_messageWriter, &messageErr, "GLSL compiler is not compiled in.\n"); return false; +#endif // SHADERC_CONFIG_HAS_GLSLANG } -} // namespace bgfx -#endif // SHADERC_CONFIG_HAS_GLSL_OPTIMIZER +} // namespace bgfx diff --git a/tools/texturev/fs_texture.bin.h b/tools/texturev/fs_texture.bin.h index 6451c8823..d3ae9283a 100644 --- a/tools/texturev/fs_texture.bin.h +++ b/tools/texturev/fs_texture.bin.h @@ -1,309 +1,453 @@ -static const uint8_t fs_texture_glsl[2334] = +static const uint8_t fs_texture_glsl[3457] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // _params0........ 0x00, 0x00, 0x09, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x02, 0x01, 0x00, 0x00, // ...u_params1.... 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // .......s_texColo - 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x08, 0x00, 0x00, 0x76, // r..............v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, // arying vec4 v_co - 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, // lor0;.varying ve - 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, // c3 v_texcoord0;. + 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x0d, 0x00, 0x00, 0x0a, // r..........1.... 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, // uniform vec4 u_p 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // arams0;.uniform - 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x3b, 0x0a, // vec4 u_params1;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, // uniform sampler2 - 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, // D s_texColor;.vo - 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, // id main ().{. v - 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x76, // ec4 color_1;. v - 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, // ec4 tmpvar_2;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, // tmpvar_2 = textu - 0x72, 0x65, 0x32, 0x44, 0x4c, 0x6f, 0x64, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, // re2DLod (s_texCo - 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // lor, v_texcoord0 - 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, // .xy, u_params0.x - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, // );. color_1.w = - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x63, // tmpvar_2.w;. c - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x69, // olor_1.xyz = (mi - 0x78, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x62, 0x73, // x (pow (. abs - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x0a, 0x20, // (tmpvar_2.xyz). - 0x20, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, // , vec3(2.2, 2.2 - 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x29, 0x29, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // , 2.2)), tmpvar_ - 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, // 2.xyz, u_params0 - 0x2e, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x65, 0x78, 0x70, 0x32, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, // .z) * exp2(u_par - 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, // ams0.w));. colo - 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x20, 0x2a, // r_1 = (color_1 * - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, // v_color0);. ve - 0x63, 0x33, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, // c3 outColor_3;. - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, // vec3 tmpvar_4;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x30, // tmpvar_4.x = 0 - 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x79, // .0;. tmpvar_4.y - 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // = 0.0;. tmpvar - 0x5f, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x6f, 0x75, // _4.z = 0.0;. ou - 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // tColor_3 = tmpva - 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, // r_4;. if ((u_pa - 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, // rams1.x < 0.5)) - 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // {. vec3 tmpva - 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // r_5;. tmpvar_ - 0x35, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // 5 = clamp (color - 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, // _1.xyz, 0.0, 1.0 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x72, 0x67, 0x62, // );. vec3 _rgb - 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x36, 0x20, 0x3d, // _6;. _rgb_6 = - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, // tmpvar_5;. f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, // loat tmpvar_7;. - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, // if ((tmpvar_5 - 0x2e, 0x78, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, // .x <= 0.0031308) - 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ) {. tmpvar - 0x5f, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, // _7 = (12.92 * tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, // pvar_5.x);. } - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, // else {. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, // pvar_7 = ((1.055 - 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, // * pow (tmpvar_5 - 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, // .x, 0.4166667)) - 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, // - 0.055);. }; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x36, 0x2e, 0x78, 0x20, 0x3d, 0x20, // . _rgb_6.x = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // tmpvar_7;. fl - 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, // oat tmpvar_8;. - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, // if ((tmpvar_5. - 0x79, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, 0x29, // y <= 0.0031308)) - 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // {. tmpvar_ - 0x38, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, // 8 = (12.92 * tmp - 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, // var_5.y);. } - 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // else {. tmp - 0x76, 0x61, 0x72, 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, // var_8 = ((1.055 - 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, // * pow (tmpvar_5. - 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, // y, 0.4166667)) - - 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, // 0.055);. };. - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x36, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x74, // _rgb_6.y = t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // mpvar_8;. flo - 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, // at tmpvar_9;. - 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, 0x7a, // if ((tmpvar_5.z - 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, 0x29, 0x20, // <= 0.0031308)) - 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, // {. tmpvar_9 - 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, // = (12.92 * tmpv - 0x61, 0x72, 0x5f, 0x35, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, // ar_5.z);. } e - 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // lse {. tmpv - 0x61, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, // ar_9 = ((1.055 * - 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, 0x7a, // pow (tmpvar_5.z - 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, // , 0.4166667)) - - 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, // 0.055);. };. - 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x6d, // _rgb_6.z = tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, // pvar_9;. outC - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x36, 0x3b, // olor_3 = _rgb_6; - 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // . } else {. - 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, // if ((u_params1.x - 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // < 1.5)) {. - 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x63, 0x6f, // outColor_3 = co - 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, // lor_1.xyz;. } - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, // else {. if - 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, // ((u_params1.x < - 0x20, 0x32, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 2.5)) {. - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x30, 0x3b, // vec3 _color_10; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // . _color_ - 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x31, 0x2e, 0x37, 0x31, // 10 = ((mat3(1.71 - 0x36, 0x36, 0x35, 0x31, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x33, 0x35, 0x35, 0x36, 0x37, 0x30, 0x38, // 6651, -0.3556708 - 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x33, 0x33, 0x36, 0x36, 0x33, 0x2c, 0x20, 0x2d, 0x30, // , -0.2533663, -0 - 0x2e, 0x36, 0x36, 0x36, 0x36, 0x38, 0x34, 0x34, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, 0x34, // .6666844, 1.6164 - 0x38, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x2c, 0x20, 0x30, // 81, 0.0157685, 0 - 0x2e, 0x30, 0x31, 0x37, 0x36, 0x33, 0x39, 0x39, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, 0x32, // .0176399, -0.042 - 0x37, 0x37, 0x30, 0x36, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x34, 0x32, 0x31, 0x30, 0x33, 0x31, 0x29, // 7706, 0.9421031) - 0x20, 0x2a, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, 0x35, // * (mat3(0.41255 - 0x36, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x33, 0x35, 0x37, 0x35, 0x37, 0x36, 0x31, 0x2c, 0x20, 0x30, // 64, 0.3575761, 0 - 0x2e, 0x31, 0x38, 0x30, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x31, 0x32, 0x36, // .1804375, 0.2126 - 0x37, 0x32, 0x39, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x31, 0x35, 0x31, 0x35, 0x32, 0x32, 0x2c, 0x20, // 729, 0.7151522, - 0x30, 0x2e, 0x30, 0x37, 0x32, 0x31, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x39, 0x33, // 0.072175, 0.0193 - 0x33, 0x33, 0x39, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x31, 0x39, 0x31, 0x39, 0x32, 0x2c, 0x20, 0x30, // 339, 0.119192, 0 - 0x2e, 0x39, 0x35, 0x30, 0x33, 0x30, 0x34, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x63, 0x6f, 0x6c, 0x6f, // .9503041) * colo - 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, // r_1.xyz)) * u_pa - 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // rams1.y);. - 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, // vec3 tmpvar_11 - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ;. tmpvar - 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x28, 0x5f, 0x63, 0x6f, 0x6c, // _11 = pow ((_col - 0x6f, 0x72, 0x5f, 0x31, 0x30, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, 0x29, 0x2c, // or_10 * 0.0001), - 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, 0x2c, // vec3(0.1593018, - 0x20, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x35, // 0.1593018, 0.15 - 0x39, 0x33, 0x30, 0x31, 0x38, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 93018));. - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, // vec3 tmpvar_12; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // . tmpvar_ - 0x31, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x28, 0x28, 0x30, 0x2e, 0x38, 0x33, // 12 = pow (((0.83 - 0x35, 0x39, 0x33, 0x37, 0x35, 0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 59375 + . - 0x20, 0x20, 0x20, 0x28, 0x31, 0x38, 0x2e, 0x38, 0x35, 0x31, 0x35, 0x36, 0x20, 0x2a, 0x20, 0x74, // (18.85156 * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // mpvar_11). - 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x2c, // ) / (vec3(1.0, - 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, // 1.0, 1.0) + . - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, 0x38, 0x2e, 0x36, 0x38, 0x37, 0x35, // (18.6875 - 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x29, 0x0a, 0x20, 0x20, // * tmpvar_11). - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x37, // )), vec3(7 - 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, // 8.84375, 78.8437 - 0x35, 0x2c, 0x20, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, // 5, 78.84375));. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x30, // _color_10 - 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, 0x20, // = tmpvar_12;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x33, // outColor_3 - 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, 0x20, // = tmpvar_12;. - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, // };. };. - 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // };. vec4 tmpvar - 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, // _13;. tmpvar_13 - 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // .xyz = outColor_ - 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x2e, 0x77, // 3;. tmpvar_13.w - 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, // = color_1.w;. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, // gl_FragColor = t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // mpvar_13;.}... + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // sampler2D s_texC + 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, // olor;.uniform ve + 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x3b, 0x0a, 0x0a, 0x69, // c4 u_params1;..i + 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // n vec3 v_texcoor + 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, // d0;.in vec4 v_co + 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, // lor0;.layout(loc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, // ation = 0) out v + 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, // ec4 bgfx_FragCol + 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, // or;..void main() + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x36, 0x34, // .{. vec4 _264 + 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x73, 0x5f, // = textureLod(s_ + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // texColor, v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // oord0.xy, u_para + 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, // ms0.x);. vec3 + 0x20, 0x5f, 0x32, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x34, 0x2e, 0x78, 0x79, 0x7a, // _267 = _264.xyz + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x33, 0x33, 0x20, // ;. vec3 _333 + 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, // = mix(pow(abs(_2 + 0x36, 0x37, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, 0x30, 0x30, 0x30, // 67), vec3(2.2000 + 0x30, 0x30, 0x30, 0x34, 0x37, 0x36, 0x38, 0x33, 0x37, 0x31, 0x35, 0x38, 0x32, 0x30, 0x33, 0x31, // 0004768371582031 + 0x32, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x36, 0x37, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // 25)), _267, vec3 + 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2a, // (u_params0.z)) * + 0x20, 0x70, 0x6f, 0x77, 0x28, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // pow(2.0, u_para + 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // ms0.w);. vec4 + 0x20, 0x5f, 0x35, 0x32, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x34, 0x3b, 0x0a, 0x20, 0x20, // _526 = _264;. + 0x20, 0x20, 0x5f, 0x35, 0x32, 0x36, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x33, 0x2e, // _526.x = _333. + 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x32, 0x36, 0x2e, 0x79, 0x20, 0x3d, 0x20, // x;. _526.y = + 0x5f, 0x33, 0x33, 0x33, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x32, 0x36, // _333.y;. _526 + 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x33, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, // .z = _333.z;. + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x32, // vec4 _279 = _52 + 0x36, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, // 6 * v_color0;. + 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, // vec3 _547;. + 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, // if (u_params1.x + 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // < 0.5). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x36, 0x32, 0x20, // vec3 _362 + 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x5f, 0x32, 0x37, 0x39, 0x2e, 0x78, 0x79, 0x7a, // = clamp(_279.xyz + 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, // , vec3(0.0), vec + 0x33, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 3(1.0));. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, // float _403 = _3 + 0x36, 0x32, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // 62.x;. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // oat _541;. + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // do. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, // if (_ + 0x34, 0x30, 0x33, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, // 403 <= 0.0031308 + 0x30, 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, // 0009073019027709 + 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 9609375). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x31, 0x32, // _541 = 12 + 0x2e, 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, // .920000076293945 + 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x30, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 3125 * _403;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, // bre + 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ak;. + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, // }. el + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, // se. { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x5f, 0x35, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, // _541 = (1.05499 + 0x39, 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, // 9947547912597656 + 0x32, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x30, 0x33, 0x2c, 0x20, 0x30, // 25 * pow(_403, 0 + 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, // .416666656732559 + 0x32, 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, // 2041015625)) - 0 + 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, // .054999999701976 + 0x37, 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, // 776123046875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, // br + 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // eak;. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, // }. b + 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, // reak; // unreach + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, // able workaround. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, // } while( + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // false);. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, // float _407 = _36 + 0x32, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // 2.y;. flo + 0x61, 0x74, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // at _543;. + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // do. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, // if (_4 + 0x30, 0x37, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, // 07 <= 0.00313080 + 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, // 0090730190277099 + 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 609375). + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, // _543 = 12. + 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, // 9200000762939453 + 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x30, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 125 * _407;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, // brea + 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // k;. } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, // . els + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // e. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x5f, 0x35, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, // _543 = (1.054999 + 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, // 9475479125976562 + 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x30, 0x37, 0x2c, 0x20, 0x30, 0x2e, // 5 * pow(_407, 0. + 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, // 4166666567325592 + 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, // 041015625)) - 0. + 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, // 0549999997019767 + 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 76123046875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, // bre + 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ak;. + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, // }. br + 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, // eak; // unreacha + 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, // ble workaround. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, // } while(f + 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // alse);. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x32, // loat _411 = _362 + 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // .z;. floa + 0x74, 0x20, 0x5f, 0x35, 0x34, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // t _545;. + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // do. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x31, // if (_41 + 0x31, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, 0x30, // 1 <= 0.003130800 + 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, 0x36, // 0907301902770996 + 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 09375). + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, 0x39, // _545 = 12.9 + 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, 0x31, // 2000007629394531 + 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 25 * _411;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, // break + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // ;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, // else + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, // _ + 0x35, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, // 545 = (1.0549999 + 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, // 4754791259765625 + 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x31, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x34, // * pow(_411, 0.4 + 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, 0x30, // 1666665673255920 + 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, // 41015625)) - 0.0 + 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, 0x37, // 5499999970197677 + 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 6123046875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, // brea + 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // k;. } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, // . bre + 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, // ak; // unreachab + 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, 0x20, // le workaround. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, // } while(fa + 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, // lse);. _5 + 0x34, 0x37, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x35, 0x34, 0x31, 0x2c, 0x20, // 47 = vec3(_541, + 0x5f, 0x35, 0x34, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x34, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // _543, _545);. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, // }. else. + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // {. vec3 _ + 0x35, 0x34, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, // 548;. if + 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x31, // (u_params1.x < 1 + 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // .5). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x20, 0x3d, // _548 = + 0x20, 0x5f, 0x32, 0x37, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // _279.xyz;. + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, // }. els + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // e. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x34, // vec3 _54 + 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, // 9;. i + 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, // f (u_params1.x < + 0x20, 0x32, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 2.5). + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x34, 0x39, 0x36, 0x20, 0x3d, 0x20, // vec3 _496 = + 0x70, 0x6f, 0x77, 0x28, 0x28, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, // pow(((mat3(vec3( + 0x31, 0x2e, 0x37, 0x31, 0x36, 0x36, 0x35, 0x31, 0x32, 0x30, 0x31, 0x32, 0x34, 0x38, 0x31, 0x36, // 1.71665120124816 + 0x38, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x33, 0x35, 0x35, // 89453125, -0.355 + 0x36, 0x37, 0x30, 0x38, 0x30, 0x39, 0x37, 0x34, 0x35, 0x37, 0x38, 0x38, 0x35, 0x37, 0x34, 0x32, // 6708097457885742 + 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x33, 0x33, 0x36, 0x36, 0x32, // 1875, -0.2533662 + 0x39, 0x31, 0x35, 0x32, 0x32, 0x39, 0x37, 0x39, 0x37, 0x33, 0x36, 0x33, 0x32, 0x38, 0x31, 0x32, // 9152297973632812 + 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x36, 0x36, 0x36, 0x36, // 5), vec3(-0.6666 + 0x38, 0x34, 0x33, 0x38, 0x39, 0x31, 0x31, 0x34, 0x33, 0x37, 0x39, 0x38, 0x38, 0x32, 0x38, 0x31, // 8438911437988281 + 0x32, 0x35, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, 0x34, 0x38, 0x31, 0x31, 0x38, 0x34, 0x39, // 25, 1.6164811849 + 0x35, 0x39, 0x34, 0x31, 0x31, 0x36, 0x32, 0x31, 0x30, 0x39, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, // 5941162109375, 0 + 0x2e, 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x30, 0x30, 0x30, 0x34, 0x34, 0x39, 0x34, 0x31, // .015768500044941 + 0x39, 0x30, 0x32, 0x31, 0x36, 0x30, 0x36, 0x34, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x29, 0x2c, // 90216064453125), + 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x31, 0x37, 0x36, 0x33, 0x39, 0x38, 0x39, // vec3(0.01763989 + 0x39, 0x36, 0x32, 0x36, 0x33, 0x37, 0x34, 0x32, 0x34, 0x34, 0x36, 0x38, 0x39, 0x39, 0x34, 0x31, // 9626374244689941 + 0x34, 0x30, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, 0x32, 0x37, 0x37, 0x30, // 40625, -0.042770 + 0x36, 0x30, 0x31, 0x38, 0x30, 0x39, 0x30, 0x32, 0x34, 0x38, 0x31, 0x30, 0x37, 0x39, 0x31, 0x30, // 6018090248107910 + 0x31, 0x35, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x34, 0x32, 0x31, 0x30, 0x33, 0x30, // 15625, 0.9421030 + 0x38, 0x37, 0x39, 0x30, 0x32, 0x30, 0x36, 0x39, 0x30, 0x39, 0x31, 0x37, 0x39, 0x36, 0x38, 0x37, // 8790206909179687 + 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x76, 0x65, 0x63, 0x33, // 5)) * (mat3(vec3 + 0x28, 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, 0x35, 0x36, 0x34, 0x30, 0x39, 0x38, 0x33, 0x35, 0x38, // (0.4125564098358 + 0x31, 0x35, 0x34, 0x32, 0x39, 0x36, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x33, 0x35, 0x37, // 154296875, 0.357 + 0x35, 0x37, 0x36, 0x31, 0x30, 0x32, 0x30, 0x31, 0x38, 0x33, 0x35, 0x36, 0x33, 0x32, 0x33, 0x32, // 5761020183563232 + 0x34, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x38, 0x30, 0x34, 0x33, 0x37, // 421875, 0.180437 + 0x35, 0x30, 0x35, 0x32, 0x34, 0x35, 0x32, 0x30, 0x38, 0x37, 0x34, 0x30, 0x32, 0x33, 0x34, 0x33, // 5052452087402343 + 0x37, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x32, 0x31, 0x32, 0x36, // 75), vec3(0.2126 + 0x37, 0x32, 0x39, 0x30, 0x34, 0x31, 0x33, 0x33, 0x37, 0x39, 0x36, 0x36, 0x39, 0x31, 0x38, 0x39, // 7290413379669189 + 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x31, 0x35, 0x31, 0x35, 0x32, // 453125, 0.715152 + 0x32, 0x30, 0x34, 0x30, 0x33, 0x36, 0x37, 0x31, 0x32, 0x36, 0x34, 0x36, 0x34, 0x38, 0x34, 0x33, // 2040367126464843 + 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x37, 0x32, 0x31, 0x37, 0x35, 0x30, 0x30, 0x33, 0x35, // 75, 0.0721750035 + 0x38, 0x38, 0x31, 0x39, 0x39, 0x36, 0x31, 0x35, 0x34, 0x37, 0x38, 0x35, 0x31, 0x35, 0x36, 0x32, // 8819961547851562 + 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x31, 0x39, 0x33, 0x33, // 5), vec3(0.01933 + 0x33, 0x39, 0x30, 0x30, 0x38, 0x38, 0x33, 0x37, 0x39, 0x33, 0x38, 0x33, 0x30, 0x38, 0x37, 0x31, // 3900883793830871 + 0x35, 0x38, 0x32, 0x30, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x31, 0x39, 0x31, // 58203125, 0.1191 + 0x39, 0x31, 0x39, 0x39, 0x36, 0x37, 0x35, 0x33, 0x32, 0x31, 0x35, 0x37, 0x38, 0x39, 0x37, 0x39, // 9199675321578979 + 0x34, 0x39, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x35, 0x30, 0x33, 0x30, // 4921875, 0.95030 + 0x34, 0x30, 0x39, 0x30, 0x39, 0x37, 0x36, 0x37, 0x31, 0x35, 0x30, 0x38, 0x37, 0x38, 0x39, 0x30, // 4090976715087890 + 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x37, 0x39, 0x2e, 0x78, 0x79, 0x7a, // 625)) * _279.xyz + 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x79, // )) * u_params1.y + 0x29, 0x20, 0x2a, 0x20, 0x39, 0x2e, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x34, 0x37, 0x33, // ) * 9.9999997473 + 0x37, 0x38, 0x37, 0x35, 0x31, 0x36, 0x33, 0x35, 0x35, 0x35, 0x31, 0x34, 0x35, 0x32, 0x36, 0x33, // 7875163555145263 + 0x36, 0x37, 0x31, 0x38, 0x38, 0x65, 0x2d, 0x30, 0x35, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // 67188e-05, vec3( + 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x37, 0x35, 0x37, 0x38, 0x31, 0x32, 0x35, 0x29, // 0.1593017578125) + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // );. + 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x28, 0x76, // _549 = pow((v + 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x38, 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, 0x29, 0x20, 0x2b, // ec3(0.8359375) + + 0x20, 0x28, 0x5f, 0x34, 0x39, 0x36, 0x20, 0x2a, 0x20, 0x31, 0x38, 0x2e, 0x38, 0x35, 0x31, 0x35, // (_496 * 18.8515 + 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, // 625)) / (vec3(1. + 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x34, 0x39, 0x36, 0x20, 0x2a, 0x20, 0x31, 0x38, 0x2e, // 0) + (_496 * 18. + 0x36, 0x38, 0x37, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x37, 0x38, 0x2e, // 6875)), vec3(78. + 0x38, 0x34, 0x33, 0x37, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 84375));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, // _549 = vec + 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 3(0.0);. + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x39, 0x3b, 0x0a, 0x20, // _548 = _549;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x5f, 0x35, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x3b, 0x0a, 0x20, 0x20, // _547 = _548;. + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // }. bgfx_Fra + 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x35, // gColor = vec4(_5 + 0x34, 0x37, 0x2c, 0x20, 0x5f, 0x32, 0x37, 0x39, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, // 47, _279.w);.}.. + 0x00, // . }; -static const uint8_t fs_texture_essl[2478] = +static const uint8_t fs_texture_essl[3635] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // _params0........ 0x00, 0x00, 0x09, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x02, 0x01, 0x00, 0x00, // ...u_params1.... 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // .......s_texColo - 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x09, 0x00, 0x00, 0x76, // r..........^...v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // arying highp vec - 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // 4 v_color0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // ing highp vec3 v - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // _texcoord0;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, // orm highp vec4 u - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // _params0;.unifor - 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, // m highp vec4 u_p - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // arams1;.uniform - 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // sampler2D s_texC - 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, // olor;.void main - 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ().{. lowp vec4 - 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, // color_1;. lowp - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, // vec4 tmpvar_2;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, // tmpvar_2 = tex - 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x4c, 0x6f, 0x64, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x5f, // ture2DLod (s_ - 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // texColor, v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // oord0.xy, u_para - 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // ms0.x);. color_ - 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, // 1.w = tmpvar_2.w - 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, // ;. color_1.xyz - 0x3d, 0x20, 0x28, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x0a, 0x20, 0x20, // = (mix (pow (. - 0x20, 0x20, 0x61, 0x62, 0x73, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, // abs(tmpvar_2.x - 0x79, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, // yz). , vec3(2.2 - 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x29, 0x29, 0x2c, 0x20, 0x74, 0x6d, // , 2.2, 2.2)), tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, // pvar_2.xyz, u_pa - 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x65, 0x78, 0x70, 0x32, 0x28, // rams0.z) * exp2( - 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x0a, 0x20, // u_params0.w));. - 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, // color_1 = (colo - 0x72, 0x5f, 0x31, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x3b, // r_1 * v_color0); - 0x0a, 0x20, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // . mediump vec4 - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, // tmpvar_3;. lowp - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x34, // vec3 outColor_4 - 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, // ;. lowp vec3 tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // pvar_5;. tmpvar - 0x5f, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // _5.x = 0.0;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, // pvar_5.y = 0.0;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, // tmpvar_5.z = 0 - 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x34, // .0;. outColor_4 - 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x69, // = tmpvar_5;. i - 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, // f ((u_params1.x - 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, // < 0.5)) {. lo - 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, // wp vec3 tmpvar_6 - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x20, 0x3d, // ;. tmpvar_6 = - 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, // clamp (color_1. - 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, // xyz, 0.0, 1.0);. - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x72, // lowp vec3 _r - 0x67, 0x62, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x37, // gb_7;. _rgb_7 - 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, // = tmpvar_6;. - 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, // lowp float tmpv - 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, // ar_8;. if ((t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x78, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, // mpvar_6.x <= 0.0 - 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 031308)) {. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, // tmpvar_8 = (12. - 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x78, 0x29, // 92 * tmpvar_6.x) - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, // ;. } else {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x20, 0x3d, 0x20, // tmpvar_8 = - 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, // ((1.055 * pow (t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, // mpvar_6.x, 0.416 - 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, // 6667)) - 0.055); - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, // . };. _rgb - 0x5f, 0x37, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, // _7.x = tmpvar_8; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, // . lowp float - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, // tmpvar_9;. if - 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x79, 0x20, 0x3c, 0x3d, // ((tmpvar_6.y <= - 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, // 0.0031308)) {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, // tmpvar_9 = - 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // (12.92 * tmpvar_ - 0x36, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, // 6.y);. } else - 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // {. tmpvar_ - 0x39, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, // 9 = ((1.055 * po - 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x79, 0x2c, 0x20, 0x30, // w (tmpvar_6.y, 0 - 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, // .4166667)) - 0.0 - 0x35, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 55);. };. - 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x37, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // _rgb_7.y = tmpva - 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, // r_9;. lowp fl - 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, // oat tmpvar_10;. - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, // if ((tmpvar_6 - 0x2e, 0x7a, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, // .z <= 0.0031308) - 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ) {. tmpvar - 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, // _10 = (12.92 * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // mpvar_6.z);. - 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, // } else {. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, // mpvar_10 = ((1.0 - 0x35, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // 55 * pow (tmpvar - 0x5f, 0x36, 0x2e, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, // _6.z, 0.4166667) - 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // ) - 0.055);. - 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x37, 0x2e, 0x7a, 0x20, // };. _rgb_7.z - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, // = tmpvar_10;. - 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x72, // outColor_4 = _r - 0x67, 0x62, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, // gb_7;. } else { - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // . if ((u_para - 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, // ms1.x < 1.5)) {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x34, // outColor_4 - 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, // = color_1.xyz;. - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // } else {. - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // if ((u_params - 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x32, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, // 1.x < 2.5)) {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // lowp vec3 - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // _color_11;. - 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x28, // _color_11 = ( - 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x31, 0x2e, 0x37, 0x31, 0x36, 0x36, 0x35, 0x31, 0x2c, 0x20, // (mat3(1.716651, - 0x2d, 0x30, 0x2e, 0x33, 0x35, 0x35, 0x36, 0x37, 0x30, 0x38, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x32, // -0.3556708, -0.2 - 0x35, 0x33, 0x33, 0x36, 0x36, 0x33, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x38, // 533663, -0.66668 - 0x34, 0x34, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x30, 0x2e, // 44, 1.616481, 0. - 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x37, 0x36, 0x33, // 0157685, 0.01763 - 0x39, 0x39, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, 0x32, 0x37, 0x37, 0x30, 0x36, 0x2c, 0x20, // 99, -0.0427706, - 0x30, 0x2e, 0x39, 0x34, 0x32, 0x31, 0x30, 0x33, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x6d, 0x61, // 0.9421031) * (ma - 0x74, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, 0x35, 0x36, 0x34, 0x2c, 0x20, 0x30, 0x2e, // t3(0.4125564, 0. - 0x33, 0x35, 0x37, 0x35, 0x37, 0x36, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x38, 0x30, 0x34, 0x33, // 3575761, 0.18043 - 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x31, 0x32, 0x36, 0x37, 0x32, 0x39, 0x2c, 0x20, 0x30, // 75, 0.2126729, 0 - 0x2e, 0x37, 0x31, 0x35, 0x31, 0x35, 0x32, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x37, 0x32, 0x31, // .7151522, 0.0721 - 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x39, 0x33, 0x33, 0x33, 0x39, 0x2c, 0x20, 0x30, // 75, 0.0193339, 0 - 0x2e, 0x31, 0x31, 0x39, 0x31, 0x39, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x35, 0x30, 0x33, 0x30, // .119192, 0.95030 - 0x34, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, // 41) * color_1.xy - 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, // z)) * u_params1. - 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, // y);. lowp - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, // vec3 tmpvar_12; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // . tmpvar_ - 0x31, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x28, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // 12 = pow ((_colo - 0x72, 0x5f, 0x31, 0x31, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, 0x29, 0x2c, 0x20, // r_11 * 0.0001), - 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, 0x2c, 0x20, // vec3(0.1593018, - 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x35, 0x39, // 0.1593018, 0.159 - 0x33, 0x30, 0x31, 0x38, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 3018));. - 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // lowp vec3 tmpvar - 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // _13;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x28, 0x28, // var_13 = pow ((( - 0x30, 0x2e, 0x38, 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, 0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, // 0.8359375 + . - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, 0x38, 0x2e, 0x38, 0x35, 0x31, 0x35, 0x36, // (18.85156 - 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x29, 0x0a, 0x20, 0x20, // * tmpvar_12). - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, // ) / (vec3( - 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, // 1.0, 1.0, 1.0) + - 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, 0x38, 0x2e, // . (18. - 0x36, 0x38, 0x37, 0x35, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, // 6875 * tmpvar_12 - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, // ). )), ve - 0x63, 0x33, 0x28, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x37, 0x38, 0x2e, // c3(78.84375, 78. - 0x38, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x29, // 84375, 78.84375) - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // );. _colo - 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, // r_11 = tmpvar_13 - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, // ;. outCol - 0x6f, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, // or_4 = tmpvar_13 - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, // ;. };. } - 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, // ;. };. lowp ve - 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, // c4 tmpvar_14;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, // tmpvar_14.xyz = - 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // outColor_4;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, // pvar_14.w = colo - 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // r_1.w;. tmpvar_ - 0x33, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, // 3 = tmpvar_14;. - 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, // gl_FragColor = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // tmpvar_3;.}... + 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x0d, 0x00, 0x00, 0x70, // r..............p + 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, // recision mediump + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, // float;.precisio + 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, // n highp int;..un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // iform highp vec4 + 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // u_params0;.unif + 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, // orm highp sample + 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, // r2D s_texColor;. + 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // uniform highp ve + 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x3b, 0x0a, 0x0a, 0x69, // c4 u_params1;..i + 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, // n highp vec3 v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, // excoord0;.in hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // hp vec4 v_color0 + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // n = 0) out highp + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, // vec4 bgfx_FragC + 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // olor;..void main + 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // ().{. highp v + 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, // ec4 _264 = textu + 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // reLod(s_texColor + 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, // , v_texcoord0.xy + 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, 0x3b, 0x0a, // , u_params0.x);. + 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // highp vec3 _ + 0x32, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, // 267 = _264.xyz;. + 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, // highp vec3 _ + 0x33, 0x33, 0x33, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x61, 0x62, // 333 = mix(pow(ab + 0x73, 0x28, 0x5f, 0x32, 0x36, 0x37, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, // s(_267), vec3(2. + 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x37, 0x36, 0x38, 0x33, 0x37, 0x31, 0x35, 0x38, // 2000000476837158 + 0x32, 0x30, 0x33, 0x31, 0x32, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x36, 0x37, 0x2c, 0x20, // 203125)), _267, + 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x7a, // vec3(u_params0.z + 0x29, 0x29, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x75, 0x5f, // )) * pow(2.0, u_ + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // params0.w);. + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x32, 0x36, 0x20, // highp vec4 _526 + 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x32, 0x36, // = _264;. _526 + 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x33, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, // .x = _333.x;. + 0x20, 0x5f, 0x35, 0x32, 0x36, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x33, 0x2e, 0x79, // _526.y = _333.y + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x32, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, // ;. _526.z = _ + 0x33, 0x33, 0x33, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // 333.z;. highp + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x37, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x32, // vec4 _279 = _52 + 0x36, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, // 6 * v_color0;. + 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x34, // highp vec3 _54 + 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, // 7;. if (u_par + 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, // ams1.x < 0.5). + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, // {. high + 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x63, 0x6c, // p vec3 _362 = cl + 0x61, 0x6d, 0x70, 0x28, 0x5f, 0x32, 0x37, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, // amp(_279.xyz, ve + 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, // c3(0.0), vec3(1. + 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, // 0));. hig + 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x33, 0x20, 0x3d, 0x20, // hp float _403 = + 0x5f, 0x33, 0x36, 0x32, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _362.x;. + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x34, 0x31, // highp float _541 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, // ;. do. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x30, 0x33, 0x20, 0x3c, 0x3d, 0x20, 0x30, // if (_403 <= 0 + 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, // .003130800090730 + 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, // 190277099609375) + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, // _ + 0x35, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, // 541 = 12.9200000 + 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, // 762939453125 * _ + 0x34, 0x30, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 403;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x20, 0x3d, 0x20, // _541 = + 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, // (1.0549999475479 + 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, // 1259765625 * pow + 0x28, 0x5f, 0x34, 0x30, 0x33, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, // (_403, 0.4166666 + 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, // 5673255920410156 + 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, // 25)) - 0.0549999 + 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, // 9970197677612304 + 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 6875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, // break; // + 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, // unreachable wor + 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // karound. + 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, // } while(false);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, // highp fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x32, 0x2e, // oat _407 = _362. + 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // y;. highp + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, // float _543;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // do. + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, // {. if + 0x20, 0x28, 0x5f, 0x34, 0x30, 0x37, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, // (_407 <= 0.0031 + 0x33, 0x30, 0x38, 0x30, 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, // 3080009073019027 + 0x37, 0x30, 0x39, 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, // 7099609375). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x20, 0x3d, // _543 = + 0x20, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, // 12.920000076293 + 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x30, 0x37, 0x3b, 0x0a, // 9453125 * _407;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, // _543 = (1.05 + 0x34, 0x39, 0x39, 0x39, 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, // 4999947547912597 + 0x36, 0x35, 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x30, 0x37, // 65625 * pow(_407 + 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, // , 0.416666656732 + 0x35, 0x35, 0x39, 0x32, 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, // 5592041015625)) + 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, // - 0.054999999701 + 0x39, 0x37, 0x36, 0x37, 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, // 976776123046875; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, // break; // unre + 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, // achable workarou + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, // nd. } whi + 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // le(false);. + 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // highp float _ + 0x34, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x32, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, // 411 = _362.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // highp floa + 0x74, 0x20, 0x5f, 0x35, 0x34, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // t _545;. + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // do. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x31, // if (_41 + 0x31, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, 0x30, // 1 <= 0.003130800 + 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, 0x36, // 0907301902770996 + 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 09375). + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, 0x39, // _545 = 12.9 + 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, 0x31, // 2000007629394531 + 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 25 * _411;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, // break + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // ;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, // else + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, // _ + 0x35, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, // 545 = (1.0549999 + 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, // 4754791259765625 + 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x31, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x34, // * pow(_411, 0.4 + 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, 0x30, // 1666665673255920 + 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, // 41015625)) - 0.0 + 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, 0x37, // 5499999970197677 + 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 6123046875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, // brea + 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // k;. } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, // . bre + 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, // ak; // unreachab + 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, 0x20, // le workaround. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, // } while(fa + 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, // lse);. _5 + 0x34, 0x37, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x35, 0x34, 0x31, 0x2c, 0x20, // 47 = vec3(_541, + 0x5f, 0x35, 0x34, 0x33, 0x2c, 0x20, 0x5f, 0x35, 0x34, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // _543, _545);. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, // }. else. + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // {. highp + 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // vec3 _548;. + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, // if (u_params1 + 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // .x < 1.5). + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x5f, 0x35, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x39, 0x2e, 0x78, 0x79, 0x7a, 0x3b, // _548 = _279.xyz; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . }. + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, // {. hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x34, 0x39, 0x3b, 0x0a, 0x20, // ghp vec3 _549;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, // if (u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x32, 0x2e, 0x35, // _params1.x < 2.5 + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // ). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x34, 0x39, 0x36, 0x20, // highp vec3 _496 + 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x28, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x76, 0x65, 0x63, // = pow(((mat3(vec + 0x33, 0x28, 0x31, 0x2e, 0x37, 0x31, 0x36, 0x36, 0x35, 0x31, 0x32, 0x30, 0x31, 0x32, 0x34, 0x38, // 3(1.716651201248 + 0x31, 0x36, 0x38, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x33, // 1689453125, -0.3 + 0x35, 0x35, 0x36, 0x37, 0x30, 0x38, 0x30, 0x39, 0x37, 0x34, 0x35, 0x37, 0x38, 0x38, 0x35, 0x37, // 5567080974578857 + 0x34, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x33, 0x33, 0x36, // 421875, -0.25336 + 0x36, 0x32, 0x39, 0x31, 0x35, 0x32, 0x32, 0x39, 0x37, 0x39, 0x37, 0x33, 0x36, 0x33, 0x32, 0x38, // 6291522979736328 + 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x36, 0x36, // 125), vec3(-0.66 + 0x36, 0x36, 0x38, 0x34, 0x33, 0x38, 0x39, 0x31, 0x31, 0x34, 0x33, 0x37, 0x39, 0x38, 0x38, 0x32, // 6684389114379882 + 0x38, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, 0x34, 0x38, 0x31, 0x31, 0x38, // 8125, 1.61648118 + 0x34, 0x39, 0x35, 0x39, 0x34, 0x31, 0x31, 0x36, 0x32, 0x31, 0x30, 0x39, 0x33, 0x37, 0x35, 0x2c, // 495941162109375, + 0x20, 0x30, 0x2e, 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x30, 0x30, 0x30, 0x34, 0x34, 0x39, // 0.0157685000449 + 0x34, 0x31, 0x39, 0x30, 0x32, 0x31, 0x36, 0x30, 0x36, 0x34, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, // 4190216064453125 + 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x31, 0x37, 0x36, 0x33, 0x39, // ), vec3(0.017639 + 0x38, 0x39, 0x39, 0x36, 0x32, 0x36, 0x33, 0x37, 0x34, 0x32, 0x34, 0x34, 0x36, 0x38, 0x39, 0x39, // 8996263742446899 + 0x34, 0x31, 0x34, 0x30, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, 0x32, 0x37, // 4140625, -0.0427 + 0x37, 0x30, 0x36, 0x30, 0x31, 0x38, 0x30, 0x39, 0x30, 0x32, 0x34, 0x38, 0x31, 0x30, 0x37, 0x39, // 7060180902481079 + 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x34, 0x32, 0x31, 0x30, // 1015625, 0.94210 + 0x33, 0x30, 0x38, 0x37, 0x39, 0x30, 0x32, 0x30, 0x36, 0x39, 0x30, 0x39, 0x31, 0x37, 0x39, 0x36, // 3087902069091796 + 0x38, 0x37, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x76, 0x65, // 875)) * (mat3(ve + 0x63, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, 0x35, 0x36, 0x34, 0x30, 0x39, 0x38, 0x33, // c3(0.41255640983 + 0x35, 0x38, 0x31, 0x35, 0x34, 0x32, 0x39, 0x36, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x33, // 58154296875, 0.3 + 0x35, 0x37, 0x35, 0x37, 0x36, 0x31, 0x30, 0x32, 0x30, 0x31, 0x38, 0x33, 0x35, 0x36, 0x33, 0x32, // 5757610201835632 + 0x33, 0x32, 0x34, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x38, 0x30, 0x34, // 32421875, 0.1804 + 0x33, 0x37, 0x35, 0x30, 0x35, 0x32, 0x34, 0x35, 0x32, 0x30, 0x38, 0x37, 0x34, 0x30, 0x32, 0x33, // 3750524520874023 + 0x34, 0x33, 0x37, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x32, 0x31, // 4375), vec3(0.21 + 0x32, 0x36, 0x37, 0x32, 0x39, 0x30, 0x34, 0x31, 0x33, 0x33, 0x37, 0x39, 0x36, 0x36, 0x39, 0x31, // 2672904133796691 + 0x38, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x31, 0x35, 0x31, // 89453125, 0.7151 + 0x35, 0x32, 0x32, 0x30, 0x34, 0x30, 0x33, 0x36, 0x37, 0x31, 0x32, 0x36, 0x34, 0x36, 0x34, 0x38, // 5220403671264648 + 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x37, 0x32, 0x31, 0x37, 0x35, 0x30, 0x30, // 4375, 0.07217500 + 0x33, 0x35, 0x38, 0x38, 0x31, 0x39, 0x39, 0x36, 0x31, 0x35, 0x34, 0x37, 0x38, 0x35, 0x31, 0x35, // 3588199615478515 + 0x36, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x31, 0x39, // 625), vec3(0.019 + 0x33, 0x33, 0x33, 0x39, 0x30, 0x30, 0x38, 0x38, 0x33, 0x37, 0x39, 0x33, 0x38, 0x33, 0x30, 0x38, // 3339008837938308 + 0x37, 0x31, 0x35, 0x38, 0x32, 0x30, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x31, // 7158203125, 0.11 + 0x39, 0x31, 0x39, 0x31, 0x39, 0x39, 0x36, 0x37, 0x35, 0x33, 0x32, 0x31, 0x35, 0x37, 0x38, 0x39, // 9191996753215789 + 0x37, 0x39, 0x34, 0x39, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x35, 0x30, // 794921875, 0.950 + 0x33, 0x30, 0x34, 0x30, 0x39, 0x30, 0x39, 0x37, 0x36, 0x37, 0x31, 0x35, 0x30, 0x38, 0x37, 0x38, // 3040909767150878 + 0x39, 0x30, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x37, 0x39, 0x2e, 0x78, // 90625)) * _279.x + 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, // yz)) * u_params1 + 0x2e, 0x79, 0x29, 0x20, 0x2a, 0x20, 0x39, 0x2e, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x34, // .y) * 9.99999974 + 0x37, 0x33, 0x37, 0x38, 0x37, 0x35, 0x31, 0x36, 0x33, 0x35, 0x35, 0x35, 0x31, 0x34, 0x35, 0x32, // 7378751635551452 + 0x36, 0x33, 0x36, 0x37, 0x31, 0x38, 0x38, 0x65, 0x2d, 0x30, 0x35, 0x2c, 0x20, 0x76, 0x65, 0x63, // 6367188e-05, vec + 0x33, 0x28, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x37, 0x35, 0x37, 0x38, 0x31, 0x32, // 3(0.159301757812 + 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 5));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x28, // _549 = pow( + 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x38, 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, 0x29, // (vec3(0.8359375) + 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x34, 0x39, 0x36, 0x20, 0x2a, 0x20, 0x31, 0x38, 0x2e, 0x38, 0x35, // + (_496 * 18.85 + 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, // 15625)) / (vec3( + 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x34, 0x39, 0x36, 0x20, 0x2a, 0x20, 0x31, // 1.0) + (_496 * 1 + 0x38, 0x2e, 0x36, 0x38, 0x37, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x37, // 8.6875)), vec3(7 + 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 8.84375));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x76, // _549 = v + 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ec3(0.0);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x39, 0x3b, // _548 = _549; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . }. + 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x3b, 0x0a, // _547 = _548;. + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // }. bgfx_F + 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, // ragColor = vec4( + 0x5f, 0x35, 0x34, 0x37, 0x2c, 0x20, 0x5f, 0x32, 0x37, 0x39, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x7d, // _547, _279.w);.} + 0x0a, 0x0a, 0x00, // ... }; static const uint8_t fs_texture_spv[4403] = { diff --git a/tools/texturev/fs_texture_3d.bin.h b/tools/texturev/fs_texture_3d.bin.h index 656f92e5b..5959b4d0e 100644 --- a/tools/texturev/fs_texture_3d.bin.h +++ b/tools/texturev/fs_texture_3d.bin.h @@ -1,320 +1,455 @@ -static const uint8_t fs_texture_3d_glsl[2409] = +static const uint8_t fs_texture_3d_glsl[3476] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // _params0........ 0x00, 0x00, 0x09, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x02, 0x01, 0x00, 0x00, // ...u_params1.... 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // .......s_texColo - 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x09, 0x00, 0x00, 0x76, // r..............v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, // arying vec4 v_co - 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, // lor0;.varying ve - 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, // c3 v_texcoord0;. + 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x0d, 0x00, 0x00, 0x0a, // r..........D.... 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, // uniform vec4 u_p 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // arams0;.uniform - 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x3b, 0x0a, // vec4 u_params1;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x33, // uniform sampler3 - 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, // D s_texColor;.vo - 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, // id main ().{. v - 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x76, // ec4 color_1;. v - 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, // ec3 tmpvar_2;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x76, 0x5f, // tmpvar_2.xy = v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, // texcoord0.xy;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x70, // tmpvar_2.z = u_p - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // arams0.y;. vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_3;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x33, // var_3 = texture3 - 0x44, 0x4c, 0x6f, 0x64, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // DLod (s_texColor - 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, // , tmpvar_2, u_pa - 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, // rams0.x);. colo - 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, // r_1.w = tmpvar_3 - 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, // .w;. color_1.xy - 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x0a, // z = (mix (pow (. - 0x20, 0x20, 0x20, 0x20, 0x61, 0x62, 0x73, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, // abs(tmpvar_3 - 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, // .xyz). , vec3(2 - 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x29, 0x29, 0x2c, 0x20, // .2, 2.2, 2.2)), - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x75, 0x5f, // tmpvar_3.xyz, u_ - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x65, 0x78, 0x70, // params0.z) * exp - 0x32, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x29, 0x3b, // 2(u_params0.w)); - 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, // . color_1 = (co - 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // lor_1 * v_color0 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, // );. vec3 outCol - 0x6f, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, // or_4;. vec3 tmp - 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_5;. tmpvar_ - 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // 5.x = 0.0;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, // var_5.y = 0.0;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, // tmpvar_5.z = 0. - 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x34, 0x20, // 0;. outColor_4 - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, // = tmpvar_5;. if - 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, // ((u_params1.x < - 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, // 0.5)) {. vec - 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 3 tmpvar_6;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, // tmpvar_6 = clamp - 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x30, // (color_1.xyz, 0 - 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // .0, 1.0);. ve - 0x63, 0x33, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, // c3 _rgb_7;. _ - 0x72, 0x67, 0x62, 0x5f, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, // rgb_7 = tmpvar_6 - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, // ;. float tmpv - 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, // ar_8;. if ((t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x78, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, // mpvar_6.x <= 0.0 - 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 031308)) {. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, // tmpvar_8 = (12. - 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x78, 0x29, // 92 * tmpvar_6.x) - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, // ;. } else {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x20, 0x3d, 0x20, // tmpvar_8 = - 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, // ((1.055 * pow (t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, // mpvar_6.x, 0.416 - 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, // 6667)) - 0.055); - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, // . };. _rgb - 0x5f, 0x37, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, // _7.x = tmpvar_8; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // . float tmpva - 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, // r_9;. if ((tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x79, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, // pvar_6.y <= 0.00 - 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 31308)) {. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, // tmpvar_9 = (12.9 - 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x79, 0x29, 0x3b, // 2 * tmpvar_6.y); - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, // . } else {. - 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x28, // tmpvar_9 = ( - 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, // (1.055 * pow (tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, // pvar_6.y, 0.4166 - 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, // 667)) - 0.055);. - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, // };. _rgb_ - 0x37, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, // 7.y = tmpvar_9;. - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // float tmpvar - 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, // _10;. if ((tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x7a, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, // pvar_6.z <= 0.00 - 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 31308)) {. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, // tmpvar_10 = (12. - 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x7a, 0x29, // 92 * tmpvar_6.z) - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, // ;. } else {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x20, 0x3d, // tmpvar_10 = - 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, // ((1.055 * pow ( - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, // tmpvar_6.z, 0.41 - 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, // 66667)) - 0.055) - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, // ;. };. _rg - 0x62, 0x5f, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // b_7.z = tmpvar_1 - 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // 0;. outColor_ - 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, // 4 = _rgb_7;. } - 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, // else {. if (( - 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x31, 0x2e, // u_params1.x < 1. - 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, // 5)) {. outC - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, // olor_4 = color_1 - 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, // .xyz;. } else - 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, // {. if ((u_ - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x32, 0x2e, 0x35, 0x29, // params1.x < 2.5) - 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, // ) {. vec3 - 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // _color_11;. - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, // _color_11 = - 0x28, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x31, 0x2e, 0x37, 0x31, 0x36, 0x36, 0x35, 0x31, 0x2c, // ((mat3(1.716651, - 0x20, 0x2d, 0x30, 0x2e, 0x33, 0x35, 0x35, 0x36, 0x37, 0x30, 0x38, 0x2c, 0x20, 0x2d, 0x30, 0x2e, // -0.3556708, -0. - 0x32, 0x35, 0x33, 0x33, 0x36, 0x36, 0x33, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x36, 0x36, 0x36, 0x36, // 2533663, -0.6666 - 0x38, 0x34, 0x34, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x30, // 844, 1.616481, 0 - 0x2e, 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x37, 0x36, // .0157685, 0.0176 - 0x33, 0x39, 0x39, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, 0x32, 0x37, 0x37, 0x30, 0x36, 0x2c, // 399, -0.0427706, - 0x20, 0x30, 0x2e, 0x39, 0x34, 0x32, 0x31, 0x30, 0x33, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x6d, // 0.9421031) * (m - 0x61, 0x74, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, 0x35, 0x36, 0x34, 0x2c, 0x20, 0x30, // at3(0.4125564, 0 - 0x2e, 0x33, 0x35, 0x37, 0x35, 0x37, 0x36, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x38, 0x30, 0x34, // .3575761, 0.1804 - 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x31, 0x32, 0x36, 0x37, 0x32, 0x39, 0x2c, 0x20, // 375, 0.2126729, - 0x30, 0x2e, 0x37, 0x31, 0x35, 0x31, 0x35, 0x32, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x37, 0x32, // 0.7151522, 0.072 - 0x31, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x39, 0x33, 0x33, 0x33, 0x39, 0x2c, 0x20, // 175, 0.0193339, - 0x30, 0x2e, 0x31, 0x31, 0x39, 0x31, 0x39, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x35, 0x30, 0x33, // 0.119192, 0.9503 - 0x30, 0x34, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, // 041) * color_1.x - 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, // yz)) * u_params1 - 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, // .y);. vec - 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 3 tmpvar_12;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x3d, // tmpvar_12 = - 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x28, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x31, // pow ((_color_11 - 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // * 0.0001), vec3 - 0x28, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x35, // (0.1593018, 0.15 - 0x39, 0x33, 0x30, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, // 93018, 0.1593018 - 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, // ));. vec3 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // tmpvar_13;. - 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x3d, 0x20, // tmpvar_13 = - 0x70, 0x6f, 0x77, 0x20, 0x28, 0x28, 0x28, 0x30, 0x2e, 0x38, 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, // pow (((0.8359375 - 0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, // + . (1 - 0x38, 0x2e, 0x38, 0x35, 0x31, 0x35, 0x36, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // 8.85156 * tmpvar - 0x5f, 0x31, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x2f, // _12). ) / - 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, // (vec3(1.0, 1.0, - 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 1.0) + . - 0x20, 0x20, 0x20, 0x28, 0x31, 0x38, 0x2e, 0x36, 0x38, 0x37, 0x35, 0x20, 0x2a, 0x20, 0x74, 0x6d, // (18.6875 * tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // pvar_12). - 0x20, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, // )), vec3(78.843 - 0x37, 0x35, 0x2c, 0x20, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x37, 0x38, // 75, 78.84375, 78 - 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // .84375));. - 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x6d, // _color_11 = tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // pvar_13;. - 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x6d, // outColor_4 = tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // pvar_13;. } - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, // ;. };. };. - 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, // vec4 tmpvar_14;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x20, // tmpvar_14.xyz - 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, // = outColor_4;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x63, 0x6f, // tmpvar_14.w = co - 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, // lor_1.w;. gl_Fr - 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // agColor = tmpvar - 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _14;.}... + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x33, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // sampler3D s_texC + 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, // olor;.uniform ve + 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x3b, 0x0a, 0x0a, 0x69, // c4 u_params1;..i + 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // n vec3 v_texcoor + 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, // d0;.in vec4 v_co + 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, // lor0;.layout(loc + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, // ation = 0) out v + 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, // ec4 bgfx_FragCol + 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, // or;..void main() + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x36, 0x39, // .{. vec4 _269 + 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x73, 0x5f, // = textureLod(s_ + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x76, // texColor, vec3(v + 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x75, // _texcoord0.xy, u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x75, 0x5f, 0x70, // _params0.y), u_p + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, // arams0.x);. v + 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x37, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x39, 0x2e, // ec3 _272 = _269. + 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, // xyz;. vec3 _3 + 0x33, 0x38, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x61, 0x62, 0x73, // 38 = mix(pow(abs + 0x28, 0x5f, 0x32, 0x37, 0x32, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, // (_272), vec3(2.2 + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x37, 0x36, 0x38, 0x33, 0x37, 0x31, 0x35, 0x38, 0x32, // 0000004768371582 + 0x30, 0x33, 0x31, 0x32, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x37, 0x32, 0x2c, 0x20, 0x76, // 03125)), _272, v + 0x65, 0x63, 0x33, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x7a, 0x29, // ec3(u_params0.z) + 0x29, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x75, 0x5f, 0x70, // ) * pow(2.0, u_p + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, // arams0.w);. v + 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x39, 0x3b, // ec4 _531 = _269; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x33, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, // . _531.x = _3 + 0x33, 0x38, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x33, 0x31, 0x2e, 0x79, // 38.x;. _531.y + 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, // = _338.y;. _ + 0x35, 0x33, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x2e, 0x7a, 0x3b, 0x0a, // 531.z = _338.z;. + 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x38, 0x34, 0x20, 0x3d, 0x20, // vec4 _284 = + 0x5f, 0x35, 0x33, 0x31, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // _531 * v_color0; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x35, 0x32, 0x3b, 0x0a, // . vec3 _552;. + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // if (u_params + 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, // 1.x < 0.5). { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, // . vec3 _3 + 0x36, 0x37, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x5f, 0x32, 0x38, 0x34, 0x2e, // 67 = clamp(_284. + 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, // xyz, vec3(0.0), + 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // vec3(1.0));. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x38, 0x20, 0x3d, // float _408 = + 0x20, 0x5f, 0x33, 0x36, 0x37, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _367.x;. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x34, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, // float _546;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // do. + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, // {. if + 0x20, 0x28, 0x5f, 0x34, 0x30, 0x38, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, // (_408 <= 0.0031 + 0x33, 0x30, 0x38, 0x30, 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, // 3080009073019027 + 0x37, 0x30, 0x39, 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, // 7099609375). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x36, 0x20, 0x3d, // _546 = + 0x20, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, // 12.920000076293 + 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x30, 0x38, 0x3b, 0x0a, // 9453125 * _408;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, // _546 = (1.05 + 0x34, 0x39, 0x39, 0x39, 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, // 4999947547912597 + 0x36, 0x35, 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x30, 0x38, // 65625 * pow(_408 + 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, // , 0.416666656732 + 0x35, 0x35, 0x39, 0x32, 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, // 5592041015625)) + 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, // - 0.054999999701 + 0x39, 0x37, 0x36, 0x37, 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, // 976776123046875; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, // break; // unre + 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, // achable workarou + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, // nd. } whi + 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // le(false);. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x31, 0x32, 0x20, 0x3d, 0x20, // float _412 = + 0x5f, 0x33, 0x36, 0x37, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _367.y;. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // float _548;. + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, // do. { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, // . if + 0x28, 0x5f, 0x34, 0x31, 0x32, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, // (_412 <= 0.00313 + 0x30, 0x38, 0x30, 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, // 0800090730190277 + 0x30, 0x39, 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 099609375). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x20, 0x3d, 0x20, // _548 = + 0x31, 0x32, 0x2e, 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, // 12.9200000762939 + 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x31, 0x32, 0x3b, 0x0a, 0x20, // 453125 * _412;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, // b + 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // reak;. + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, // _548 = (1.054 + 0x39, 0x39, 0x39, 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, // 9999475479125976 + 0x35, 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x31, 0x32, 0x2c, // 5625 * pow(_412, + 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, // 0.4166666567325 + 0x35, 0x39, 0x32, 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, // 592041015625)) - + 0x20, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, // 0.0549999997019 + 0x37, 0x36, 0x37, 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, // 76776123046875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, // break; // unrea + 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, // chable workaroun + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, // d. } whil + 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // e(false);. + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x5f, // float _416 = _ + 0x33, 0x36, 0x37, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // 367.z;. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x35, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // loat _550;. + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // do. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, // if ( + 0x5f, 0x34, 0x31, 0x36, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, // _416 <= 0.003130 + 0x38, 0x30, 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, // 8000907301902770 + 0x39, 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 99609375). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x31, // _550 = 1 + 0x32, 0x2e, 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, // 2.92000007629394 + 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x31, 0x36, 0x3b, 0x0a, 0x20, 0x20, // 53125 * _416;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, // br + 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // eak;. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, // }. e + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // lse. + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x5f, 0x35, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, // _550 = (1.0549 + 0x39, 0x39, 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, // 9994754791259765 + 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x31, 0x36, 0x2c, 0x20, // 625 * pow(_416, + 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, // 0.41666665673255 + 0x39, 0x32, 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, // 92041015625)) - + 0x30, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, // 0.05499999970197 + 0x36, 0x37, 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, // 6776123046875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, // b + 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // reak;. + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, // break; // unreac + 0x68, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, // hable workaround + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, // . } while + 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // (false);. + 0x20, 0x5f, 0x35, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x35, 0x34, // _552 = vec3(_54 + 0x36, 0x2c, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x2c, 0x20, 0x5f, 0x35, 0x35, 0x30, 0x29, 0x3b, 0x0a, // 6, _548, _550);. + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, // }. else. + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, // {. vec + 0x33, 0x20, 0x5f, 0x35, 0x35, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 3 _553;. + 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, // if (u_params1.x + 0x3c, 0x20, 0x31, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, // < 1.5). { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x35, // . _55 + 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, // 3 = _284.xyz;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // else. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // vec3 + 0x5f, 0x35, 0x35, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _554;. + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, // if (u_params1. + 0x78, 0x20, 0x3c, 0x20, 0x32, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // x < 2.5). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x30, 0x31, // vec3 _501 + 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x28, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x76, 0x65, // = pow(((mat3(ve + 0x63, 0x33, 0x28, 0x31, 0x2e, 0x37, 0x31, 0x36, 0x36, 0x35, 0x31, 0x32, 0x30, 0x31, 0x32, 0x34, // c3(1.71665120124 + 0x38, 0x31, 0x36, 0x38, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, // 81689453125, -0. + 0x33, 0x35, 0x35, 0x36, 0x37, 0x30, 0x38, 0x30, 0x39, 0x37, 0x34, 0x35, 0x37, 0x38, 0x38, 0x35, // 3556708097457885 + 0x37, 0x34, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x33, 0x33, // 7421875, -0.2533 + 0x36, 0x36, 0x32, 0x39, 0x31, 0x35, 0x32, 0x32, 0x39, 0x37, 0x39, 0x37, 0x33, 0x36, 0x33, 0x32, // 6629152297973632 + 0x38, 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x36, // 8125), vec3(-0.6 + 0x36, 0x36, 0x36, 0x38, 0x34, 0x33, 0x38, 0x39, 0x31, 0x31, 0x34, 0x33, 0x37, 0x39, 0x38, 0x38, // 6668438911437988 + 0x32, 0x38, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, 0x34, 0x38, 0x31, 0x31, // 28125, 1.6164811 + 0x38, 0x34, 0x39, 0x35, 0x39, 0x34, 0x31, 0x31, 0x36, 0x32, 0x31, 0x30, 0x39, 0x33, 0x37, 0x35, // 8495941162109375 + 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x30, 0x30, 0x30, 0x34, 0x34, // , 0.015768500044 + 0x39, 0x34, 0x31, 0x39, 0x30, 0x32, 0x31, 0x36, 0x30, 0x36, 0x34, 0x34, 0x35, 0x33, 0x31, 0x32, // 9419021606445312 + 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x31, 0x37, 0x36, 0x33, // 5), vec3(0.01763 + 0x39, 0x38, 0x39, 0x39, 0x36, 0x32, 0x36, 0x33, 0x37, 0x34, 0x32, 0x34, 0x34, 0x36, 0x38, 0x39, // 9899626374244689 + 0x39, 0x34, 0x31, 0x34, 0x30, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, 0x32, // 94140625, -0.042 + 0x37, 0x37, 0x30, 0x36, 0x30, 0x31, 0x38, 0x30, 0x39, 0x30, 0x32, 0x34, 0x38, 0x31, 0x30, 0x37, // 7706018090248107 + 0x39, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x34, 0x32, 0x31, // 91015625, 0.9421 + 0x30, 0x33, 0x30, 0x38, 0x37, 0x39, 0x30, 0x32, 0x30, 0x36, 0x39, 0x30, 0x39, 0x31, 0x37, 0x39, // 0308790206909179 + 0x36, 0x38, 0x37, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x76, // 6875)) * (mat3(v + 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, 0x35, 0x36, 0x34, 0x30, 0x39, 0x38, // ec3(0.4125564098 + 0x33, 0x35, 0x38, 0x31, 0x35, 0x34, 0x32, 0x39, 0x36, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, // 358154296875, 0. + 0x33, 0x35, 0x37, 0x35, 0x37, 0x36, 0x31, 0x30, 0x32, 0x30, 0x31, 0x38, 0x33, 0x35, 0x36, 0x33, // 3575761020183563 + 0x32, 0x33, 0x32, 0x34, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x38, 0x30, // 232421875, 0.180 + 0x34, 0x33, 0x37, 0x35, 0x30, 0x35, 0x32, 0x34, 0x35, 0x32, 0x30, 0x38, 0x37, 0x34, 0x30, 0x32, // 4375052452087402 + 0x33, 0x34, 0x33, 0x37, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x32, // 34375), vec3(0.2 + 0x31, 0x32, 0x36, 0x37, 0x32, 0x39, 0x30, 0x34, 0x31, 0x33, 0x33, 0x37, 0x39, 0x36, 0x36, 0x39, // 1267290413379669 + 0x31, 0x38, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x31, 0x35, // 189453125, 0.715 + 0x31, 0x35, 0x32, 0x32, 0x30, 0x34, 0x30, 0x33, 0x36, 0x37, 0x31, 0x32, 0x36, 0x34, 0x36, 0x34, // 1522040367126464 + 0x38, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x37, 0x32, 0x31, 0x37, 0x35, 0x30, // 84375, 0.0721750 + 0x30, 0x33, 0x35, 0x38, 0x38, 0x31, 0x39, 0x39, 0x36, 0x31, 0x35, 0x34, 0x37, 0x38, 0x35, 0x31, // 0358819961547851 + 0x35, 0x36, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x31, // 5625), vec3(0.01 + 0x39, 0x33, 0x33, 0x33, 0x39, 0x30, 0x30, 0x38, 0x38, 0x33, 0x37, 0x39, 0x33, 0x38, 0x33, 0x30, // 9333900883793830 + 0x38, 0x37, 0x31, 0x35, 0x38, 0x32, 0x30, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, // 87158203125, 0.1 + 0x31, 0x39, 0x31, 0x39, 0x31, 0x39, 0x39, 0x36, 0x37, 0x35, 0x33, 0x32, 0x31, 0x35, 0x37, 0x38, // 1919199675321578 + 0x39, 0x37, 0x39, 0x34, 0x39, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x35, // 9794921875, 0.95 + 0x30, 0x33, 0x30, 0x34, 0x30, 0x39, 0x30, 0x39, 0x37, 0x36, 0x37, 0x31, 0x35, 0x30, 0x38, 0x37, // 0304090976715087 + 0x38, 0x39, 0x30, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x38, 0x34, 0x2e, // 890625)) * _284. + 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // xyz)) * u_params + 0x31, 0x2e, 0x79, 0x29, 0x20, 0x2a, 0x20, 0x39, 0x2e, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, // 1.y) * 9.9999997 + 0x34, 0x37, 0x33, 0x37, 0x38, 0x37, 0x35, 0x31, 0x36, 0x33, 0x35, 0x35, 0x35, 0x31, 0x34, 0x35, // 4737875163555145 + 0x32, 0x36, 0x33, 0x36, 0x37, 0x31, 0x38, 0x38, 0x65, 0x2d, 0x30, 0x35, 0x2c, 0x20, 0x76, 0x65, // 26367188e-05, ve + 0x63, 0x33, 0x28, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x37, 0x35, 0x37, 0x38, 0x31, // c3(0.15930175781 + 0x32, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 25));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, // _554 = pow + 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x38, 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, // ((vec3(0.8359375 + 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x35, 0x30, 0x31, 0x20, 0x2a, 0x20, 0x31, 0x38, 0x2e, 0x38, // ) + (_501 * 18.8 + 0x35, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, // 515625)) / (vec3 + 0x28, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x35, 0x30, 0x31, 0x20, 0x2a, 0x20, // (1.0) + (_501 * + 0x31, 0x38, 0x2e, 0x36, 0x38, 0x37, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // 18.6875)), vec3( + 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 78.84375));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x35, 0x34, 0x20, 0x3d, 0x20, // _554 = + 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // vec3(0.0);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x35, 0x34, // _553 = _554 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, // ;. }. + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x35, 0x33, 0x3b, // _552 = _553; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // . }. bgfx_ + 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, // FragColor = vec4 + 0x28, 0x5f, 0x35, 0x35, 0x32, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x34, 0x2e, 0x77, 0x29, 0x3b, 0x0a, // (_552, _284.w);. + 0x7d, 0x0a, 0x0a, 0x00, // }... }; -static const uint8_t fs_texture_3d_essl[2564] = +static const uint8_t fs_texture_3d_essl[3654] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // _params0........ 0x00, 0x00, 0x09, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x02, 0x01, 0x00, 0x00, // ...u_params1.... 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // .......s_texColo - 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x09, 0x00, 0x00, 0x76, // r..............v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // arying highp vec - 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // 4 v_color0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // ing highp vec3 v - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // _texcoord0;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, // orm highp vec4 u - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // _params0;.unifor - 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, // m highp vec4 u_p - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // arams1;.uniform - 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x33, 0x44, 0x20, 0x73, // lowp sampler3D s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // _texColor;.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, // main ().{. lowp - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, // vec4 color_1;. - 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, // highp vec3 tmpv - 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // ar_2;. tmpvar_2 - 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // .xy = v_texcoord - 0x30, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // 0.xy;. tmpvar_2 - 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x79, // .z = u_params0.y - 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, // ;. lowp vec4 tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // pvar_3;. tmpvar - 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x33, 0x44, 0x4c, 0x6f, // _3 = texture3DLo - 0x64, 0x45, 0x58, 0x54, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // dEXT (s_texColor - 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, // , tmpvar_2, u_pa - 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, // rams0.x);. colo - 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, // r_1.w = tmpvar_3 - 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, // .w;. color_1.xy - 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x0a, // z = (mix (pow (. - 0x20, 0x20, 0x20, 0x20, 0x61, 0x62, 0x73, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, // abs(tmpvar_3 - 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, // .xyz). , vec3(2 - 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x29, 0x29, 0x2c, 0x20, // .2, 2.2, 2.2)), - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x75, 0x5f, // tmpvar_3.xyz, u_ - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x65, 0x78, 0x70, // params0.z) * exp - 0x32, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x29, 0x3b, // 2(u_params0.w)); - 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, // . color_1 = (co - 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // lor_1 * v_color0 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, // );. mediump vec - 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, // 4 tmpvar_4;. lo - 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // wp vec3 outColor - 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // _5;. lowp vec3 - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // tmpvar_6;. tmpv - 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, // ar_6.x = 0.0;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, // tmpvar_6.y = 0.0 - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x7a, 0x20, 0x3d, // ;. tmpvar_6.z = - 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // 0.0;. outColor - 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, // _5 = tmpvar_6;. - 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, // if ((u_params1. - 0x78, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // x < 0.5)) {. - 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // lowp vec3 tmpvar - 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, // _7;. tmpvar_7 - 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // = clamp (color_ - 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, // 1.xyz, 0.0, 1.0) - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // ;. lowp vec3 - 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, // _rgb_8;. _rgb - 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, // _8 = tmpvar_7;. - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, // lowp float tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, // pvar_9;. if ( - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x78, 0x20, 0x3c, 0x3d, 0x20, 0x30, // (tmpvar_7.x <= 0 - 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // .0031308)) {. - 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x31, // tmpvar_9 = (1 - 0x32, 0x2e, 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, // 2.92 * tmpvar_7. - 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, // x);. } else { - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, // . tmpvar_9 - 0x3d, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, // = ((1.055 * pow - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, 0x34, // (tmpvar_7.x, 0.4 - 0x31, 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, // 166667)) - 0.055 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, // );. };. _r - 0x67, 0x62, 0x5f, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // gb_8.x = tmpvar_ - 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // 9;. lowp floa - 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, // t tmpvar_10;. - 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x79, // if ((tmpvar_7.y - 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, 0x29, 0x20, // <= 0.0031308)) - 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // {. tmpvar_1 - 0x30, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, // 0 = (12.92 * tmp - 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, // var_7.y);. } - 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // else {. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, // var_10 = ((1.055 - 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, // * pow (tmpvar_7 - 0x2e, 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, // .y, 0.4166667)) - 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, // - 0.055);. }; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x38, 0x2e, 0x79, 0x20, 0x3d, 0x20, // . _rgb_8.y = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, // tmpvar_10;. l - 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // owp float tmpvar - 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, // _11;. if ((tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x7a, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, // pvar_7.z <= 0.00 - 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 31308)) {. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, // tmpvar_11 = (12. - 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x7a, 0x29, // 92 * tmpvar_7.z) - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, // ;. } else {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, // tmpvar_11 = - 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, // ((1.055 * pow ( - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, // tmpvar_7.z, 0.41 - 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, // 66667)) - 0.055) - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, // ;. };. _rg - 0x62, 0x5f, 0x38, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // b_8.z = tmpvar_1 - 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // 1;. outColor_ - 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, // 5 = _rgb_8;. } - 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, // else {. if (( - 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x31, 0x2e, // u_params1.x < 1. - 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, // 5)) {. outC - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, // olor_5 = color_1 - 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, // .xyz;. } else - 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, // {. if ((u_ - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x32, 0x2e, 0x35, 0x29, // params1.x < 2.5) - 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, // ) {. lowp - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x32, 0x3b, // vec3 _color_12; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // . _color_ - 0x31, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x31, 0x2e, 0x37, 0x31, // 12 = ((mat3(1.71 - 0x36, 0x36, 0x35, 0x31, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x33, 0x35, 0x35, 0x36, 0x37, 0x30, 0x38, // 6651, -0.3556708 - 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x33, 0x33, 0x36, 0x36, 0x33, 0x2c, 0x20, 0x2d, 0x30, // , -0.2533663, -0 - 0x2e, 0x36, 0x36, 0x36, 0x36, 0x38, 0x34, 0x34, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, 0x34, // .6666844, 1.6164 - 0x38, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x2c, 0x20, 0x30, // 81, 0.0157685, 0 - 0x2e, 0x30, 0x31, 0x37, 0x36, 0x33, 0x39, 0x39, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, 0x32, // .0176399, -0.042 - 0x37, 0x37, 0x30, 0x36, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x34, 0x32, 0x31, 0x30, 0x33, 0x31, 0x29, // 7706, 0.9421031) - 0x20, 0x2a, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, 0x35, // * (mat3(0.41255 - 0x36, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x33, 0x35, 0x37, 0x35, 0x37, 0x36, 0x31, 0x2c, 0x20, 0x30, // 64, 0.3575761, 0 - 0x2e, 0x31, 0x38, 0x30, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x31, 0x32, 0x36, // .1804375, 0.2126 - 0x37, 0x32, 0x39, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x31, 0x35, 0x31, 0x35, 0x32, 0x32, 0x2c, 0x20, // 729, 0.7151522, - 0x30, 0x2e, 0x30, 0x37, 0x32, 0x31, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x39, 0x33, // 0.072175, 0.0193 - 0x33, 0x33, 0x39, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x31, 0x39, 0x31, 0x39, 0x32, 0x2c, 0x20, 0x30, // 339, 0.119192, 0 - 0x2e, 0x39, 0x35, 0x30, 0x33, 0x30, 0x34, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x63, 0x6f, 0x6c, 0x6f, // .9503041) * colo - 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, // r_1.xyz)) * u_pa - 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // rams1.y);. - 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, // lowp vec3 tmpv - 0x61, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, // ar_13;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, // mpvar_13 = pow ( - 0x28, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x30, // (_color_12 * 0.0 - 0x30, 0x30, 0x31, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x31, 0x35, 0x39, // 001), vec3(0.159 - 0x33, 0x30, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, 0x2c, // 3018, 0.1593018, - 0x20, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // 0.1593018));. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // lowp vec3 - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // tmpvar_14;. - 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x70, // tmpvar_14 = p - 0x6f, 0x77, 0x20, 0x28, 0x28, 0x28, 0x30, 0x2e, 0x38, 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, 0x20, // ow (((0.8359375 - 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, 0x38, // + . (18 - 0x2e, 0x38, 0x35, 0x31, 0x35, 0x36, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // .85156 * tmpvar_ - 0x31, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, // 13). ) / - 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, // (vec3(1.0, 1.0, - 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 1.0) + . - 0x20, 0x20, 0x28, 0x31, 0x38, 0x2e, 0x36, 0x38, 0x37, 0x35, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, // (18.6875 * tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // var_13). - 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, // )), vec3(78.8437 - 0x35, 0x2c, 0x20, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x37, 0x38, 0x2e, // 5, 78.84375, 78. - 0x38, 0x34, 0x33, 0x37, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 84375));. - 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // _color_12 = tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // var_14;. - 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // outColor_5 = tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, // var_14;. }; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x6c, // . };. };. l - 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // owp vec4 tmpvar_ - 0x31, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x2e, // 15;. tmpvar_15. - 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x35, // xyz = outColor_5 - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x2e, 0x77, 0x20, // ;. tmpvar_15.w - 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x74, // = color_1.w;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // mpvar_4 = tmpvar - 0x5f, 0x31, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // _15;. gl_FragCo - 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, // lor = tmpvar_4;. - 0x7d, 0x0a, 0x0a, 0x00, // }... + 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x0d, 0x00, 0x00, 0x70, // r..............p + 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, // recision mediump + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, // float;.precisio + 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, // n highp int;..un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // iform highp vec4 + 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // u_params0;.unif + 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, // orm highp sample + 0x72, 0x33, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, // r3D s_texColor;. + 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // uniform highp ve + 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x3b, 0x0a, 0x0a, 0x69, // c4 u_params1;..i + 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, // n highp vec3 v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, // excoord0;.in hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // hp vec4 v_color0 + 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, // ;.layout(locatio + 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // n = 0) out highp + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, // vec4 bgfx_FragC + 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // olor;..void main + 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // ().{. highp v + 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, // ec4 _269 = textu + 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // reLod(s_texColor + 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // , vec3(v_texcoor + 0x64, 0x30, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, // d0.xy, u_params0 + 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, // .y), u_params0.x + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // );. highp vec + 0x33, 0x20, 0x5f, 0x32, 0x37, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x39, 0x2e, 0x78, 0x79, // 3 _272 = _269.xy + 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // z;. highp vec + 0x33, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x70, 0x6f, 0x77, // 3 _338 = mix(pow + 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, 0x37, 0x32, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // (abs(_272), vec3 + 0x28, 0x32, 0x2e, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x37, 0x36, 0x38, 0x33, 0x37, // (2.2000000476837 + 0x31, 0x35, 0x38, 0x32, 0x30, 0x33, 0x31, 0x32, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x37, // 158203125)), _27 + 0x32, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // 2, vec3(u_params + 0x30, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x32, 0x2e, 0x30, 0x2c, // 0.z)) * pow(2.0, + 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, // u_params0.w);. + 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, // highp vec4 _5 + 0x33, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, // 31 = _269;. _ + 0x35, 0x33, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x2e, 0x78, 0x3b, 0x0a, // 531.x = _338.x;. + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x33, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, // _531.y = _33 + 0x38, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x33, 0x31, 0x2e, 0x7a, 0x20, // 8.y;. _531.z + 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, // = _338.z;. hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x38, 0x34, 0x20, 0x3d, 0x20, // ghp vec4 _284 = + 0x5f, 0x35, 0x33, 0x31, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // _531 * v_color0; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // . highp vec3 + 0x5f, 0x35, 0x35, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, // _552;. if (u_ + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x29, // params1.x < 0.5) + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, // . {. h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x36, 0x37, 0x20, 0x3d, // ighp vec3 _367 = + 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x5f, 0x32, 0x38, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x2c, // clamp(_284.xyz, + 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // vec3(0.0), vec3 + 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // (1.0));. + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x38, // highp float _408 + 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x37, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _367.x;. + 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // highp float _ + 0x35, 0x34, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, // 546;. do. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x30, 0x38, 0x20, 0x3c, // if (_408 < + 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, 0x30, 0x30, 0x39, 0x30, // = 0.003130800090 + 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, 0x36, 0x30, 0x39, 0x33, // 7301902770996093 + 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 75). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x5f, 0x35, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x30, 0x30, // _546 = 12.9200 + 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, // 000762939453125 + 0x2a, 0x20, 0x5f, 0x34, 0x30, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // * _408;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x36, // _546 + 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x34, 0x37, 0x35, // = (1.0549999475 + 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, // 4791259765625 * + 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x30, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, // pow(_408, 0.4166 + 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, 0x30, 0x34, 0x31, 0x30, // 6665673255920410 + 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x39, // 15625)) - 0.0549 + 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, 0x37, 0x36, 0x31, 0x32, // 9999970197677612 + 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 3046875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, // break; + 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x20, // // unreachable + 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // workaround. + 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, // } while(false + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // );. highp + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x33, // float _412 = _3 + 0x36, 0x37, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, // 67.y;. hi + 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x3b, 0x0a, // ghp float _548;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // do. + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x31, 0x32, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, // if (_412 <= 0.0 + 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, // 0313080009073019 + 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, // 0277099609375). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, // _54 + 0x38, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, // 8 = 12.920000076 + 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x31, // 2939453125 * _41 + 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 2;. + 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x31, // _548 = (1 + 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, // .054999947547912 + 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, // 59765625 * pow(_ + 0x34, 0x31, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, // 412, 0.416666656 + 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, // 7325592041015625 + 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, // )) - 0.054999999 + 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, // 7019767761230468 + 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 75;. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, // break; // u + 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, // nreachable worka + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, // round. } + 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, // while(false);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // highp floa + 0x74, 0x20, 0x5f, 0x34, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x37, 0x2e, 0x7a, 0x3b, // t _416 = _367.z; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, // . highp f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x35, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // loat _550;. + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // do. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, // if ( + 0x5f, 0x34, 0x31, 0x36, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, // _416 <= 0.003130 + 0x38, 0x30, 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, // 8000907301902770 + 0x39, 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 99609375). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x31, // _550 = 1 + 0x32, 0x2e, 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, // 2.92000007629394 + 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x31, 0x36, 0x3b, 0x0a, 0x20, 0x20, // 53125 * _416;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, // br + 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // eak;. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, // }. e + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // lse. + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x5f, 0x35, 0x35, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, // _550 = (1.0549 + 0x39, 0x39, 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, // 9994754791259765 + 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x31, 0x36, 0x2c, 0x20, // 625 * pow(_416, + 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, // 0.41666665673255 + 0x39, 0x32, 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, // 92041015625)) - + 0x30, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, // 0.05499999970197 + 0x36, 0x37, 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, // 6776123046875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, // b + 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // reak;. + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, // break; // unreac + 0x68, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, // hable workaround + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, // . } while + 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // (false);. + 0x20, 0x5f, 0x35, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x35, 0x34, // _552 = vec3(_54 + 0x36, 0x2c, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x2c, 0x20, 0x5f, 0x35, 0x35, 0x30, 0x29, 0x3b, 0x0a, // 6, _548, _550);. + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, // }. else. + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, // {. hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x35, 0x33, 0x3b, 0x0a, 0x20, 0x20, // hp vec3 _553;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // if (u_para + 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, // ms1.x < 1.5). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x5f, 0x35, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x34, 0x2e, 0x78, // _553 = _284.x + 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, // yz;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x35, 0x34, // highp vec3 _554 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, // ;. if + 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, // (u_params1.x < + 0x32, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 2.5). + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, // highp vec3 _5 + 0x30, 0x31, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x28, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, // 01 = pow(((mat3( + 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x37, 0x31, 0x36, 0x36, 0x35, 0x31, 0x32, 0x30, 0x31, // vec3(1.716651201 + 0x32, 0x34, 0x38, 0x31, 0x36, 0x38, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, // 2481689453125, - + 0x30, 0x2e, 0x33, 0x35, 0x35, 0x36, 0x37, 0x30, 0x38, 0x30, 0x39, 0x37, 0x34, 0x35, 0x37, 0x38, // 0.35567080974578 + 0x38, 0x35, 0x37, 0x34, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35, // 857421875, -0.25 + 0x33, 0x33, 0x36, 0x36, 0x32, 0x39, 0x31, 0x35, 0x32, 0x32, 0x39, 0x37, 0x39, 0x37, 0x33, 0x36, // 3366291522979736 + 0x33, 0x32, 0x38, 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, // 328125), vec3(-0 + 0x2e, 0x36, 0x36, 0x36, 0x36, 0x38, 0x34, 0x33, 0x38, 0x39, 0x31, 0x31, 0x34, 0x33, 0x37, 0x39, // .666684389114379 + 0x38, 0x38, 0x32, 0x38, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, 0x34, 0x38, // 8828125, 1.61648 + 0x31, 0x31, 0x38, 0x34, 0x39, 0x35, 0x39, 0x34, 0x31, 0x31, 0x36, 0x32, 0x31, 0x30, 0x39, 0x33, // 1184959411621093 + 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x30, 0x30, 0x30, // 75, 0.0157685000 + 0x34, 0x34, 0x39, 0x34, 0x31, 0x39, 0x30, 0x32, 0x31, 0x36, 0x30, 0x36, 0x34, 0x34, 0x35, 0x33, // 4494190216064453 + 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x31, 0x37, // 125), vec3(0.017 + 0x36, 0x33, 0x39, 0x38, 0x39, 0x39, 0x36, 0x32, 0x36, 0x33, 0x37, 0x34, 0x32, 0x34, 0x34, 0x36, // 6398996263742446 + 0x38, 0x39, 0x39, 0x34, 0x31, 0x34, 0x30, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, // 8994140625, -0.0 + 0x34, 0x32, 0x37, 0x37, 0x30, 0x36, 0x30, 0x31, 0x38, 0x30, 0x39, 0x30, 0x32, 0x34, 0x38, 0x31, // 4277060180902481 + 0x30, 0x37, 0x39, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x34, // 0791015625, 0.94 + 0x32, 0x31, 0x30, 0x33, 0x30, 0x38, 0x37, 0x39, 0x30, 0x32, 0x30, 0x36, 0x39, 0x30, 0x39, 0x31, // 2103087902069091 + 0x37, 0x39, 0x36, 0x38, 0x37, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x33, // 796875)) * (mat3 + 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, 0x35, 0x36, 0x34, 0x30, // (vec3(0.41255640 + 0x39, 0x38, 0x33, 0x35, 0x38, 0x31, 0x35, 0x34, 0x32, 0x39, 0x36, 0x38, 0x37, 0x35, 0x2c, 0x20, // 98358154296875, + 0x30, 0x2e, 0x33, 0x35, 0x37, 0x35, 0x37, 0x36, 0x31, 0x30, 0x32, 0x30, 0x31, 0x38, 0x33, 0x35, // 0.35757610201835 + 0x36, 0x33, 0x32, 0x33, 0x32, 0x34, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, // 63232421875, 0.1 + 0x38, 0x30, 0x34, 0x33, 0x37, 0x35, 0x30, 0x35, 0x32, 0x34, 0x35, 0x32, 0x30, 0x38, 0x37, 0x34, // 8043750524520874 + 0x30, 0x32, 0x33, 0x34, 0x33, 0x37, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, // 0234375), vec3(0 + 0x2e, 0x32, 0x31, 0x32, 0x36, 0x37, 0x32, 0x39, 0x30, 0x34, 0x31, 0x33, 0x33, 0x37, 0x39, 0x36, // .212672904133796 + 0x36, 0x39, 0x31, 0x38, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x37, // 69189453125, 0.7 + 0x31, 0x35, 0x31, 0x35, 0x32, 0x32, 0x30, 0x34, 0x30, 0x33, 0x36, 0x37, 0x31, 0x32, 0x36, 0x34, // 1515220403671264 + 0x36, 0x34, 0x38, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x37, 0x32, 0x31, 0x37, // 6484375, 0.07217 + 0x35, 0x30, 0x30, 0x33, 0x35, 0x38, 0x38, 0x31, 0x39, 0x39, 0x36, 0x31, 0x35, 0x34, 0x37, 0x38, // 5003588199615478 + 0x35, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, // 515625), vec3(0. + 0x30, 0x31, 0x39, 0x33, 0x33, 0x33, 0x39, 0x30, 0x30, 0x38, 0x38, 0x33, 0x37, 0x39, 0x33, 0x38, // 0193339008837938 + 0x33, 0x30, 0x38, 0x37, 0x31, 0x35, 0x38, 0x32, 0x30, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, // 3087158203125, 0 + 0x2e, 0x31, 0x31, 0x39, 0x31, 0x39, 0x31, 0x39, 0x39, 0x36, 0x37, 0x35, 0x33, 0x32, 0x31, 0x35, // .119191996753215 + 0x37, 0x38, 0x39, 0x37, 0x39, 0x34, 0x39, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, // 789794921875, 0. + 0x39, 0x35, 0x30, 0x33, 0x30, 0x34, 0x30, 0x39, 0x30, 0x39, 0x37, 0x36, 0x37, 0x31, 0x35, 0x30, // 9503040909767150 + 0x38, 0x37, 0x38, 0x39, 0x30, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x38, // 87890625)) * _28 + 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // 4.xyz)) * u_para + 0x6d, 0x73, 0x31, 0x2e, 0x79, 0x29, 0x20, 0x2a, 0x20, 0x39, 0x2e, 0x39, 0x39, 0x39, 0x39, 0x39, // ms1.y) * 9.99999 + 0x39, 0x37, 0x34, 0x37, 0x33, 0x37, 0x38, 0x37, 0x35, 0x31, 0x36, 0x33, 0x35, 0x35, 0x35, 0x31, // 9747378751635551 + 0x34, 0x35, 0x32, 0x36, 0x33, 0x36, 0x37, 0x31, 0x38, 0x38, 0x65, 0x2d, 0x30, 0x35, 0x2c, 0x20, // 4526367188e-05, + 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x37, 0x35, 0x37, // vec3(0.159301757 + 0x38, 0x31, 0x32, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 8125));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x70, // _554 = p + 0x6f, 0x77, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x38, 0x33, 0x35, 0x39, 0x33, // ow((vec3(0.83593 + 0x37, 0x35, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x35, 0x30, 0x31, 0x20, 0x2a, 0x20, 0x31, 0x38, // 75) + (_501 * 18 + 0x2e, 0x38, 0x35, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x76, 0x65, // .8515625)) / (ve + 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x35, 0x30, 0x31, 0x20, // c3(1.0) + (_501 + 0x2a, 0x20, 0x31, 0x38, 0x2e, 0x36, 0x38, 0x37, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, // * 18.6875)), vec + 0x33, 0x28, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // 3(78.84375));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x35, 0x34, 0x20, // _554 + 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // = vec3(0.0);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x35, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x35, // _553 = _5 + 0x35, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, // 54;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x35, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x35, // _552 = _55 + 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, // 3;. }. bgf + 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, // x_FragColor = ve + 0x63, 0x34, 0x28, 0x5f, 0x35, 0x35, 0x32, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x34, 0x2e, 0x77, 0x29, // c4(_552, _284.w) + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... }; static const uint8_t fs_texture_3d_spv[4463] = { diff --git a/tools/texturev/fs_texture_array.bin.h b/tools/texturev/fs_texture_array.bin.h index f764762ff..6f9aab09f 100644 --- a/tools/texturev/fs_texture_array.bin.h +++ b/tools/texturev/fs_texture_array.bin.h @@ -1,91 +1,81 @@ -static const uint8_t fs_texture_array_glsl[616] = +static const uint8_t fs_texture_array_glsl[531] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // _params0........ 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, // ...s_texColor... - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x02, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, // .......,...varyi - 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, // ng vec4 v_color0 - 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // ;.varying vec3 v - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // _texcoord0;.unif + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, // ............unif 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // orm vec4 u_param 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, // s0;.uniform samp 0x6c, 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, // ler2DArray s_tex - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // Color;.void main - 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, // ().{. vec3 tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_1;. tmpvar_ - 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // 1.xy = v_texcoor - 0x64, 0x30, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // d0.xy;. tmpvar_ - 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, // 1.z = u_params0. - 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // y;. vec4 _color - 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x32, 0x20, 0x3d, // _2;. _color_2 = - 0x20, 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, // (texture2DArray - 0x4c, 0x6f, 0x64, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, // Lod (s_texColor, - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, // tmpvar_1, u_par - 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ams0.x) * v_colo - 0x72, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, // r0);. vec4 tmpv - 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, // ar_3;. tmpvar_3 - 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, // .xyz = pow (abs( - 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x20, 0x28, // (. mix (pow ( - 0x61, 0x62, 0x73, 0x28, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x7a, // abs(_color_2.xyz - 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, // ), vec3(2.2, 2.2 - 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // , 2.2)), _color_ - 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, // 2.xyz, u_params0 - 0x2e, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, // .z). * . ex - 0x70, 0x32, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x0a, // p2(u_params0.w). - 0x20, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x35, 0x34, // )), vec3(0.454 - 0x35, 0x34, 0x35, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x2c, // 5454, 0.4545454, - 0x20, 0x30, 0x2e, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // 0.4545454));. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, // tmpvar_3.w = _co - 0x6c, 0x6f, 0x72, 0x5f, 0x32, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, // lor_2.w;. gl_Fr - 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // agColor = tmpvar - 0x5f, 0x33, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _3;.}... + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // Color;..in vec3 + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, // v_texcoord0;.lay + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, // out(location = 0 + 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, // ) out vec4 bgfx_ + 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, // FragColor;.in ve + 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, // c4 v_color0;..vo + 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // id main().{. + 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, // vec4 _114 = text + 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // ureLod(s_texColo + 0x72, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // r, vec3(v_texcoo + 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // rd0.xy, u_params + 0x30, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, // 0.y), u_params0. + 0x78, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, // x) * v_color0;. + 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, // vec3 _141 = _ + 0x31, 0x31, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, // 114.xyz;. bgf + 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, // x_FragColor = ve + 0x63, 0x34, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x61, 0x62, 0x73, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x70, // c4(pow(abs(mix(p + 0x6f, 0x77, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x31, 0x34, 0x31, 0x29, 0x2c, 0x20, 0x76, 0x65, // ow(abs(_141), ve + 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x37, 0x36, 0x38, // c3(2.20000004768 + 0x33, 0x37, 0x31, 0x35, 0x38, 0x32, 0x30, 0x33, 0x31, 0x32, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x5f, // 37158203125)), _ + 0x31, 0x34, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // 141, vec3(u_para + 0x6d, 0x73, 0x30, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x32, 0x2e, // ms0.z)) * pow(2. + 0x30, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x29, // 0, u_params0.w)) + 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, // , vec3(0.4545454 + 0x36, 0x38, 0x30, 0x39, 0x31, 0x39, 0x36, 0x34, 0x37, 0x32, 0x31, 0x36, 0x37, 0x39, 0x36, 0x38, // 6809196472167968 + 0x37, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x7d, // 75)), _114.w);.} + 0x0a, 0x0a, 0x00, // ... }; -static const uint8_t fs_texture_array_essl[701] = +static const uint8_t fs_texture_array_essl[619] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // _params0........ 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, // ...s_texColor... - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, // ...........varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ng highp vec4 v_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, // color0;.varying - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // highp vec3 v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // coord0;.uniform - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, // highp vec4 u_par - 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, // ams0;.uniform sa - 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x74, // mpler2DArray s_t - 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // exColor;.void ma - 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // in ().{. highp - 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, // vec3 tmpvar_1;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x76, // tmpvar_1.xy = v - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, // _texcoord0.xy;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x75, 0x5f, // tmpvar_1.z = u_ - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x6d, 0x65, 0x64, // params0.y;. med - 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // iump vec4 tmpvar - 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // _2;. lowp vec4 - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6c, // _color_3;. _col - 0x6f, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, // or_3 = (texture2 - 0x44, 0x41, 0x72, 0x72, 0x61, 0x79, 0x4c, 0x6f, 0x64, 0x45, 0x58, 0x54, 0x20, 0x28, 0x73, 0x5f, // DArrayLodEXT (s_ - 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // texColor, tmpvar - 0x5f, 0x31, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, // _1, u_params0.x) - 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, // * v_color0);. - 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // lowp vec4 tmpvar - 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x78, // _4;. tmpvar_4.x - 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x28, 0x0a, // yz = pow (abs((. - 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x61, 0x62, // mix (pow (ab - 0x73, 0x28, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x2c, // s(_color_3.xyz), - 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x2c, 0x20, // vec3(2.2, 2.2, - 0x32, 0x2e, 0x32, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x33, 0x2e, // 2.2)), _color_3. - 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x7a, // xyz, u_params0.z - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x32, // ). * . exp2 - 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x0a, 0x20, 0x20, // (u_params0.w). - 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x35, 0x34, 0x35, 0x34, // )), vec3(0.45454 - 0x35, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x2c, 0x20, 0x30, // 54, 0.4545454, 0 - 0x2e, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // .4545454));. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // pvar_4.w = _colo - 0x72, 0x5f, 0x33, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // r_3.w;. tmpvar_ - 0x32, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, // 2 = tmpvar_4;. - 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, // gl_FragColor = t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // mpvar_2;.}... + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x02, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, // ......./...preci + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, // sion mediump flo + 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, // at;.precision hi + 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // ghp int;..unifor + 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, // m highp vec4 u_p + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // arams0;.uniform + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x41, // highp sampler2DA + 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, // rray s_texColor; + 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // ..in highp vec3 + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, // v_texcoord0;.lay + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, // out(location = 0 + 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ) out highp vec4 + 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, // bgfx_FragColor; + 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, // .in highp vec4 v + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, // _color0;..void m + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, // ain().{. high + 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x65, // p vec4 _114 = te + 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, // xtureLod(s_texCo + 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // lor, vec3(v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // oord0.xy, u_para + 0x6d, 0x73, 0x30, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // ms0.y), u_params + 0x30, 0x2e, 0x78, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // 0.x) * v_color0; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // . highp vec3 + 0x5f, 0x31, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x3b, // _141 = _114.xyz; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // . bgfx_FragCo + 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x61, // lor = vec4(pow(a + 0x62, 0x73, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, // bs(mix(pow(abs(_ + 0x31, 0x34, 0x31, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, 0x30, 0x30, // 141), vec3(2.200 + 0x30, 0x30, 0x30, 0x30, 0x34, 0x37, 0x36, 0x38, 0x33, 0x37, 0x31, 0x35, 0x38, 0x32, 0x30, 0x33, // 0000476837158203 + 0x31, 0x32, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x34, 0x31, 0x2c, 0x20, 0x76, 0x65, 0x63, // 125)), _141, vec + 0x33, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x7a, 0x29, 0x29, 0x20, // 3(u_params0.z)) + 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, // * pow(2.0, u_par + 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, // ams0.w)), vec3(0 + 0x2e, 0x34, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x36, 0x38, 0x30, 0x39, 0x31, 0x39, 0x36, 0x34, // .454545468091964 + 0x37, 0x32, 0x31, 0x36, 0x37, 0x39, 0x36, 0x38, 0x37, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x31, // 7216796875)), _1 + 0x31, 0x34, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 14.w);.}... }; static const uint8_t fs_texture_array_spv[1855] = { diff --git a/tools/texturev/fs_texture_cube.bin.h b/tools/texturev/fs_texture_cube.bin.h index 9d5cc76a1..50ee8f2ed 100644 --- a/tools/texturev/fs_texture_cube.bin.h +++ b/tools/texturev/fs_texture_cube.bin.h @@ -1,341 +1,467 @@ -static const uint8_t fs_texture_cube_glsl[2570] = +static const uint8_t fs_texture_cube_glsl[3576] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x09, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // _params0........ + 0x00, 0x00, 0x05, 0x75, 0x5f, 0x6d, 0x74, 0x78, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, // ...u_mtx........ 0x00, 0x00, 0x09, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x02, 0x01, 0x00, 0x00, // ...u_params1.... 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // .......s_texColo - 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x75, 0x5f, 0x6d, 0x74, // r...........u_mt - 0x78, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x09, 0x00, 0x00, 0x76, // x..............v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, // arying vec4 v_co - 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, // lor0;.varying ve - 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, // c3 v_texcoord0;. + 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0d, 0x00, 0x00, 0x0a, // r............... 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, // uniform vec4 u_p 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // arams0;.uniform - 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x3b, 0x0a, // vec4 u_params1;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, // uniform samplerC - 0x75, 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, // ube s_texColor;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, // uniform mat4 u_m - 0x74, 0x78, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, // tx;.void main () - 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // .{. vec4 color_ - 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // 1;. vec3 tmpvar - 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x7a, // _2;. tmpvar_2.z - 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // = 1.0;. tmpvar - 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, // _2.xy = (((v_tex - 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x30, 0x29, // coord0.xy * 2.0) - 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, // - 1.0) * vec2(1 - 0x2e, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, // .0, -1.0));. ve - 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, // c4 tmpvar_3;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, // mpvar_3.w = 0.0; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x20, // . tmpvar_3.xyz - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, // = tmpvar_2;. ve - 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, // c4 tmpvar_4;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, // mpvar_4 = textur - 0x65, 0x43, 0x75, 0x62, 0x65, 0x4c, 0x6f, 0x64, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // eCubeLod (s_texC - 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, // olor, normalize( - 0x28, 0x75, 0x5f, 0x6d, 0x74, 0x78, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // (u_mtx * tmpvar_ - 0x33, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // 3).xyz), u_param - 0x73, 0x30, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, // s0.x);. color_1 - 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x77, 0x3b, // .w = tmpvar_4.w; - 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, // . color_1.xyz = - 0x20, 0x28, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, // (mix (pow (. - 0x20, 0x61, 0x62, 0x73, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x78, 0x79, // abs(tmpvar_4.xy - 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, 0x2c, // z). , vec3(2.2, - 0x20, 0x32, 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x29, 0x29, 0x2c, 0x20, 0x74, 0x6d, 0x70, // 2.2, 2.2)), tmp - 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, // var_4.xyz, u_par - 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x65, 0x78, 0x70, 0x32, 0x28, 0x75, // ams0.z) * exp2(u - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // _params0.w));. - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // color_1 = (color - 0x5f, 0x31, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x3b, 0x0a, // _1 * v_color0);. - 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // vec3 outColor_ - 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // 5;. vec3 tmpvar - 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x78, // _6;. tmpvar_6.x - 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // = 0.0;. tmpvar - 0x5f, 0x36, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // _6.y = 0.0;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, // pvar_6.z = 0.0;. - 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x74, // outColor_5 = t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, // mpvar_6;. if (( - 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x2e, // u_params1.x < 0. - 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, // 5)) {. vec3 t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // mpvar_7;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x63, // var_7 = clamp (c - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, // olor_1.xyz, 0.0, - 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // 1.0);. vec3 - 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, // _rgb_8;. _rgb - 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, // _8 = tmpvar_7;. - 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // float tmpvar_ - 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, // 9;. if ((tmpv - 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x78, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, // ar_7.x <= 0.0031 - 0x33, 0x30, 0x38, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, // 308)) {. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x20, // pvar_9 = (12.92 - 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, // * tmpvar_7.x);. - 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // } else {. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x31, // tmpvar_9 = ((1 - 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, // .055 * pow (tmpv - 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, // ar_7.x, 0.416666 - 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, // 7)) - 0.055);. - 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x38, 0x2e, // };. _rgb_8. - 0x78, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, // x = tmpvar_9;. - 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // float tmpvar_1 - 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, // 0;. if ((tmpv - 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x79, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, // ar_7.y <= 0.0031 - 0x33, 0x30, 0x38, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, // 308)) {. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, // pvar_10 = (12.92 - 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x79, 0x29, 0x3b, 0x0a, // * tmpvar_7.y);. - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // } else {. - 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, // tmpvar_10 = ( - 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, // (1.055 * pow (tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, // pvar_7.y, 0.4166 - 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, // 667)) - 0.055);. - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, // };. _rgb_ - 0x38, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x3b, // 8.y = tmpvar_10; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // . float tmpva - 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, // r_11;. if ((t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x7a, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, // mpvar_7.z <= 0.0 - 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 031308)) {. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, // tmpvar_11 = (12 - 0x2e, 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x7a, // .92 * tmpvar_7.z - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, // );. } else {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, // tmpvar_11 - 0x3d, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, // = ((1.055 * pow - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x34, // (tmpvar_7.z, 0.4 - 0x31, 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, // 166667)) - 0.055 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, // );. };. _r - 0x67, 0x62, 0x5f, 0x38, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // gb_8.z = tmpvar_ - 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // 11;. outColor - 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x7d, // _5 = _rgb_8;. } - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, // else {. if ( - 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x31, // (u_params1.x < 1 - 0x2e, 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, // .5)) {. out - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // Color_5 = color_ - 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, // 1.xyz;. } els - 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, // e {. if ((u - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x32, 0x2e, 0x35, // _params1.x < 2.5 - 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, // )) {. vec - 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 3 _color_12;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x3d, // _color_12 = - 0x20, 0x28, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x31, 0x2e, 0x37, 0x31, 0x36, 0x36, 0x35, 0x31, // ((mat3(1.716651 - 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x33, 0x35, 0x35, 0x36, 0x37, 0x30, 0x38, 0x2c, 0x20, 0x2d, 0x30, // , -0.3556708, -0 - 0x2e, 0x32, 0x35, 0x33, 0x33, 0x36, 0x36, 0x33, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x36, 0x36, 0x36, // .2533663, -0.666 - 0x36, 0x38, 0x34, 0x34, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, 0x34, 0x38, 0x31, 0x2c, 0x20, // 6844, 1.616481, - 0x30, 0x2e, 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x37, // 0.0157685, 0.017 - 0x36, 0x33, 0x39, 0x39, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, 0x32, 0x37, 0x37, 0x30, 0x36, // 6399, -0.0427706 - 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x34, 0x32, 0x31, 0x30, 0x33, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, // , 0.9421031) * ( - 0x6d, 0x61, 0x74, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, 0x35, 0x36, 0x34, 0x2c, 0x20, // mat3(0.4125564, - 0x30, 0x2e, 0x33, 0x35, 0x37, 0x35, 0x37, 0x36, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x38, 0x30, // 0.3575761, 0.180 - 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x31, 0x32, 0x36, 0x37, 0x32, 0x39, 0x2c, // 4375, 0.2126729, - 0x20, 0x30, 0x2e, 0x37, 0x31, 0x35, 0x31, 0x35, 0x32, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x37, // 0.7151522, 0.07 - 0x32, 0x31, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x39, 0x33, 0x33, 0x33, 0x39, 0x2c, // 2175, 0.0193339, - 0x20, 0x30, 0x2e, 0x31, 0x31, 0x39, 0x31, 0x39, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x35, 0x30, // 0.119192, 0.950 - 0x33, 0x30, 0x34, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, // 3041) * color_1. - 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // xyz)) * u_params - 0x31, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, // 1.y);. ve - 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, // c3 tmpvar_13;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x20, // tmpvar_13 - 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x28, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, // = pow ((_color_1 - 0x32, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, // 2 * 0.0001), vec - 0x33, 0x28, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x31, // 3(0.1593018, 0.1 - 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, // 593018, 0.159301 - 0x38, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, // 8));. vec - 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 3 tmpvar_14;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x20, 0x3d, // tmpvar_14 = - 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x28, 0x28, 0x30, 0x2e, 0x38, 0x33, 0x35, 0x39, 0x33, 0x37, // pow (((0.835937 - 0x35, 0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, // 5 + . ( - 0x31, 0x38, 0x2e, 0x38, 0x35, 0x31, 0x35, 0x36, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // 18.85156 * tmpva - 0x72, 0x5f, 0x31, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, // r_13). ) - 0x2f, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, // / (vec3(1.0, 1.0 - 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // , 1.0) + . - 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, 0x38, 0x2e, 0x36, 0x38, 0x37, 0x35, 0x20, 0x2a, 0x20, 0x74, // (18.6875 * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // mpvar_13). - 0x20, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x37, 0x38, 0x2e, 0x38, 0x34, // )), vec3(78.84 - 0x33, 0x37, 0x35, 0x2c, 0x20, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x37, // 375, 78.84375, 7 - 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 8.84375));. - 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x74, // _color_12 = t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // mpvar_14;. - 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x74, // outColor_5 = t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // mpvar_14;. - 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, // };. };. };. - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x3b, // vec4 tmpvar_15; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x2e, 0x78, 0x79, 0x7a, // . tmpvar_15.xyz - 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, // = outColor_5;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x63, // tmpvar_15.w = c - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, // olor_1.w;. gl_F - 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // ragColor = tmpva - 0x72, 0x5f, 0x31, 0x35, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // r_15;.}... + 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x74, 0x78, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // mat4 u_mtx;.unif + 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, // orm samplerCube + 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // s_texColor;.unif + 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // orm vec4 u_param + 0x73, 0x31, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, // s1;..in vec3 v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, // excoord0;.in vec + 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // 4 v_color0;.layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, // ut(location = 0) + 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, // out vec4 bgfx_F + 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // ragColor;..void + 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, // main().{. vec + 0x34, 0x20, 0x5f, 0x32, 0x38, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, // 4 _287 = texture + 0x4c, 0x6f, 0x64, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, // Lod(s_texColor, + 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x28, 0x75, 0x5f, 0x6d, 0x74, 0x78, // normalize((u_mtx + 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // * vec4(((v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, // oord0.xy * 2.0) + 0x2d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, // - vec2(1.0)) * v + 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, // ec2(1.0, -1.0), + 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x2c, // 1.0, 0.0)).xyz), + 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, // u_params0.x);. + 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x39, 0x30, 0x20, 0x3d, 0x20, 0x5f, // vec3 _290 = _ + 0x32, 0x38, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, // 287.xyz;. vec + 0x33, 0x20, 0x5f, 0x33, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x70, 0x6f, 0x77, // 3 _354 = mix(pow + 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, 0x39, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // (abs(_290), vec3 + 0x28, 0x32, 0x2e, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x37, 0x36, 0x38, 0x33, 0x37, // (2.2000000476837 + 0x31, 0x35, 0x38, 0x32, 0x30, 0x33, 0x31, 0x32, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x39, // 158203125)), _29 + 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // 0, vec3(u_params + 0x30, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x32, 0x2e, 0x30, 0x2c, // 0.z)) * pow(2.0, + 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, // u_params0.w);. + 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x5f, // vec4 _547 = _ + 0x32, 0x38, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x2e, 0x78, 0x20, // 287;. _547.x + 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x34, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, // = _354.x;. _5 + 0x34, 0x37, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x34, 0x2e, 0x79, 0x3b, 0x0a, 0x20, // 47.y = _354.y;. + 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x34, // _547.z = _354 + 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x30, // .z;. vec4 _30 + 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // 2 = _547 * v_col + 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, // or0;. vec3 _5 + 0x36, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, // 68;. if (u_pa + 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x0a, 0x20, // rams1.x < 0.5). + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, // {. vec + 0x33, 0x20, 0x5f, 0x33, 0x38, 0x33, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x5f, // 3 _383 = clamp(_ + 0x33, 0x30, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, // 302.xyz, vec3(0. + 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, // 0), vec3(1.0));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, // float _4 + 0x32, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x33, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 24 = _383.x;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x36, 0x32, 0x3b, // float _562; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, // . do. + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x32, 0x34, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, // if (_424 <= 0. + 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, // 0031308000907301 + 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, // 90277099609375). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, // _5 + 0x36, 0x32, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, // 62 = 12.92000007 + 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, // 62939453125 * _4 + 0x32, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 24;. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x28, // _562 = ( + 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, // 1.05499994754791 + 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, // 259765625 * pow( + 0x5f, 0x34, 0x32, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, // _424, 0.41666665 + 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, // 6732559204101562 + 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, // 5)) - 0.05499999 + 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, // 9701976776123046 + 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, // break; // + 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, // unreachable work + 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // around. } + 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, // while(false);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, // float _42 + 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x33, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 8 = _383.y;. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x36, 0x34, 0x3b, 0x0a, // float _564;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // do. + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x32, 0x38, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, // if (_428 <= 0.0 + 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, // 0313080009073019 + 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, // 0277099609375). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, // _56 + 0x34, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, // 4 = 12.920000076 + 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x32, // 2939453125 * _42 + 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 8;. + 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x31, // _564 = (1 + 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, // .054999947547912 + 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, // 59765625 * pow(_ + 0x34, 0x32, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, // 428, 0.416666656 + 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, // 7325592041015625 + 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, // )) - 0.054999999 + 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, // 7019767761230468 + 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 75;. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, // break; // u + 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, // nreachable worka + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, // round. } + 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, // while(false);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x32, // float _432 + 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x33, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _383.z;. + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x36, 0x36, 0x3b, 0x0a, 0x20, // float _566;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // do. + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x33, 0x32, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, // if (_432 <= 0.00 + 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, // 3130800090730190 + 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, // 277099609375). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, 0x36, // _566 + 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, // = 12.9200000762 + 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x33, 0x32, // 939453125 * _432 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ;. + 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, // _566 = (1. + 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, // 0549999475479125 + 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, // 9765625 * pow(_4 + 0x33, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, // 32, 0.4166666567 + 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, // 325592041015625) + 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, // ) - 0.0549999997 + 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, // 0197677612304687 + 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 5;. + 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, // break; // un + 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, // reachable workar + 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, // ound. } w + 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // hile(false);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, // _568 = vec3 + 0x28, 0x5f, 0x35, 0x36, 0x32, 0x2c, 0x20, 0x5f, 0x35, 0x36, 0x34, 0x2c, 0x20, 0x5f, 0x35, 0x36, // (_562, _564, _56 + 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, // 6);. }. el + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // se. {. + 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x36, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // vec3 _569;. + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // if (u_params + 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 1.x < 1.5). + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x5f, 0x35, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x2e, 0x78, 0x79, 0x7a, // _569 = _302.xyz + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, // ;. }. + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, // {. v + 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x37, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ec3 _570;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // if (u_para + 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x32, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, // ms1.x < 2.5). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // vec3 + 0x5f, 0x35, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x28, 0x28, 0x6d, 0x61, 0x74, // _517 = pow(((mat + 0x33, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x37, 0x31, 0x36, 0x36, 0x35, 0x31, 0x32, // 3(vec3(1.7166512 + 0x30, 0x31, 0x32, 0x34, 0x38, 0x31, 0x36, 0x38, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, // 012481689453125, + 0x20, 0x2d, 0x30, 0x2e, 0x33, 0x35, 0x35, 0x36, 0x37, 0x30, 0x38, 0x30, 0x39, 0x37, 0x34, 0x35, // -0.355670809745 + 0x37, 0x38, 0x38, 0x35, 0x37, 0x34, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, // 78857421875, -0. + 0x32, 0x35, 0x33, 0x33, 0x36, 0x36, 0x32, 0x39, 0x31, 0x35, 0x32, 0x32, 0x39, 0x37, 0x39, 0x37, // 2533662915229797 + 0x33, 0x36, 0x33, 0x32, 0x38, 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // 36328125), vec3( + 0x2d, 0x30, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x38, 0x34, 0x33, 0x38, 0x39, 0x31, 0x31, 0x34, 0x33, // -0.6666843891143 + 0x37, 0x39, 0x38, 0x38, 0x32, 0x38, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, // 798828125, 1.616 + 0x34, 0x38, 0x31, 0x31, 0x38, 0x34, 0x39, 0x35, 0x39, 0x34, 0x31, 0x31, 0x36, 0x32, 0x31, 0x30, // 4811849594116210 + 0x39, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x30, // 9375, 0.01576850 + 0x30, 0x30, 0x34, 0x34, 0x39, 0x34, 0x31, 0x39, 0x30, 0x32, 0x31, 0x36, 0x30, 0x36, 0x34, 0x34, // 0044941902160644 + 0x35, 0x33, 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, // 53125), vec3(0.0 + 0x31, 0x37, 0x36, 0x33, 0x39, 0x38, 0x39, 0x39, 0x36, 0x32, 0x36, 0x33, 0x37, 0x34, 0x32, 0x34, // 1763989962637424 + 0x34, 0x36, 0x38, 0x39, 0x39, 0x34, 0x31, 0x34, 0x30, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, // 468994140625, -0 + 0x2e, 0x30, 0x34, 0x32, 0x37, 0x37, 0x30, 0x36, 0x30, 0x31, 0x38, 0x30, 0x39, 0x30, 0x32, 0x34, // .042770601809024 + 0x38, 0x31, 0x30, 0x37, 0x39, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, // 810791015625, 0. + 0x39, 0x34, 0x32, 0x31, 0x30, 0x33, 0x30, 0x38, 0x37, 0x39, 0x30, 0x32, 0x30, 0x36, 0x39, 0x30, // 9421030879020690 + 0x39, 0x31, 0x37, 0x39, 0x36, 0x38, 0x37, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x6d, 0x61, // 91796875)) * (ma + 0x74, 0x33, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, 0x35, 0x36, // t3(vec3(0.412556 + 0x34, 0x30, 0x39, 0x38, 0x33, 0x35, 0x38, 0x31, 0x35, 0x34, 0x32, 0x39, 0x36, 0x38, 0x37, 0x35, // 4098358154296875 + 0x2c, 0x20, 0x30, 0x2e, 0x33, 0x35, 0x37, 0x35, 0x37, 0x36, 0x31, 0x30, 0x32, 0x30, 0x31, 0x38, // , 0.357576102018 + 0x33, 0x35, 0x36, 0x33, 0x32, 0x33, 0x32, 0x34, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, // 3563232421875, 0 + 0x2e, 0x31, 0x38, 0x30, 0x34, 0x33, 0x37, 0x35, 0x30, 0x35, 0x32, 0x34, 0x35, 0x32, 0x30, 0x38, // .180437505245208 + 0x37, 0x34, 0x30, 0x32, 0x33, 0x34, 0x33, 0x37, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // 740234375), vec3 + 0x28, 0x30, 0x2e, 0x32, 0x31, 0x32, 0x36, 0x37, 0x32, 0x39, 0x30, 0x34, 0x31, 0x33, 0x33, 0x37, // (0.2126729041337 + 0x39, 0x36, 0x36, 0x39, 0x31, 0x38, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, // 9669189453125, 0 + 0x2e, 0x37, 0x31, 0x35, 0x31, 0x35, 0x32, 0x32, 0x30, 0x34, 0x30, 0x33, 0x36, 0x37, 0x31, 0x32, // .715152204036712 + 0x36, 0x34, 0x36, 0x34, 0x38, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x37, 0x32, // 646484375, 0.072 + 0x31, 0x37, 0x35, 0x30, 0x30, 0x33, 0x35, 0x38, 0x38, 0x31, 0x39, 0x39, 0x36, 0x31, 0x35, 0x34, // 1750035881996154 + 0x37, 0x38, 0x35, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // 78515625), vec3( + 0x30, 0x2e, 0x30, 0x31, 0x39, 0x33, 0x33, 0x33, 0x39, 0x30, 0x30, 0x38, 0x38, 0x33, 0x37, 0x39, // 0.01933390088379 + 0x33, 0x38, 0x33, 0x30, 0x38, 0x37, 0x31, 0x35, 0x38, 0x32, 0x30, 0x33, 0x31, 0x32, 0x35, 0x2c, // 383087158203125, + 0x20, 0x30, 0x2e, 0x31, 0x31, 0x39, 0x31, 0x39, 0x31, 0x39, 0x39, 0x36, 0x37, 0x35, 0x33, 0x32, // 0.1191919967532 + 0x31, 0x35, 0x37, 0x38, 0x39, 0x37, 0x39, 0x34, 0x39, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, // 15789794921875, + 0x30, 0x2e, 0x39, 0x35, 0x30, 0x33, 0x30, 0x34, 0x30, 0x39, 0x30, 0x39, 0x37, 0x36, 0x37, 0x31, // 0.95030409097671 + 0x35, 0x30, 0x38, 0x37, 0x38, 0x39, 0x30, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, // 5087890625)) * _ + 0x33, 0x30, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, // 302.xyz)) * u_pa + 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x79, 0x29, 0x20, 0x2a, 0x20, 0x39, 0x2e, 0x39, 0x39, 0x39, // rams1.y) * 9.999 + 0x39, 0x39, 0x39, 0x37, 0x34, 0x37, 0x33, 0x37, 0x38, 0x37, 0x35, 0x31, 0x36, 0x33, 0x35, 0x35, // 9997473787516355 + 0x35, 0x31, 0x34, 0x35, 0x32, 0x36, 0x33, 0x36, 0x37, 0x31, 0x38, 0x38, 0x65, 0x2d, 0x30, 0x35, // 514526367188e-05 + 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x37, // , vec3(0.1593017 + 0x35, 0x37, 0x38, 0x31, 0x32, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 578125));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x37, 0x30, 0x20, 0x3d, // _570 = + 0x20, 0x70, 0x6f, 0x77, 0x28, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x38, 0x33, 0x35, // pow((vec3(0.835 + 0x39, 0x33, 0x37, 0x35, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x35, 0x31, 0x37, 0x20, 0x2a, 0x20, // 9375) + (_517 * + 0x31, 0x38, 0x2e, 0x38, 0x35, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x28, // 18.8515625)) / ( + 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x35, 0x31, // vec3(1.0) + (_51 + 0x37, 0x20, 0x2a, 0x20, 0x31, 0x38, 0x2e, 0x36, 0x38, 0x37, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x76, // 7 * 18.6875)), v + 0x65, 0x63, 0x33, 0x28, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x29, 0x29, 0x3b, 0x0a, // ec3(78.84375));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x37, // _57 + 0x30, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, // 0 = vec3(0.0);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, 0x39, 0x20, 0x3d, 0x20, // _569 = + 0x5f, 0x35, 0x37, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // _570;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x5f, // _568 = _ + 0x35, 0x36, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, // 569;. }. b + 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, // gfx_FragColor = + 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x35, 0x36, 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x2e, // vec4(_568, _302. + 0x77, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // w);.}... }; -static const uint8_t fs_texture_cube_essl[2737] = +static const uint8_t fs_texture_cube_essl[3760] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x09, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // _params0........ + 0x00, 0x00, 0x05, 0x75, 0x5f, 0x6d, 0x74, 0x78, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, // ...u_mtx........ 0x00, 0x00, 0x09, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x02, 0x01, 0x00, 0x00, // ...u_params1.... 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // .......s_texColo - 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x75, 0x5f, 0x6d, 0x74, // r...........u_mt - 0x78, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x0a, 0x00, 0x00, 0x76, // x..........Q...v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // arying highp vec - 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // 4 v_color0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // ing highp vec3 v - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // _texcoord0;.unif + 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0e, 0x00, 0x00, 0x70, // r..........P...p + 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, // recision mediump + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, // float;.precisio + 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, // n highp int;..un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // iform highp vec4 + 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // u_params0;.unif + 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, // orm highp mat4 u + 0x5f, 0x6d, 0x74, 0x78, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, // _mtx;.uniform hi + 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, // ghp samplerCube + 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // s_texColor;.unif 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, // orm highp vec4 u - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // _params0;.unifor - 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, // m highp vec4 u_p - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // arams1;.uniform - 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, // lowp samplerCube - 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // s_texColor;.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, // form highp mat4 - 0x75, 0x5f, 0x6d, 0x74, 0x78, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // u_mtx;.void main - 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, // ().{. lowp vec - 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, // 4 color_1;. hig - 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // hp vec3 tmpvar_2 - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x7a, 0x20, 0x3d, // ;. tmpvar_2.z = - 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // 1.0;. tmpvar_2 - 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // .xy = (((v_texco - 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2d, // ord0.xy * 2.0) - - 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, // 1.0) * vec2(1.0 - 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, // , -1.0));. high - 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, // p vec4 tmpvar_3; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2e, 0x77, 0x20, 0x3d, 0x20, // . tmpvar_3.w = - 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x2e, // 0.0;. tmpvar_3. - 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, // xyz = tmpvar_2;. - 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, // lowp vec4 tmpv - 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, // ar_4;. tmpvar_4 - 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x4c, 0x6f, // = textureCubeLo - 0x64, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // d (s_texColor - 0x2c, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x28, 0x75, 0x5f, 0x6d, // , normalize((u_m - 0x74, 0x78, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x29, 0x2e, 0x78, // tx * tmpvar_3).x - 0x79, 0x7a, 0x29, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, // yz), u_params0.x - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, // );. color_1.w = - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x63, // tmpvar_4.w;. c - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x69, // olor_1.xyz = (mi - 0x78, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x62, 0x73, // x (pow (. abs - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x0a, 0x20, // (tmpvar_4.xyz). - 0x20, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, // , vec3(2.2, 2.2 - 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x29, 0x29, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // , 2.2)), tmpvar_ - 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, // 4.xyz, u_params0 - 0x2e, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x65, 0x78, 0x70, 0x32, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, // .z) * exp2(u_par - 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, // ams0.w));. colo - 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x20, 0x2a, // r_1 = (color_1 * - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6d, 0x65, // v_color0);. me - 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // diump vec4 tmpva - 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, // r_5;. lowp vec3 - 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x6c, // outColor_6;. l - 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // owp vec3 tmpvar_ - 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x78, 0x20, // 7;. tmpvar_7.x - 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // = 0.0;. tmpvar_ - 0x37, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // 7.y = 0.0;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, // var_7.z = 0.0;. - 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x6d, // outColor_6 = tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, // pvar_7;. if ((u - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x35, // _params1.x < 0.5 - 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, // )) {. lowp ve - 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, // c3 tmpvar_8;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, // tmpvar_8 = clam - 0x70, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, // p (color_1.xyz, - 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, // 0.0, 1.0);. l - 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x39, 0x3b, // owp vec3 _rgb_9; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x74, 0x6d, // . _rgb_9 = tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, // pvar_8;. lowp - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, // float tmpvar_10 - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // ;. if ((tmpva - 0x72, 0x5f, 0x38, 0x2e, 0x78, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, // r_8.x <= 0.00313 - 0x30, 0x38, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // 08)) {. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x20, // var_10 = (12.92 - 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, // * tmpvar_8.x);. - 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // } else {. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x28, // tmpvar_10 = (( - 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, // 1.055 * pow (tmp - 0x76, 0x61, 0x72, 0x5f, 0x38, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, // var_8.x, 0.41666 - 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, 0x20, // 67)) - 0.055);. - 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x39, // };. _rgb_9 - 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x3b, 0x0a, // .x = tmpvar_10;. - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, // lowp float t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, // mpvar_11;. if - 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x2e, 0x79, 0x20, 0x3c, 0x3d, // ((tmpvar_8.y <= - 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, // 0.0031308)) {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, // tmpvar_11 = - 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // (12.92 * tmpvar - 0x5f, 0x38, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, // _8.y);. } els - 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // e {. tmpvar - 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, 0x20, // _11 = ((1.055 * - 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x2e, 0x79, 0x2c, // pow (tmpvar_8.y, - 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, // 0.4166667)) - 0 - 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, // .055);. };. - 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x39, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // _rgb_9.y = tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, // var_11;. lowp - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, // float tmpvar_12 - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // ;. if ((tmpva - 0x72, 0x5f, 0x38, 0x2e, 0x7a, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, // r_8.z <= 0.00313 - 0x30, 0x38, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // 08)) {. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x20, // var_12 = (12.92 - 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, // * tmpvar_8.z);. - 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // } else {. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x28, // tmpvar_12 = (( - 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, // 1.055 * pow (tmp - 0x76, 0x61, 0x72, 0x5f, 0x38, 0x2e, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, // var_8.z, 0.41666 - 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, 0x20, // 67)) - 0.055);. - 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x39, // };. _rgb_9 - 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, // .z = tmpvar_12;. - 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x36, 0x20, 0x3d, // outColor_6 = - 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, // _rgb_9;. } els - 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, // e {. if ((u_p - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x35, 0x29, 0x29, // arams1.x < 1.5)) - 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, // {. outColo - 0x72, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, // r_6 = color_1.xy - 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, // z;. } else {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, // if ((u_par - 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x32, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x7b, // ams1.x < 2.5)) { - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, // . lowp ve - 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, // c3 _color_13;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x20, // _color_13 - 0x3d, 0x20, 0x28, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x31, 0x2e, 0x37, 0x31, 0x36, 0x36, 0x35, // = ((mat3(1.71665 - 0x31, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x33, 0x35, 0x35, 0x36, 0x37, 0x30, 0x38, 0x2c, 0x20, 0x2d, // 1, -0.3556708, - - 0x30, 0x2e, 0x32, 0x35, 0x33, 0x33, 0x36, 0x36, 0x33, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x36, 0x36, // 0.2533663, -0.66 - 0x36, 0x36, 0x38, 0x34, 0x34, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, 0x34, 0x38, 0x31, 0x2c, // 66844, 1.616481, - 0x20, 0x30, 0x2e, 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, // 0.0157685, 0.01 - 0x37, 0x36, 0x33, 0x39, 0x39, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, 0x32, 0x37, 0x37, 0x30, // 76399, -0.042770 - 0x36, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x34, 0x32, 0x31, 0x30, 0x33, 0x31, 0x29, 0x20, 0x2a, 0x20, // 6, 0.9421031) * - 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, 0x35, 0x36, 0x34, 0x2c, // (mat3(0.4125564, - 0x20, 0x30, 0x2e, 0x33, 0x35, 0x37, 0x35, 0x37, 0x36, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x38, // 0.3575761, 0.18 - 0x30, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x31, 0x32, 0x36, 0x37, 0x32, 0x39, // 04375, 0.2126729 - 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x31, 0x35, 0x31, 0x35, 0x32, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x30, // , 0.7151522, 0.0 - 0x37, 0x32, 0x31, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x39, 0x33, 0x33, 0x33, 0x39, // 72175, 0.0193339 - 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x31, 0x39, 0x31, 0x39, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x35, // , 0.119192, 0.95 - 0x30, 0x33, 0x30, 0x34, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, // 03041) * color_1 - 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // .xyz)) * u_param - 0x73, 0x31, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, // s1.y);. l - 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // owp vec3 tmpvar_ - 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // 14;. tmpv - 0x61, 0x72, 0x5f, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x28, 0x5f, 0x63, // ar_14 = pow ((_c - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, // olor_13 * 0.0001 - 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, // ), vec3(0.159301 - 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x2e, // 8, 0.1593018, 0. - 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 1593018));. - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, // lowp vec3 tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // var_15;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x35, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x20, // tmpvar_15 = pow - 0x28, 0x28, 0x28, 0x30, 0x2e, 0x38, 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, 0x20, 0x2b, 0x20, 0x0a, // (((0.8359375 + . - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, 0x38, 0x2e, 0x38, 0x35, // (18.85 - 0x31, 0x35, 0x36, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x29, // 156 * tmpvar_14) - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x76, 0x65, // . ) / (ve - 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, // c3(1.0, 1.0, 1.0 - 0x29, 0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, // ) + . ( - 0x31, 0x38, 0x2e, 0x36, 0x38, 0x37, 0x35, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // 18.6875 * tmpvar - 0x5f, 0x31, 0x34, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x2c, // _14). )), - 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, // vec3(78.84375, - 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, // 78.84375, 78.843 - 0x37, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, // 75));. _c - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // olor_13 = tmpvar - 0x5f, 0x31, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, // _15;. out - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // Color_6 = tmpvar - 0x5f, 0x31, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, // _15;. };. - 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, // };. };. lowp - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x3b, // vec4 tmpvar_16; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x2e, 0x78, 0x79, 0x7a, // . tmpvar_16.xyz - 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, // = outColor_6;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x63, // tmpvar_16.w = c - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // olor_1.w;. tmpv - 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x36, // ar_5 = tmpvar_16 - 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // ;. gl_FragColor - 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, // = tmpvar_5;.}.. - 0x00, // . + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, // _params1;..in hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // ghp vec3 v_texco + 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // ord0;.in highp v + 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, // ec4 v_color0;.la + 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // yout(location = + 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // 0) out highp vec + 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // 4 bgfx_FragColor + 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, // ;..void main().{ + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // . highp vec4 + 0x5f, 0x32, 0x38, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, // _287 = textureLo + 0x64, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x6e, 0x6f, // d(s_texColor, no + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x28, 0x75, 0x5f, 0x6d, 0x74, 0x78, 0x20, 0x2a, // rmalize((u_mtx * + 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x28, 0x28, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // vec4(((v_texcoo + 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, // rd0.xy * 2.0) - + 0x76, 0x65, 0x63, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, // vec2(1.0)) * vec + 0x32, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x31, 0x2e, // 2(1.0, -1.0), 1. + 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x2c, 0x20, 0x75, // 0, 0.0)).xyz), u + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // _params0.x);. + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, 0x39, 0x30, // highp vec3 _290 + 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, // = _287.xyz;. + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x35, 0x34, // highp vec3 _354 + 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, // = mix(pow(abs(_ + 0x32, 0x39, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, 0x30, 0x30, // 290), vec3(2.200 + 0x30, 0x30, 0x30, 0x30, 0x34, 0x37, 0x36, 0x38, 0x33, 0x37, 0x31, 0x35, 0x38, 0x32, 0x30, 0x33, // 0000476837158203 + 0x31, 0x32, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x39, 0x30, 0x2c, 0x20, 0x76, 0x65, 0x63, // 125)), _290, vec + 0x33, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x7a, 0x29, 0x29, 0x20, // 3(u_params0.z)) + 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, // * pow(2.0, u_par + 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, // ams0.w);. hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x5f, // hp vec4 _547 = _ + 0x32, 0x38, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x2e, 0x78, 0x20, // 287;. _547.x + 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x34, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, // = _354.x;. _5 + 0x34, 0x37, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x34, 0x2e, 0x79, 0x3b, 0x0a, 0x20, // 47.y = _354.y;. + 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x34, // _547.z = _354 + 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // .z;. highp ve + 0x63, 0x34, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x20, 0x2a, // c4 _302 = _547 * + 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, // v_color0;. h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x36, 0x38, 0x3b, 0x0a, // ighp vec3 _568;. + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // if (u_params + 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, // 1.x < 0.5). { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // . highp v + 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x38, 0x33, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, // ec3 _383 = clamp + 0x28, 0x5f, 0x33, 0x30, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // (_302.xyz, vec3( + 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, // 0.0), vec3(1.0)) + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // ;. highp + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, // float _424 = _38 + 0x33, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, // 3.x;. hig + 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x36, 0x32, 0x3b, 0x0a, 0x20, // hp float _562;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // do. + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x32, 0x34, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, // if (_424 <= 0.00 + 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, // 3130800090730190 + 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, // 277099609375). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, 0x32, // _562 + 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, // = 12.9200000762 + 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x32, 0x34, // 939453125 * _424 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ;. + 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, // _562 = (1. + 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, // 0549999475479125 + 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, // 9765625 * pow(_4 + 0x32, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, // 24, 0.4166666567 + 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, // 325592041015625) + 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, // ) - 0.0549999997 + 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, // 0197677612304687 + 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 5;. + 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, // break; // un + 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, // reachable workar + 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, // ound. } w + 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // hile(false);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // highp float + 0x20, 0x5f, 0x34, 0x32, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x33, 0x2e, 0x79, 0x3b, 0x0a, // _428 = _383.y;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, // highp fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x36, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // oat _564;. + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // do. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, // if (_ + 0x34, 0x32, 0x38, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, // 428 <= 0.0031308 + 0x30, 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, // 0009073019027709 + 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 9609375). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x31, 0x32, // _564 = 12 + 0x2e, 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, // .920000076293945 + 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x32, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 3125 * _428;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, // bre + 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ak;. + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, // }. el + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, // se. { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // . + 0x20, 0x5f, 0x35, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, // _564 = (1.05499 + 0x39, 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, // 9947547912597656 + 0x32, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x32, 0x38, 0x2c, 0x20, 0x30, // 25 * pow(_428, 0 + 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, // .416666656732559 + 0x32, 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, // 2041015625)) - 0 + 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, // .054999999701976 + 0x37, 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, // 776123046875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, // br + 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // eak;. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, // }. b + 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, // reak; // unreach + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, // able workaround. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, // } while( + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // false);. + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x33, 0x32, // highp float _432 + 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x33, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // = _383.z;. + 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, // highp float _ + 0x35, 0x36, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, // 566;. do. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x33, 0x32, 0x20, 0x3c, // if (_432 < + 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, 0x30, 0x30, 0x39, 0x30, // = 0.003130800090 + 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, 0x36, 0x30, 0x39, 0x33, // 7301902770996093 + 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 75). + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x5f, 0x35, 0x36, 0x36, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x30, 0x30, // _566 = 12.9200 + 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, // 000762939453125 + 0x2a, 0x20, 0x5f, 0x34, 0x33, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // * _432;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, 0x36, // _566 + 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x34, 0x37, 0x35, // = (1.0549999475 + 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, // 4791259765625 * + 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x33, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, // pow(_432, 0.4166 + 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, 0x30, 0x34, 0x31, 0x30, // 6665673255920410 + 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x39, // 15625)) - 0.0549 + 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, 0x37, 0x36, 0x31, 0x32, // 9999970197677612 + 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 3046875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, // break; + 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x20, // // unreachable + 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // workaround. + 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, // } while(false + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, 0x38, 0x20, // );. _568 + 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x35, 0x36, 0x32, 0x2c, 0x20, 0x5f, 0x35, 0x36, // = vec3(_562, _56 + 0x34, 0x2c, 0x20, 0x5f, 0x35, 0x36, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // 4, _566);. }. + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // else. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // highp vec + 0x33, 0x20, 0x5f, 0x35, 0x36, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 3 _569;. + 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, // if (u_params1.x + 0x3c, 0x20, 0x31, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, // < 1.5). { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x36, // . _56 + 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, // 9 = _302.xyz;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // else. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // highp + 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x37, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // vec3 _570;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, // if (u_pa + 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x32, 0x2e, 0x35, 0x29, 0x0a, 0x20, // rams1.x < 2.5). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, // hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x31, 0x37, 0x20, 0x3d, 0x20, 0x70, // hp vec3 _517 = p + 0x6f, 0x77, 0x28, 0x28, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, // ow(((mat3(vec3(1 + 0x2e, 0x37, 0x31, 0x36, 0x36, 0x35, 0x31, 0x32, 0x30, 0x31, 0x32, 0x34, 0x38, 0x31, 0x36, 0x38, // .716651201248168 + 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x33, 0x35, 0x35, 0x36, // 9453125, -0.3556 + 0x37, 0x30, 0x38, 0x30, 0x39, 0x37, 0x34, 0x35, 0x37, 0x38, 0x38, 0x35, 0x37, 0x34, 0x32, 0x31, // 7080974578857421 + 0x38, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x33, 0x33, 0x36, 0x36, 0x32, 0x39, // 875, -0.25336629 + 0x31, 0x35, 0x32, 0x32, 0x39, 0x37, 0x39, 0x37, 0x33, 0x36, 0x33, 0x32, 0x38, 0x31, 0x32, 0x35, // 1522979736328125 + 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x38, // ), vec3(-0.66668 + 0x34, 0x33, 0x38, 0x39, 0x31, 0x31, 0x34, 0x33, 0x37, 0x39, 0x38, 0x38, 0x32, 0x38, 0x31, 0x32, // 4389114379882812 + 0x35, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, 0x34, 0x38, 0x31, 0x31, 0x38, 0x34, 0x39, 0x35, // 5, 1.61648118495 + 0x39, 0x34, 0x31, 0x31, 0x36, 0x32, 0x31, 0x30, 0x39, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, // 941162109375, 0. + 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x30, 0x30, 0x30, 0x34, 0x34, 0x39, 0x34, 0x31, 0x39, // 0157685000449419 + 0x30, 0x32, 0x31, 0x36, 0x30, 0x36, 0x34, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, // 0216064453125), + 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x31, 0x37, 0x36, 0x33, 0x39, 0x38, 0x39, 0x39, // vec3(0.017639899 + 0x36, 0x32, 0x36, 0x33, 0x37, 0x34, 0x32, 0x34, 0x34, 0x36, 0x38, 0x39, 0x39, 0x34, 0x31, 0x34, // 6263742446899414 + 0x30, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, 0x32, 0x37, 0x37, 0x30, 0x36, // 0625, -0.0427706 + 0x30, 0x31, 0x38, 0x30, 0x39, 0x30, 0x32, 0x34, 0x38, 0x31, 0x30, 0x37, 0x39, 0x31, 0x30, 0x31, // 0180902481079101 + 0x35, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x34, 0x32, 0x31, 0x30, 0x33, 0x30, 0x38, // 5625, 0.94210308 + 0x37, 0x39, 0x30, 0x32, 0x30, 0x36, 0x39, 0x30, 0x39, 0x31, 0x37, 0x39, 0x36, 0x38, 0x37, 0x35, // 7902069091796875 + 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, // )) * (mat3(vec3( + 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, 0x35, 0x36, 0x34, 0x30, 0x39, 0x38, 0x33, 0x35, 0x38, 0x31, // 0.41255640983581 + 0x35, 0x34, 0x32, 0x39, 0x36, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x33, 0x35, 0x37, 0x35, // 54296875, 0.3575 + 0x37, 0x36, 0x31, 0x30, 0x32, 0x30, 0x31, 0x38, 0x33, 0x35, 0x36, 0x33, 0x32, 0x33, 0x32, 0x34, // 7610201835632324 + 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x38, 0x30, 0x34, 0x33, 0x37, 0x35, // 21875, 0.1804375 + 0x30, 0x35, 0x32, 0x34, 0x35, 0x32, 0x30, 0x38, 0x37, 0x34, 0x30, 0x32, 0x33, 0x34, 0x33, 0x37, // 0524520874023437 + 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x32, 0x31, 0x32, 0x36, 0x37, // 5), vec3(0.21267 + 0x32, 0x39, 0x30, 0x34, 0x31, 0x33, 0x33, 0x37, 0x39, 0x36, 0x36, 0x39, 0x31, 0x38, 0x39, 0x34, // 2904133796691894 + 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x31, 0x35, 0x31, 0x35, 0x32, 0x32, // 53125, 0.7151522 + 0x30, 0x34, 0x30, 0x33, 0x36, 0x37, 0x31, 0x32, 0x36, 0x34, 0x36, 0x34, 0x38, 0x34, 0x33, 0x37, // 0403671264648437 + 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x37, 0x32, 0x31, 0x37, 0x35, 0x30, 0x30, 0x33, 0x35, 0x38, // 5, 0.07217500358 + 0x38, 0x31, 0x39, 0x39, 0x36, 0x31, 0x35, 0x34, 0x37, 0x38, 0x35, 0x31, 0x35, 0x36, 0x32, 0x35, // 8199615478515625 + 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x31, 0x39, 0x33, 0x33, 0x33, // ), vec3(0.019333 + 0x39, 0x30, 0x30, 0x38, 0x38, 0x33, 0x37, 0x39, 0x33, 0x38, 0x33, 0x30, 0x38, 0x37, 0x31, 0x35, // 9008837938308715 + 0x38, 0x32, 0x30, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x31, 0x39, 0x31, 0x39, // 8203125, 0.11919 + 0x31, 0x39, 0x39, 0x36, 0x37, 0x35, 0x33, 0x32, 0x31, 0x35, 0x37, 0x38, 0x39, 0x37, 0x39, 0x34, // 1996753215789794 + 0x39, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x35, 0x30, 0x33, 0x30, 0x34, // 921875, 0.950304 + 0x30, 0x39, 0x30, 0x39, 0x37, 0x36, 0x37, 0x31, 0x35, 0x30, 0x38, 0x37, 0x38, 0x39, 0x30, 0x36, // 0909767150878906 + 0x32, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, // 25)) * _302.xyz) + 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x79, 0x29, // ) * u_params1.y) + 0x20, 0x2a, 0x20, 0x39, 0x2e, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x34, 0x37, 0x33, 0x37, // * 9.99999974737 + 0x38, 0x37, 0x35, 0x31, 0x36, 0x33, 0x35, 0x35, 0x35, 0x31, 0x34, 0x35, 0x32, 0x36, 0x33, 0x36, // 8751635551452636 + 0x37, 0x31, 0x38, 0x38, 0x65, 0x2d, 0x30, 0x35, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, // 7188e-05, vec3(0 + 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x37, 0x35, 0x37, 0x38, 0x31, 0x32, 0x35, 0x29, 0x29, // .1593017578125)) + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ;. + 0x20, 0x20, 0x5f, 0x35, 0x37, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x28, 0x76, 0x65, // _570 = pow((ve + 0x63, 0x33, 0x28, 0x30, 0x2e, 0x38, 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, 0x29, 0x20, 0x2b, 0x20, // c3(0.8359375) + + 0x28, 0x5f, 0x35, 0x31, 0x37, 0x20, 0x2a, 0x20, 0x31, 0x38, 0x2e, 0x38, 0x35, 0x31, 0x35, 0x36, // (_517 * 18.85156 + 0x32, 0x35, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, // 25)) / (vec3(1.0 + 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x35, 0x31, 0x37, 0x20, 0x2a, 0x20, 0x31, 0x38, 0x2e, 0x36, // ) + (_517 * 18.6 + 0x38, 0x37, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x37, 0x38, 0x2e, 0x38, // 875)), vec3(78.8 + 0x34, 0x33, 0x37, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 4375));. + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x37, 0x30, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, // _570 = vec3 + 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // (0.0);. + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x5f, 0x35, 0x36, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x37, 0x30, 0x3b, 0x0a, 0x20, 0x20, // _569 = _570;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x5f, 0x35, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x36, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, // _568 = _569;. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, // }. bgfx_Frag + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x35, 0x36, // Color = vec4(_56 + 0x38, 0x2c, 0x20, 0x5f, 0x33, 0x30, 0x32, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 8, _302.w);.}... }; static const uint8_t fs_texture_cube_spv[4843] = { diff --git a/tools/texturev/fs_texture_cube2.bin.h b/tools/texturev/fs_texture_cube2.bin.h index 4788f9d58..61943e907 100644 --- a/tools/texturev/fs_texture_cube2.bin.h +++ b/tools/texturev/fs_texture_cube2.bin.h @@ -1,310 +1,452 @@ -static const uint8_t fs_texture_cube2_glsl[2335] = +static const uint8_t fs_texture_cube2_glsl[3456] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // _params0........ 0x00, 0x00, 0x09, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x02, 0x01, 0x00, 0x00, // ...u_params1.... 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // .......s_texColo - 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x08, 0x00, 0x00, 0x76, // r..............v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, // arying vec4 v_co - 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, // lor0;.varying ve - 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, // c3 v_texcoord0;. + 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0d, 0x00, 0x00, 0x0a, // r..........0.... 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, // uniform vec4 u_p 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // arams0;.uniform + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, // samplerCube s_te + 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // xColor;.uniform 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x3b, 0x0a, // vec4 u_params1;. - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, // uniform samplerC - 0x75, 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, // ube s_texColor;. - 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, // void main ().{. - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, // vec4 color_1;. - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, // vec4 tmpvar_2;. - 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, // tmpvar_2 = tex - 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x4c, 0x6f, 0x64, 0x20, 0x28, 0x73, 0x5f, 0x74, // tureCubeLod (s_t - 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // exColor, v_texco - 0x6f, 0x72, 0x64, 0x30, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, // ord0, u_params0. - 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, // x);. color_1.w - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, // = tmpvar_2.w;. - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x6d, // color_1.xyz = (m - 0x69, 0x78, 0x20, 0x28, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x62, // ix (pow (. ab - 0x73, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x0a, // s(tmpvar_2.xyz). - 0x20, 0x20, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, // , vec3(2.2, 2. - 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x29, 0x29, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // 2, 2.2)), tmpvar - 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // _2.xyz, u_params - 0x30, 0x2e, 0x7a, 0x29, 0x20, 0x2a, 0x20, 0x65, 0x78, 0x70, 0x32, 0x28, 0x75, 0x5f, 0x70, 0x61, // 0.z) * exp2(u_pa - 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, // rams0.w));. col - 0x6f, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x20, // or_1 = (color_1 - 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, // * v_color0);. v - 0x65, 0x63, 0x33, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x33, 0x3b, 0x0a, // ec3 outColor_3;. - 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, // vec3 tmpvar_4; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, // . tmpvar_4.x = - 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x2e, // 0.0;. tmpvar_4. - 0x79, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // y = 0.0;. tmpva - 0x72, 0x5f, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x6f, // r_4.z = 0.0;. o - 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // utColor_3 = tmpv - 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, // ar_4;. if ((u_p - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, // arams1.x < 0.5)) - 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, // {. vec3 tmpv - 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ar_5;. tmpvar - 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, // _5 = clamp (colo - 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, // r_1.xyz, 0.0, 1. - 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x72, 0x67, // 0);. vec3 _rg - 0x62, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x36, 0x20, // b_6;. _rgb_6 - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // = tmpvar_5;. - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, // float tmpvar_7;. - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // if ((tmpvar_ - 0x35, 0x2e, 0x78, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, // 5.x <= 0.0031308 - 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // )) {. tmpva - 0x72, 0x5f, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, // r_7 = (12.92 * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // mpvar_5.x);. - 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, // } else {. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, // mpvar_7 = ((1.05 - 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // 5 * pow (tmpvar_ - 0x35, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, // 5.x, 0.4166667)) - 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, // - 0.055);. } - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x36, 0x2e, 0x78, 0x20, 0x3d, // ;. _rgb_6.x = - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, // tmpvar_7;. f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, // loat tmpvar_8;. - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, // if ((tmpvar_5 - 0x2e, 0x79, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, // .y <= 0.0031308) - 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ) {. tmpvar - 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, // _8 = (12.92 * tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, // pvar_5.y);. } - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, // else {. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, // pvar_8 = ((1.055 - 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, // * pow (tmpvar_5 - 0x2e, 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, // .y, 0.4166667)) - 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, // - 0.055);. }; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x36, 0x2e, 0x79, 0x20, 0x3d, 0x20, // . _rgb_6.y = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // tmpvar_8;. fl - 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, // oat tmpvar_9;. - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, // if ((tmpvar_5. - 0x7a, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, 0x29, // z <= 0.0031308)) - 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // {. tmpvar_ - 0x39, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, // 9 = (12.92 * tmp - 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, // var_5.z);. } - 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, // else {. tmp - 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, // var_9 = ((1.055 - 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, // * pow (tmpvar_5. - 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, // z, 0.4166667)) - - 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, // 0.055);. };. - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x74, // _rgb_6.z = t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, // mpvar_9;. out - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x36, // Color_3 = _rgb_6 - 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // ;. } else {. - 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, // if ((u_params1. - 0x78, 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // x < 1.5)) {. - 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x63, // outColor_3 = c - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // olor_1.xyz;. - 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, // } else {. i - 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, // f ((u_params1.x - 0x3c, 0x20, 0x32, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // < 2.5)) {. - 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x30, // vec3 _color_10 - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ;. _color - 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x31, 0x2e, 0x37, // _10 = ((mat3(1.7 - 0x31, 0x36, 0x36, 0x35, 0x31, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x33, 0x35, 0x35, 0x36, 0x37, 0x30, // 16651, -0.355670 - 0x38, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x33, 0x33, 0x36, 0x36, 0x33, 0x2c, 0x20, 0x2d, // 8, -0.2533663, - - 0x30, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x38, 0x34, 0x34, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, // 0.6666844, 1.616 - 0x34, 0x38, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x2c, 0x20, // 481, 0.0157685, - 0x30, 0x2e, 0x30, 0x31, 0x37, 0x36, 0x33, 0x39, 0x39, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, // 0.0176399, -0.04 - 0x32, 0x37, 0x37, 0x30, 0x36, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x34, 0x32, 0x31, 0x30, 0x33, 0x31, // 27706, 0.9421031 - 0x29, 0x20, 0x2a, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, // ) * (mat3(0.4125 - 0x35, 0x36, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x33, 0x35, 0x37, 0x35, 0x37, 0x36, 0x31, 0x2c, 0x20, // 564, 0.3575761, - 0x30, 0x2e, 0x31, 0x38, 0x30, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x31, 0x32, // 0.1804375, 0.212 - 0x36, 0x37, 0x32, 0x39, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x31, 0x35, 0x31, 0x35, 0x32, 0x32, 0x2c, // 6729, 0.7151522, - 0x20, 0x30, 0x2e, 0x30, 0x37, 0x32, 0x31, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x39, // 0.072175, 0.019 - 0x33, 0x33, 0x33, 0x39, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x31, 0x39, 0x31, 0x39, 0x32, 0x2c, 0x20, // 3339, 0.119192, - 0x30, 0x2e, 0x39, 0x35, 0x30, 0x33, 0x30, 0x34, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x63, 0x6f, 0x6c, // 0.9503041) * col - 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, // or_1.xyz)) * u_p - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // arams1.y);. - 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // vec3 tmpvar_1 - 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // 1;. tmpva - 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x28, 0x5f, 0x63, 0x6f, // r_11 = pow ((_co - 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x30, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x31, 0x29, // lor_10 * 0.0001) - 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, // , vec3(0.1593018 - 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x31, // , 0.1593018, 0.1 - 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 593018));. - 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, // vec3 tmpvar_12 - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // ;. tmpvar - 0x5f, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x28, 0x28, 0x30, 0x2e, 0x38, // _12 = pow (((0.8 - 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, 0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 359375 + . - 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, 0x38, 0x2e, 0x38, 0x35, 0x31, 0x35, 0x36, 0x20, 0x2a, 0x20, // (18.85156 * - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // tmpvar_11). - 0x20, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, // ) / (vec3(1.0 - 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x0a, 0x20, // , 1.0, 1.0) + . - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, 0x38, 0x2e, 0x36, 0x38, 0x37, // (18.687 - 0x35, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x31, 0x29, 0x0a, 0x20, // 5 * tmpvar_11). - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // )), vec3( - 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, // 78.84375, 78.843 - 0x37, 0x35, 0x2c, 0x20, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x29, 0x29, 0x3b, 0x0a, // 75, 78.84375));. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, // _color_1 - 0x30, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, // 0 = tmpvar_12;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // outColor_ - 0x33, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, // 3 = tmpvar_12;. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, // };. };. - 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // };. vec4 tmpva - 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // r_13;. tmpvar_1 - 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // 3.xyz = outColor - 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x2e, // _3;. tmpvar_13. - 0x77, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x3b, 0x0a, 0x20, // w = color_1.w;. - 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, // gl_FragColor = - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // tmpvar_13;.}... + 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // .in vec3 v_texco + 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // ord0;.in vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, // ocation = 0) out + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, // vec4 bgfx_FragC + 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // olor;..void main + 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, // ().{. vec4 _2 + 0x36, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, // 62 = textureLod( + 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, // s_texColor, v_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // xcoord0, u_param + 0x73, 0x30, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // s0.x);. vec3 + 0x5f, 0x32, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x3b, // _265 = _262.xyz; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x33, 0x31, 0x20, 0x3d, // . vec3 _331 = + 0x20, 0x6d, 0x69, 0x78, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x32, 0x36, // mix(pow(abs(_26 + 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, 0x30, 0x30, 0x30, 0x30, // 5), vec3(2.20000 + 0x30, 0x30, 0x34, 0x37, 0x36, 0x38, 0x33, 0x37, 0x31, 0x35, 0x38, 0x32, 0x30, 0x33, 0x31, 0x32, // 0047683715820312 + 0x35, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, // 5)), _265, vec3( + 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, // u_params0.z)) * + 0x70, 0x6f, 0x77, 0x28, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // pow(2.0, u_param + 0x73, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // s0.w);. vec4 + 0x5f, 0x35, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, // _524 = _262;. + 0x20, 0x5f, 0x35, 0x32, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x31, 0x2e, 0x78, // _524.x = _331.x + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x32, 0x34, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, // ;. _524.y = _ + 0x33, 0x33, 0x31, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x32, 0x34, 0x2e, // 331.y;. _524. + 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x31, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // z = _331.z;. + 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x32, 0x34, // vec4 _277 = _524 + 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, // * v_color0;. + 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x34, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // vec3 _545;. + 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, // if (u_params1.x + 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // < 0.5). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x36, 0x30, 0x20, 0x3d, // vec3 _360 = + 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x5f, 0x32, 0x37, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x2c, // clamp(_277.xyz, + 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // vec3(0.0), vec3 + 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // (1.0));. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, // float _401 = _36 + 0x30, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // 0.x;. flo + 0x61, 0x74, 0x20, 0x5f, 0x35, 0x33, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // at _539;. + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // do. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, // if (_4 + 0x30, 0x31, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, // 01 <= 0.00313080 + 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, // 0090730190277099 + 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 609375). + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, // _539 = 12. + 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, // 9200000762939453 + 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x30, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 125 * _401;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, // brea + 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // k;. } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, // . els + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, // e. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x5f, 0x35, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, // _539 = (1.054999 + 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, // 9475479125976562 + 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x30, 0x31, 0x2c, 0x20, 0x30, 0x2e, // 5 * pow(_401, 0. + 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, // 4166666567325592 + 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, // 041015625)) - 0. + 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, // 0549999997019767 + 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 76123046875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, // bre + 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ak;. + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, // }. br + 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, // eak; // unreacha + 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, // ble workaround. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, // } while(f + 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, // alse);. f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x30, // loat _405 = _360 + 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, // .y;. floa + 0x74, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // t _541;. + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // do. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x30, // if (_40 + 0x35, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, 0x30, // 5 <= 0.003130800 + 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, 0x36, // 0907301902770996 + 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 09375). + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, 0x39, // _541 = 12.9 + 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, 0x31, // 2000007629394531 + 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x30, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 25 * _405;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, // break + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // ;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, // else + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, // _ + 0x35, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, // 541 = (1.0549999 + 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, // 4754791259765625 + 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x30, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x34, // * pow(_405, 0.4 + 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, 0x30, // 1666665673255920 + 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, // 41015625)) - 0.0 + 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, 0x37, // 5499999970197677 + 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 6123046875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, // brea + 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // k;. } + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, // . bre + 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, // ak; // unreachab + 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, 0x20, // le workaround. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, // } while(fa + 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, // lse);. fl + 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x30, 0x2e, // oat _409 = _360. + 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // z;. float + 0x20, 0x5f, 0x35, 0x34, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, // _543;. d + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // o. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x30, 0x39, // if (_409 + 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, 0x30, 0x30, // <= 0.0031308000 + 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, 0x36, 0x30, // 9073019027709960 + 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 9375). + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, 0x39, 0x32, // _543 = 12.92 + 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, // 0000076293945312 + 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x30, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 5 * _409;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, // break; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, // . }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, // _5 + 0x34, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x34, // 43 = (1.05499994 + 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, 0x20, // 754791259765625 + 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x30, 0x39, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, // * pow(_409, 0.41 + 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, 0x30, 0x34, // 6666656732559204 + 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, // 1015625)) - 0.05 + 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, 0x37, 0x36, // 4999999701976776 + 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 123046875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, // break + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // ;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, // brea + 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, // k; // unreachabl + 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, // e workaround. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, // } while(fal + 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, // se);. _54 + 0x35, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x35, 0x33, 0x39, 0x2c, 0x20, 0x5f, // 5 = vec3(_539, _ + 0x35, 0x34, 0x31, 0x2c, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 541, _543);. + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, // }. else. { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, // . vec3 _5 + 0x34, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, // 46;. if ( + 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x31, 0x2e, // u_params1.x < 1. + 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, // 5). {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x36, 0x20, 0x3d, 0x20, // _546 = + 0x5f, 0x32, 0x37, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // _277.xyz;. + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, // }. else + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x34, 0x37, // vec3 _547 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, // ;. if + 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, // (u_params1.x < + 0x32, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 2.5). + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x34, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x70, // vec3 _494 = p + 0x6f, 0x77, 0x28, 0x28, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, // ow(((mat3(vec3(1 + 0x2e, 0x37, 0x31, 0x36, 0x36, 0x35, 0x31, 0x32, 0x30, 0x31, 0x32, 0x34, 0x38, 0x31, 0x36, 0x38, // .716651201248168 + 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x33, 0x35, 0x35, 0x36, // 9453125, -0.3556 + 0x37, 0x30, 0x38, 0x30, 0x39, 0x37, 0x34, 0x35, 0x37, 0x38, 0x38, 0x35, 0x37, 0x34, 0x32, 0x31, // 7080974578857421 + 0x38, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x33, 0x33, 0x36, 0x36, 0x32, 0x39, // 875, -0.25336629 + 0x31, 0x35, 0x32, 0x32, 0x39, 0x37, 0x39, 0x37, 0x33, 0x36, 0x33, 0x32, 0x38, 0x31, 0x32, 0x35, // 1522979736328125 + 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x38, // ), vec3(-0.66668 + 0x34, 0x33, 0x38, 0x39, 0x31, 0x31, 0x34, 0x33, 0x37, 0x39, 0x38, 0x38, 0x32, 0x38, 0x31, 0x32, // 4389114379882812 + 0x35, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, 0x34, 0x38, 0x31, 0x31, 0x38, 0x34, 0x39, 0x35, // 5, 1.61648118495 + 0x39, 0x34, 0x31, 0x31, 0x36, 0x32, 0x31, 0x30, 0x39, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, // 941162109375, 0. + 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x30, 0x30, 0x30, 0x34, 0x34, 0x39, 0x34, 0x31, 0x39, // 0157685000449419 + 0x30, 0x32, 0x31, 0x36, 0x30, 0x36, 0x34, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, // 0216064453125), + 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x31, 0x37, 0x36, 0x33, 0x39, 0x38, 0x39, 0x39, // vec3(0.017639899 + 0x36, 0x32, 0x36, 0x33, 0x37, 0x34, 0x32, 0x34, 0x34, 0x36, 0x38, 0x39, 0x39, 0x34, 0x31, 0x34, // 6263742446899414 + 0x30, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, 0x32, 0x37, 0x37, 0x30, 0x36, // 0625, -0.0427706 + 0x30, 0x31, 0x38, 0x30, 0x39, 0x30, 0x32, 0x34, 0x38, 0x31, 0x30, 0x37, 0x39, 0x31, 0x30, 0x31, // 0180902481079101 + 0x35, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x34, 0x32, 0x31, 0x30, 0x33, 0x30, 0x38, // 5625, 0.94210308 + 0x37, 0x39, 0x30, 0x32, 0x30, 0x36, 0x39, 0x30, 0x39, 0x31, 0x37, 0x39, 0x36, 0x38, 0x37, 0x35, // 7902069091796875 + 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, // )) * (mat3(vec3( + 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, 0x35, 0x36, 0x34, 0x30, 0x39, 0x38, 0x33, 0x35, 0x38, 0x31, // 0.41255640983581 + 0x35, 0x34, 0x32, 0x39, 0x36, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x33, 0x35, 0x37, 0x35, // 54296875, 0.3575 + 0x37, 0x36, 0x31, 0x30, 0x32, 0x30, 0x31, 0x38, 0x33, 0x35, 0x36, 0x33, 0x32, 0x33, 0x32, 0x34, // 7610201835632324 + 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x38, 0x30, 0x34, 0x33, 0x37, 0x35, // 21875, 0.1804375 + 0x30, 0x35, 0x32, 0x34, 0x35, 0x32, 0x30, 0x38, 0x37, 0x34, 0x30, 0x32, 0x33, 0x34, 0x33, 0x37, // 0524520874023437 + 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x32, 0x31, 0x32, 0x36, 0x37, // 5), vec3(0.21267 + 0x32, 0x39, 0x30, 0x34, 0x31, 0x33, 0x33, 0x37, 0x39, 0x36, 0x36, 0x39, 0x31, 0x38, 0x39, 0x34, // 2904133796691894 + 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x31, 0x35, 0x31, 0x35, 0x32, 0x32, // 53125, 0.7151522 + 0x30, 0x34, 0x30, 0x33, 0x36, 0x37, 0x31, 0x32, 0x36, 0x34, 0x36, 0x34, 0x38, 0x34, 0x33, 0x37, // 0403671264648437 + 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x37, 0x32, 0x31, 0x37, 0x35, 0x30, 0x30, 0x33, 0x35, 0x38, // 5, 0.07217500358 + 0x38, 0x31, 0x39, 0x39, 0x36, 0x31, 0x35, 0x34, 0x37, 0x38, 0x35, 0x31, 0x35, 0x36, 0x32, 0x35, // 8199615478515625 + 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x31, 0x39, 0x33, 0x33, 0x33, // ), vec3(0.019333 + 0x39, 0x30, 0x30, 0x38, 0x38, 0x33, 0x37, 0x39, 0x33, 0x38, 0x33, 0x30, 0x38, 0x37, 0x31, 0x35, // 9008837938308715 + 0x38, 0x32, 0x30, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x31, 0x39, 0x31, 0x39, // 8203125, 0.11919 + 0x31, 0x39, 0x39, 0x36, 0x37, 0x35, 0x33, 0x32, 0x31, 0x35, 0x37, 0x38, 0x39, 0x37, 0x39, 0x34, // 1996753215789794 + 0x39, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x35, 0x30, 0x33, 0x30, 0x34, // 921875, 0.950304 + 0x30, 0x39, 0x30, 0x39, 0x37, 0x36, 0x37, 0x31, 0x35, 0x30, 0x38, 0x37, 0x38, 0x39, 0x30, 0x36, // 0909767150878906 + 0x32, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x29, // 25)) * _277.xyz) + 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x79, 0x29, // ) * u_params1.y) + 0x20, 0x2a, 0x20, 0x39, 0x2e, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x34, 0x37, 0x33, 0x37, // * 9.99999974737 + 0x38, 0x37, 0x35, 0x31, 0x36, 0x33, 0x35, 0x35, 0x35, 0x31, 0x34, 0x35, 0x32, 0x36, 0x33, 0x36, // 8751635551452636 + 0x37, 0x31, 0x38, 0x38, 0x65, 0x2d, 0x30, 0x35, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, // 7188e-05, vec3(0 + 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x37, 0x35, 0x37, 0x38, 0x31, 0x32, 0x35, 0x29, 0x29, // .1593017578125)) + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ;. + 0x20, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x28, 0x76, 0x65, // _547 = pow((ve + 0x63, 0x33, 0x28, 0x30, 0x2e, 0x38, 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, 0x29, 0x20, 0x2b, 0x20, // c3(0.8359375) + + 0x28, 0x5f, 0x34, 0x39, 0x34, 0x20, 0x2a, 0x20, 0x31, 0x38, 0x2e, 0x38, 0x35, 0x31, 0x35, 0x36, // (_494 * 18.85156 + 0x32, 0x35, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, // 25)) / (vec3(1.0 + 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x34, 0x39, 0x34, 0x20, 0x2a, 0x20, 0x31, 0x38, 0x2e, 0x36, // ) + (_494 * 18.6 + 0x38, 0x37, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x37, 0x38, 0x2e, 0x38, // 875)), vec3(78.8 + 0x34, 0x33, 0x37, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 4375));. + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, // _547 = vec3 + 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // (0.0);. + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x5f, 0x35, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x3b, 0x0a, 0x20, 0x20, // _546 = _547;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x5f, 0x35, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, // _545 = _546;. + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, // }. bgfx_Frag + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, 0x35, 0x34, // Color = vec4(_54 + 0x35, 0x2c, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 5, _277.w);.}... }; -static const uint8_t fs_texture_cube2_essl[2484] = +static const uint8_t fs_texture_cube2_essl[3634] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // _params0........ 0x00, 0x00, 0x09, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x02, 0x01, 0x00, 0x00, // ...u_params1.... 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // .......s_texColo - 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x09, 0x00, 0x00, 0x76, // r..........d...v - 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, // arying highp vec - 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // 4 v_color0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // ing highp vec3 v - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // _texcoord0;.unif - 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, // orm highp vec4 u - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // _params0;.unifor - 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, // m highp vec4 u_p - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, // arams1;.uniform - 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, // lowp samplerCube - 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, // s_texColor;.voi - 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, // d main ().{. lo - 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x3b, // wp vec4 color_1; - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, // . lowp vec4 tmp - 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_2;. tmpvar_ - 0x32, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, 0x62, 0x65, 0x4c, // 2 = textureCubeL - 0x6f, 0x64, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // od (s_texColo - 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2c, 0x20, // r, v_texcoord0, - 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, // u_params0.x);. - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // color_1.w = tmpv - 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // ar_2.w;. color_ - 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x70, 0x6f, // 1.xyz = (mix (po - 0x77, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x62, 0x73, 0x28, 0x74, 0x6d, 0x70, 0x76, // w (. abs(tmpv - 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x2c, 0x20, 0x76, 0x65, // ar_2.xyz). , ve - 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, 0x2c, 0x20, 0x32, 0x2e, 0x32, // c3(2.2, 2.2, 2.2 - 0x29, 0x29, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x7a, // )), tmpvar_2.xyz - 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x7a, 0x29, 0x20, 0x2a, // , u_params0.z) * - 0x20, 0x65, 0x78, 0x70, 0x32, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, // exp2(u_params0. - 0x77, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x20, 0x3d, // w));. color_1 = - 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, // (color_1 * v_co - 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, // lor0);. mediump - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, // vec4 tmpvar_3;. - 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6f, 0x75, 0x74, 0x43, // lowp vec3 outC - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, // olor_4;. lowp v - 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, // ec3 tmpvar_5;. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, // tmpvar_5.x = 0.0 - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x2e, 0x79, 0x20, 0x3d, // ;. tmpvar_5.y = - 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, // 0.0;. tmpvar_5 - 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, // .z = 0.0;. outC - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // olor_4 = tmpvar_ - 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // 5;. if ((u_para - 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, // ms1.x < 0.5)) {. - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, // lowp vec3 tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // pvar_6;. tmpv - 0x61, 0x72, 0x5f, 0x36, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x63, 0x6f, // ar_6 = clamp (co - 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, // lor_1.xyz, 0.0, - 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, // 1.0);. lowp v - 0x65, 0x63, 0x33, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // ec3 _rgb_7;. - 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // _rgb_7 = tmpvar_ - 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // 6;. lowp floa - 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // t tmpvar_8;. - 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x78, 0x20, // if ((tmpvar_6.x - 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, 0x29, 0x20, 0x7b, // <= 0.0031308)) { - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x38, 0x20, // . tmpvar_8 - 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // = (12.92 * tmpva - 0x72, 0x5f, 0x36, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, // r_6.x);. } el - 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // se {. tmpva - 0x72, 0x5f, 0x38, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, 0x20, // r_8 = ((1.055 * - 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x78, 0x2c, // pow (tmpvar_6.x, - 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, // 0.4166667)) - 0 - 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, // .055);. };. - 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x37, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // _rgb_7.x = tmp - 0x76, 0x61, 0x72, 0x5f, 0x38, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, // var_8;. lowp - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, // float tmpvar_9;. - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // if ((tmpvar_ - 0x36, 0x2e, 0x79, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, // 6.y <= 0.0031308 - 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // )) {. tmpva - 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, // r_9 = (12.92 * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // mpvar_6.y);. - 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, // } else {. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, // mpvar_9 = ((1.05 - 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // 5 * pow (tmpvar_ - 0x36, 0x2e, 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, // 6.y, 0.4166667)) - 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, // - 0.055);. } - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x37, 0x2e, 0x79, 0x20, 0x3d, // ;. _rgb_7.y = - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, // tmpvar_9;. l - 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // owp float tmpvar - 0x5f, 0x31, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, // _10;. if ((tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x7a, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, // pvar_6.z <= 0.00 - 0x33, 0x31, 0x33, 0x30, 0x38, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 31308)) {. - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x32, 0x2e, // tmpvar_10 = (12. - 0x39, 0x32, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x7a, 0x29, // 92 * tmpvar_6.z) - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, // ;. } else {. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x30, 0x20, 0x3d, // tmpvar_10 = - 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, // ((1.055 * pow ( - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x36, 0x2e, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, // tmpvar_6.z, 0.41 - 0x36, 0x36, 0x36, 0x36, 0x37, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x35, 0x29, // 66667)) - 0.055) - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x72, 0x67, // ;. };. _rg - 0x62, 0x5f, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // b_7.z = tmpvar_1 - 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // 0;. outColor_ - 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x72, 0x67, 0x62, 0x5f, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, // 4 = _rgb_7;. } - 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, // else {. if (( - 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x31, 0x2e, // u_params1.x < 1. - 0x35, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x43, // 5)) {. outC - 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, // olor_4 = color_1 - 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, // .xyz;. } else - 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x5f, // {. if ((u_ + 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x0d, 0x00, 0x00, 0x70, // r..............p + 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, // recision mediump + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, // float;.precisio + 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, // n highp int;..un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // iform highp vec4 + 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // u_params0;.unif + 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, // orm highp sample + 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // rCube s_texColor + 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // ;.uniform highp + 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x3b, 0x0a, // vec4 u_params1;. + 0x0a, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, // .in highp vec3 v + 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x20, 0x68, // _texcoord0;.in h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ighp vec4 v_colo + 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, // r0;.layout(locat + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x67, // ion = 0) out hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, // hp vec4 bgfx_Fra + 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, // gColor;..void ma + 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // in().{. highp + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x36, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, // vec4 _262 = tex + 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, // tureLod(s_texCol + 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2c, // or, v_texcoord0, + 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, // u_params0.x);. + 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x32, // highp vec3 _2 + 0x36, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, // 65 = _262.xyz;. + 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, // highp vec3 _3 + 0x33, 0x31, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x70, 0x6f, 0x77, 0x28, 0x61, 0x62, 0x73, // 31 = mix(pow(abs + 0x28, 0x5f, 0x32, 0x36, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x32, 0x2e, 0x32, // (_265), vec3(2.2 + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x37, 0x36, 0x38, 0x33, 0x37, 0x31, 0x35, 0x38, 0x32, // 0000004768371582 + 0x30, 0x33, 0x31, 0x32, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x2c, 0x20, 0x76, // 03125)), _265, v + 0x65, 0x63, 0x33, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x7a, 0x29, // ec3(u_params0.z) + 0x29, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x75, 0x5f, 0x70, // ) * pow(2.0, u_p + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, // arams0.w);. h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x32, 0x34, 0x20, 0x3d, // ighp vec4 _524 = + 0x20, 0x5f, 0x32, 0x36, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x32, 0x34, 0x2e, // _262;. _524. + 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x31, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // x = _331.x;. + 0x5f, 0x35, 0x32, 0x34, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x31, 0x2e, 0x79, 0x3b, // _524.y = _331.y; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x32, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, // . _524.z = _3 + 0x33, 0x31, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // 31.z;. highp + 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x32, 0x34, // vec4 _277 = _524 + 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, // * v_color0;. + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x34, 0x35, // highp vec3 _545 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // ;. if (u_para + 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, // ms1.x < 0.5). + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // {. highp + 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x36, 0x30, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, // vec3 _360 = cla + 0x6d, 0x70, 0x28, 0x5f, 0x32, 0x37, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x76, 0x65, 0x63, // mp(_277.xyz, vec + 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, // 3(0.0), vec3(1.0 + 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, // ));. high + 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x5f, // p float _401 = _ + 0x33, 0x36, 0x30, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, // 360.x;. h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x33, 0x39, 0x3b, // ighp float _539; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, // . do. + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x30, 0x31, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, // if (_401 <= 0. + 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, // 0031308000907301 + 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, // 90277099609375). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, // _5 + 0x33, 0x39, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, // 39 = 12.92000007 + 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, // 62939453125 * _4 + 0x30, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 01;. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x28, // _539 = ( + 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, // 1.05499994754791 + 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, // 259765625 * pow( + 0x5f, 0x34, 0x30, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, // _401, 0.41666665 + 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, // 6732559204101562 + 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, // 5)) - 0.05499999 + 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, // 9701976776123046 + 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, // break; // + 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, // unreachable work + 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, // around. } + 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, // while(false);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, // highp flo + 0x61, 0x74, 0x20, 0x5f, 0x34, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x30, 0x2e, 0x79, // at _405 = _360.y + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, // ;. highp + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // float _541;. + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, // do. { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, // . if + 0x28, 0x5f, 0x34, 0x30, 0x35, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, // (_405 <= 0.00313 + 0x30, 0x38, 0x30, 0x30, 0x30, 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, // 0800090730190277 + 0x30, 0x39, 0x39, 0x36, 0x30, 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 099609375). + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x20, 0x3d, 0x20, // _541 = + 0x31, 0x32, 0x2e, 0x39, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, // 12.9200000762939 + 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x30, 0x35, 0x3b, 0x0a, 0x20, // 453125 * _405;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, // b + 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // reak;. + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, // _541 = (1.054 + 0x39, 0x39, 0x39, 0x39, 0x34, 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, // 9999475479125976 + 0x35, 0x36, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x30, 0x35, 0x2c, // 5625 * pow(_405, + 0x20, 0x30, 0x2e, 0x34, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, // 0.4166666567325 + 0x35, 0x39, 0x32, 0x30, 0x34, 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, // 592041015625)) - + 0x20, 0x30, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, // 0.0549999997019 + 0x37, 0x36, 0x37, 0x37, 0x36, 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, // 76776123046875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // break;. + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, // break; // unrea + 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, // chable workaroun + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, // d. } whil + 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // e(false);. + 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, // highp float _4 + 0x30, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x30, 0x2e, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20, // 09 = _360.z;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // highp float + 0x20, 0x5f, 0x35, 0x34, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, // _543;. d + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, // o. {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x30, 0x39, // if (_409 + 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x31, 0x33, 0x30, 0x38, 0x30, 0x30, 0x30, // <= 0.0031308000 + 0x39, 0x30, 0x37, 0x33, 0x30, 0x31, 0x39, 0x30, 0x32, 0x37, 0x37, 0x30, 0x39, 0x39, 0x36, 0x30, // 9073019027709960 + 0x39, 0x33, 0x37, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 9375). + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x2e, 0x39, 0x32, // _543 = 12.92 + 0x30, 0x30, 0x30, 0x30, 0x30, 0x37, 0x36, 0x32, 0x39, 0x33, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, // 0000076293945312 + 0x35, 0x20, 0x2a, 0x20, 0x5f, 0x34, 0x30, 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 5 * _409;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, // break; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, // . }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, // _5 + 0x34, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x35, 0x34, 0x39, 0x39, 0x39, 0x39, 0x34, // 43 = (1.05499994 + 0x37, 0x35, 0x34, 0x37, 0x39, 0x31, 0x32, 0x35, 0x39, 0x37, 0x36, 0x35, 0x36, 0x32, 0x35, 0x20, // 754791259765625 + 0x2a, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x5f, 0x34, 0x30, 0x39, 0x2c, 0x20, 0x30, 0x2e, 0x34, 0x31, // * pow(_409, 0.41 + 0x36, 0x36, 0x36, 0x36, 0x36, 0x35, 0x36, 0x37, 0x33, 0x32, 0x35, 0x35, 0x39, 0x32, 0x30, 0x34, // 6666656732559204 + 0x31, 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x30, 0x35, // 1015625)) - 0.05 + 0x34, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x30, 0x31, 0x39, 0x37, 0x36, 0x37, 0x37, 0x36, // 4999999701976776 + 0x31, 0x32, 0x33, 0x30, 0x34, 0x36, 0x38, 0x37, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // 123046875;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, // break + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, // ;. }. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, // brea + 0x6b, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, // k; // unreachabl + 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, // e workaround. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, // } while(fal + 0x73, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, // se);. _54 + 0x35, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x5f, 0x35, 0x33, 0x39, 0x2c, 0x20, 0x5f, // 5 = vec3(_539, _ + 0x35, 0x34, 0x31, 0x2c, 0x20, 0x5f, 0x35, 0x34, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, // 541, _543);. + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, // }. else. { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // . highp v + 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x34, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ec3 _546;. + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, // if (u_params1. + 0x78, 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x35, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // x < 1.5). + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, // {. _ + 0x35, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, // 546 = _277.xyz;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, // else. { + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, // . hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x3b, 0x0a, 0x20, 0x20, // hp vec3 _547;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x5f, // if (u_ 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x32, 0x2e, 0x35, 0x29, // params1.x < 2.5) - 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, // ) {. lowp - 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x31, 0x3b, // vec3 _color_11; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, // . _color_ - 0x31, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x31, 0x2e, 0x37, 0x31, // 11 = ((mat3(1.71 - 0x36, 0x36, 0x35, 0x31, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x33, 0x35, 0x35, 0x36, 0x37, 0x30, 0x38, // 6651, -0.3556708 - 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x33, 0x33, 0x36, 0x36, 0x33, 0x2c, 0x20, 0x2d, 0x30, // , -0.2533663, -0 - 0x2e, 0x36, 0x36, 0x36, 0x36, 0x38, 0x34, 0x34, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, 0x34, // .6666844, 1.6164 - 0x38, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x2c, 0x20, 0x30, // 81, 0.0157685, 0 - 0x2e, 0x30, 0x31, 0x37, 0x36, 0x33, 0x39, 0x39, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, 0x32, // .0176399, -0.042 - 0x37, 0x37, 0x30, 0x36, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x34, 0x32, 0x31, 0x30, 0x33, 0x31, 0x29, // 7706, 0.9421031) - 0x20, 0x2a, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, 0x35, // * (mat3(0.41255 - 0x36, 0x34, 0x2c, 0x20, 0x30, 0x2e, 0x33, 0x35, 0x37, 0x35, 0x37, 0x36, 0x31, 0x2c, 0x20, 0x30, // 64, 0.3575761, 0 - 0x2e, 0x31, 0x38, 0x30, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x31, 0x32, 0x36, // .1804375, 0.2126 - 0x37, 0x32, 0x39, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x31, 0x35, 0x31, 0x35, 0x32, 0x32, 0x2c, 0x20, // 729, 0.7151522, - 0x30, 0x2e, 0x30, 0x37, 0x32, 0x31, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x39, 0x33, // 0.072175, 0.0193 - 0x33, 0x33, 0x39, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x31, 0x39, 0x31, 0x39, 0x32, 0x2c, 0x20, 0x30, // 339, 0.119192, 0 - 0x2e, 0x39, 0x35, 0x30, 0x33, 0x30, 0x34, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x63, 0x6f, 0x6c, 0x6f, // .9503041) * colo - 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, // r_1.xyz)) * u_pa - 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // rams1.y);. - 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, // lowp vec3 tmpv - 0x61, 0x72, 0x5f, 0x31, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, // ar_12;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x20, 0x28, // mpvar_12 = pow ( - 0x28, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x30, // (_color_11 * 0.0 - 0x30, 0x30, 0x31, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x31, 0x35, 0x39, // 001), vec3(0.159 - 0x33, 0x30, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, 0x2c, // 3018, 0.1593018, - 0x20, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x38, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // 0.1593018));. - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // lowp vec3 - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, // tmpvar_13;. - 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x70, // tmpvar_13 = p - 0x6f, 0x77, 0x20, 0x28, 0x28, 0x28, 0x30, 0x2e, 0x38, 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, 0x20, // ow (((0.8359375 - 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, 0x38, // + . (18 - 0x2e, 0x38, 0x35, 0x31, 0x35, 0x36, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // .85156 * tmpvar_ - 0x31, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x2f, 0x20, // 12). ) / - 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, // (vec3(1.0, 1.0, - 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 1.0) + . - 0x20, 0x20, 0x28, 0x31, 0x38, 0x2e, 0x36, 0x38, 0x37, 0x35, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, // (18.6875 * tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // var_12). - 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, // )), vec3(78.8437 - 0x35, 0x2c, 0x20, 0x37, 0x38, 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x37, 0x38, 0x2e, // 5, 78.84375, 78. - 0x38, 0x34, 0x33, 0x37, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 84375));. - 0x20, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // _color_11 = tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // var_13;. - 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, // outColor_4 = tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, // var_13;. }; - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x6c, // . };. };. l - 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // owp vec4 tmpvar_ - 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x2e, // 14;. tmpvar_14. - 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x34, // xyz = outColor_4 - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x34, 0x2e, 0x77, 0x20, // ;. tmpvar_14.w - 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x74, // = color_1.w;. t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // mpvar_3 = tmpvar - 0x5f, 0x31, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, // _14;. gl_FragCo - 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, // lor = tmpvar_3;. - 0x7d, 0x0a, 0x0a, 0x00, // }... + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, // . {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, // h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x34, 0x39, 0x34, 0x20, 0x3d, // ighp vec3 _494 = + 0x20, 0x70, 0x6f, 0x77, 0x28, 0x28, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x76, 0x65, 0x63, 0x33, // pow(((mat3(vec3 + 0x28, 0x31, 0x2e, 0x37, 0x31, 0x36, 0x36, 0x35, 0x31, 0x32, 0x30, 0x31, 0x32, 0x34, 0x38, 0x31, // (1.7166512012481 + 0x36, 0x38, 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x33, 0x35, // 689453125, -0.35 + 0x35, 0x36, 0x37, 0x30, 0x38, 0x30, 0x39, 0x37, 0x34, 0x35, 0x37, 0x38, 0x38, 0x35, 0x37, 0x34, // 5670809745788574 + 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x33, 0x33, 0x36, 0x36, // 21875, -0.253366 + 0x32, 0x39, 0x31, 0x35, 0x32, 0x32, 0x39, 0x37, 0x39, 0x37, 0x33, 0x36, 0x33, 0x32, 0x38, 0x31, // 2915229797363281 + 0x32, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x2d, 0x30, 0x2e, 0x36, 0x36, 0x36, // 25), vec3(-0.666 + 0x36, 0x38, 0x34, 0x33, 0x38, 0x39, 0x31, 0x31, 0x34, 0x33, 0x37, 0x39, 0x38, 0x38, 0x32, 0x38, // 6843891143798828 + 0x31, 0x32, 0x35, 0x2c, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x36, 0x34, 0x38, 0x31, 0x31, 0x38, 0x34, // 125, 1.616481184 + 0x39, 0x35, 0x39, 0x34, 0x31, 0x31, 0x36, 0x32, 0x31, 0x30, 0x39, 0x33, 0x37, 0x35, 0x2c, 0x20, // 95941162109375, + 0x30, 0x2e, 0x30, 0x31, 0x35, 0x37, 0x36, 0x38, 0x35, 0x30, 0x30, 0x30, 0x34, 0x34, 0x39, 0x34, // 0.01576850004494 + 0x31, 0x39, 0x30, 0x32, 0x31, 0x36, 0x30, 0x36, 0x34, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x29, // 190216064453125) + 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x31, 0x37, 0x36, 0x33, 0x39, 0x38, // , vec3(0.0176398 + 0x39, 0x39, 0x36, 0x32, 0x36, 0x33, 0x37, 0x34, 0x32, 0x34, 0x34, 0x36, 0x38, 0x39, 0x39, 0x34, // 9962637424468994 + 0x31, 0x34, 0x30, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x34, 0x32, 0x37, 0x37, // 140625, -0.04277 + 0x30, 0x36, 0x30, 0x31, 0x38, 0x30, 0x39, 0x30, 0x32, 0x34, 0x38, 0x31, 0x30, 0x37, 0x39, 0x31, // 0601809024810791 + 0x30, 0x31, 0x35, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x34, 0x32, 0x31, 0x30, 0x33, // 015625, 0.942103 + 0x30, 0x38, 0x37, 0x39, 0x30, 0x32, 0x30, 0x36, 0x39, 0x30, 0x39, 0x31, 0x37, 0x39, 0x36, 0x38, // 0879020690917968 + 0x37, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x33, 0x28, 0x76, 0x65, 0x63, // 75)) * (mat3(vec + 0x33, 0x28, 0x30, 0x2e, 0x34, 0x31, 0x32, 0x35, 0x35, 0x36, 0x34, 0x30, 0x39, 0x38, 0x33, 0x35, // 3(0.412556409835 + 0x38, 0x31, 0x35, 0x34, 0x32, 0x39, 0x36, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x33, 0x35, // 8154296875, 0.35 + 0x37, 0x35, 0x37, 0x36, 0x31, 0x30, 0x32, 0x30, 0x31, 0x38, 0x33, 0x35, 0x36, 0x33, 0x32, 0x33, // 7576102018356323 + 0x32, 0x34, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x38, 0x30, 0x34, 0x33, // 2421875, 0.18043 + 0x37, 0x35, 0x30, 0x35, 0x32, 0x34, 0x35, 0x32, 0x30, 0x38, 0x37, 0x34, 0x30, 0x32, 0x33, 0x34, // 7505245208740234 + 0x33, 0x37, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x32, 0x31, 0x32, // 375), vec3(0.212 + 0x36, 0x37, 0x32, 0x39, 0x30, 0x34, 0x31, 0x33, 0x33, 0x37, 0x39, 0x36, 0x36, 0x39, 0x31, 0x38, // 6729041337966918 + 0x39, 0x34, 0x35, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x31, 0x35, 0x31, 0x35, // 9453125, 0.71515 + 0x32, 0x32, 0x30, 0x34, 0x30, 0x33, 0x36, 0x37, 0x31, 0x32, 0x36, 0x34, 0x36, 0x34, 0x38, 0x34, // 2204036712646484 + 0x33, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x37, 0x32, 0x31, 0x37, 0x35, 0x30, 0x30, 0x33, // 375, 0.072175003 + 0x35, 0x38, 0x38, 0x31, 0x39, 0x39, 0x36, 0x31, 0x35, 0x34, 0x37, 0x38, 0x35, 0x31, 0x35, 0x36, // 5881996154785156 + 0x32, 0x35, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x31, 0x39, 0x33, // 25), vec3(0.0193 + 0x33, 0x33, 0x39, 0x30, 0x30, 0x38, 0x38, 0x33, 0x37, 0x39, 0x33, 0x38, 0x33, 0x30, 0x38, 0x37, // 3390088379383087 + 0x31, 0x35, 0x38, 0x32, 0x30, 0x33, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x31, 0x39, // 158203125, 0.119 + 0x31, 0x39, 0x31, 0x39, 0x39, 0x36, 0x37, 0x35, 0x33, 0x32, 0x31, 0x35, 0x37, 0x38, 0x39, 0x37, // 1919967532157897 + 0x39, 0x34, 0x39, 0x32, 0x31, 0x38, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x39, 0x35, 0x30, 0x33, // 94921875, 0.9503 + 0x30, 0x34, 0x30, 0x39, 0x30, 0x39, 0x37, 0x36, 0x37, 0x31, 0x35, 0x30, 0x38, 0x37, 0x38, 0x39, // 0409097671508789 + 0x30, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x2e, 0x78, 0x79, // 0625)) * _277.xy + 0x7a, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x31, 0x2e, // z)) * u_params1. + 0x79, 0x29, 0x20, 0x2a, 0x20, 0x39, 0x2e, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x37, 0x34, 0x37, // y) * 9.999999747 + 0x33, 0x37, 0x38, 0x37, 0x35, 0x31, 0x36, 0x33, 0x35, 0x35, 0x35, 0x31, 0x34, 0x35, 0x32, 0x36, // 3787516355514526 + 0x33, 0x36, 0x37, 0x31, 0x38, 0x38, 0x65, 0x2d, 0x30, 0x35, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, // 367188e-05, vec3 + 0x28, 0x30, 0x2e, 0x31, 0x35, 0x39, 0x33, 0x30, 0x31, 0x37, 0x35, 0x37, 0x38, 0x31, 0x32, 0x35, // (0.1593017578125 + 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // ));. + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x77, 0x28, 0x28, // _547 = pow(( + 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x38, 0x33, 0x35, 0x39, 0x33, 0x37, 0x35, 0x29, 0x20, // vec3(0.8359375) + 0x2b, 0x20, 0x28, 0x5f, 0x34, 0x39, 0x34, 0x20, 0x2a, 0x20, 0x31, 0x38, 0x2e, 0x38, 0x35, 0x31, // + (_494 * 18.851 + 0x35, 0x36, 0x32, 0x35, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, // 5625)) / (vec3(1 + 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x34, 0x39, 0x34, 0x20, 0x2a, 0x20, 0x31, 0x38, // .0) + (_494 * 18 + 0x2e, 0x36, 0x38, 0x37, 0x35, 0x29, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x37, 0x38, // .6875)), vec3(78 + 0x2e, 0x38, 0x34, 0x33, 0x37, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // .84375));. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // else. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // {. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x76, 0x65, // _547 = ve + 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // c3(0.0);. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x20, 0x5f, 0x35, 0x34, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x37, 0x3b, 0x0a, // _546 = _547;. + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // }. + 0x20, 0x20, 0x5f, 0x35, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x36, 0x3b, 0x0a, 0x20, // _545 = _546;. + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, // }. bgfx_Fr + 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x5f, // agColor = vec4(_ + 0x35, 0x34, 0x35, 0x2c, 0x20, 0x5f, 0x32, 0x37, 0x37, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, // 545, _277.w);.}. + 0x0a, 0x00, // .. }; static const uint8_t fs_texture_cube2_spv[4359] = { diff --git a/tools/texturev/fs_texture_msdf.bin.h b/tools/texturev/fs_texture_msdf.bin.h index de17dfd76..22b9d1f5c 100644 --- a/tools/texturev/fs_texture_msdf.bin.h +++ b/tools/texturev/fs_texture_msdf.bin.h @@ -1,78 +1,76 @@ -static const uint8_t fs_texture_msdf_glsl[494] = +static const uint8_t fs_texture_msdf_glsl[488] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // _params0........ 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, // ...s_texColor... - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb2, 0x01, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, // ...........varyi - 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // ng vec3 v_texcoo - 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, // rd0;.uniform vec - 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // 4 u_params0;.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, // form sampler2D s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // _texColor;.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, // main ().{. vec3 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, // var_1 = texture2 - 0x44, 0x4c, 0x6f, 0x64, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // DLod (s_texColor - 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, // , v_texcoord0.xy - 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, 0x2e, 0x78, // , u_params0.x).x - 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, // yz;. float tmpv - 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // ar_2;. tmpvar_2 - 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x61, 0x78, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x20, 0x28, 0x74, 0x6d, // = (max (min (tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // pvar_1.x, tmpvar - 0x5f, 0x31, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, // _1.y), min (. - 0x20, 0x6d, 0x61, 0x78, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, // max (tmpvar_1.x - 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x79, 0x29, 0x0a, 0x20, 0x20, // , tmpvar_1.y). - 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2d, // , tmpvar_1.z)) - - 0x20, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, // 0.5);. gl_Frag - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, 0x6c, 0x61, // Color = vec4(cla - 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x2f, // mp (((tmpvar_2 / - 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, // . (abs(dFdx( - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, // tmpvar_2)) + abs - 0x28, 0x64, 0x46, 0x64, 0x79, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x29, // (dFdy(tmpvar_2)) - 0x29, 0x0a, 0x20, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x2c, 0x20, 0x30, 0x2e, // ). ) + 0.5), 0. - 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 0, 1.0));.}... + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, // ............unif + 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, // orm sampler2D s_ + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // texColor;.unifor + 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, // m vec4 u_params0 + 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // ;..in vec3 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // coord0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, // ocation = 0) out + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, // vec4 bgfx_FragC + 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // olor;..void main + 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, // ().{. vec4 _5 + 0x38, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x73, // 8 = textureLod(s + 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // _texColor, v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, // coord0.xy, u_par + 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // ams0.x);. flo + 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x38, 0x2e, 0x78, 0x3b, // at _104 = _58.x; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x20, // . float _106 + 0x3d, 0x20, 0x5f, 0x35, 0x38, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // = _58.y;. flo + 0x61, 0x74, 0x20, 0x5f, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x6d, 0x69, 0x6e, // at _65 = max(min + 0x28, 0x5f, 0x31, 0x30, 0x34, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x29, 0x2c, 0x20, 0x6d, 0x69, // (_104, _106), mi + 0x6e, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x30, 0x34, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x36, // n(max(_104, _106 + 0x29, 0x2c, 0x20, 0x5f, 0x35, 0x38, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x35, // ), _58.z)) - 0.5 + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, // ;. bgfx_FragC + 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, // olor = mix(vec4( + 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2c, // 0.0), vec4(1.0), + 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x5f, 0x36, 0x35, // vec4(clamp((_65 + 0x20, 0x2f, 0x20, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x5f, 0x36, 0x35, 0x29, 0x29, 0x20, // / fwidth(_65)) + 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, // + 0.5, 0.0, 1.0) + 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ));.}... }; -static const uint8_t fs_texture_msdf_essl[613] = +static const uint8_t fs_texture_msdf_essl[582] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // _params0........ 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, // ...s_texColor... - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x02, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, // .......)...varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, // ng highp vec3 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // texcoord0;.unifo - 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, // rm highp vec4 u_ - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // params0;.uniform - 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, // sampler2D s_tex - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // Color;.void main - 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, // ().{. lowp vec - 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // 3 tmpvar_1;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, // pvar_1 = texture - 0x32, 0x44, 0x4c, 0x6f, 0x64, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // 2DLod (s_texC - 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // olor, v_texcoord - 0x30, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, // 0.xy, u_params0. - 0x78, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, // x).xyz;. lowp f - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, // loat tmpvar_2;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x61, 0x78, // tmpvar_2 = (max - 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // (min (tmpvar_1. - 0x78, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x79, 0x29, 0x2c, 0x20, // x, tmpvar_1.y), - 0x6d, 0x69, 0x6e, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x28, 0x74, // min (. max (t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_1.x, tmpva - 0x72, 0x5f, 0x31, 0x2e, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // r_1.y). , tmpva - 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x0a, // r_1.z)) - 0.5);. - 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, // lowp float tmp - 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // var_3;. tmpvar_ - 0x33, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x74, 0x6d, 0x70, // 3 = clamp (((tmp - 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x2f, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x62, // var_2 / . (ab - 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, // s(dFdx(tmpvar_2) - 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x79, 0x28, 0x74, 0x6d, 0x70, // ) + abs(dFdy(tmp - 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x30, // var_2))). ) + 0 - 0x2e, 0x35, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, // .5), 0.0, 1.0);. - 0x20, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, // mediump vec4 t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_4;. tmpva - 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // r_4 = vec4(tmpva - 0x72, 0x5f, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, // r_3);. gl_FragC - 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, // olor = tmpvar_4; - 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x02, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, // ...........preci + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, // sion mediump flo + 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, // at;.precision hi + 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // ghp int;..unifor + 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, // m highp sampler2 + 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, // D s_texColor;.un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // iform highp vec4 + 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, // u_params0;..in + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // highp vec3 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // coord0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, // ocation = 0) out + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, // highp vec4 bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, // _FragColor;..voi + 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, // d main().{. h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x38, 0x20, 0x3d, 0x20, // ighp vec4 _58 = + 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, // textureLod(s_tex + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // Color, v_texcoor + 0x64, 0x30, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, // d0.xy, u_params0 + 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, // .x);. highp f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x38, 0x2e, // loat _104 = _58. + 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, // x;. highp flo + 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x38, 0x2e, 0x79, 0x3b, // at _106 = _58.y; + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // . highp float + 0x20, 0x5f, 0x36, 0x35, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x6d, 0x69, 0x6e, 0x28, 0x5f, // _65 = max(min(_ + 0x31, 0x30, 0x34, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x29, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x28, // 104, _106), min( + 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x31, 0x30, 0x34, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x29, 0x2c, // max(_104, _106), + 0x20, 0x5f, 0x35, 0x38, 0x2e, 0x7a, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x35, 0x3b, 0x0a, // _58.z)) - 0.5;. + 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, // bgfx_FragCol + 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, // or = mix(vec4(0. + 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, // 0), vec4(1.0), v + 0x65, 0x63, 0x34, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x5f, 0x36, 0x35, 0x20, 0x2f, // ec4(clamp((_65 / + 0x20, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x5f, 0x36, 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, // fwidth(_65)) + + 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, // 0.5, 0.0, 1.0))) + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ;.}... }; static const uint8_t fs_texture_msdf_spv[1559] = { diff --git a/tools/texturev/fs_texture_msdf.sc b/tools/texturev/fs_texture_msdf.sc index 69786b1f4..c919a14d4 100644 --- a/tools/texturev/fs_texture_msdf.sc +++ b/tools/texturev/fs_texture_msdf.sc @@ -18,8 +18,8 @@ void main() { vec4 bgColor = vec4(0.0, 0.0, 0.0, 0.0); vec4 fgColor = vec4(1.0, 1.0, 1.0, 1.0); - vec3 sample = texture2DLod(s_texColor, v_texcoord0.xy, u_textureLod).xyz; - float sigDist = median(sample) - 0.5; + vec3 msdf = texture2DLod(s_texColor, v_texcoord0.xy, u_textureLod).xyz; + float sigDist = median(msdf) - 0.5; float opacity = clamp(sigDist/fwidth(sigDist) + 0.5, 0.0, 1.0); gl_FragColor = mix(bgColor, fgColor, opacity); } diff --git a/tools/texturev/fs_texture_sdf.bin.h b/tools/texturev/fs_texture_sdf.bin.h index c5b82edf9..4a7bbe188 100644 --- a/tools/texturev/fs_texture_sdf.bin.h +++ b/tools/texturev/fs_texture_sdf.bin.h @@ -1,87 +1,68 @@ -static const uint8_t fs_texture_sdf_glsl[586] = +static const uint8_t fs_texture_sdf_glsl[431] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // _params0........ 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, // ...s_texColor... - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, // ...........varyi - 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // ng vec3 v_texcoo - 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, // rd0;.uniform vec - 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // 4 u_params0;.uni - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, // form sampler2D s - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // _texColor;.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // main ().{. vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, // var_1 = texture2 - 0x44, 0x4c, 0x6f, 0x64, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // DLod (s_texColor - 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, // , v_texcoord0.xy - 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, 0x3b, 0x0a, // , u_params0.x);. - 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // float tmpvar_2 - 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, // ;. tmpvar_2 = ( - 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x78, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // abs(dFdx(tmpvar_ - 0x31, 0x2e, 0x78, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x79, // 1.x)) + abs(dFdy - 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x29, 0x29, 0x29, 0x3b, 0x0a, // (tmpvar_1.x)));. - 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x33, 0x3b, // float edge0_3; - 0x0a, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, // . edge0_3 = (0. - 0x35, 0x20, 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x20, // 5 - tmpvar_2);. - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, // float tmpvar_4; - 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x63, 0x6c, // . tmpvar_4 = cl - 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // amp (((tmpvar_1. - 0x78, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x33, 0x29, 0x20, 0x2f, 0x20, 0x28, // x - edge0_3) / ( - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, 0x6d, 0x70, 0x76, // . (0.5 + tmpv - 0x61, 0x72, 0x5f, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, // ar_2). - edge0 - 0x5f, 0x33, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, // _3)), 0.0, 1.0); - 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, // . gl_FragColor - 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x74, // = vec4(clamp ((t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x2a, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_4 * (tmpva - 0x72, 0x5f, 0x34, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x33, 0x2e, 0x30, 0x20, // r_4 * . (3.0 - 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // - (2.0 * tmpvar_ - 0x34, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // 4)). )), 0.0, 1 - 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .0));.}... + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, 0x66, // .......s....unif + 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, // orm sampler2D s_ + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // texColor;.unifor + 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, // m vec4 u_params0 + 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // ;..in vec3 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // coord0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, // ocation = 0) out + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, // vec4 bgfx_FragC + 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // olor;..void main + 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, // ().{. vec4 _3 + 0x35, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x73, // 5 = textureLod(s + 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // _texColor, v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, // coord0.xy, u_par + 0x61, 0x6d, 0x73, 0x30, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, // ams0.x);. flo + 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x2e, 0x78, 0x3b, 0x0a, // at _36 = _35.x;. + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x39, 0x20, 0x3d, 0x20, // float _39 = + 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x5f, 0x33, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, // fwidth(_36);. + 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, // bgfx_FragColor + 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, // = mix(vec4(0.0), + 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, // vec4(1.0), vec4 + 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, // (clamp(smoothste + 0x70, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x33, 0x39, 0x2c, 0x20, 0x30, 0x2e, 0x35, // p(0.5 - _39, 0.5 + 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x39, 0x2c, 0x20, 0x5f, 0x33, 0x36, 0x29, 0x2c, 0x20, 0x30, 0x2e, // + _39, _36), 0. + 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // 0, 1.0)));.}... }; -static const uint8_t fs_texture_sdf_essl[666] = +static const uint8_t fs_texture_sdf_essl[519] = { 0x46, 0x53, 0x48, 0x0b, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x75, // FSH............u 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // _params0........ 0x00, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, // ...s_texColor... - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x02, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, // .......^...varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, // ng highp vec3 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // texcoord0;.unifo - 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, // rm highp vec4 u_ - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // params0;.uniform - 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, // sampler2D s_tex - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // Color;.void main - 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, // ().{. lowp vec - 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // 4 tmpvar_1;. tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, // pvar_1 = texture - 0x32, 0x44, 0x4c, 0x6f, 0x64, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // 2DLod (s_texC - 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // olor, v_texcoord - 0x30, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x2e, // 0.xy, u_params0. - 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // x);. lowp float - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_2;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, // var_2 = (abs(dFd - 0x78, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x29, 0x29, 0x20, 0x2b, // x(tmpvar_1.x)) + - 0x20, 0x61, 0x62, 0x73, 0x28, 0x64, 0x46, 0x64, 0x79, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // abs(dFdy(tmpvar - 0x5f, 0x31, 0x2e, 0x78, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, // _1.x)));. lowp - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x33, 0x3b, 0x0a, 0x20, // float edge0_3;. - 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, // edge0_3 = (0.5 - 0x2d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, // - tmpvar_2);. l - 0x6f, 0x77, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // owp float tmpvar - 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, // _4;. tmpvar_4 = - 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // clamp (((tmpvar - 0x5f, 0x31, 0x2e, 0x78, 0x20, 0x2d, 0x20, 0x65, 0x64, 0x67, 0x65, 0x30, 0x5f, 0x33, 0x29, 0x20, // _1.x - edge0_3) - 0x2f, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x74, // / (. (0.5 + t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x65, 0x64, // mpvar_2). - ed - 0x67, 0x65, 0x30, 0x5f, 0x33, 0x29, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, // ge0_3)), 0.0, 1. - 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // 0);. lowp vec4 - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // tmpvar_5;. tmpv - 0x61, 0x72, 0x5f, 0x35, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, 0x6c, 0x61, 0x6d, // ar_5 = vec4(clam - 0x70, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x2a, 0x20, 0x28, // p ((tmpvar_4 * ( - 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x2a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, // tmpvar_4 * . - 0x28, 0x33, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x74, 0x6d, // (3.0 - (2.0 * tm - 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x30, // pvar_4)). )), 0 - 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, // .0, 1.0));. gl_ - 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, // FragColor = tmpv - 0x61, 0x72, 0x5f, 0x35, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // ar_5;.}... + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x01, 0x00, 0x00, 0x70, 0x72, 0x65, 0x63, 0x69, // ...........preci + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, // sion mediump flo + 0x61, 0x74, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, // at;.precision hi + 0x67, 0x68, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, // ghp int;..unifor + 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, // m highp sampler2 + 0x44, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, // D s_texColor;.un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // iform highp vec4 + 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x20, // u_params0;..in + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, // highp vec3 v_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // coord0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, // ocation = 0) out + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x67, 0x66, 0x78, // highp vec4 bgfx + 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, // _FragColor;..voi + 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, // d main().{. h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x35, 0x20, 0x3d, 0x20, // ighp vec4 _35 = + 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, // textureLod(s_tex + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, // Color, v_texcoor + 0x64, 0x30, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x30, // d0.xy, u_params0 + 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, // .x);. highp f + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x33, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x2e, 0x78, // loat _36 = _35.x + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, // ;. highp floa + 0x74, 0x20, 0x5f, 0x33, 0x39, 0x20, 0x3d, 0x20, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x5f, // t _39 = fwidth(_ + 0x33, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x67, 0x66, 0x78, 0x5f, 0x46, 0x72, // 36);. bgfx_Fr + 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x76, 0x65, // agColor = mix(ve + 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2e, // c4(0.0), vec4(1. + 0x30, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x73, // 0), vec4(clamp(s + 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, // moothstep(0.5 - + 0x5f, 0x33, 0x39, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x5f, 0x33, 0x39, 0x2c, 0x20, // _39, 0.5 + _39, + 0x5f, 0x33, 0x36, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, // _36), 0.0, 1.0)) + 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // );.}... }; static const uint8_t fs_texture_sdf_spv[1419] = { diff --git a/tools/texturev/vs_texture.bin.h b/tools/texturev/vs_texture.bin.h index 0e33c7295..d0fe07f01 100644 --- a/tools/texturev/vs_texture.bin.h +++ b/tools/texturev/vs_texture.bin.h @@ -1,61 +1,56 @@ -static const uint8_t vs_texture_glsl[400] = +static const uint8_t vs_texture_glsl[381] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........c...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec3 a_position;. - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, // attribute vec3 a - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // _texcoord0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ing vec4 v_color - 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // 0;.varying vec3 - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // v_texcoord0;.uni + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........P....uni 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // lViewProj;.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // main ().{. vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, // var_1.zw = vec2( - 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // 0.0, 1.0);. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, // var_1.xy = a_pos - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, // ition.xy;. gl_P - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // osition = (u_mod - 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, // elViewProj * tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // var_1);. v_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // oord0 = a_texcoo - 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, // rd0;. v_color0 - 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // = a_color0;.}... + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, // ion;.out vec3 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, // t(location = 2) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec3 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, // n.xy, 0.0, 1.0); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // . v_texcoord0 + 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, // = a_texcoord0;. + 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, // v_color0 = a + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _color0;.}... }; -static const uint8_t vs_texture_essl[442] = +static const uint8_t vs_texture_essl[381] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // bute highp vec3 - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, // a_position;.attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, // ibute highp vec3 - 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, // a_texcoord0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // rying highp vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color0;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, // ng highp vec3 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // texcoord0;.unifo - 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // rm highp mat4 u_ - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, // modelViewProj;.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // highp vec4 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // r_1;. tmpvar_1. - 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, // zw = vec2(0.0, 1 - 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // .0);. tmpvar_1. - 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, // xy = a_position. - 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // xy;. gl_Positio - 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, // n = (u_modelView - 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, // Proj * tmpvar_1) - 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, // ;. v_texcoord0 - 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, // = a_texcoord0;. - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, // v_color0 = a_co - 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lor0;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........P....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, // ion;.out vec3 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, // t(location = 2) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec3 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, // n.xy, 0.0, 1.0); + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // . v_texcoord0 + 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, // = a_texcoord0;. + 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, // v_color0 = a + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _color0;.}... }; static const uint8_t vs_texture_spv[1234] = { diff --git a/tools/texturev/vs_texture_cube.bin.h b/tools/texturev/vs_texture_cube.bin.h index 1d29115e9..967218f40 100644 --- a/tools/texturev/vs_texture_cube.bin.h +++ b/tools/texturev/vs_texture_cube.bin.h @@ -1,60 +1,56 @@ -static const uint8_t vs_texture_cube_glsl[386] = +static const uint8_t vs_texture_cube_glsl[373] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ........U...attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, // ibute vec4 a_col - 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, // or0;.attribute v - 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, // ec3 a_position;. - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, // attribute vec3 a - 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // _texcoord0;.vary - 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ing vec4 v_color - 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // 0;.varying vec3 - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, // v_texcoord0;.uni + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........H....uni 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode - 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // lViewProj;.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // main ().{. vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, // var_1.w = 1.0;. - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, // tmpvar_1.xyz = - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, // a_position;. gl - 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, // _Position = (u_m - 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, // odelViewProj * t - 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, // mpvar_1);. v_te - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // xcoord0 = a_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // oord0;. v_color - 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, // 0 = a_color0;.}. - 0x0a, 0x00, // .. + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, // ion;.out vec3 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, // t(location = 2) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec3 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, // n, 1.0);. v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, // excoord0 = a_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, // coord0;. v_co + 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // lor0 = a_color0; + 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... }; -static const uint8_t vs_texture_cube_essl[428] = +static const uint8_t vs_texture_cube_essl[373] = { 0x56, 0x53, 0x48, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, // VSH............u 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, // _modelViewProj.. - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, // ............attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ibute highp vec4 - 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // a_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, // bute highp vec3 - 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, // a_position;.attr - 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, // ibute highp vec3 - 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, // a_texcoord0;.va - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // rying highp vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color0;.varyi - 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, // ng highp vec3 v_ - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // texcoord0;.unifo - 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, // rm highp mat4 u_ - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, // modelViewProj;.v - 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // oid main ().{. - 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // highp vec4 tmpva - 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // r_1;. tmpvar_1. - 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // w = 1.0;. tmpva - 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, // r_1.xyz = a_posi - 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, // tion;. gl_Posit - 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, // ion = (u_modelVi - 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ewProj * tmpvar_ - 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // 1);. v_texcoord - 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, // 0 = a_texcoord0; - 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, // . v_color0 = a_ - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // color0;.}... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x69, // ........H....uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x0a, 0x6c, 0x61, 0x79, 0x6f, // lViewProj;..layo + 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x29, // ut(location = 1) + 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // in vec3 a_posit + 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x5f, // ion;.out vec3 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, // texcoord0;.layou + 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x29, 0x20, // t(location = 2) + 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // in vec3 a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, // rd0;.out vec4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, // color0;.layout(l + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, 0x20, // ocation = 0) in + 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x0a, // vec4 a_color0;.. + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, // void main().{. + 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // gl_Position = + 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, // u_modelViewProj + 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // * vec4(a_positio + 0x6e, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x74, // n, 1.0);. v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, // excoord0 = a_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, // coord0;. v_co + 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, // lor0 = a_color0; + 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... }; static const uint8_t vs_texture_cube_spv[1238] = {